diff --git a/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua b/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua index 3a8f3a5c0..3ad2b6925 100644 --- a/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua +++ b/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua @@ -351,12 +351,12 @@ function run() -- Got a modem message, process it and add it to the rednet event queue local sModem, nChannel, nReplyChannel, tMessage = p1, p2, p3, p4 if isOpen(sModem) and (nChannel == os.getComputerID() or nChannel == CHANNEL_BROADCAST) then - if type(tMessage) == "table" and tMessage.nMessageID then - if not tReceivedMessages[tMessage.nMessageID] then - tReceivedMessages[tMessage.nMessageID] = true - tReceivedMessageTimeouts[os.startTimer(30)] = tMessage.nMessageID - os.queueEvent("rednet_message", nReplyChannel, tMessage.message, tMessage.sProtocol) - end + if type(tMessage) == "table" and type(tMessage.nMessageID) == "number" + and tMessage.nMessageID == tMessage.nMessageID and not tReceivedMessages[tMessage.nMessageID] + then + tReceivedMessages[tMessage.nMessageID] = true + tReceivedMessageTimeouts[os.startTimer(30)] = tMessage.nMessageID + os.queueEvent("rednet_message", nReplyChannel, tMessage.message, tMessage.sProtocol) end end diff --git a/src/test/java/dan200/computercraft/ingame/CraftOsTest.kt b/src/test/java/dan200/computercraft/ingame/CraftOsTest.kt new file mode 100644 index 000000000..8b3bef714 --- /dev/null +++ b/src/test/java/dan200/computercraft/ingame/CraftOsTest.kt @@ -0,0 +1,13 @@ +package dan200.computercraft.ingame + +import dan200.computercraft.ingame.api.GameTest +import dan200.computercraft.ingame.api.TestContext +import dan200.computercraft.ingame.api.checkComputerOk + +class CraftOsTest { + /** + * Sends a rednet message to another a computer and back again. + */ + @GameTest + suspend fun `Sends basic rednet messages`(context: TestContext) = context.checkComputerOk(13) +} diff --git a/src/test/server-files/computers/computer/11/startup.lua b/src/test/server-files/computers/computer/11/startup.lua index bcc6c8ee2..58cc42004 100644 --- a/src/test/server-files/computers/computer/11/startup.lua +++ b/src/test/server-files/computers/computer/11/startup.lua @@ -1,3 +1,5 @@ +-- TurtleTest.`Use compostors` + test.eq(true, turtle.dropDown(), "Drop items into compostor") test.ok() diff --git a/src/test/server-files/computers/computer/12/startup.lua b/src/test/server-files/computers/computer/12/startup.lua index d84bc4bdc..94513b754 100644 --- a/src/test/server-files/computers/computer/12/startup.lua +++ b/src/test/server-files/computers/computer/12/startup.lua @@ -1,3 +1,5 @@ +-- TurtleTest.`Cleaned with cauldrons` + local old_details = turtle.getItemDetail(1, true) test.assert(turtle.place(), "Dyed turtle") diff --git a/src/test/server-files/computers/computer/13/startup.lua b/src/test/server-files/computers/computer/13/startup.lua new file mode 100644 index 000000000..8c786ff4b --- /dev/null +++ b/src/test/server-files/computers/computer/13/startup.lua @@ -0,0 +1,14 @@ +-- CraftOsTest.`Sends basic rednet messages` + +rednet.open("top") + +rednet.send(14, "Test msg") + +local id, msg +repeat + id, msg = rednet.receive() + print(id, msg) +until id == 14 + +test.eq("Test msg", msg) +test.ok() diff --git a/src/test/server-files/computers/computer/14/startup.lua b/src/test/server-files/computers/computer/14/startup.lua new file mode 100644 index 000000000..dd81c8ecb --- /dev/null +++ b/src/test/server-files/computers/computer/14/startup.lua @@ -0,0 +1,7 @@ +-- CraftOsTest.`Sends basic rednet messages` + +rednet.open("top") +while true do + local id, msg, protocol = rednet.receive() + rednet.send(id, msg, protocol) +end diff --git a/src/test/server-files/computers/ids.json b/src/test/server-files/computers/ids.json index 6b4a94cbe..cbd91ed6c 100644 --- a/src/test/server-files/computers/ids.json +++ b/src/test/server-files/computers/ids.json @@ -1,3 +1,3 @@ { - "computer": 12 + "computer": 14 } \ No newline at end of file diff --git a/src/test/server-files/structures/craft_os_test.sends_basic_rednet_messages.snbt b/src/test/server-files/structures/craft_os_test.sends_basic_rednet_messages.snbt new file mode 100644 index 000000000..a6ce86eba --- /dev/null +++ b/src/test/server-files/structures/craft_os_test.sends_basic_rednet_messages.snbt @@ -0,0 +1,555 @@ +{ + size: [5, 5, 5], + entities: [], + blocks: [ + { + pos: [0, 0, 0], + state: 0 + }, + { + pos: [1, 0, 0], + state: 0 + }, + { + pos: [2, 0, 0], + state: 0 + }, + { + pos: [3, 0, 0], + state: 0 + }, + { + pos: [4, 0, 0], + state: 0 + }, + { + pos: [0, 0, 1], + state: 0 + }, + { + pos: [1, 0, 1], + state: 0 + }, + { + pos: [2, 0, 1], + state: 0 + }, + { + pos: [3, 0, 1], + state: 0 + }, + { + pos: [4, 0, 1], + state: 0 + }, + { + pos: [0, 0, 2], + state: 0 + }, + { + pos: [1, 0, 2], + state: 0 + }, + { + pos: [2, 0, 2], + state: 0 + }, + { + pos: [3, 0, 2], + state: 0 + }, + { + pos: [4, 0, 2], + state: 0 + }, + { + pos: [0, 0, 3], + state: 0 + }, + { + pos: [1, 0, 3], + state: 0 + }, + { + pos: [2, 0, 3], + state: 0 + }, + { + pos: [3, 0, 3], + state: 0 + }, + { + pos: [4, 0, 3], + state: 0 + }, + { + pos: [0, 0, 4], + state: 0 + }, + { + pos: [1, 0, 4], + state: 0 + }, + { + pos: [2, 0, 4], + state: 0 + }, + { + pos: [3, 0, 4], + state: 0 + }, + { + pos: [4, 0, 4], + state: 0 + }, + { + nbt: { + Label: "Echo", + id: "computercraft:computer_advanced", + ComputerId: 14, + On: 1b + }, + pos: [1, 1, 2], + state: 1 + }, + { + nbt: { + Label: "Main", + id: "computercraft:computer_advanced", + ComputerId: 13, + On: 1b + }, + pos: [3, 1, 2], + state: 2 + }, + { + nbt: { + id: "computercraft:wireless_modem_normal" + }, + pos: [1, 2, 2], + state: 3 + }, + { + nbt: { + id: "computercraft:wireless_modem_normal" + }, + pos: [3, 2, 2], + state: 3 + }, + { + pos: [0, 1, 0], + state: 4 + }, + { + pos: [1, 1, 0], + state: 4 + }, + { + pos: [2, 1, 0], + state: 4 + }, + { + pos: [3, 1, 0], + state: 4 + }, + { + pos: [4, 1, 0], + state: 4 + }, + { + pos: [0, 2, 0], + state: 4 + }, + { + pos: [1, 2, 0], + state: 4 + }, + { + pos: [2, 2, 0], + state: 4 + }, + { + pos: [3, 2, 0], + state: 4 + }, + { + pos: [4, 2, 0], + state: 4 + }, + { + pos: [0, 3, 0], + state: 4 + }, + { + pos: [1, 3, 0], + state: 4 + }, + { + pos: [2, 3, 0], + state: 4 + }, + { + pos: [3, 3, 0], + state: 4 + }, + { + pos: [4, 3, 0], + state: 4 + }, + { + pos: [0, 4, 0], + state: 4 + }, + { + pos: [1, 4, 0], + state: 4 + }, + { + pos: [2, 4, 0], + state: 4 + }, + { + pos: [3, 4, 0], + state: 4 + }, + { + pos: [4, 4, 0], + state: 4 + }, + { + pos: [0, 1, 1], + state: 4 + }, + { + pos: [1, 1, 1], + state: 4 + }, + { + pos: [2, 1, 1], + state: 4 + }, + { + pos: [3, 1, 1], + state: 4 + }, + { + pos: [4, 1, 1], + state: 4 + }, + { + pos: [0, 2, 1], + state: 4 + }, + { + pos: [1, 2, 1], + state: 4 + }, + { + pos: [2, 2, 1], + state: 4 + }, + { + pos: [3, 2, 1], + state: 4 + }, + { + pos: [4, 2, 1], + state: 4 + }, + { + pos: [0, 3, 1], + state: 4 + }, + { + pos: [1, 3, 1], + state: 4 + }, + { + pos: [2, 3, 1], + state: 4 + }, + { + pos: [3, 3, 1], + state: 4 + }, + { + pos: [4, 3, 1], + state: 4 + }, + { + pos: [0, 4, 1], + state: 4 + }, + { + pos: [1, 4, 1], + state: 4 + }, + { + pos: [2, 4, 1], + state: 4 + }, + { + pos: [3, 4, 1], + state: 4 + }, + { + pos: [4, 4, 1], + state: 4 + }, + { + pos: [0, 1, 2], + state: 4 + }, + { + pos: [2, 1, 2], + state: 4 + }, + { + pos: [4, 1, 2], + state: 4 + }, + { + pos: [0, 2, 2], + state: 4 + }, + { + pos: [2, 2, 2], + state: 4 + }, + { + pos: [4, 2, 2], + state: 4 + }, + { + pos: [0, 3, 2], + state: 4 + }, + { + pos: [1, 3, 2], + state: 4 + }, + { + pos: [2, 3, 2], + state: 4 + }, + { + pos: [3, 3, 2], + state: 4 + }, + { + pos: [4, 3, 2], + state: 4 + }, + { + pos: [0, 4, 2], + state: 4 + }, + { + pos: [1, 4, 2], + state: 4 + }, + { + pos: [2, 4, 2], + state: 4 + }, + { + pos: [3, 4, 2], + state: 4 + }, + { + pos: [4, 4, 2], + state: 4 + }, + { + pos: [0, 1, 3], + state: 4 + }, + { + pos: [1, 1, 3], + state: 4 + }, + { + pos: [2, 1, 3], + state: 4 + }, + { + pos: [3, 1, 3], + state: 4 + }, + { + pos: [4, 1, 3], + state: 4 + }, + { + pos: [0, 2, 3], + state: 4 + }, + { + pos: [1, 2, 3], + state: 4 + }, + { + pos: [2, 2, 3], + state: 4 + }, + { + pos: [3, 2, 3], + state: 4 + }, + { + pos: [4, 2, 3], + state: 4 + }, + { + pos: [0, 3, 3], + state: 4 + }, + { + pos: [1, 3, 3], + state: 4 + }, + { + pos: [2, 3, 3], + state: 4 + }, + { + pos: [3, 3, 3], + state: 4 + }, + { + pos: [4, 3, 3], + state: 4 + }, + { + pos: [0, 4, 3], + state: 4 + }, + { + pos: [1, 4, 3], + state: 4 + }, + { + pos: [2, 4, 3], + state: 4 + }, + { + pos: [3, 4, 3], + state: 4 + }, + { + pos: [4, 4, 3], + state: 4 + }, + { + pos: [0, 1, 4], + state: 4 + }, + { + pos: [1, 1, 4], + state: 4 + }, + { + pos: [2, 1, 4], + state: 4 + }, + { + pos: [3, 1, 4], + state: 4 + }, + { + pos: [4, 1, 4], + state: 4 + }, + { + pos: [0, 2, 4], + state: 4 + }, + { + pos: [1, 2, 4], + state: 4 + }, + { + pos: [2, 2, 4], + state: 4 + }, + { + pos: [3, 2, 4], + state: 4 + }, + { + pos: [4, 2, 4], + state: 4 + }, + { + pos: [0, 3, 4], + state: 4 + }, + { + pos: [1, 3, 4], + state: 4 + }, + { + pos: [2, 3, 4], + state: 4 + }, + { + pos: [3, 3, 4], + state: 4 + }, + { + pos: [4, 3, 4], + state: 4 + }, + { + pos: [0, 4, 4], + state: 4 + }, + { + pos: [1, 4, 4], + state: 4 + }, + { + pos: [2, 4, 4], + state: 4 + }, + { + pos: [3, 4, 4], + state: 4 + }, + { + pos: [4, 4, 4], + state: 4 + } + ], + palette: [ + { + Name: "minecraft:polished_andesite" + }, + { + Properties: { + facing: "north", + state: "on" + }, + Name: "computercraft:computer_advanced" + }, + { + Properties: { + facing: "north", + state: "blinking" + }, + Name: "computercraft:computer_advanced" + }, + { + Properties: { + waterlogged: "false", + facing: "down", + on: "true" + }, + Name: "computercraft:wireless_modem_normal" + }, + { + Name: "minecraft:air" + } + ], + DataVersion: 2230 +}