Описание
# CC: Relative Routing
CC: Relative Routing adds two ComputerCraft peripherals that lets you interact with the world using **relative coordinates** instead of peripheral IDs, making your programs portable and reproducible.
---
## Blocks
### Redstone Router
Send wireless redstone signals to relative coordinates and block faces.
Connect a CC computer to the Redstone Router, then use the `redstone_router` peripheral:
```lua
local router = peripheral.find("redstone_router")
-- Power the north face of the block 3 east, 0 up, 2 north of the router
router.setRedstone(3, 0, -2, "north", 15)
-- Read redstone
print(router.getRedstone(3, 0, -2, "north")) -- 15
-- Remove all active signals
router.clearAll()
```
**API**
| Method | Description |
|--------|-------------|
| `setRedstone(x, y, z, side, power)` | Sets a redstone signal (power 0–15) on the given face of the target block. Power 0 removes the signal. |
| `getRedstone(x, y, z, side)` | Returns the currently stored power for that offset + face. |
| `clearAll()` | Removes all active signals from this router. |
`side` is one of: `north` `south` `east` `west` `up` `down`
---
### Peripheral Router
Wrap any CC-compatible peripheral nearby using relative coordinates instead of a peripheral name or side. The peripheral can be used as if it was connected to the computer.
```lua
local router = peripheral.find("peripheral_router")
-- Wrap a monitor at offset (3, 0, 0)
local mon = router.wrap(3, 0, 0)
mon.setTextScale(1)
mon.clear()
mon.setCursorPos(1, 1)
mon.write("Hello from relative routing!")
-- Check what's at an offset before wrapping
if router.isPresent(0, 2, 0) then
print(router.getType(0, 2, 0)) -- e.g. "monitor"
print(router.getMethods(0, 2, 0)) -- list all methods
end
-- Call a single method without wrapping
router.call(3, 0, 0, "write", "Hello")
-- You can even move fluids
local input_fluid_tank = router.wrap(1,0,0)
local output_fluid_tank = router.wrap(3,0,0)
local moved = output_fluid_tank.pullFluid(input_fluid_tank, 1000, "minecraft:water")
print(moved .. " mB moved")
```
**API**
| Method | Description |
|--------|-------------|
| `wrap(x, y, z)` | Returns a proxy object with all the target peripheral's methods. Prefer this for interacting with peripherals. |
| `isPresent(x, y, z)` | Returns `true` if a peripheral exists at the offset. |
| `getType(x, y, z)` | Returns the peripheral type string, or `nil` if none. |
| `getMethods(x, y, z)` | Returns a table of all method names on the peripheral. |
| `call(x, y, z, method, ...)` | Calls a single named method. Note: may return `nil` for value-returning methods. Use `wrap()` when you need return values. |
> Coordinates are relative to the Peripheral Router block itself. Works with any CC:Tweaked peripheral: monitors, speakers, disk drives, modems, and peripherals added by other mods.
---
## Target Wand
The **Target Wand** is a helper item that prints the correct relative coordinates for any block relative to a router, so you never have to count blocks manually.
**Usage:**
1. Right-click a **Redstone Router** or **Peripheral Router** to select it as the controller.
2. Right-click any other block to print the relative coordinates and a ready-to-use Lua snippet in chat.
For Peripheral Router targets, it also detects what peripheral (if any) is at that position.
---
## Configuration
The config file is at `config/ccrelativerouting-common.toml`.
| Option | Default | Description |
|--------|---------|-------------|
| `maxRange` | `128` | Maximum distance for Redstone Router offsets |
| `peripheralMaxRange` | `128` | Maximum distance for Peripheral Router offsets |