About the infinite crossing loop.
Can’t you just store the crucible entity they connect to when you place a crossing, so they relay the crucible entity?
This way, whatever crucible they find first halts the search as you place the crossing. If the user is dumb enough to connect two crucibles to the same crossing they get whatever crucible the crossing found first, which would be deterministic but a dumb way of doing it.
Or can’t you save that information in the crossing tile?
I mean, that would save a lot of performance as you only search for a crucible when you place the crossing.
Issues would be if users place the crossing before the crucible. But the crucible could of course check for nearby crossings and have them refresh their searches. This is the only time they “lock” so to speak.
Another issue of course would be if the crucible goes POOF. But again, you could either update the crossings connected to it or you could have a check to see if the crucible still exists at the stored location. The latter is probably safer as there’s block moving mods out there.