A WebSocket layer for interacting with ComputerCraft from Rust. Currently only tested with CC: Tweaked and CraftOS-PC.
CC: An implementation of what is considered ComputerCraft (i.e. CC: Tweaked.)
Host: The server hosting the websocket server and controlling the workers.
Worker: A ComputerCraft computer running the worker
program, connected to the Host.
This project is nowhere near completion. The fundamentals are in place, but there is a lot of work to be done.
To-Do List
- Documentation
- rustdoc
- README.md
- Error handling
- Lua error handling (using
pcall
) - Rust error handling
- Lua error handling (using
- Access to CC globals (
disk
,fs
,os
, etc.) - Execution of arbitrary Lua code
- Calling Lua files that are on the Worker
- Executing Lua code stored in or generated by the Host
- Named Workers
- Multiple Workers
- Two-way serialization
- Async request/response protocol
- Unwrapped peripheral access
- Attaching to arbitrary peripheral
- Calling arbitrary methods on peripherals
- Wrapped peripherals
- Standard peripherals (CC)
- Command block
- Computer
- Drive
- Modem
- Monitor
- Printer
- Speaker
- Advanced Peripherals
- Chat Box
- Energy Detector
- Environment Detector
- Player Detector
- Inventory Manager
- NBT Storage
- Block Reader
- Geo Scanner
- Redstone Integrator
- AR Controller
- ME Bridge
- RS Bridge (partially implemented)
- Colony Integrator (partially implemented)
- Create: Crafts & Additions
- Electric Motor
- Accumulator
- Portable Energy Interface
- Redstone Relay
- Digital Adapter
- Standard peripherals (CC)
It is not hard to have a CC program to dramatically drop the TPS on a server. This library is intended to enable offloading expensive computations from the Minecraft server onto a separate process.
It is also useful for people who, like me, are not fond of Lua, and find maintaining a substantial Lua program to be discouraging, to say the least.
use computercraft::Server;
use computercraft::peripheral::IntoWrappedPeripheral;
use computercraft::wrappers::monitor::Monitor;
let server = Server::listen();
let computer = server.wait_for_connection().await;
let peripheral = computer.find_peripheral("monitor_0").await.unwrap();
let monitor: Monitor = peripheral.into_wrapped().await.unwrap();
monitor.write("Hello from Rust!").await;
Copy the worker.lua
file and worker/
directory to the Worker(s). Decide if you wish to use a JSON config file or arguments (config file is recommended, see default_config.json
).
Option | Argument Pos. | JSON Key | Description | Default |
---|---|---|---|---|
Hostname | 1 (first) | hostname |
The hostname to connect to | N/A |
Port | 2 (second) | port |
The port the websocket is bound to | 56552 |
Secure | 3 (third) | secure |
Enables use of wss protocol |
false |
Name | 4 (fourth) | name |
The Worker name to be used by the Host | nil /null /None |
Reconnect | 5 (fifth) | reconnect |
Automatically reconnect when the socket closes or fails | true |
Debug | 6 (sixth) | debug |
Enable verbose logging | false |
The worker
command has two forms:
worker <arg list...>
: Argument form, the order is defined in the table above.worker <path to config JSON>
: Config file form, the JSON keys are also defined in the table above.
If you are using CraftOS-PC as your CC implementation, you can quickly initialize the computer (i.e. load the Lua code) by running the ./scripts/init_craftos.sh
script. There are a few options that you can read about by running ./scripts/init_craftos.sh --help
.
If you are running the Minecraft server and Host on the same computer, make sure you've
configured local IP access. If you are having trouble using the hostname localhost
, try 127.0.0.1
instead. I don't know why they're handled differently, but it reliably solves the issue for me.
IMPORTANT: If you are intending on sending large objects over the WebSocket (i.e. rsBridge.listItems()
), make sure you increase the websocket_message
value accordingly (NOTE: See CC: Tweaked issue #1566 [and the fix]). In my testing, using 4MiB (4194304
) seems to work in most cases.