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
@ElementW, this pull request has merge conflicts with the target branch. Please merge the latest changes and leave a message here so we can continue with the process of reviewing and merging this pull request. Thanks!
Note that this pull request will not be merged before 0.5.2, meaning it will have to be rebased onto the 0.5.2 1.20.1 branch closer to 0.5.2's release, so don't worry about fixing conflicts right now as there will more conflicts when the target branch is changed.
@PepperCode1 Thanks for the heads up. It gives me more time to add a few more features I might need to automate what I'm building, where the use cases add up over time to reveal APIs that may still be lacking in my implementation.
For example I'll be adding distanceTo(station_filter) to Stations soon™.
As for the 1.20 rebase I've already tried on my side and it was an almost trivial rebase so I'm not too worried.
actually I'd have a suggestion: CC should be able to get the arrivals like display boards do ykyk
Rebased onto 1.20.1 with #7453.