diff --git a/src/main/java/org/terasology/signalling/componentSystem/ScrewdriverSystem.java b/src/main/java/org/terasology/signalling/componentSystem/ScrewdriverSystem.java index 2abe262..cc3f70a 100644 --- a/src/main/java/org/terasology/signalling/componentSystem/ScrewdriverSystem.java +++ b/src/main/java/org/terasology/signalling/componentSystem/ScrewdriverSystem.java @@ -15,6 +15,8 @@ */ package org.terasology.signalling.componentSystem; +import org.joml.RoundingMode; +import org.joml.Vector3i; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.ReceiveEvent; import org.terasology.entitySystem.systems.BaseComponentSystem; @@ -25,7 +27,6 @@ import org.terasology.math.JomlUtil; import org.terasology.math.Rotation; import org.terasology.math.Side; -import org.terasology.math.geom.Vector3i; import org.terasology.registry.In; import org.terasology.signalling.components.RotateableByScrewdriverComponent; import org.terasology.signalling.components.ScrewdriverComponent; @@ -71,7 +72,7 @@ public void initialise() { public void rotateGate(ActivateEvent event, EntityRef screwdriver) { final EntityRef target = event.getTarget(); if (target.hasComponent(RotateableByScrewdriverComponent.class)) { - final Vector3i targetLocation = new Vector3i(JomlUtil.from(event.getTargetLocation())); + final Vector3i targetLocation = new Vector3i(event.getTargetLocation(), RoundingMode.FLOOR); final Block block = worldProvider.getBlock(targetLocation); final BlockFamily blockFamily = block.getBlockFamily(); if (blockFamily instanceof SideDefinedBlockFamily) { diff --git a/src/main/java/org/terasology/signalling/componentSystem/SignalNetworkNode.java b/src/main/java/org/terasology/signalling/componentSystem/SignalNetworkNode.java index 87d9d39..3008f38 100644 --- a/src/main/java/org/terasology/signalling/componentSystem/SignalNetworkNode.java +++ b/src/main/java/org/terasology/signalling/componentSystem/SignalNetworkNode.java @@ -15,6 +15,7 @@ */ package org.terasology.signalling.componentSystem; +import org.joml.Vector3ic; import org.terasology.blockNetwork.NetworkNode; import org.terasology.math.geom.Vector3i; @@ -28,7 +29,7 @@ public enum Type { private Type type; - public SignalNetworkNode(Vector3i location, byte inputSides, byte outputSides, Type type) { + public SignalNetworkNode(Vector3ic location, byte inputSides, byte outputSides, Type type) { super(location, inputSides, outputSides); this.type = type; } diff --git a/src/main/java/org/terasology/signalling/componentSystem/SignalSwitchBehaviourSystem.java b/src/main/java/org/terasology/signalling/componentSystem/SignalSwitchBehaviourSystem.java index 726312a..60cb233 100644 --- a/src/main/java/org/terasology/signalling/componentSystem/SignalSwitchBehaviourSystem.java +++ b/src/main/java/org/terasology/signalling/componentSystem/SignalSwitchBehaviourSystem.java @@ -20,6 +20,9 @@ import gnu.trove.iterator.TObjectLongIterator; import gnu.trove.map.TObjectLongMap; import gnu.trove.map.hash.TObjectLongHashMap; +import org.joml.RoundingMode; +import org.joml.Vector3f; +import org.joml.Vector3i; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.blockNetwork.BlockNetworkUtil; @@ -38,9 +41,6 @@ import org.terasology.logic.delay.DelayedActionTriggeredEvent; import org.terasology.logic.location.LocationComponent; import org.terasology.math.Side; -import org.terasology.math.geom.ImmutableVector3i; -import org.terasology.math.geom.Vector3f; -import org.terasology.math.geom.Vector3i; import org.terasology.registry.CoreRegistry; import org.terasology.registry.In; import org.terasology.signalling.components.SignalConsumerAdvancedStatusComponent; @@ -100,7 +100,7 @@ public class SignalSwitchBehaviourSystem extends BaseComponentSystem implements private Set activatedPressurePlates = Sets.newHashSet(); - private TObjectLongMap gateLastSignalChangeTime = new TObjectLongHashMap<>(); + private TObjectLongMap gateLastSignalChangeTime = new TObjectLongHashMap<>(); private long lastSignalCleanupExecuteTime; @@ -139,7 +139,7 @@ public void handleGateSignalChange(EntityRef entity) { public void handleDelayedTrigger(String actionId, EntityRef entity) { if (processOutputForNormalGate(entity)) { BlockComponent block = entity.getComponent(BlockComponent.class); - gateLastSignalChangeTime.put(new ImmutableVector3i(block.getPosition()), time.getGameTimeInMs()); + gateLastSignalChangeTime.put(block.getPosition(new Vector3i()), time.getGameTimeInMs()); } } }; @@ -159,7 +159,7 @@ public void handleGateSignalChange(EntityRef entity) { public void handleDelayedTrigger(String actionId, EntityRef entity) { if (processOutputForRevertedGate(entity)) { BlockComponent block = entity.getComponent(BlockComponent.class); - gateLastSignalChangeTime.put(new ImmutableVector3i(block.getPosition()), time.getGameTimeInMs()); + gateLastSignalChangeTime.put(block.getPosition(new Vector3i()), time.getGameTimeInMs()); } } }); @@ -201,7 +201,7 @@ public void handleGateSignalChange(EntityRef entity) { public void handleDelayedTrigger(String actionId, EntityRef entity) { if (processOutputForSetResetGate(entity)) { BlockComponent block = entity.getComponent(BlockComponent.class); - gateLastSignalChangeTime.put(new ImmutableVector3i(block.getPosition()), time.getGameTimeInMs()); + gateLastSignalChangeTime.put(block.getPosition(new Vector3i()), time.getGameTimeInMs()); } } }); @@ -256,7 +256,7 @@ public void delayedTriggerOnSignalGate(DelayedActionTriggeredEvent event, Entity private void deleteOldSignalChangesForGates() { long worldTime = time.getGameTimeInMs(); if (lastSignalCleanupExecuteTime + SIGNAL_CLEANUP_INTERVAL < worldTime) { - final TObjectLongIterator iterator = gateLastSignalChangeTime.iterator(); + final TObjectLongIterator iterator = gateLastSignalChangeTime.iterator(); while (iterator.hasNext()) { iterator.advance(); if (iterator.value() + GATE_MINIMUM_SIGNAL_CHANGE_INTERVAL < worldTime) { @@ -360,8 +360,8 @@ private void handlePressurePlateEvents() { Iterable players = entityManager.getEntitiesWith(CharacterComponent.class, LocationComponent.class); for (EntityRef player : players) { - Vector3f playerLocation = player.getComponent(LocationComponent.class).getWorldPosition(); - Vector3i locationBeneathPlayer = new Vector3i(playerLocation.x + 0.5f, playerLocation.y - 0.5f, playerLocation.z + 0.5f); + Vector3f playerLocation = player.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()); + Vector3i locationBeneathPlayer = new Vector3i(playerLocation.add(0.5f, -0.5f, 0.5f), RoundingMode.FLOOR); Block blockBeneathPlayer = worldProvider.getBlock(locationBeneathPlayer); if (blockBeneathPlayer == signalPressurePlate) { EntityRef entityBeneathPlayer = blockEntityRegistry.getBlockEntityAt(locationBeneathPlayer); @@ -423,7 +423,7 @@ public void configureTimeDelay(SetSignalDelayEvent event, EntityRef entity) { @ReceiveEvent(components = {BlockComponent.class, SignalProducerComponent.class}) public void producerActivated(ActivateEvent event, EntityRef entity) { SignalProducerComponent producerComponent = entity.getComponent(SignalProducerComponent.class); - Vector3i blockLocation = new Vector3i(entity.getComponent(BlockComponent.class).getPosition()); + Vector3i blockLocation = entity.getComponent(BlockComponent.class).getPosition(new Vector3i()); Block blockAtLocation = worldProvider.getBlock(blockLocation); if (blockAtLocation == signalTransformer) { signalTransformerActivated(entity, producerComponent); @@ -549,7 +549,7 @@ public void gateConsumerModified(OnChangedComponent event, EntityRef entity, Sig public void consumerModified(OnChangedComponent event, EntityRef entity) { if (entity.hasComponent(BlockComponent.class)) { SignalConsumerStatusComponent consumerStatusComponent = entity.getComponent(SignalConsumerStatusComponent.class); - Vector3i blockLocation = new Vector3i(entity.getComponent(BlockComponent.class).getPosition()); + Vector3i blockLocation = entity.getComponent(BlockComponent.class).getPosition(new Vector3i()); Block block = worldProvider.getBlock(blockLocation); SignalConsumerComponent signalConsumerComponent = entity.getComponent(SignalConsumerComponent.class); @@ -609,7 +609,7 @@ private void delayGateSignalChangeIfNeeded(EntityRef entity, String actionId) { // Schedule for the gate to be looked either immediately (during "update" method) or at least // GATE_MINIMUM_SIGNAL_CHANGE_INTERVAL from the time it has last changed, whichever is later long delay; - final ImmutableVector3i location = new ImmutableVector3i(entity.getComponent(BlockComponent.class).getPosition()); + final Vector3i location = entity.getComponent(BlockComponent.class).getPosition(new Vector3i()); if (gateLastSignalChangeTime.containsKey(location)) { delay = gateLastSignalChangeTime.get(location) + GATE_MINIMUM_SIGNAL_CHANGE_INTERVAL - time.getGameTimeInMs(); } else { diff --git a/src/main/java/org/terasology/signalling/componentSystem/SignalSystem.java b/src/main/java/org/terasology/signalling/componentSystem/SignalSystem.java index 45ec1ba..c8c1b32 100644 --- a/src/main/java/org/terasology/signalling/componentSystem/SignalSystem.java +++ b/src/main/java/org/terasology/signalling/componentSystem/SignalSystem.java @@ -20,9 +20,12 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nullable; +import org.joml.Vector3i; +import org.joml.Vector3ic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.blockNetwork.BlockNetworkUtil; @@ -42,7 +45,6 @@ import org.terasology.math.JomlUtil; import org.terasology.math.Side; import org.terasology.math.SideBitFlag; -import org.terasology.math.geom.Vector3i; import org.terasology.registry.In; import org.terasology.signalling.components.SignalConductorComponent; import org.terasology.signalling.components.SignalConsumerAdvancedStatusComponent; @@ -96,7 +98,8 @@ public class SignalSystem extends BaseComponentSystem implements UpdateSubscribe private Set modifiedConsumers = Sets.newHashSet(); // Used to store signal for consumer from networks - private Map, NetworkSignals>> consumerSignalInNetworks = Maps.newHashMap(); + private Map, NetworkSignals>> consumerSignalInNetworks = + Maps.newHashMap(); private long lastUpdate; @@ -133,7 +136,8 @@ public void update(float delta) { */ private void updateSignals() { // Gather all networks that might have their signal state modified - Set> networksToRecalculate = Sets.newHashSet(signalNetworkState.consumeNetworksToRecalculate()); + Set> networksToRecalculate = + Sets.newHashSet(signalNetworkState.consumeNetworksToRecalculate()); // This includes networks with modified producers appendNetworksContainingModifiedProducer(networksToRecalculate); @@ -154,7 +158,8 @@ private void updateSignals() { } // Update signals of consumers that have been changed in networks that are not going to be recalculated - for (SignalNetworkNode modifiedConsumer : Iterables.concat(modifiedConsumers, signalNetworkState.consumeConsumersToRecalculate())) { + for (SignalNetworkNode modifiedConsumer : Iterables.concat(modifiedConsumers, + signalNetworkState.consumeConsumersToRecalculate())) { for (Network2 network : signalNetwork.getNetworks()) { if (!networksToRecalculate.contains(network) && network.hasLeafNode(modifiedConsumer)) { NetworkSignals consumerSignalInNetwork = getConsumerSignalInNetwork(network, modifiedConsumer); @@ -172,10 +177,13 @@ private void updateSignals() { // Set consumer status changes for (SignalNetworkNode consumerToEvaluate : consumersToEvaluate) { if (signalNetwork.containsLeafNode(consumerToEvaluate)) { - final EntityRef blockEntity = blockEntityRegistry.getBlockEntityAt(consumerToEvaluate.location.toVector3i()); - final SignalConsumerComponent consumerComponent = blockEntity.getComponent(SignalConsumerComponent.class); + final EntityRef blockEntity = + blockEntityRegistry.getBlockEntityAt(consumerToEvaluate.location.toVector3i()); + final SignalConsumerComponent consumerComponent = + blockEntity.getComponent(SignalConsumerComponent.class); if (consumerComponent != null) { - Map, NetworkSignals> consumerSignals = consumerSignalInNetworks.get(consumerToEvaluate); + Map, NetworkSignals> consumerSignals = + consumerSignalInNetworks.get(consumerToEvaluate); removeStaleSignals(consumerToEvaluate, consumerSignals); processSignalConsumerResult(consumerSignals.values(), consumerComponent, blockEntity); @@ -186,36 +194,31 @@ private void updateSignals() { /** * Finds the consumers in a network + * * @param network The network to query for Consumers * @return The consumers on the given network */ private Iterable getConsumersInNetwork(Network2 network) { - return Iterables.filter(network.getLeafNodes(), - new Predicate() { - @Override - public boolean apply(@Nullable SignalNetworkNode input) { - return input.getType() == SignalNetworkNode.Type.CONSUMER; - } - }); + return network.getLeafNodes().stream() + .filter(input -> input.getType() == SignalNetworkNode.Type.CONSUMER) + .collect(Collectors.toList()); } /** * Finds the producers in a network + * * @param network The network to query for Producers * @return The producers on the given network */ private Iterable getProducersInNetwork(Network2 network) { - return Iterables.filter(network.getLeafNodes(), - new Predicate() { - @Override - public boolean apply(@Nullable SignalNetworkNode input) { - return input.getType() == SignalNetworkNode.Type.PRODUCER; - } - }); + return network.getLeafNodes().stream() + .filter(input -> input.getType() == SignalNetworkNode.Type.PRODUCER) + .collect(Collectors.toList()); } /** * Adds all networks that have a producer that is modified to the list of networks to be recalculated + * * @param networksToRecalculate The list of networks that need to be recalculated */ private void appendNetworksContainingModifiedProducer(Set> networksToRecalculate) { @@ -232,15 +235,17 @@ private void appendNetworksContainingModifiedProducer(Set, NetworkSignals> consumerSignals) { - Iterator, NetworkSignals>> signalInNetworkIterator = consumerSignals.entrySet().iterator(); + private void removeStaleSignals(SignalNetworkNode consumerToEvaluate, Map, + NetworkSignals> consumerSignals) { + Iterator, NetworkSignals>> signalInNetworkIterator = + consumerSignals.entrySet().iterator(); while (signalInNetworkIterator.hasNext()) { Map.Entry, NetworkSignals> signalEntry = signalInNetworkIterator.next(); // If the network no longer is active or no longer contains the consumer - it is "stale" @@ -252,11 +257,13 @@ private void removeStaleSignals(SignalNetworkNode consumerToEvaluate, Map networkSignals, SignalConsumerComponent signalConsumerComponent, EntityRef entity) { + private void processSignalConsumerResult(Collection networkSignals, + SignalConsumerComponent signalConsumerComponent, EntityRef entity) { final SignalConsumerComponent.Mode mode = signalConsumerComponent.mode; switch (mode) { // OR @@ -288,15 +295,15 @@ private void processSignalConsumerResult(Collection networkSigna } /** - * Sends a signal change to an advanced consumer represented by {@code entity}. This is done by - * updating the {@code signalStrengths} field of the {@link SignalConsumerAdvancedStatusComponent} - * on the {@code entity}. + * Sends a signal change to an advanced consumer represented by {@code entity}. This is done by updating the {@code + * signalStrengths} field of the {@link SignalConsumerAdvancedStatusComponent} on the {@code entity}. * * @param entity The consumer entity. * @param networkSignals The signals in the network which are to be sent to the {@code entity}. */ private void outputSignalToAdvancedConsumer(EntityRef entity, Collection networkSignals) { - final SignalConsumerAdvancedStatusComponent advancedStatusComponent = entity.getComponent(SignalConsumerAdvancedStatusComponent.class); + final SignalConsumerAdvancedStatusComponent advancedStatusComponent = + entity.getComponent(SignalConsumerAdvancedStatusComponent.class); Map signalResult = new HashMap<>(); if (networkSignals != null) { for (NetworkSignals networkSignal : networkSignals) { @@ -312,14 +319,15 @@ private void outputSignalToAdvancedConsumer(EntityRef entity, Collection networkSignals) { /** * Used for the AND signal block + * * @param networkSignals The signals in the network * @return True if the network has a AND signal */ @@ -375,6 +385,7 @@ private boolean hasSignalForAnd(Collection networkSignals) { /** * Used for the OR signal block + * * @param networkSignals The signals in the network * @return True if the network has a OR signal */ @@ -391,13 +402,15 @@ private boolean hasSignalForOr(Collection networkSignals) { } /** - * Returns the most powerful signals in the given network. - * If there is a signal with infinite strength on the network, the whole network is returned. + * Returns the most powerful signals in the given network. If there is a signal with infinite strength on the + * network, the whole network is returned. + * * @param network The network to check for signals * @param consumerNode The node receiving the signals * @return The most powerful of the signals */ - private NetworkSignals getConsumerSignalInNetwork(Network2 network, SignalNetworkNode consumerNode) { + private NetworkSignals getConsumerSignalInNetwork(Network2 network, + SignalNetworkNode consumerNode) { // Check for infinite signal strength (-1), if there - it powers whole network Iterable producers = getProducersInNetwork(network); for (SignalNetworkNode producer : producers) { @@ -428,13 +441,15 @@ private NetworkSignals getConsumerSignalInNetwork(Network2 ne /** * Returns the most powerful signal on the network on a specific side + * * @param network The network to check for signals * @param consumerNode The node to check from * @param producers The producers in the network * @param sideInNetwork The side in question * @return The most powerful signal on the side */ - private int getMaxSignalInNetworkOnSide(Network2 network, SignalNetworkNode consumerNode, Iterable producers, Side sideInNetwork) { + private int getMaxSignalInNetworkOnSide(Network2 network, SignalNetworkNode consumerNode, + Iterable producers, Side sideInNetwork) { int result = 0; for (SignalNetworkNode producer : producers) { if (consumerCanPowerItself || !producer.location.equals(consumerNode.location)) { @@ -450,46 +465,52 @@ private int getMaxSignalInNetworkOnSide(Network2 network, Sig /** * Makes a node with the given specifications + * * @param location The location of the node * @param inputDefinedSides The sides to receive input * @param outputDefinedSides The sides to make output * @param type The {@link SignalNetworkNode.Type} the node should be * @return A node with the given specifications */ - private SignalNetworkNode toNode(Vector3i location, int inputDefinedSides, int outputDefinedSides, SignalNetworkNode.Type type) { - return new SignalNetworkNode(location, getConnections(location, (byte) inputDefinedSides), getConnections(location, (byte) outputDefinedSides), type); + private SignalNetworkNode toNode(Vector3ic location, int inputDefinedSides, int outputDefinedSides, + SignalNetworkNode.Type type) { + return new SignalNetworkNode(location, getConnections(location, (byte) inputDefinedSides), + getConnections(location, (byte) outputDefinedSides), type); } /** * Gets all the sides of the block that it is possible to connect to, input or output + * * @param location The location of the block to get connections from * @param definedSides The sides of the block that are defined as input or output * @return The sides which it is possible to connect to */ - private byte getConnections(Vector3i location, byte definedSides) { + private byte getConnections(Vector3ic location, byte definedSides) { return BlockNetworkUtil.getResultConnections(worldProvider.getBlock(location), definedSides); } /** * Adds the placed block to the correct list + * * @param event The event triggered by block placement * @param entityRef The entity information of the placed block */ @ReceiveEvent() public void onBlockPlaced(OnBlockItemPlaced event, EntityRef entityRef) { EntityRef ref = event.getPlacedBlock(); - final Vector3i location = JomlUtil.from(event.getPosition()); + final Vector3ic location = event.getPosition(); - if(ref.hasComponent(SignalConductorComponent.class)){ + if (ref.hasComponent(SignalConductorComponent.class)) { logger.debug("SignalConductor placed: " + ref.getParentPrefab()); - for (SignalConductorComponent.ConnectionGroup connectionGroup : ref.getComponent(SignalConductorComponent.class).connectionGroups) { - final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); + for (SignalConductorComponent.ConnectionGroup connectionGroup : + ref.getComponent(SignalConductorComponent.class).connectionGroups) { + final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, + connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); signalNetwork.addNetworkingBlock(conductorNode, NetworkChangeReason.WORLD_CHANGE); } } - if(ref.hasComponent(SignalConsumerComponent.class)) - { + if (ref.hasComponent(SignalConsumerComponent.class)) { logger.debug("SignalConsumer placed: " + ref.getParentPrefab()); byte connectingOnSides = ref.getComponent(SignalConsumerComponent.class).connectionSides; @@ -497,15 +518,14 @@ public void onBlockPlaced(OnBlockItemPlaced event, EntityRef entityRef) { consumerSignalInNetworks.put(consumerNode, Maps.newHashMap()); signalNetwork.addLeafBlock(consumerNode, NetworkChangeReason.WORLD_CHANGE); - } - else if(ref.hasComponent(SignalProducerComponent.class)) - { + } else if (ref.hasComponent(SignalProducerComponent.class)) { logger.debug("SignalProducer placed: " + ref.getParentPrefab()); final SignalProducerComponent producerComponent = ref.getComponent(SignalProducerComponent.class); final int signalStrength = producerComponent.signalStrength; byte connectingOnSides = producerComponent.connectionSides; - final SignalNetworkNode producerNode = toNode(location, 0, connectingOnSides, SignalNetworkNode.Type.PRODUCER); + final SignalNetworkNode producerNode = toNode(location, 0, connectingOnSides, + SignalNetworkNode.Type.PRODUCER); producerSignalStrengths.put(producerNode, signalStrength); signalNetwork.addLeafBlock(producerNode, NetworkChangeReason.WORLD_CHANGE); @@ -520,10 +540,12 @@ else if(ref.hasComponent(SignalProducerComponent.class)) @ReceiveEvent(components = {SignalConductorComponent.class}) public void prefabConductorLoaded(OnActivatedBlocks event, EntityRef blockType) { - for (SignalConductorComponent.ConnectionGroup connectionGroup : blockType.getComponent(SignalConductorComponent.class).connectionGroups) { + for (SignalConductorComponent.ConnectionGroup connectionGroup : + blockType.getComponent(SignalConductorComponent.class).connectionGroups) { Set conductorNodes = Sets.newHashSet(); - for (Vector3i location : event.getBlockPositions()) { - final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + final SignalNetworkNode conductorNode = toNode(JomlUtil.from(location), connectionGroup.inputSides, + connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); conductorNodes.add(conductorNode); } signalNetwork.addNetworkingBlocks(conductorNodes, NetworkChangeReason.CHUNK_EVENT); @@ -532,11 +554,13 @@ public void prefabConductorLoaded(OnActivatedBlocks event, EntityRef blockType) @ReceiveEvent(components = {SignalConductorComponent.class}) public void prefabConductorUnloaded(BeforeDeactivateBlocks event, EntityRef blockType) { - for (SignalConductorComponent.ConnectionGroup connectionGroup : blockType.getComponent(SignalConductorComponent.class).connectionGroups) { + for (SignalConductorComponent.ConnectionGroup connectionGroup : + blockType.getComponent(SignalConductorComponent.class).connectionGroups) { Set conductorNodes = Sets.newHashSet(); // Quite messy due to the order of operations, need to check if the order is important - for (Vector3i location : event.getBlockPositions()) { - final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + final SignalNetworkNode conductorNode = toNode(JomlUtil.from(location), connectionGroup.inputSides, + connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); conductorNodes.add(conductorNode); } signalNetwork.removeNetworkingBlocks(conductorNodes, NetworkChangeReason.CHUNK_EVENT); @@ -544,12 +568,13 @@ public void prefabConductorUnloaded(BeforeDeactivateBlocks event, EntityRef bloc } - @ReceiveEvent(components = {BlockComponent.class, SignalConductorComponent.class}) public void conductorRemoved(BeforeDestroyEvent event, EntityRef block) { - final Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition()); - for (SignalConductorComponent.ConnectionGroup connectionGroup : block.getComponent(SignalConductorComponent.class).connectionGroups) { - final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); + final Vector3i location = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); + for (SignalConductorComponent.ConnectionGroup connectionGroup : + block.getComponent(SignalConductorComponent.class).connectionGroups) { + final SignalNetworkNode conductorNode = toNode(location, connectionGroup.inputSides, + connectionGroup.outputSides, SignalNetworkNode.Type.CONDUCTOR); signalNetwork.removeNetworkingBlock(conductorNode, NetworkChangeReason.WORLD_CHANGE); } } @@ -563,8 +588,9 @@ public void prefabProducerLoaded(OnActivatedBlocks event, EntityRef blockType) { final SignalProducerComponent producerComponent = blockType.getComponent(SignalProducerComponent.class); int signalStrength = producerComponent.signalStrength; Set producerNodes = Sets.newHashSet(); - for (Vector3i location : event.getBlockPositions()) { - final SignalNetworkNode producerNode = toNode(location, 0, producerComponent.connectionSides, SignalNetworkNode.Type.PRODUCER); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + final SignalNetworkNode producerNode = toNode(JomlUtil.from(location), 0, + producerComponent.connectionSides, SignalNetworkNode.Type.PRODUCER); producerSignalStrengths.put(producerNode, signalStrength); producerNodes.add(producerNode); @@ -577,8 +603,9 @@ public void prefabProducerUnloaded(BeforeDeactivateBlocks event, EntityRef block byte connectingOnSides = blockType.getComponent(SignalProducerComponent.class).connectionSides; // Quite messy due to the order of operations, need to check if the order is important Set producerNodes = Sets.newHashSet(); - for (Vector3i location : event.getBlockPositions()) { - final SignalNetworkNode producerNode = toNode(location, 0, connectingOnSides, SignalNetworkNode.Type.PRODUCER); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + final SignalNetworkNode producerNode = toNode(JomlUtil.from(location), 0, connectingOnSides, + SignalNetworkNode.Type.PRODUCER); producerNodes.add(producerNode); } @@ -589,12 +616,11 @@ public void prefabProducerUnloaded(BeforeDeactivateBlocks event, EntityRef block } - @ReceiveEvent(components = {SignalProducerComponent.class}) public void producerUpdated(OnChangedComponent event, EntityRef block) { logger.debug("Producer updated: " + block.getParentPrefab()); if (block.hasComponent(BlockComponent.class)) { - Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition()); + Vector3i location = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); final SignalProducerComponent producerComponent = block.getComponent(SignalProducerComponent.class); Set oldLeafNodes = Sets.newHashSet(signalNetwork.getLeafNodesAt(location)); @@ -605,7 +631,8 @@ public void producerUpdated(OnChangedComponent event, EntityRef block) { } } - SignalNetworkNode node = toNode(location, 0, producerComponent.connectionSides, SignalNetworkNode.Type.PRODUCER); + SignalNetworkNode node = toNode(location, 0, producerComponent.connectionSides, + SignalNetworkNode.Type.PRODUCER); producerSignalStrengths.put(node, producerComponent.signalStrength); signalNetwork.addLeafBlock(node, NetworkChangeReason.WORLD_CHANGE); @@ -615,7 +642,7 @@ public void producerUpdated(OnChangedComponent event, EntityRef block) { @ReceiveEvent(components = {BlockComponent.class, SignalProducerComponent.class}) public void producerRemoved(BeforeDestroyEvent event, EntityRef block) { - Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition()); + Vector3i location = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); byte connectingOnSides = block.getComponent(SignalProducerComponent.class).connectionSides; final SignalNetworkNode producerNode = toNode(location, 0, connectingOnSides, SignalNetworkNode.Type.PRODUCER); @@ -631,8 +658,9 @@ public void producerRemoved(BeforeDestroyEvent event, EntityRef block) { public void prefabConsumerLoaded(OnActivatedBlocks event, EntityRef blockType) { byte connectingOnSides = blockType.getComponent(SignalConsumerComponent.class).connectionSides; Set consumerNodes = Sets.newHashSet(); - for (Vector3i location : event.getBlockPositions()) { - SignalNetworkNode consumerNode = toNode(location, connectingOnSides, 0, SignalNetworkNode.Type.CONSUMER); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + SignalNetworkNode consumerNode = toNode(JomlUtil.from(location), connectingOnSides, 0, + SignalNetworkNode.Type.CONSUMER); consumerSignalInNetworks.put(consumerNode, Maps.newHashMap()); consumerNodes.add(consumerNode); @@ -646,8 +674,9 @@ public void prefabConsumerUnloaded(BeforeDeactivateBlocks event, EntityRef block Set consumerNodes = Sets.newHashSet(); // Quite messy due to the order of operations, need to check if the order is important - for (Vector3i location : event.getBlockPositions()) { - SignalNetworkNode consumerNode = toNode(location, connectingOnSides, 0, SignalNetworkNode.Type.CONSUMER); + for (org.terasology.math.geom.Vector3i location : event.getBlockPositions()) { + SignalNetworkNode consumerNode = toNode(JomlUtil.from(location), connectingOnSides, 0, + SignalNetworkNode.Type.CONSUMER); consumerNodes.add(consumerNode); } @@ -658,12 +687,11 @@ public void prefabConsumerUnloaded(BeforeDeactivateBlocks event, EntityRef block } - @ReceiveEvent(components = {SignalConsumerComponent.class}) public void consumerUpdated(OnChangedComponent event, EntityRef block) { if (block.hasComponent(BlockComponent.class)) { - Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition()); + Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition(new Vector3i())); final SignalConsumerComponent consumerComponent = block.getComponent(SignalConsumerComponent.class); Set oldLeafNodes = Sets.newHashSet(signalNetwork.getLeafNodesAt(location)); @@ -674,7 +702,8 @@ public void consumerUpdated(OnChangedComponent event, EntityRef block) { } } - SignalNetworkNode node = toNode(location, consumerComponent.connectionSides, 0, SignalNetworkNode.Type.CONSUMER); + SignalNetworkNode node = toNode(location, consumerComponent.connectionSides, 0, + SignalNetworkNode.Type.CONSUMER); consumerSignalInNetworks.put(node, Maps.newHashMap()); signalNetwork.addLeafBlock(node, NetworkChangeReason.WORLD_CHANGE); @@ -685,7 +714,7 @@ public void consumerUpdated(OnChangedComponent event, EntityRef block) { @ReceiveEvent(components = {BlockComponent.class, SignalConsumerComponent.class}) public void consumerRemoved(BeforeDestroyEvent event, EntityRef block) { - Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition()); + Vector3i location = new Vector3i(block.getComponent(BlockComponent.class).getPosition(new Vector3i())); byte connectingOnSides = block.getComponent(SignalConsumerComponent.class).connectionSides; final SignalNetworkNode consumerNode = toNode(location, connectingOnSides, 0, SignalNetworkNode.Type.CONSUMER); diff --git a/src/main/java/org/terasology/signalling/computer/module/SignalModuleServerSystem.java b/src/main/java/org/terasology/signalling/computer/module/SignalModuleServerSystem.java index f48614f..d4820d1 100644 --- a/src/main/java/org/terasology/signalling/computer/module/SignalModuleServerSystem.java +++ b/src/main/java/org/terasology/signalling/computer/module/SignalModuleServerSystem.java @@ -27,7 +27,6 @@ import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.logic.inventory.InventoryManager; import org.terasology.logic.inventory.events.InventorySlotChangedEvent; -import org.terasology.math.Side; import org.terasology.mobileBlocks.server.AfterBlockMovedEvent; import org.terasology.mobileBlocks.server.BeforeBlockMovesEvent; import org.terasology.mobileBlocks.server.BlockTransitionDuringMoveEvent; @@ -37,9 +36,6 @@ import org.terasology.signalling.components.SignalProducerComponent; import org.terasology.world.BlockEntityRegistry; -import java.util.EnumSet; -import java.util.Set; - @RegisterSystem(RegisterMode.AUTHORITY) public class SignalModuleServerSystem extends BaseComponentSystem { @In