Minetest(mesecons mod)luacontroller基础教程

minetest(mesecons mod)luacontroller基础教程

原文:Mesecons - Luacontroller
mod:[Mod] Mesecons (= redstone) 红石 [GitHub] [minetest-mod-mesecons]

合成

image_2021-06-01-17-57-54

此图片转自原文

image_2021-06-01-17-59-15
并按下图摆成这样(其实也可以不用这样)

当你右键luacontroller时,就会弹出绿色方框,代码区域就在绿色方框内,当你输入完代码后,要点击execute按钮才能保存代码并执行,如果代码出现错误方框下面就会显示出错误信息

image_2021-06-01-17-59-39
代码出现错误

正文

第一章:输出

输入以下代码并执行,不出差错端口b就会亮起来

port.a = true

显然可以设置多个端口,不过注意一个luacontroller只有四个端口

port.a = true 
port.b = true 
port.c = true

当然可以让代码更短一点

port = {a=true, b=true, c=true}

编程控制器时,所有端口都会重置。但是,也可以手动关闭它们

port = {a=false, b=true, c=false, d=true}

不过要注意端口是在整个代码执行后设置的

以下的代码显然是不成立的

port.a = true port.a = false

print命令

print()

这个命令很简单,以下就是使用例子

print("Hello World!") 
print("What is the answer to life the universe and everything?") 
print(42) 
print({answer=42, question="unknown"}) 
print(port.c) print(port)

代码执行之后内容会显示在开启minetest的终端或者minetest一开始的黑色窗口

print命令不能打印多个函数,因此以下函数

print("ab", "cd")

应该改为

print("ab".."cd")

第二章:输入
输入寄存器叫“pin”

print(pin)

可以建立输入与输出的关系

port.b = pin.a

image_2021-06-01-17-58-37
注意a端口并没亮,只是连接a端口的mesecon亮了,mesecon之所以亮了也不是因为luacontroller
让我们看一下下面的代码

port.a = true 
port.b = pin.a

前一段代码不能被执行,因为端口是在整个代码执行后才设置的,但是第二段代码仍会执行

第三章:逻辑(这一章或许有点难)

你可以用luacontroller实现逻辑门,以下就是实现逻辑门的代码

与门

port.a = pin.b and pin.c

上面的代码的意思是:只有当端口b与端口c为true时(也就是两个端口都是亮着的时),端口a的值才能为true。

或门

port.a = pin.b or pin.c

上面的代码的意思是:只要端口b或端口c为true时(也可以它们两个都为true),端口a的值为true。

非门

port.a = not pin.b

上面的代码的意思是:当端口b的值为true时,端口a的值为false(跟true相反),当端口b的值为false时,端口a的值为true。

与非门

port.a = not (pin.b and pin.c)

上面的代码的意思是:只有当输入b与输入c都为false或只有其中一个输入为true时,端口a才能为true

或非门

port.a = not (pin.b or pin.c)

上面的代码的意思是:只有当输入b与输入c都为false时,端口a才能为true

异或门

port.a = pin.b ~= pin.c

上面的代码的意思是:只有当输入b与输入c不同值时(其实值也就两个,就是true与false),端口a才能为true

同或门

port.a = pin.b == pin.c

上面的代码的意思是:只有当输入b与输入c同值时,端口a才能为true

让我们看一个例子

if (pin.a and pin.b and (pin.b ~= pin.d)) then    
print("Lua rocks") 
end

上面的代码中,要打印出信息,必须要满足输出a与b都为true且输出b与输入d不同值

第四章:中断

中断的命令很简单,就是意思是中断的英语单词interrupt加括号,括号内加数字,数字就是一次中断所需的时间(单位为秒)。

interrupt(x)

中断命令基本上就是定时器,所以你可以利用此命令做成类似mc的红石循环。这里就不展示了

interrupt(1) print("execute")

上面的代码表示的是:每1秒打印信息到终端

您也可以将单个字符串传递到下一个呼叫

interrupt(1, "a parameter")

您可以使用访问参数
interrupt(0.5, “a parameter”)
print(event.iid)

x也不能太小,否则luacontroller会过热而停止工作,这在之后会详细讲

第五章:事件

如果代码被执行,肯定是有它的原因。它的原因就成为事件,可以通过print来查看事件

print(event)

事件分为以下四种

类型 当luacontroller编程后执行
on 此事件在激活端口时触发的。事件pin:端口名称(A/B/C/D)与xyz坐标
off 此事件在关闭端口触发的。事件pin:端口名称(A/B/C/D)与xyz坐标
interrupt 此事件是中断时触发的。事件中可用的其他信息。 iid: 中断中指定的 iid (时间, iid)
digiline 当收到数据线的信号时触发的。事件.频道:消息的通道:和事件.msg:消息的内容。

现在来做个简单的T翻转代码

if (event.type == "on" and event.pin.name == "B") then
port.a = not port.a
end

上面的代码的意思是:当B端口每次开启一次,A端口状态值就会成为它本来状态值的相反值。

第六章:记忆

这章节很简单:你可以将信息存储在mem中,只有你挖掘它至它变成掉落物时数据才会删除,或者luacontroller过热,可以在没有数据丢失的情况你编程

print (mem.var)
mem.var = "example"

执行此代码时,输出将为Nil,但在那之后,打印出来的是example,你需要靠挖掘luacontroller至它变成掉落物来删除数据,如果向luacontroller输入数据大小超过100k,会导致luacontroller过热

第七章:过热

前面的章节已经大致说明过热产生的后果。显然,过热是保护性能,以防止服务器奔溃(其实单人游戏里的房间也算服务器)。如果luacontroller没有足够的资源,就会过热,如果一秒之内执行超过二十个操作的话,在默认过热值下的luacontroller就会过热

interrupt(0.1)
port.a=not pin.b

多激活pin.b就可以看到luacontroller就像cpu超频超载工作散热不够似的萎了,表面变成红色,然后停止工作

你也可以设置比较慢的中断避免过热

如果程序在mem表使用比可用内存多,luacontroller也会过热。

1 个赞

照片补充:image_2021-06-01-17-57-54
image
image_2021-06-01-17-59-15


image_2021-06-01-17-59-39

image_2021-06-01-17-58-37

第八章,第九章,第十章请到原帖看,其实是我看不懂这些,丢人了(),不过不看这三章也对制造类似mc的机器没什么影响

准备今天更新第八,九,十章