Skip to content

Commit bd5d580

Browse files
committed
use some more longs in acceptor cache
1 parent 2659fab commit bd5d580

File tree

9 files changed

+42
-19
lines changed

9 files changed

+42
-19
lines changed

src/main/java/mekanism/common/content/network/InventoryNetwork.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public InventoryNetwork(Collection<InventoryNetwork> networks) {
4444
public List<AcceptorData> calculateAcceptors(TransitRequest request, TransporterStack stack, Long2ObjectMap<ChunkAccess> chunkMap,
4545
Map<GlobalPos, Set<TransporterStack>> additionalFlowingStacks) {
4646
List<AcceptorData> toReturn = new ArrayList<>();
47-
for (Map.Entry<BlockPos, Map<Direction, IItemHandler>> entry : acceptorCache.getAcceptorEntrySet()) {
48-
BlockPos pos = entry.getKey();
47+
for (Long2ObjectMap.Entry<Map<Direction, IItemHandler>> entry : acceptorCache.getAcceptorEntrySet()) {
48+
BlockPos pos = BlockPos.of(entry.getLongKey());
4949
if (!pos.equals(stack.homeLocation)) {
5050
BlockEntity acceptor = WorldUtils.getTileEntity(getWorld(), chunkMap, pos);
5151
Map<TransitResponse, AcceptorData> dataMap = new HashMap<>();

src/main/java/mekanism/common/content/network/transmitter/LogisticalTransporterBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public void onUpdateServer() {
184184
//Otherwise, try to insert it into the destination inventory
185185
//Get the handler we are trying to insert into from the network's acceptor cache
186186
Direction side = stack.getSide(this).getOpposite();
187-
IItemHandler acceptor = network.getCachedAcceptor(nextPos, side);
187+
IItemHandler acceptor = network.getCachedAcceptor(next, side);
188188
if (acceptor == null && stack.getPathType().isHome()) {
189189
//TODO: Cache this capability. The issue is that when we are sending it back home
190190
// if it pulled the item itself, then it isn't in our cached acceptors, and thus won't be able to insert it

src/main/java/mekanism/common/content/network/transmitter/Transmitter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ public BlockPos getBlockPos() {
127127
return transmitterTile.getBlockPos();
128128
}
129129

130+
public long getWorldPositionLong() {
131+
return transmitterTile.getWorldPositionLong();
132+
}
133+
130134
@Override
131135
public Level getLevel() {
132136
return transmitterTile.getLevel();

src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ private Destination getDestination(LongList ret, @Nullable LogisticalTransporter
244244
//If we are connected to a side, idle towards it, the path not pointing at a transmitter
245245
// is gracefully handled
246246
transportStack.idleDir = side;
247-
ret.add(relativePos(start.asLong(), side));
247+
ret.add(WorldUtils.relativePos(start.asLong(), side));
248248
return createDestination(ret);
249249
}
250250
}
@@ -527,7 +527,4 @@ public interface DestChecker {
527527
}
528528
}
529529

530-
private static long relativePos(long pos, Direction direction) {
531-
return BlockPos.asLong(BlockPos.getX(pos) + direction.getStepX(), BlockPos.getY(pos) + direction.getStepY(), BlockPos.getZ(pos) + direction.getStepZ());
532-
}
533530
}

src/main/java/mekanism/common/item/ItemNetworkReader.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ private void displayTransmitterInfo(Player player, Level level, BlockPos pos, Ti
114114
private void displayConnectedNetworks(Player player, Level world, BlockPos pos) {
115115
Set<DynamicNetwork<?, ?, ?>> iteratedNetworks = new ObjectOpenHashSet<>();
116116
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
117+
long posAsLong = pos.asLong();
117118
for (Direction side : EnumUtils.DIRECTIONS) {
118119
mutable.setWithOffset(pos, side);
119120
BlockEntity tile = WorldUtils.getTileEntity(world, mutable);
@@ -123,7 +124,7 @@ private void displayConnectedNetworks(Player player, Level world, BlockPos pos)
123124
if (transmitterNetwork.hasAcceptor(pos) && !iteratedNetworks.contains(transmitterNetwork)) {
124125
displayBorder(player, compileList(transmitter.getSupportedTransmissionTypes()), false);
125126
player.sendSystemMessage(MekanismLang.NETWORK_READER_CONNECTED_SIDES.translateColored(EnumColor.GRAY, EnumColor.DARK_GRAY,
126-
compileList(transmitterNetwork.getAcceptorDirections(pos))));
127+
compileList(transmitterNetwork.getAcceptorDirections(posAsLong))));
127128
displayEndBorder(player);
128129
iteratedNetworks.add(transmitterNetwork);
129130
}

src/main/java/mekanism/common/lib/transmitter/DynamicNetwork.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,11 +256,11 @@ public boolean hasAcceptor(BlockPos acceptorPos) {
256256
return acceptorCache.hasAcceptor(acceptorPos);
257257
}
258258

259-
public ACCEPTOR getCachedAcceptor(BlockPos acceptorPos, Direction side) {
259+
public ACCEPTOR getCachedAcceptor(long acceptorPos, Direction side) {
260260
return acceptorCache.getCachedAcceptor(acceptorPos, side);
261261
}
262262

263-
public Set<Direction> getAcceptorDirections(BlockPos pos) {
263+
public Set<Direction> getAcceptorDirections(long pos) {
264264
return acceptorCache.getAcceptorDirections(pos);
265265
}
266266

src/main/java/mekanism/common/lib/transmitter/acceptor/NetworkAcceptorCache.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package mekanism.common.lib.transmitter.acceptor;
22

3+
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
4+
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
35
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
46
import java.util.Collection;
57
import java.util.Collections;
@@ -10,19 +12,20 @@
1012
import java.util.Set;
1113
import mekanism.common.content.network.transmitter.Transmitter;
1214
import mekanism.common.lib.transmitter.TransmitterNetworkRegistry;
15+
import mekanism.common.util.WorldUtils;
1316
import net.minecraft.core.BlockPos;
1417
import net.minecraft.core.Direction;
1518
import org.jetbrains.annotations.Nullable;
1619

1720
public class NetworkAcceptorCache<ACCEPTOR> {
1821

19-
private final Map<BlockPos, Map<Direction, ACCEPTOR>> cachedAcceptors = new Object2ObjectOpenHashMap<>();
22+
private final Long2ObjectMap<Map<Direction, ACCEPTOR>> cachedAcceptors = new Long2ObjectOpenHashMap<>();
2023
private final Map<Transmitter<ACCEPTOR, ?, ?>, Set<Direction>> changedAcceptors = new Object2ObjectOpenHashMap<>();
2124

2225
public void updateTransmitterOnSide(Transmitter<ACCEPTOR, ?, ?> transmitter, Direction side) {
2326
transmitter.refreshAcceptorConnections(side);
2427
ACCEPTOR acceptor = transmitter.canConnectToAcceptor(side) ? transmitter.getAcceptor(side) : null;
25-
BlockPos acceptorPos = transmitter.getBlockPos().relative(side);
28+
long acceptorPos = WorldUtils.relativePos(transmitter.getWorldPositionLong(), side);
2629
if (acceptor == null) {
2730
Map<Direction, ACCEPTOR> cached = cachedAcceptors.get(acceptorPos);
2831
if (cached != null) {
@@ -37,8 +40,8 @@ public void updateTransmitterOnSide(Transmitter<ACCEPTOR, ?, ?> transmitter, Dir
3740
}
3841

3942
public void adoptAcceptors(NetworkAcceptorCache<ACCEPTOR> other) {
40-
for (Entry<BlockPos, Map<Direction, ACCEPTOR>> entry : other.cachedAcceptors.entrySet()) {
41-
BlockPos pos = entry.getKey();
43+
for (Long2ObjectMap.Entry<Map<Direction, ACCEPTOR>> entry : other.cachedAcceptors.long2ObjectEntrySet()) {
44+
long pos = entry.getLongKey();
4245
if (cachedAcceptors.containsKey(pos)) {
4346
cachedAcceptors.get(pos).putAll(entry.getValue());
4447
} else {
@@ -83,8 +86,8 @@ public void deregister() {
8386
/**
8487
* @apiNote Listeners should not be added to these LazyOptionals here as they may not correspond to an actual handler and may not get invalidated.
8588
*/
86-
public Set<Map.Entry<BlockPos, Map<Direction, ACCEPTOR>>> getAcceptorEntrySet() {
87-
return cachedAcceptors.entrySet();
89+
public Set<Long2ObjectMap.Entry<Map<Direction, ACCEPTOR>>> getAcceptorEntrySet() {
90+
return cachedAcceptors.long2ObjectEntrySet();
8891
}
8992

9093
/**
@@ -100,15 +103,15 @@ public int getAcceptorCount() {
100103
}
101104

102105
public boolean hasAcceptor(BlockPos acceptorPos) {
103-
return cachedAcceptors.containsKey(acceptorPos);
106+
return cachedAcceptors.containsKey(acceptorPos.asLong());
104107
}
105108

106109
@Nullable
107-
public ACCEPTOR getCachedAcceptor(BlockPos acceptorPos, Direction side) {
110+
public ACCEPTOR getCachedAcceptor(long acceptorPos, Direction side) {
108111
return cachedAcceptors.getOrDefault(acceptorPos, Collections.emptyMap()).get(side);
109112
}
110113

111-
public Set<Direction> getAcceptorDirections(BlockPos pos) {
114+
public Set<Direction> getAcceptorDirections(long pos) {
112115
//TODO: Do this better?
113116
return cachedAcceptors.get(pos).keySet();
114117
}

src/main/java/mekanism/common/tile/base/TileEntityUpdateable.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ public abstract class TileEntityUpdateable extends BlockEntity implements ITileW
3535
private GlobalPos cachedCoord;
3636
private boolean cacheCoord;
3737
private long lastSave;
38+
private final long worldPositionLong;
3839

3940
public TileEntityUpdateable(TileEntityTypeRegistryObject<?> type, BlockPos pos, BlockState state) {
4041
super(type.get(), pos, state);
42+
this.worldPositionLong = pos.asLong();
4143
}
4244

4345
/**
@@ -210,6 +212,10 @@ public GlobalPos getTileGlobalPos() {
210212
return cacheCoord && cachedCoord != null ? cachedCoord : ITileWrapper.super.getTileGlobalPos();
211213
}
212214

215+
public long getWorldPositionLong() {
216+
return worldPositionLong;
217+
}
218+
213219
@Override
214220
public Chunk3D getTileChunk() {
215221
if (cacheCoord && cachedCoord != null) {

src/main/java/mekanism/common/util/WorldUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,4 +830,16 @@ public static boolean canSeeSun(@Nullable Level world, BlockPos pos) {
830830
public static BlockPos getBlockPosFromChunkPos(long chunkPos) {
831831
return new BlockPos((int) chunkPos, 0, (int) (chunkPos >> 32));
832832
}
833+
834+
/**
835+
* Get a packed block pos on the relative side.
836+
* @see BlockPos#relative(Direction)
837+
*
838+
* @param pos Source position
839+
* @param direction direction to offset in
840+
* @return the packed offset position
841+
*/
842+
public static long relativePos(long pos, Direction direction) {
843+
return BlockPos.asLong(BlockPos.getX(pos) + direction.getStepX(), BlockPos.getY(pos) + direction.getStepY(), BlockPos.getZ(pos) + direction.getStepZ());
844+
}
833845
}

0 commit comments

Comments
 (0)