diff --git a/src/main/java/mekanism/common/content/network/InventoryNetwork.java b/src/main/java/mekanism/common/content/network/InventoryNetwork.java index 2060dec739d..b515123ef02 100644 --- a/src/main/java/mekanism/common/content/network/InventoryNetwork.java +++ b/src/main/java/mekanism/common/content/network/InventoryNetwork.java @@ -44,8 +44,8 @@ public InventoryNetwork(Collection networks) { public List calculateAcceptors(TransitRequest request, TransporterStack stack, Long2ObjectMap chunkMap, Map> additionalFlowingStacks) { List toReturn = new ArrayList<>(); - for (Map.Entry> entry : acceptorCache.getAcceptorEntrySet()) { - BlockPos pos = entry.getKey(); + for (Long2ObjectMap.Entry> entry : acceptorCache.getAcceptorEntrySet()) { + BlockPos pos = BlockPos.of(entry.getLongKey()); if (!pos.equals(stack.homeLocation)) { BlockEntity acceptor = WorldUtils.getTileEntity(getWorld(), chunkMap, pos); Map dataMap = new HashMap<>(); diff --git a/src/main/java/mekanism/common/content/network/transmitter/LogisticalTransporterBase.java b/src/main/java/mekanism/common/content/network/transmitter/LogisticalTransporterBase.java index d3507d64f97..ee408511cbb 100644 --- a/src/main/java/mekanism/common/content/network/transmitter/LogisticalTransporterBase.java +++ b/src/main/java/mekanism/common/content/network/transmitter/LogisticalTransporterBase.java @@ -184,7 +184,7 @@ public void onUpdateServer() { //Otherwise, try to insert it into the destination inventory //Get the handler we are trying to insert into from the network's acceptor cache Direction side = stack.getSide(this).getOpposite(); - IItemHandler acceptor = network.getCachedAcceptor(nextPos, side); + IItemHandler acceptor = network.getCachedAcceptor(next, side); if (acceptor == null && stack.getPathType().isHome()) { //TODO: Cache this capability. The issue is that when we are sending it back home // if it pulled the item itself, then it isn't in our cached acceptors, and thus won't be able to insert it diff --git a/src/main/java/mekanism/common/content/network/transmitter/Transmitter.java b/src/main/java/mekanism/common/content/network/transmitter/Transmitter.java index 661332eb651..189eb88a716 100644 --- a/src/main/java/mekanism/common/content/network/transmitter/Transmitter.java +++ b/src/main/java/mekanism/common/content/network/transmitter/Transmitter.java @@ -127,6 +127,10 @@ public BlockPos getBlockPos() { return transmitterTile.getBlockPos(); } + public long getWorldPositionLong() { + return transmitterTile.getWorldPositionLong(); + } + @Override public Level getLevel() { return transmitterTile.getLevel(); diff --git a/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java b/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java index c26b377bf5a..a53f8bb4e5b 100644 --- a/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java +++ b/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java @@ -244,7 +244,7 @@ private Destination getDestination(LongList ret, @Nullable LogisticalTransporter //If we are connected to a side, idle towards it, the path not pointing at a transmitter // is gracefully handled transportStack.idleDir = side; - ret.add(relativePos(start.asLong(), side)); + ret.add(WorldUtils.relativePos(start.asLong(), side)); return createDestination(ret); } } @@ -527,7 +527,4 @@ public interface DestChecker { } } - private static long relativePos(long pos, Direction direction) { - return BlockPos.asLong(BlockPos.getX(pos) + direction.getStepX(), BlockPos.getY(pos) + direction.getStepY(), BlockPos.getZ(pos) + direction.getStepZ()); - } } \ No newline at end of file diff --git a/src/main/java/mekanism/common/item/ItemNetworkReader.java b/src/main/java/mekanism/common/item/ItemNetworkReader.java index 756476e1b76..becbb2a75d0 100644 --- a/src/main/java/mekanism/common/item/ItemNetworkReader.java +++ b/src/main/java/mekanism/common/item/ItemNetworkReader.java @@ -114,6 +114,7 @@ private void displayTransmitterInfo(Player player, Level level, BlockPos pos, Ti private void displayConnectedNetworks(Player player, Level world, BlockPos pos) { Set> iteratedNetworks = new ObjectOpenHashSet<>(); BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + long posAsLong = pos.asLong(); for (Direction side : EnumUtils.DIRECTIONS) { mutable.setWithOffset(pos, side); BlockEntity tile = WorldUtils.getTileEntity(world, mutable); @@ -123,7 +124,7 @@ private void displayConnectedNetworks(Player player, Level world, BlockPos pos) if (transmitterNetwork.hasAcceptor(pos) && !iteratedNetworks.contains(transmitterNetwork)) { displayBorder(player, compileList(transmitter.getSupportedTransmissionTypes()), false); player.sendSystemMessage(MekanismLang.NETWORK_READER_CONNECTED_SIDES.translateColored(EnumColor.GRAY, EnumColor.DARK_GRAY, - compileList(transmitterNetwork.getAcceptorDirections(pos)))); + compileList(transmitterNetwork.getAcceptorDirections(posAsLong)))); displayEndBorder(player); iteratedNetworks.add(transmitterNetwork); } diff --git a/src/main/java/mekanism/common/lib/transmitter/DynamicNetwork.java b/src/main/java/mekanism/common/lib/transmitter/DynamicNetwork.java index f0a88c153e1..d518883786d 100644 --- a/src/main/java/mekanism/common/lib/transmitter/DynamicNetwork.java +++ b/src/main/java/mekanism/common/lib/transmitter/DynamicNetwork.java @@ -256,11 +256,11 @@ public boolean hasAcceptor(BlockPos acceptorPos) { return acceptorCache.hasAcceptor(acceptorPos); } - public ACCEPTOR getCachedAcceptor(BlockPos acceptorPos, Direction side) { + public ACCEPTOR getCachedAcceptor(long acceptorPos, Direction side) { return acceptorCache.getCachedAcceptor(acceptorPos, side); } - public Set getAcceptorDirections(BlockPos pos) { + public Set getAcceptorDirections(long pos) { return acceptorCache.getAcceptorDirections(pos); } diff --git a/src/main/java/mekanism/common/lib/transmitter/acceptor/NetworkAcceptorCache.java b/src/main/java/mekanism/common/lib/transmitter/acceptor/NetworkAcceptorCache.java index 1fbd784a030..c39a2ec1e48 100644 --- a/src/main/java/mekanism/common/lib/transmitter/acceptor/NetworkAcceptorCache.java +++ b/src/main/java/mekanism/common/lib/transmitter/acceptor/NetworkAcceptorCache.java @@ -1,5 +1,7 @@ package mekanism.common.lib.transmitter.acceptor; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import java.util.Collection; import java.util.Collections; @@ -10,19 +12,20 @@ import java.util.Set; import mekanism.common.content.network.transmitter.Transmitter; import mekanism.common.lib.transmitter.TransmitterNetworkRegistry; +import mekanism.common.util.WorldUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import org.jetbrains.annotations.Nullable; public class NetworkAcceptorCache { - private final Map> cachedAcceptors = new Object2ObjectOpenHashMap<>(); + private final Long2ObjectMap> cachedAcceptors = new Long2ObjectOpenHashMap<>(); private final Map, Set> changedAcceptors = new Object2ObjectOpenHashMap<>(); public void updateTransmitterOnSide(Transmitter transmitter, Direction side) { transmitter.refreshAcceptorConnections(side); ACCEPTOR acceptor = transmitter.canConnectToAcceptor(side) ? transmitter.getAcceptor(side) : null; - BlockPos acceptorPos = transmitter.getBlockPos().relative(side); + long acceptorPos = WorldUtils.relativePos(transmitter.getWorldPositionLong(), side); if (acceptor == null) { Map cached = cachedAcceptors.get(acceptorPos); if (cached != null) { @@ -37,8 +40,8 @@ public void updateTransmitterOnSide(Transmitter transmitter, Dir } public void adoptAcceptors(NetworkAcceptorCache other) { - for (Entry> entry : other.cachedAcceptors.entrySet()) { - BlockPos pos = entry.getKey(); + for (Long2ObjectMap.Entry> entry : other.cachedAcceptors.long2ObjectEntrySet()) { + long pos = entry.getLongKey(); if (cachedAcceptors.containsKey(pos)) { cachedAcceptors.get(pos).putAll(entry.getValue()); } else { @@ -83,8 +86,8 @@ public void deregister() { /** * @apiNote Listeners should not be added to these LazyOptionals here as they may not correspond to an actual handler and may not get invalidated. */ - public Set>> getAcceptorEntrySet() { - return cachedAcceptors.entrySet(); + public Set>> getAcceptorEntrySet() { + return cachedAcceptors.long2ObjectEntrySet(); } /** @@ -100,15 +103,15 @@ public int getAcceptorCount() { } public boolean hasAcceptor(BlockPos acceptorPos) { - return cachedAcceptors.containsKey(acceptorPos); + return cachedAcceptors.containsKey(acceptorPos.asLong()); } @Nullable - public ACCEPTOR getCachedAcceptor(BlockPos acceptorPos, Direction side) { + public ACCEPTOR getCachedAcceptor(long acceptorPos, Direction side) { return cachedAcceptors.getOrDefault(acceptorPos, Collections.emptyMap()).get(side); } - public Set getAcceptorDirections(BlockPos pos) { + public Set getAcceptorDirections(long pos) { //TODO: Do this better? return cachedAcceptors.get(pos).keySet(); } diff --git a/src/main/java/mekanism/common/tile/base/TileEntityUpdateable.java b/src/main/java/mekanism/common/tile/base/TileEntityUpdateable.java index b04a3033658..693de63217e 100644 --- a/src/main/java/mekanism/common/tile/base/TileEntityUpdateable.java +++ b/src/main/java/mekanism/common/tile/base/TileEntityUpdateable.java @@ -35,9 +35,11 @@ public abstract class TileEntityUpdateable extends BlockEntity implements ITileW private GlobalPos cachedCoord; private boolean cacheCoord; private long lastSave; + private final long worldPositionLong; public TileEntityUpdateable(TileEntityTypeRegistryObject type, BlockPos pos, BlockState state) { super(type.get(), pos, state); + this.worldPositionLong = pos.asLong(); } /** @@ -210,6 +212,10 @@ public GlobalPos getTileGlobalPos() { return cacheCoord && cachedCoord != null ? cachedCoord : ITileWrapper.super.getTileGlobalPos(); } + public long getWorldPositionLong() { + return worldPositionLong; + } + @Override public Chunk3D getTileChunk() { if (cacheCoord && cachedCoord != null) { diff --git a/src/main/java/mekanism/common/util/WorldUtils.java b/src/main/java/mekanism/common/util/WorldUtils.java index 1d264096e3c..4683c9b62f5 100644 --- a/src/main/java/mekanism/common/util/WorldUtils.java +++ b/src/main/java/mekanism/common/util/WorldUtils.java @@ -830,4 +830,16 @@ public static boolean canSeeSun(@Nullable Level world, BlockPos pos) { public static BlockPos getBlockPosFromChunkPos(long chunkPos) { return new BlockPos((int) chunkPos, 0, (int) (chunkPos >> 32)); } + + /** + * Get a packed block pos on the relative side. + * @see BlockPos#relative(Direction) + * + * @param pos Source position + * @param direction direction to offset in + * @return the packed offset position + */ + public static long relativePos(long pos, Direction direction) { + return BlockPos.asLong(BlockPos.getX(pos) + direction.getStepX(), BlockPos.getY(pos) + direction.getStepY(), BlockPos.getZ(pos) + direction.getStepZ()); + } } \ No newline at end of file