From ad86fe1142adaf1e68ad36eaa532d399246632d4 Mon Sep 17 00:00:00 2001 From: OgelGames Date: Sat, 23 Jan 2021 21:27:31 +1100 Subject: [PATCH] first working version --- .gitignore | 1 + .luacheckrc | 15 +++++ diode.lua | 37 ++++++++++++ filter.lua | 46 +++++++++++++++ init.lua | 49 ++++++++++++++++ mod.conf | 5 ++ override.lua | 81 ++++++++++++++++++++++++++ splitter.lua | 46 +++++++++++++++ textures/digicontrol_bottom.png | Bin 0 -> 222 bytes textures/digicontrol_diode.png | Bin 0 -> 7603 bytes textures/digicontrol_filter.png | Bin 0 -> 6538 bytes textures/digicontrol_side.png | Bin 0 -> 138 bytes textures/digicontrol_side_port.png | Bin 0 -> 208 bytes textures/digicontrol_splitter.png | Bin 0 -> 8274 bytes textures/digicontrol_trisplitter.png | Bin 0 -> 8307 bytes textures/digicontrol_trisplitter2.png | Bin 0 -> 12530 bytes trisplitter.lua | 44 ++++++++++++++ 17 files changed, 324 insertions(+) create mode 100644 .gitignore create mode 100644 .luacheckrc create mode 100644 diode.lua create mode 100644 filter.lua create mode 100644 init.lua create mode 100644 mod.conf create mode 100644 override.lua create mode 100644 splitter.lua create mode 100644 textures/digicontrol_bottom.png create mode 100644 textures/digicontrol_diode.png create mode 100644 textures/digicontrol_filter.png create mode 100644 textures/digicontrol_side.png create mode 100644 textures/digicontrol_side_port.png create mode 100644 textures/digicontrol_splitter.png create mode 100644 textures/digicontrol_trisplitter.png create mode 100644 textures/digicontrol_trisplitter2.png create mode 100644 trisplitter.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a37273b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +files/ diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..9c9b438 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,15 @@ + +globals = { + "digilines", + "digicontrol" +} + +read_globals = { + "vector", + "screwdriver", + "minetest", + "default", + "pipeworks", + "dump", + "VoxelArea", +} diff --git a/diode.lua b/diode.lua new file mode 100644 index 0000000..7bccdab --- /dev/null +++ b/diode.lua @@ -0,0 +1,37 @@ + +minetest.register_node("digicontrol:diode", { + description = "Digilines Diode", + inventory_image = "digicontrol_diode.png", + tiles = { + "digicontrol_diode.png", + "digicontrol_bottom.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png", + "digicontrol_side.png", + "digicontrol_side.png" + }, + drawtype = "nodebox", + node_box = digicontrol.node_box, + selection_box = digicontrol.selection_box, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {digicontrol = 1, dig_immediate = 2}, + digiline = { + semiconductor = { + rules = function(node) + return { + digicontrol.get_rule(1, node.param2) + } + end + }, + wire = { + rules = function(node) + return { + digicontrol.get_rule(1, node.param2), + digicontrol.get_rule(3, node.param2) + } + end + } + } +}) diff --git a/filter.lua b/filter.lua new file mode 100644 index 0000000..5b2ed2c --- /dev/null +++ b/filter.lua @@ -0,0 +1,46 @@ + +minetest.register_node("digicontrol:filter", { + description = "Digilines Filter", + inventory_image = "digicontrol_filter.png", + tiles = { + "digicontrol_filter.png", + "digicontrol_bottom.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png", + "digicontrol_side.png", + "digicontrol_side.png" + }, + drawtype = "nodebox", + node_box = digicontrol.node_box, + selection_box = digicontrol.selection_box, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {digicontrol = 1, dig_immediate = 2}, + digiline = { + semiconductor = { + rules = function(node, pos, from, channel) + local setchannel = minetest.get_meta(pos):get_string("channel") + if channel ~= setchannel then return {} end + local side = digicontrol.get_side(pos, from, node.param2) + if side == 3 then + return { + digicontrol.get_rule(1, node.param2) + } + else + return { + digicontrol.get_rule(3, node.param2) + } + end + end + }, + wire = { + rules = function(node) + return { + digicontrol.get_rule(1, node.param2), + digicontrol.get_rule(3, node.param2) + } + end + } + } +}) diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..595564f --- /dev/null +++ b/init.lua @@ -0,0 +1,49 @@ + +digicontrol = {} + +digicontrol.selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } +} + +digicontrol.node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, + { -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 } + }, +} + +local BASE_RULES = { + {x = 0, y = 0, z = 1}, -- Up (side 0) + {x = 1, y = 0, z = 0}, -- Right (side 1) + {x = 0, y = 0, z =-1}, -- Down (side 2) + {x =-1, y = 0, z = 0} -- Left (side 3) +} + +digicontrol.all_rules = BASE_RULES + +function digicontrol.get_rule(side, param2) + if param2 >= 4 then return nil end + return BASE_RULES[((side + param2) % 4) + 1] +end + +function digicontrol.get_side(pos, from, param2) + if param2 >= 4 then return nil end + local dir = vector.subtract(from, pos) + local facedir = minetest.dir_to_facedir(dir) + return ((facedir - param2) + 4) % 4 +end + +local MP = minetest.get_modpath("digicontrol") + +-- Overrides to digilines functions +dofile(MP.."/override.lua") + +-- Nodes +dofile(MP.."/diode.lua") +dofile(MP.."/splitter.lua") +dofile(MP.."/trisplitter.lua") +dofile(MP.."/filter.lua") +--dofile(MP.."/limiter.lua") +--dofile(MP.."/router.lua") diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..9c01ff8 --- /dev/null +++ b/mod.conf @@ -0,0 +1,5 @@ +name = digicontrol +description = Adds nodes to control the flow of digiline messages +depends = default, digilines +optional_depends = digiline_routing +min_minetest_version = 5.0 \ No newline at end of file diff --git a/override.lua b/override.lua new file mode 100644 index 0000000..c1003cc --- /dev/null +++ b/override.lua @@ -0,0 +1,81 @@ + +-- Override digilines.transmit and digilines.receptor_send to add more functionality +-- Mostly copied from https://github.com/minetest-mods/digilines/blob/master/internal.lua + + +local function queue_new() + return {nextRead = 1, nextWrite = 1} +end + +local function queue_empty(queue) + return queue.nextRead == queue.nextWrite +end + +local function queue_enqueue(queue, object) + local nextWrite = queue.nextWrite + queue[nextWrite] = object + queue.nextWrite = nextWrite + 1 +end + +local function queue_dequeue(queue) + local nextRead = queue.nextRead + local object = queue[nextRead] + queue[nextRead] = nil + queue.nextRead = nextRead + 1 + return object[1], object[2] +end + +function digilines.transmit(pos, channel, msg, checked, origin) + local checkedID = minetest.hash_node_position(pos) + if checked[checkedID] or not origin then + return + end + checked[checkedID] = true + + digilines.vm_begin() + local queue = queue_new() + queue_enqueue(queue, {pos, origin}) + while not queue_empty(queue) do + local curPos, fromPos = queue_dequeue(queue) + local node = digilines.get_node_force(curPos) + local spec = digilines.getspec(node) + if spec then + -- Effector actions --> Receive + if spec.effector then + spec.effector.action(curPos, node, channel, msg, fromPos) + end + -- Cable actions --> Transmit + local rules + -- Custom semiconductor def for digicontrol nodes + if spec.semiconductor then + rules = spec.semiconductor.rules(node, curPos, fromPos, channel) + elseif spec.wire then + rules = digilines.importrules(spec.wire.rules, node) + end + if rules then + for _, rule in ipairs(rules) do + local nextPos = digilines.addPosRule(curPos, rule) + if digilines.rules_link(curPos, nextPos) then + checkedID = minetest.hash_node_position(nextPos) + if not checked[checkedID] then + checked[checkedID] = true + queue_enqueue(queue, {nextPos, curPos}) + end + end + end + end + end + end + digilines.vm_end() +end + + +function digilines.receptor_send(pos, rules, channel, msg) + local checked = {} + checked[minetest.hash_node_position(pos)] = true -- exclude itself + for _,rule in ipairs(rules) do + if digilines.rules_link(pos, digilines.addPosRule(pos, rule)) then + digilines.transmit(digilines.addPosRule(pos, rule), channel, msg, checked, pos) + end + end +end diff --git a/splitter.lua b/splitter.lua new file mode 100644 index 0000000..623d2ef --- /dev/null +++ b/splitter.lua @@ -0,0 +1,46 @@ + +minetest.register_node("digicontrol:splitter", { + description = "Digilines Splitter", + inventory_image = "digicontrol_splitter.png", + tiles = { + "digicontrol_splitter.png", + "digicontrol_bottom.png", + "digicontrol_side.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png" + }, + drawtype = "nodebox", + node_box = digicontrol.node_box, + selection_box = digicontrol.selection_box, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {digicontrol = 1, dig_immediate = 2}, + digiline = { + semiconductor = { + rules = function(node, pos, from) + local side = digicontrol.get_side(pos, from, node.param2) + if side == 3 then + return { + digicontrol.get_rule(0, node.param2), + digicontrol.get_rule(2, node.param2) + } + elseif side == 0 or side == 2 then + return { + digicontrol.get_rule(3, node.param2) + } + end + end + }, + wire = { + rules = function(node) + return { + digicontrol.get_rule(0, node.param2), + digicontrol.get_rule(2, node.param2), + digicontrol.get_rule(3, node.param2) + } + end + } + } +}) diff --git a/textures/digicontrol_bottom.png b/textures/digicontrol_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae955c128f07634750247dc5337d322153ba888 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAmU_B4hDb=V9_%b+HsoP;_;!DS z?ng$4z;u73mzuke-PQ8n!d`5}%aHWUBi;4M#^{*4!Zo(SpSJLB49Vg++t%sM`Q}?` z)6b1XtIm5b)k{D4&SHDSACJ0s5;khik(U}6y(cuh(s$F(mDuce?-g51hD68h{T*UI zE^{P@TuWN?uC~i)*D8zed#cSexX+i*Z(TlnPlM~R1y<&B{0({D*2=BxTmY1%Q~loCICRUS#1CS literal 0 HcmV?d00001 diff --git a/textures/digicontrol_diode.png b/textures/digicontrol_diode.png new file mode 100644 index 0000000000000000000000000000000000000000..4a91d4c95389e9da49af7d29b90c252fc3e2f24a GIT binary patch literal 7603 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 literal 0 HcmV?d00001 diff --git a/textures/digicontrol_side_port.png b/textures/digicontrol_side_port.png new file mode 100644 index 0000000000000000000000000000000000000000..449d2b38ecb7ed7508e1677bfd949486b219a7ec GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|(>+}rLn>}fo#e^qWXR)OZ9Yvw zrR)tuXK-2G<(FX}>|z$2T-3EFVq^B~Ih(g`yB6iuX=wG_iQ{>DOuW@AvTgjlP1lrizlQ&x;QW%iXvQhyjpe6|flg%bboFyt I=akR{0Ey323;+NC literal 0 HcmV?d00001 diff --git a/textures/digicontrol_splitter.png b/textures/digicontrol_splitter.png new file mode 100644 index 0000000000000000000000000000000000000000..967f54e758e3cdf360e92e426738ed2fa4d1b91a GIT binary patch literal 8274 zcmd^Ec|6o>+yCLnknNG;QWM3LH+7w|@8IhDFM?xjb z*biwTWT^>R3&U7548zR4_dVl0&*%BP&*y#4^T+$wGk?r)=DL5^{=KjJy6^kONi!qy zwOiLB2qJD`eAFC41i?>1EzU02%rAWEVHF3d z7W_UTWw_yjfE_u;Q(ATEmszVOrd95*hL)JO`)#-XkhuO6iA2Kp@4UBzA%EY|$5Yxs zTWRV2%tgIEv~}_({Z_{Pd(4%d>MP5;2iI;YP#CN>D{~MnRT?aCu({uHn?bM99Zb|m zC32RO&C0S`)3b2t1R-G8f9>b(K4ihe%#?-lyAU7p(fjHlJrl0rsXKnSonNM8)yIT% z#^_?J!6B|bVIINfNB%>B{~+=oyj+8ye`Ro$s(yznH5yAvlf9Zf|#xy?Px^+1{^wGF(0%uHU{fQ+GhD!hg3S&L<3)xzPlZ0ED z+(e`-_{gbg6`|u?{rL6{+p98;4Y5frA={tG$=snd$*5hOtATyoQ&~l;!>R za;prRL%!JUFY4f$3tWFZ7>I%_?(unf(~j)W;hPDZdjjjbN9zD_tno=^KsdzjW;kQHrosv@m1;p4?pUY!j1$H~KDM=` zr}-g^4ZVhVygSrlzA`_bz~*`@smZb*39KI|EB6i;uMXZ?KGd8hRbWRuq zBkTUt?4X&eanU2=wDg@wtkvBI-g0Xf4#FW>Pd~Sd^pdXu5e%#dF$bsfnVK%KbeG5F ze(v0phh<@$#>Dkz+*rh~r_kI`QMGNGxe!4Q`p=DsZUht?@`9PGd(^+u(Nr8%oK_z+n6b zO+6R}v(3Gje%#0E&>-7nBd#z~U}wWvvd*c$n2Lsxb<8nivRPe1+fnSU8$L{?@&;3#r>BY91l}F!ceU^*9v(URQ zWxY6u4vN3G;eZk0iUs3nxQ5;>t-`}VPqT~bnKkKQ**Yr``o7+|^r;z8 zS$BnPa%%cDVFkNc>&`ejf_jHZncTn0LO6HCE-5;)f;+WrDrS0Sr&8-M{VMP&%Qk<( zn2M+GE}-P?N;#Xrq0317_C)$SYuxUq0&ddz+=ci-abNisdG>apneVC5c0JJrSN4D* z;~QFs?=R6hHr13>&`?+|A`m)rqp_PcwP&;(M(fgvz3dCZy(^99d_agcuctt#G7T#R+jwIBxm|C>$2cLRlZSxOVj~gc0e%!*-`UnhzQn-ZIisZayJe# zm}bA(89e22v(Iquat`;4;IpAybKB(nefV6TJ3A?jPf83W@0g9!(hU$F#|Nx)Ax`mX zertfA10Ejoq2nQ^!6YADOAO)Ajj_Jn^T3U)pT;LmeK`*~<_VlGk%4zId7$h#sDr@8 zJbM289WDR%TvGP=U{>o^qzSb??nU(%Ra3>|{-b zCI|?Kn2U^dKP%7jW)5K^vNA0=s!Rs(A)TXrzVYB7*79`(h-6E7(dSK(;A z9?8A3$4nc2X)Oh0iR_4GWQHwoOi5SY74PC0&i3={A<=_!hgnOai1Mv#M*Dk0G*`ZT zy7bMAYlDOiXx;sIFm1H5eiP84R&(RsoY;Mtr@Le0sYkKgrXL1Ih81-~w9fD6+a{Z) z(_0$MjuMOZdWLv)g$JJXd%qgK3HdN@i^oh!o$4- zAyT!+=~yGlQ#k>PEviTY8YiuHC%B3i=!}Y85o=q%lxH}nFdawM5*0lgGfFee%*uNu z0ZhrgOTsPly?dyq?b`#WAjRbkxe0t-WghyvixYX#=Vu-?*{&IwZ{Dm8immx^aq$GB znv=K+zia8GDF+exi*XHZsgWkHhDAe*te8lwMEWy8rx~D?mYZ8bUfdrCy6fR zez(q73}n ze50l7BWOzTKr0G`+R|Lcx5dC)u6|qJ(|h%qgcPK5W_kQm$#ytz03&U`j5e5ud#Fht zJA=v{d8Qj|+GLR}ogdPV+gjH~*ns$)v4835>$KA;leca*wB>f-6IOx=+D2Taz_YQ0 zAfd~DdKDBL=XJ4E^JOL%ClER^{A4q4V#D}KHcox%4XsbKOwIvyeslirTGhDa;wSohzXSlm##Kh`s9uBP9fM6<7WNSiA(vm3ZyIB8Z^B`Sgpf1BjIc@XCs z6_Am`-InSZ5#CWC15Iu?>5B`W6S<(~XGWvpN+Stbcj&@^j@hT7sd?{};OOTBPKDL6 z(&Zi=N|A@5K1^$BU|*5utvHE&@@(r?^%dtgxu^cLw&mqI{i5xE2)A5F;}lleb$s-O zfCPF@acjL){Hj+nxwpVnjIakq4MAcaK@cY<=}xKMyNcH*2QXUg&Quou9_H`gs0c&$ z@TVvF(~k4>MjEZvEE!ob3XYn){wKaBG}HMLp0w z{+4l@QPP5{#Q4^@W+#k1E!-%9mRdg*>Q8^n;zIU%}E9ugU!!k^s!_6L1$PQ;3A5AmnXUv z;4CZIa~5NaE0>Q0#r?5;hvln6X4DCKOYg6ZD@rB_DBuLH?__N#_jGwOgz4$LBexNx zU&<5D9#bXgY~2ssS?+1H$XT{m2cE}J9*;!zR|oEOMqbRle!Nw34RCVTNJfOp-P4n? z*5s?}FdAIn$iaB^ZLd|ya0Z2%CY+eym&9j?v+E#RQCj2-e<+zgu@y7`-fsb&ZF;)d zl}|24$ITes$QR;g2&C=bFe(AK!cA@pn;;}Kolg0KRn#3WWQ0=+4 zh1+d8n=c6~=rZ-sSXofV!bK6}37OV$!4CF1N00#cJ|h-oBU#WA?aT7?&HN@g0Uvh;=aTTyrHWK8T5k4!(=+@r=If3P$=(_(w=yE zX8vtJN2EePYyF_>q#TG>*ko@?!PEx+$}{BUF>XIU7#|_8EV+f~7U}PKgmLz4V5h%3 zWQ!>Vjbd8GR$qI2Srw#<;_0&c^r!vq6b(4oV8^TW^V@|;X+c;!HE}@0h<0`!p7|Dg zdb^O{Z|IhA7RZ?770aE1-rmgn|O&D_Q)2fmvX;>i1{et`DUnHyTL*fg?=1 z$Qo6CJZw^vlXoklBbH+<-y%l?nqG8HRh_tZQ;v6@A?0aM{}mPKKa^7%Erto6!dah+ z$ZCSUA28UH{!`@Gya9AhMoZqqyVQOwpcBujhIgD`>{*D3ZZcS-kdiklW5^}DIR8Cf z?_XISxiA+O8+#dKx>OBoNN9Oy;wueT!G|_}cu?~2 z{JGOGYjMrRy}g;M>uDG0{4YoAW+aSU1Hgsbkq)_>j0Bwuena6p_IyrvM}~o>4S*so zsy#-?+ak#nE_Ej>UC5@<>oCEQa}!Y=aqLxjUtr6i7XYBEHbJ7Ho*6)2i9?ZlpVd6U z&yK$!30xmxU2RyEu@ZOFnZq)y2krkKpgKgLR1+RJ^{DdlypP&;=*4VWH}oZ-&??=# z7|J3IO@WTyD7_B_(!9c0s6*pJz5Lw1@cL&}FWIY{)O3$R2J7)=3dS-<=*Ye-cKgIK)%8;uu`-F)>ARP1*E{X~NUL z!CA7@+klGnfXGy6=>5F-?ZKr3ZQjhYz`Qz8W> z8<&FIu(Rx@k1*S%C7tsO8;EA(=SjWWpL?CKh0v)V8p5J|pFtFmK*08D&NfWF25l#t z(Wde$c~3obU2lM5qrjUM9m~9Fq2&0xPOmfHC$hsD6;^Es2)P08DL`#Dd^Iq${P;damxt=&wVIEwPlE8&w1tDHjXw?zZ=>8g7j z?(9BKVcZqLv~#1fqGo^oeMUDp!?k(SUF&{ZspXaBX5kCXgfC}iIOz#z)bJ*X_{b?U zZFsnH{@fFVj~AQ1Tk=Xs`w-r+`SxvI-p!wii^mZdV>e)G+4M%wao!xuD%0)QU&a|8 zhve5G9_8heBmkZ)8{HavmN8W?Aql`ugQ{wVf64wv`yI|OqLe2%2dH4CQQX~k+aQtE z54BUk4(8WAXEIy0U{6exas_QYEr0^!{wBT9!|f#>MIaq;zxoUC(YGcfD@SV*P89R| zhD;l9!n3(xw>Yd-6qVwDkgtnntGdP*uUZ`9sA?(_AYd!wx4t(%S=e)tAAFoE)tI67 z9@;)vgYNVXh9|j1sQ|c9kMtk_IJh=_%DjB}Ds;=~Gz^2A9g9KLP5 zFC;Shl^7_jJctG{Z^F4tg7y2$9|m%!R%BQrv{X-c_jm10c>q}y8oEAzeidJ6hSRIr z3rhs!5hxemop>P;w)FL7r7_20jIos@NxpMsW||EB6=#>Xh<)f@QU{;-K}1Meq}vB~ zYwZ>yEpwfgnsOgyk2M(<8uK#o1ZVxO3*$MZGHbxBO+w4+{p8j};m_P~xiqlh(Uyga z4u=`tQX&D%9chTLcc!**57bOpv|wZ6`2f4Gd|+R3>CAgjJYi`CZM?FYw71;v@O3I~b{e_tvWHvCO+eRC#uT5|5P;2}v&yGUR=L4X^cZ4)z9Qp4>x zB53&bd$kmc#pWDJCj{x#%BYUb6)6mYV_L3<+eCyHn}Y}>gA=X+q2E9`YRt>f!X-`n zrV+5acOe;Fl)McrIbiobyYWncQZeAi;jAO^YqxXS4# z_^w7onitJs?x^99h$S_UmtNkXX-0ceDp|T!6~W19!s1REc{n)uJ{_&k`D!<^j`-n$ z5TLf-JstQnXP7G4EQ(Yt9OQ*zq^$dA2j*dO%_ii|=@Op6k?P~;{adRa(`BSuwjz)4 z3Gm>}p$$y=*2O<+71KCc>ex8pk`16&BQZ)3Gz(#?LKRLSeeAEdK5#w(BeUiV)7$fN z>GtL28ru;77oMg%)pFA!Pv5V_Au_MUYNs7_FRE3lUkBxI2fm`OudTGS^R+N0kcob& z2qqpeD;6I4cK2I3>LUPIbt_`Pw#4evcew%C(yr4srw%(I!IR!=7kouPj#*L1j1Hg( z!QYiiH`{MS0K~5@yn`!1`|)v_Y}kB$ea8<2V`SJo33If7q#X{w#GPPIbF3W}^3GS! z(YS2ggF!|Wt-_0s!D%9P^fyO{4cU9q|8+z3pKJcdMbJO)vi?aoaPD7Q2f+w0yB0?mcG$NQI73%VS%QQ#zpJ9) z?vSEqg6q#B{LxMJQxqjLS_$oi*!IzF(7ylH54a5@F(lpEMUJ*}kwng%jG}!zw-($! zQ-XiHV1~7=Q)G)-{T5GV2&6ISIFjFgYn*s~A6iq(Mab`(dV_50c0r1Xq1n-bU(R0o EAEG`Tn*aa+ literal 0 HcmV?d00001 diff --git a/textures/digicontrol_trisplitter.png b/textures/digicontrol_trisplitter.png new file mode 100644 index 0000000000000000000000000000000000000000..86e338a1a073c74c116853e54f8e34afd7ac2bf3 GIT binary patch literal 8307 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 literal 0 HcmV?d00001 diff --git a/trisplitter.lua b/trisplitter.lua new file mode 100644 index 0000000..e4774fd --- /dev/null +++ b/trisplitter.lua @@ -0,0 +1,44 @@ + +minetest.register_node("digicontrol:trisplitter", { + description = "Digilines Tri-Splitter", + inventory_image = "digicontrol_trisplitter.png", + tiles = { + "digicontrol_trisplitter.png", + "digicontrol_bottom.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png", + "digicontrol_side_port.png" + }, + drawtype = "nodebox", + node_box = digicontrol.node_box, + selection_box = digicontrol.selection_box, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {digicontrol = 1, dig_immediate = 2}, + digiline = { + semiconductor = { + rules = function(node, pos, from) + local side = digicontrol.get_side(pos, from, node.param2) + if side == 3 then + return { + digicontrol.get_rule(0, node.param2), + digicontrol.get_rule(1, node.param2), + digicontrol.get_rule(2, node.param2) + } + else + return { + digicontrol.get_rule(3, node.param2) + } + end + end + }, + wire = { + rules = function(node) + if node.param2 >= 4 then return {} end + return digicontrol.all_rules + end + } + } +})