Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ComputerCraft integrations to more devices (1.20.1 edition) #7453

Open
wants to merge 7 commits into
base: mc1.20.1/dev
Choose a base branch
from

Conversation

ElementW
Copy link

@ElementW ElementW commented Mar 1, 2025

Note

1.20.1 rebase of #6849. I haven't probed extensively for breakage, so testing is more than welcome.

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_arrival and train_departure when these occur on the station
    • 1 argument: train name
  • 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_change with 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_passed with 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, or nil failing 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)
      • setSignal() does partial display state update. Might be confusing, feedback welcome.

Direct nixie control, no need for a display link

Now featuring colour!

Nixie_text_cycling.mp4

Custom signals!

Nixie_custom_color_and_glow_size.mp4
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

Nixie_connect_and_reset.mp4

ElementW added 7 commits March 1, 2025 15:01
- 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
- Makes computer-controlled signals unable to be changed by external
  factors
- Emit CC event train_signal_state_change with 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
- Emit CC events train_imminent, train_arrival and train_departure when
  these occur on the station
- Add CC canTrainReach() function to test if the train stopped at the
  station can reach a (schedule-compatible) destination
- Add CC distanceTo() function to get the shortest distance to a
  (schedule-compatible) destination at the moment, using the train
  stopped in the station
- Emit CC events train_passing & train_passed with 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,
  or nil failing that
- Add CC {get,set}GeneratedSpeed() function get/set motor speed
- Add CC isExtended() function to check extension state
- Add CC extend()/retract()/toggle() to change the Sticker extension
  state, returning state change success.
- Emit CC event `overstressed` from Stressometers
- Emit CC event `stress_change` from Stressometers
  - 2 arguments: stress (SU), capacity (SU)
- Emit CC event `speed_change` from Speedometers
  - 1 argument: speed (RPM)
@Ordep-42
Copy link

Ordep-42 commented Mar 1, 2025

Very nice integration that opens a lot of possibilites, really hope it gets merged into the main mod!

@BirbIrl
Copy link

BirbIrl commented Mar 1, 2025

Very cool and would love to see it merged! i'm also currently working on a PR with CC integration for the StockTicker and packagers. Are you planning to work on that as well? You seem way better than me at this so maybe i should just leave the stage entirely for you. I barely managed to add tickers as new peripherals that just print any value after a good hour of bashing my head against CC's source

@ElementW
Copy link
Author

ElementW commented Mar 1, 2025

@BirbIrl I'm not planning on adding support for the new logistics stuff (as least yet, ADHD is a bitch and who knows I might still end up adding new things). Feel free to base your work on mine however, the ComputerEvent related code is probably what's going to be the most useful to you.

@BirbIrl
Copy link

BirbIrl commented Mar 1, 2025

@BirbIrl I'm not planning on adding support for the new logistics stuff (as least yet, ADHD is a bitch and who knows I might still end up adding new things). Feel free to base your work on mine however, the ComputerEvent related code is probably what's going to be the most useful to you.

Aye, going back to work on it (when my brain lets me, aspergers is a bitch), I'll try making it with your pr getting merged in mind 🫡

@VoidLeech VoidLeech added the pr type: feature PR adds a new feature or changes an existing feature label Mar 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
pr type: feature PR adds a new feature or changes an existing feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants