sandboxels/mods/wifi_draw.js

88 lines
3.3 KiB
JavaScript
Raw Normal View History

2024-06-24 01:49:40 -04:00
// RedBirdly's mod to draw lines between transmitters/receivers
2024-08-09 09:47:10 -04:00
// logicgates.js or wifi.js required
2024-06-24 01:49:40 -04:00
let logicReceivers = [];
let logicTransmitters = [];
2024-08-09 09:47:10 -04:00
let receivers = [];
let transmitters = [];
2024-06-24 01:49:40 -04:00
function updateLogicLists() {
2024-08-09 09:47:10 -04:00
receivers = [];
transmitters = [];
2024-06-24 01:49:40 -04:00
logicReceivers = [];
logicTransmitters = [];
for (let i = 0; i < currentPixels.length; i++) {
const pixel = currentPixels[i];
if (pixel.element === "logic_receiver") {
logicReceivers.push(pixel);
} else if (pixel.element === "logic_transmitter") {
logicTransmitters.push(pixel);
2024-08-09 09:47:10 -04:00
} else if (pixel.element === "receiver") {
2024-06-24 01:49:40 -04:00
receivers.push(pixel);
} else if (pixel.element === "transmitter") {
transmitters.push(pixel);
2024-08-09 09:47:10 -04:00
}
2024-06-24 01:49:40 -04:00
}
}
// Function to draw lines between linked transmitters and receivers
function drawLinks() {
// Iterate through transmitters and receivers to draw lines for linked channels
for (const transmitter of logicTransmitters) {
for (const receiver of logicReceivers) {
if (transmitter.channel === receiver.channel) {
ctx.beginPath();
ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf);
ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf);
ctx.strokeStyle = "RGBA(255,255,255,0.2)";
const neighbors = [
{ x: transmitter.x, y: transmitter.y - 1 }, // Top
{ x: transmitter.x, y: transmitter.y + 1 }, // Bottom
{ x: transmitter.x - 1, y: transmitter.y }, // Left
{ x: transmitter.x + 1, y: transmitter.y } // Right
];
let highlight = false;
for (const neighbor of neighbors) {
if (
neighbor.x >= 0 && neighbor.x < width &&
neighbor.y >= 0 && neighbor.y < height
) {
const neighborPixel = pixelMap[neighbor.x][neighbor.y];
if (neighborPixel && neighborPixel.lstate > 0) {
highlight = true;
break;
}
}
}
if (highlight) {
ctx.strokeStyle = "RGBA(255,200,0,0.4)";
}
ctx.lineWidth = 2;
ctx.stroke();
}
}
}
2024-08-09 09:47:10 -04:00
// Iterate through transmitters and receivers to draw lines for linked channels
for (const transmitter of transmitters) {
for (const receiver of receivers) {
if (transmitter._channel === receiver._channel) {
ctx.beginPath();
ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf);
ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf);
ctx.strokeStyle = "RGBA(0,0,255,0.2)";
ctx.lineWidth = 2;
ctx.stroke();
}
}
}
2024-06-24 01:49:40 -04:00
}
2024-08-09 09:47:10 -04:00
renderPostPixel(updateLogicLists);
renderPostPixel(drawLinks);