From 24d6238d17d49717172146c922b281a35851f634 Mon Sep 17 00:00:00 2001 From: EmeraldBlock Date: Wed, 24 Nov 2021 22:43:39 -0600 Subject: [PATCH] only show acceptor belt if connected --- src/js/game/systems/acceptor_belt.js | 68 ++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/js/game/systems/acceptor_belt.js b/src/js/game/systems/acceptor_belt.js index 806efad9..10d4a7b2 100644 --- a/src/js/game/systems/acceptor_belt.js +++ b/src/js/game/systems/acceptor_belt.js @@ -2,7 +2,13 @@ import { globalConfig } from "../../core/config"; import { DrawParameters } from "../../core/draw_parameters"; import { Loader } from "../../core/loader"; import { Rectangle } from "../../core/rectangle"; -import { enumDirectionToAngle, enumInvertedDirections } from "../../core/vector"; +import { + enumDirection, + enumDirectionToAngle, + enumDirectionToVector, + enumInvertedDirections, + Vector, +} from "../../core/vector"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { MapChunkView } from "../map_chunk_view"; @@ -20,6 +26,50 @@ export class AcceptorBeltSystem extends GameSystemWithFilter { } } + /** + * Checks if a given tile is connected and has an ejector + * @param {Vector} tile + * @param {enumDirection} toDirection + * @returns {boolean} + */ + checkIsEjectorConnected(tile, toDirection) { + const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "regular"); + if (!contents) { + return false; + } + + const staticComp = contents.components.StaticMapEntity; + + // Check if its a belt, since then its simple + const beltComp = contents.components.Belt; + if (beltComp) { + return staticComp.localDirectionToWorld(beltComp.direction) === toDirection; + } + + // Check for an ejector + const ejectorComp = contents.components.ItemEjector; + if (ejectorComp) { + // Check each slot to see if its connected + for (let i = 0; i < ejectorComp.slots.length; ++i) { + const slot = ejectorComp.slots[i]; + const slotTile = staticComp.localTileToWorld(slot.pos); + + // Step 1: Check if the tile matches + if (!slotTile.equals(tile)) { + continue; + } + + // Step 2: Check if the direction matches + const slotDirection = staticComp.localDirectionToWorld(slot.direction); + if (slotDirection === toDirection) { + return true; + } + } + } + + return false; + } + /** * Draws a given chunk * @param {DrawParameters} parameters @@ -76,8 +126,20 @@ export class AcceptorBeltSystem extends GameSystemWithFilter { const direction = directions[j]; // Extract direction and angle - const worldDirection = staticComp.localDirectionToWorld(direction); - const angle = enumDirectionToAngle[enumInvertedDirections[worldDirection]]; + const worldDirection = + enumInvertedDirections[staticComp.localDirectionToWorld(direction)]; + const worldDirectionVector = enumDirectionToVector[worldDirection]; + const angle = enumDirectionToAngle[worldDirection]; + + // check if connected + if ( + !this.checkIsEjectorConnected( + transformedPos.sub(worldDirectionVector), + worldDirection + ) + ) { + continue; + } const clipRect = new Rectangle(0, 1 - beltLength, 1, beltLength);