Skip to content

Commit 1fb36c4

Browse files
committed
Replace mana network with chunk search for lookups of closest pool/spreader
The concept of the "mana network" has been stripped down to only maintain a clientside collection of spreaders for the client display tick logic.
1 parent a5669d4 commit 1fb36c4

File tree

14 files changed

+77
-167
lines changed

14 files changed

+77
-167
lines changed

Fabric/src/main/java/vazkii/botania/fabric/FabricCommonInitializer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher,
422422
}
423423

424424
private void serverStopping(MinecraftServer server) {
425-
ManaNetworkHandler.instance.clear();
426425
CorporeaIndexBlockEntity.clearIndexCache();
427426
}
428427

NeoForge/src/main/java/vazkii/botania/neoforge/ForgeCommonInitializer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,6 @@ private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher,
656656
}
657657

658658
private void serverStopping(MinecraftServer server) {
659-
ManaNetworkHandler.instance.clear();
660659
CorporeaIndexBlockEntity.clearIndexCache();
661660
}
662661

Xplat/src/main/java/vazkii/botania/api/block_entity/BindableSpecialFlowerBlockEntity.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,27 @@
2121
import net.minecraft.world.entity.LivingEntity;
2222
import net.minecraft.world.entity.player.Player;
2323
import net.minecraft.world.item.ItemStack;
24+
import net.minecraft.world.level.ChunkPos;
2425
import net.minecraft.world.level.Level;
2526
import net.minecraft.world.level.block.entity.BlockEntity;
2627
import net.minecraft.world.level.block.entity.BlockEntityType;
2728
import net.minecraft.world.level.block.state.BlockState;
29+
import net.minecraft.world.level.chunk.LevelChunk;
2830

2931
import org.jetbrains.annotations.Nullable;
3032

3133
import vazkii.botania.api.BotaniaAPIClient;
3234
import vazkii.botania.api.block.Bound;
3335
import vazkii.botania.api.block.WandBindable;
3436
import vazkii.botania.api.block.WandHUD;
37+
import vazkii.botania.api.mana.ManaReceiver;
3538
import vazkii.botania.client.core.helper.RenderHelper;
3639
import vazkii.botania.common.helper.MathHelper;
3740
import vazkii.botania.common.item.BotaniaItems;
41+
import vazkii.botania.xplat.XplatAbstractions;
3842

43+
import java.util.List;
44+
import java.util.Map;
3945
import java.util.Objects;
4046

4147
/**
@@ -76,7 +82,44 @@ public void attemptAutoBinding() {
7682
/**
7783
* Returns the BlockPos of the nearest target within the binding radius, or `null` if there aren't any.
7884
*/
79-
public abstract @Nullable BlockPos findClosestTarget();
85+
@Nullable
86+
public BlockPos findClosestTarget() {
87+
return getClosestManaReceiver(bindClass, getLevel(), getBlockPos(), getBindingRadius());
88+
}
89+
90+
@Nullable
91+
protected BlockPos getClosestManaReceiver(Class<T> receiverType, Level level, BlockPos center, int rangeLimit) {
92+
long minDist = Long.MAX_VALUE;
93+
long limitSquared = (long) rangeLimit * rangeLimit;
94+
BlockPos closestPos = null;
95+
96+
// TODO: if we get around to doing data fixers, using POIs for this would be even more efficient
97+
List<ChunkPos> chunkPosList = ChunkPos.rangeClosed(
98+
new ChunkPos(center.offset(-rangeLimit, 0, -rangeLimit)),
99+
new ChunkPos(center.offset(rangeLimit, 0, rangeLimit))
100+
).toList();
101+
102+
for (ChunkPos chunkPos : chunkPosList) {
103+
LevelChunk chunk = level.getChunkSource().getChunkNow(chunkPos.x, chunkPos.z);
104+
if (chunk != null) {
105+
for (Map.Entry<BlockPos, BlockEntity> entry : chunk.getBlockEntities().entrySet()) {
106+
BlockPos pos = entry.getKey();
107+
long dist = MathHelper.distSqr(center, pos);
108+
if (dist > minDist || dist > limitSquared) {
109+
continue;
110+
}
111+
BlockEntity be = entry.getValue();
112+
ManaReceiver manaReceiver = XplatAbstractions.instance().findManaReceiver(be);
113+
if (receiverType.isInstance(manaReceiver)) {
114+
minDist = dist;
115+
closestPos = pos;
116+
}
117+
}
118+
}
119+
}
120+
121+
return closestPos;
122+
}
80123

81124
@Override
82125
protected void tickFlower() {

Xplat/src/main/java/vazkii/botania/api/block_entity/FunctionalFlowerBlockEntity.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
import net.minecraft.world.level.block.entity.BlockEntityType;
1919
import net.minecraft.world.level.block.state.BlockState;
2020

21-
import org.jetbrains.annotations.Nullable;
22-
2321
import vazkii.botania.api.BotaniaAPI;
24-
import vazkii.botania.api.internal.ManaNetwork;
2522
import vazkii.botania.api.mana.ManaPool;
2623

2724
import static vazkii.botania.api.BotaniaAPI.botaniaRL;
@@ -64,14 +61,6 @@ public int getBindingRadius() {
6461
return LINK_RANGE;
6562
}
6663

67-
@Nullable
68-
@Override
69-
public BlockPos findClosestTarget() {
70-
ManaNetwork network = BotaniaAPI.instance().getManaNetworkInstance();
71-
var closestPool = network.getClosestPool(getBlockPos(), getLevel(), getBindingRadius());
72-
return closestPool == null ? null : closestPool.getManaReceiverPos();
73-
}
74-
7564
public void drawManaFromPool() {
7665
ManaPool pool = findBoundTile();
7766
if (pool != null) {

Xplat/src/main/java/vazkii/botania/api/block_entity/GeneratingFlowerBlockEntity.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.jetbrains.annotations.Nullable;
2222

2323
import vazkii.botania.api.BotaniaAPI;
24-
import vazkii.botania.api.internal.ManaNetwork;
2524
import vazkii.botania.api.mana.ManaCollector;
2625

2726
import static vazkii.botania.api.BotaniaAPI.botaniaRL;
@@ -78,14 +77,6 @@ public int getBindingRadius() {
7877
return LINK_RANGE;
7978
}
8079

81-
@Nullable
82-
@Override
83-
public BlockPos findClosestTarget() {
84-
ManaNetwork network = BotaniaAPI.instance().getManaNetworkInstance();
85-
var closestCollector = network.getClosestCollector(getBlockPos(), getLevel(), getBindingRadius());
86-
return closestCollector == null ? null : closestCollector.getManaReceiverPos();
87-
}
88-
8980
public void emptyManaIntoCollector() {
9081
ManaCollector collector = findBoundTile();
9182
if (collector != null && !collector.isFull() && getMana() > 0) {

Xplat/src/main/java/vazkii/botania/api/internal/DummyManaNetwork.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
*/
99
package vazkii.botania.api.internal;
1010

11-
import net.minecraft.core.BlockPos;
1211
import net.minecraft.world.level.Level;
1312

1413
import vazkii.botania.api.mana.*;
@@ -23,26 +22,11 @@ public class DummyManaNetwork implements ManaNetwork {
2322
@Override
2423
public void clear() {}
2524

26-
@Override
27-
public ManaPool getClosestPool(BlockPos pos, Level world, int limit) {
28-
return null;
29-
}
30-
31-
@Override
32-
public ManaCollector getClosestCollector(BlockPos pos, Level world, int limit) {
33-
return null;
34-
}
35-
3625
@Override
3726
public Set<ManaCollector> getAllCollectorsInWorld(Level world) {
3827
return Collections.emptySet();
3928
}
4029

41-
@Override
42-
public Set<ManaPool> getAllPoolsInWorld(Level world) {
43-
return Collections.emptySet();
44-
}
45-
4630
@Override
4731
public void fireManaNetworkEvent(ManaReceiver thing, ManaBlockType type, ManaNetworkAction action) {
4832

Xplat/src/main/java/vazkii/botania/api/internal/ManaNetwork.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
*/
99
package vazkii.botania.api.internal;
1010

11-
import net.minecraft.core.BlockPos;
1211
import net.minecraft.world.level.Level;
1312

14-
import org.jetbrains.annotations.Nullable;
15-
1613
import vazkii.botania.api.mana.*;
1714

1815
import java.util.Set;
@@ -28,40 +25,11 @@ public interface ManaNetwork {
2825
*/
2926
void clear();
3027

31-
/**
32-
* Gets the closest Mana Collector (eg. Mana Spreader) in the network to the Chunk
33-
* Coordinates passed in, in the given dimension.<br>
34-
* Note that this function *can* get performance intensive, it's reccomended you
35-
* call it sparingly and take cache of the value returned.
36-
*
37-
* @param limit The maximum distance the closest block can be, if the closest block
38-
* is farther away than that, null will be returned instead.
39-
*/
40-
@Nullable
41-
ManaCollector getClosestCollector(BlockPos pos, Level world, int limit);
42-
43-
/**
44-
* Gets the closest Mana Pool in the network to the Chunk Coordinates passed in,
45-
* in the given dimension.<br>
46-
* Note that this function *can* get performance intensive, it's reccomended you
47-
* call it sparingly and take cache of the value returned.
48-
*
49-
* @param limit The maximum distance the closest block can be, if the closest block
50-
* is farther away than that, null will be returned instead.
51-
*/
52-
@Nullable
53-
ManaPool getClosestPool(BlockPos pos, Level world, int limit);
54-
5528
/**
5629
* Gets read-only view of all Mana Collectors (eg. Mana Spreader) in the dimension
5730
* passed in.
5831
*/
5932
Set<ManaCollector> getAllCollectorsInWorld(Level world);
6033

61-
/**
62-
* Gets read-only view of all Mana Pools in the dimension passed in.
63-
*/
64-
Set<ManaPool> getAllPoolsInWorld(Level world);
65-
6634
void fireManaNetworkEvent(ManaReceiver thing, ManaBlockType type, ManaNetworkAction action);
6735
}
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package vazkii.botania.api.mana;
22

33
public enum ManaBlockType {
4-
POOL,
54
COLLECTOR
65
}

Xplat/src/main/java/vazkii/botania/client/core/handler/DebugHandler.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
import net.minecraft.ChatFormatting;
1212
import net.minecraft.client.Minecraft;
13-
import net.minecraft.resources.ResourceKey;
14-
import net.minecraft.resources.ResourceLocation;
1513
import net.minecraft.world.level.Level;
1614

1715
import vazkii.botania.common.handler.ManaNetworkHandler;
@@ -33,16 +31,7 @@ public static void onDrawDebugText(List<String> left) {
3331
left.add("");
3432
String version = XplatAbstractions.INSTANCE.getBotaniaVersion();
3533

36-
left.add(PREFIX + "(CLIENT) netColl: " + ManaNetworkHandler.instance.getAllCollectorsInWorld(world).size() + ", netPool: " + ManaNetworkHandler.instance.getAllPoolsInWorld(world).size() + ", rv: " + version);
37-
38-
if (Minecraft.getInstance().hasSingleplayerServer()) {
39-
ResourceKey<Level> dim = world.dimension();
40-
ResourceLocation dimName = dim.location();
41-
if (mc.getSingleplayerServer() != null) {
42-
Level serverWorld = mc.getSingleplayerServer().getLevel(dim);
43-
left.add(PREFIX + String.format("(INTEGRATED SERVER %s) netColl : %d, netPool: %d", dimName, ManaNetworkHandler.instance.getAllCollectorsInWorld(serverWorld).size(), ManaNetworkHandler.instance.getAllPoolsInWorld(serverWorld).size()));
44-
}
45-
}
34+
left.add(PREFIX + "(CLIENT) netColl: " + ManaNetworkHandler.instance.getAllCollectorsInWorld(world).size() + ", rv: " + version);
4635
}
4736
}
4837

Xplat/src/main/java/vazkii/botania/common/block/block_entity/mana/ManaPoolBlockEntity.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.jetbrains.annotations.UnknownNullability;
3838
import org.lwjgl.opengl.GL11;
3939

40-
import vazkii.botania.api.BotaniaAPI;
4140
import vazkii.botania.api.BotaniaAPIClient;
4241
import vazkii.botania.api.block.WandHUD;
4342
import vazkii.botania.api.block.Wandable;
@@ -58,7 +57,6 @@
5857
import vazkii.botania.common.crafting.BotaniaRecipeTypes;
5958
import vazkii.botania.common.crafting.StateIngredients;
6059
import vazkii.botania.common.handler.BotaniaSounds;
61-
import vazkii.botania.common.handler.ManaNetworkHandler;
6260
import vazkii.botania.common.helper.EntityHelper;
6361
import vazkii.botania.common.item.BotaniaItems;
6462
import vazkii.botania.common.item.ManaTabletItem;
@@ -125,12 +123,6 @@ public void receiveMana(int mana) {
125123
}
126124
}
127125

128-
@Override
129-
public void setRemoved() {
130-
super.setRemoved();
131-
BotaniaAPI.instance().getManaNetworkInstance().fireManaNetworkEvent(this, ManaBlockType.POOL, ManaNetworkAction.REMOVE);
132-
}
133-
134126
public static int calculateComparatorLevel(int mana, int max) {
135127
int val = (int) ((double) mana / (double) max * 15.0);
136128
if (mana > 0) {
@@ -249,9 +241,6 @@ private void initManaCapAndNetwork() {
249241
if (getMaxMana() == -1) {
250242
manaCap = ((ManaPoolBlock) getBlockState().getBlock()).getManaCapacity();
251243
}
252-
if (!ManaNetworkHandler.instance.isPoolIn(level, this) && !isRemoved()) {
253-
BotaniaAPI.instance().getManaNetworkInstance().fireManaNetworkEvent(this, ManaBlockType.POOL, ManaNetworkAction.ADD);
254-
}
255244
}
256245

257246
public static void clientTick(Level level, BlockPos worldPosition, BlockState state, ManaPoolBlockEntity self) {

0 commit comments

Comments
 (0)