Lua / Computercraft听还能起作用吗?

时间:2013-03-28 02:38:50

标签: lua listener minecraft computercraft

我正在尝试使用computercraft在Tekkit上创建计算机系统/网络。

Computecraft是一种基于Lua的修改,在Minecraft / Tekkit和其他修改包中运行。

基本上,我目前正在使用无线路由器执行此操作:

rednet.open('top') -- Open Connection to the wireless router
print ("test")
input = read()
rednet.receive()  -- Listen for messages send/broadcasted 

if message then
 print (message)
end

我正在尝试对我的所有系统执行更改,如下所示:

rednet.open ('top')
 -- Do all normal stuff

rednet.receive()
if message == "Lock202" then 
 os.pullEvent = os.pullEventRaw
 term.clear()
 term.setCursorPos(1,1)
 print ("Alert In Progress, Terminal Locked")
end

通过做所有正常的事情,我希望用户能够导航和使用计算机的功能。但是当呼叫rednet.receive()时,它会冻结并等待收到的消息。

我希望它在后台运行,并且仅在收到消息时才会执行。

我试过看文档,帮助。并且考虑将这个问题提交给SO,因为可以使用Lua Coders。

3 个答案:

答案 0 :(得分:2)

http://computercraft.info/wiki/Parallel.waitForAll

这是一个基本多线程你的程序的函数......所以你可以做...

function listen()
 while true do
  id, msg, distance = rednet.receive()
  FUNCTION_THAT_RUNS_STUFF(id, msg, distance)
  sleep(1)
 end
end

function main_loop()
 while true do
  --do your other stuff in here
 end
end

--end of file run everything
parrallel.waitForAll(listen, main_loop)

答案 1 :(得分:0)

命令rednet.receive()可以在其参数中包含一个参数,即“超时”。

这是以秒为单位测量的。它也是一个浮点数(十进制),例如4.50,1.23。等

这意味着它会在那段时间内收到。

实现所需内容的一种好方法是让另一台计算机不断接收消息,然后向计算机发出红石信号,以便进行模块化接收和写入

的内容。
function Check()
  If rs.getInput("back") then
     local id, message = rednet.receive(5)
     print("Receiving Message")
  end
end

另一台计算机会这样做:

computerid = 50

id, message = rednet.receive()
  rs.setOutput("back",true)
  sleep(1)
  rednet.send(computerid, message)
  rs.setOutput("back",false)

计算机ID将等于您想要运行的原始计算机的ID。您还必须在运行代码时定期使用Check()函数,除非收到消息,否则它将不会影响计算机,在这种情况下它接收“rednet.receive”中指定的时间量参数。

希望这有帮助

- EwilDawe

答案 2 :(得分:0)

我做的是我有1台运行os.pullEvent,还有一些其他的收集信息并通过rednet发送,这使得只有一台PC被卡住了,尽管事实上其他的都很漂亮非常不可用,当然如果你做了我所做的,你可以让它检测密钥和rednet_message等等。