Create
Create copied to clipboard
Add ComputerCraft integrations to more devices
Adds a handful of ComputerCraft integrations to mostly train-related devices. If merged I will expand the repo's wiki to document these APIs.
Train Station
- Emit CC events
train_imminent,train_arrivalandtrain_departurewhen these occur on the station - Add CC
canTrainReach(destination)function to test if the train stopped at the station can reach a (schedule-compatible) destination - Add CC
distanceTo(destination)function to get the shortest distance to a (schedule-compatible) destination at the moment, using the train stopped in the station
Train Signal
- Makes computer-controlled signals unable to be changed by external factors
- Emit CC event
train_signal_state_changewith the new state as parameter whenever the signal changes - Add CC
getState()function to get the current signal state - Add CC
isForcedRed()/setForcedRed(forced)functions to force the signal to be red, replacing redstone control - Add CC
getSignalType()/cycleSignalType()function to change the signal signal type in the same manner as using the wrench - Add CC
listBlockingTrainNames()function to list names of trains blocking the track group ahead of the signal
Train Observer
- Emit CC events
train_passing&train_passedwith the name of the train originating these events - Add CC
isTrainPassing()function to check passing train presence - Add CC
getPassingTrainName()function to get the passing train name, ornilfailing that
Creative Motor
- Add CC
{get,set}GeneratedSpeed()function get/set motor speed
Sticker
- Add CC
isExtended()function to check extension state - Add CC
extend()/retract()/toggle()to change the Sticker extension state, returning state change success
Speedometer
- Emit CC event
speed_change- 1 argument: speed (RPM)
Stressometer
- Emit CC event
overstressed - Emit CC event
stress_change- 2 arguments: stress (SU), capacity (SU)
Nixie Tubes
The big feature
- Makes computer-controlled Nixie Tubes unable to be changed by external factors (but can still be used as a Display Link source)
- Add CC
setText(text[, colour])function - Add CC
setTextColour(colour)function - Add CC
setSignal(first, second)function taking 2 tables describing the appearance of the first and second tube as custom train signals- Has controls for Red, Green, Blue, glow dot size (1-4 pixels on each axis), and blink interval (in a PWM fashion)
Direct nixie control, no need for a display link
Now featuring colour!
https://github.com/user-attachments/assets/5d3b9128-19a7-477e-b082-14057491e06a
Custom signals!
https://github.com/user-attachments/assets/2cc743d8-b8bc-45fb-9b9d-3ef021ab5f09
Code
Rotates the left tube through the Oklch hue wheel, and the right tube through the valid glow sizes
function oklch2oklab(l, c, h)
if h ~= h then -- Checks for NaN
return l, 0, 0
end
return l, c * math.cos(h * math.pi / 180), c * math.sin(h * math.pi / 180)
end
function oklab2rgb(l, a, b)
-- Convert OKLab to linear RGB
local l_ = l + 0.3963377774 * a + 0.2158037573 * b
local m_ = l - 0.1055613458 * a - 0.0638541728 * b
local s_ = l - 0.0894841775 * a - 1.2914855480 * b
local l_3 = l_ ^ 3
local m_3 = m_ ^ 3
local s_3 = s_ ^ 3
local r = 4.0767416621 * l_3 - 3.3077115913 * m_3 + 0.2309699292 * s_3
local g = -1.2684380046 * l_3 + 2.6097574011 * m_3 - 0.3413193965 * s_3
local b = -0.0041960863 * l_3 - 0.7034186147 * m_3 + 1.7076147010 * s_3
-- Convert linear RGB to sRGB
local function linearToSrgb(c)
if c <= 0.0031308 then
return 12.92 * c
else
return 1.055 * (c ^ (1 / 2.4)) - 0.055
end
end
r = linearToSrgb(r)
g = linearToSrgb(g)
b = linearToSrgb(b)
-- Clamp values to [0, 1] range
r = math.min(math.max(r, 0), 1)
g = math.min(math.max(g, 0), 1)
b = math.min(math.max(b, 0), 1)
return r * 255, g * 255, b * 255
end
t=peripheral.wrap("top")
i=0
gw = {
{1, 1},
{1, 2},
{1, 3},
{1, 4},
{2, 4},
{3, 4},
{4, 4},
{4, 3},
{4, 2},
{4, 1},
{3, 1},
{2, 1},
}
while true do
i = (i + 4) % 360
local r, g, b = oklab2rgb(oklch2oklab(0.5, 0.23, i))
local j = math.floor(i/16) % #gw
t.setSignal({r=r, g=g, b=b, glowWidth=1, glowHeight=1}, {glowWidth=gw[j+1][1], glowHeight=gw[j+1][2]})
sleep(0.05)
end
Clears & reset themselves when dis/connected from computers
https://github.com/user-attachments/assets/3f84b17e-76bb-4010-a5c9-20d527f14d9a