Skip to content

Commit dad629c

Browse files
committed
RXJava pass 2; move chunk listening to actual field instances
1 parent 6c6d63e commit dad629c

5 files changed

Lines changed: 61 additions & 76 deletions

File tree

src/api/java/dev/compactmods/crafting/api/field/IMiniaturizationField.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
public interface IMiniaturizationField {
1515

16+
default void dispose() {}
17+
1618
AxisAlignedBB getBounds();
1719

1820
MiniaturizationFieldSize getFieldSize();
@@ -55,8 +57,6 @@ default CompoundNBT serverData() {
5557
return new CompoundNBT();
5658
}
5759

58-
default void loadServerData(CompoundNBT nbt) {}
59-
6060
default CompoundNBT clientData() {
6161
CompoundNBT data = new CompoundNBT();
6262
data.putLong("center", getCenter().asLong());

src/main/java/dev/compactmods/crafting/events/WorldEventHandler.java

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,32 @@
11
package dev.compactmods.crafting.events;
22

3-
import java.util.HashMap;
4-
import java.util.concurrent.TimeUnit;
53
import dev.compactmods.crafting.CompactCrafting;
64
import dev.compactmods.crafting.api.field.IActiveWorldFields;
7-
import dev.compactmods.crafting.api.field.IMiniaturizationField;
85
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
96
import dev.compactmods.crafting.network.ClientFieldUnwatchPacket;
107
import dev.compactmods.crafting.network.ClientFieldWatchPacket;
118
import dev.compactmods.crafting.network.NetworkHandler;
12-
import io.reactivex.rxjava3.disposables.Disposable;
13-
import io.reactivex.rxjava3.schedulers.Schedulers;
149
import io.reactivex.rxjava3.subjects.PublishSubject;
1510
import io.reactivex.rxjava3.subjects.Subject;
1611
import net.minecraft.entity.player.ServerPlayerEntity;
17-
import net.minecraft.util.RegistryKey;
1812
import net.minecraft.util.math.ChunkPos;
19-
import net.minecraft.world.World;
20-
import net.minecraft.world.chunk.Chunk;
2113
import net.minecraft.world.server.ServerWorld;
22-
import net.minecraftforge.common.util.LazyOptional;
2314
import net.minecraftforge.event.TickEvent;
2415
import net.minecraftforge.event.world.ChunkEvent;
2516
import net.minecraftforge.event.world.ChunkWatchEvent;
2617
import net.minecraftforge.eventbus.api.SubscribeEvent;
2718
import net.minecraftforge.fml.common.Mod;
2819
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
29-
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent;
3020
import net.minecraftforge.fml.network.PacketDistributor;
3121

3222
@SuppressWarnings("unused")
3323
@Mod.EventBusSubscriber(modid = CompactCrafting.MOD_ID)
3424
public class WorldEventHandler {
3525

36-
private static final HashMap<RegistryKey<World>, LazyOptional<IActiveWorldFields>> FIELDS = new HashMap<>();
37-
private static final Subject<ChunkEvent> CHUNK_CHANGES;
38-
private static final Disposable CHUNK_LISTENER;
26+
public static final Subject<ChunkEvent> CHUNK_CHANGES;
3927

4028
static {
4129
CHUNK_CHANGES = PublishSubject.create();
42-
CHUNK_LISTENER = CHUNK_CHANGES.buffer(1, TimeUnit.SECONDS, Schedulers.newThread())
43-
.filter(l -> !l.isEmpty())
44-
.subscribe((changedChunks) -> {
45-
final World level = ((Chunk) changedChunks.get(0).getChunk()).getLevel();
46-
if (!FIELDS.containsKey(level.dimension())) {
47-
final LazyOptional<IActiveWorldFields> cap = level.getCapability(CapabilityActiveWorldFields.FIELDS);
48-
FIELDS.put(level.dimension(), cap);
49-
cap.addListener((listener) -> {
50-
listener.ifPresent(fields -> FIELDS.remove(fields.getLevel()));
51-
});
52-
}
53-
54-
FIELDS.get(level.dimension()).ifPresent(fields -> {
55-
changedChunks.stream()
56-
.map(ce -> ce.getChunk().getPos())
57-
.flatMap(fields::getFields)
58-
.forEach(IMiniaturizationField::checkLoaded);
59-
});
60-
});
6130
}
6231

6332
@SubscribeEvent
@@ -76,12 +45,6 @@ public static void onServerStarted(final FMLServerStartedEvent evt) {
7645
}
7746
}
7847

79-
@SubscribeEvent
80-
void onServerStop(final FMLServerStoppingEvent stopping) {
81-
if (!CHUNK_LISTENER.isDisposed())
82-
CHUNK_LISTENER.dispose();
83-
}
84-
8548
@SubscribeEvent
8649
public static void onWorldTick(final TickEvent.WorldTickEvent evt) {
8750
if (evt.phase != TickEvent.Phase.START) return;

src/main/java/dev/compactmods/crafting/field/MiniaturizationField.java

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
1313
import dev.compactmods.crafting.api.recipe.IMiniaturizationRecipe;
1414
import dev.compactmods.crafting.crafting.CraftingHelper;
15+
import dev.compactmods.crafting.events.WorldEventHandler;
1516
import dev.compactmods.crafting.network.FieldActivatedPacket;
1617
import dev.compactmods.crafting.network.FieldDeactivatedPacket;
1718
import dev.compactmods.crafting.network.FieldRecipeChangedPacket;
@@ -22,6 +23,7 @@
2223
import dev.compactmods.crafting.recipes.blocks.RecipeBlocks;
2324
import dev.compactmods.crafting.server.ServerConfig;
2425
import dev.compactmods.crafting.util.BlockSpaceUtil;
26+
import io.reactivex.rxjava3.disposables.Disposable;
2527
import net.minecraft.block.Blocks;
2628
import net.minecraft.entity.item.ItemEntity;
2729
import net.minecraft.item.Item;
@@ -35,10 +37,12 @@
3537
import net.minecraft.util.ResourceLocation;
3638
import net.minecraft.util.math.AxisAlignedBB;
3739
import net.minecraft.util.math.BlockPos;
40+
import net.minecraft.util.math.ChunkPos;
3841
import net.minecraft.util.math.vector.Vector3i;
3942
import net.minecraft.world.IServerWorld;
4043
import net.minecraft.world.IWorld;
4144
import net.minecraft.world.World;
45+
import net.minecraft.world.chunk.Chunk;
4246
import net.minecraft.world.gen.feature.template.PlacementSettings;
4347
import net.minecraft.world.gen.feature.template.Template;
4448
import net.minecraft.world.server.ServerWorld;
@@ -68,13 +72,60 @@ public class MiniaturizationField implements IMiniaturizationField {
6872
private LazyOptional<IMiniaturizationField> lazyReference = LazyOptional.empty();
6973
private boolean disabled = false;
7074

75+
private static Disposable CHUNK_LISTENER;
76+
7177
public MiniaturizationField() {
7278
}
7379

7480
private MiniaturizationField(MiniaturizationFieldSize size, BlockPos center) {
7581
this.center = center;
7682
this.size = size;
7783
this.craftingState = EnumCraftingState.NOT_MATCHED;
84+
85+
setupChunkListener();
86+
}
87+
88+
public MiniaturizationField(CompoundNBT nbt) {
89+
this.craftingState = EnumCraftingState.valueOf(nbt.getString("state"));
90+
91+
this.center = NBTUtil.readBlockPos(nbt.getCompound("center"));
92+
this.size = MiniaturizationFieldSize.valueOf(nbt.getString("size"));
93+
94+
setupChunkListener();
95+
96+
// temp load recipe
97+
if (nbt.contains("recipe")) {
98+
this.recipeId = new ResourceLocation(nbt.getString("recipe"));
99+
this.craftingProgress = nbt.getInt("progress");
100+
}
101+
102+
if (nbt.contains("matchedBlocks")) {
103+
Template t = new Template();
104+
t.load(nbt.getCompound("matchedBlocks"));
105+
this.matchedBlocks = t;
106+
} else {
107+
this.matchedBlocks = null;
108+
}
109+
110+
this.disabled = nbt.contains("disabled") && nbt.getBoolean("disabled");
111+
}
112+
113+
private void setupChunkListener() {
114+
// add projector and central chunks
115+
final Set<ChunkPos> insideChunks = getProjectorPositions().map(ChunkPos::new).distinct().collect(Collectors.toSet());
116+
insideChunks.add(new ChunkPos(center));
117+
118+
CHUNK_LISTENER = WorldEventHandler.CHUNK_CHANGES.filter(ce -> {
119+
boolean sameLevel = ((Chunk) ce.getChunk()).getLevel().dimension().equals(level.dimension());
120+
boolean watchedChunk = insideChunks.contains(ce.getChunk().getPos());
121+
return sameLevel && watchedChunk;
122+
}).subscribe((changed) -> this.checkLoaded());
123+
}
124+
125+
@Override
126+
public void dispose() {
127+
if (!CHUNK_LISTENER.isDisposed())
128+
CHUNK_LISTENER.dispose();
78129
}
79130

80131
public static MiniaturizationField fromSizeAndCenter(MiniaturizationFieldSize fieldSize, BlockPos center) {
@@ -368,7 +419,7 @@ public boolean isLoaded() {
368419
}
369420

370421
public void checkLoaded() {
371-
CompactCrafting.LOGGER.trace("Checking loaded state.");
422+
CompactCrafting.LOGGER.debug("Checking loaded state.");
372423
this.loaded = level.isAreaLoaded(center, size.getProjectorDistance() + 3);
373424

374425
if (loaded) {
@@ -418,27 +469,6 @@ public CompoundNBT serverData() {
418469
return nbt;
419470
}
420471

421-
@Override
422-
public void loadServerData(CompoundNBT nbt) {
423-
this.craftingState = EnumCraftingState.valueOf(nbt.getString("state"));
424-
425-
// temp load recipe
426-
if (nbt.contains("recipe")) {
427-
this.recipeId = new ResourceLocation(nbt.getString("recipe"));
428-
this.craftingProgress = nbt.getInt("progress");
429-
}
430-
431-
if (nbt.contains("matchedBlocks")) {
432-
Template t = new Template();
433-
t.load(nbt.getCompound("matchedBlocks"));
434-
this.matchedBlocks = t;
435-
} else {
436-
this.matchedBlocks = null;
437-
}
438-
439-
this.disabled = nbt.contains("disabled") && nbt.getBoolean("disabled");
440-
}
441-
442472
@Override
443473
public void setProgress(int progress) {
444474
this.craftingProgress = progress;
@@ -507,7 +537,7 @@ public void setRef(LazyOptional<IMiniaturizationField> lazyReference) {
507537
@Override
508538
public void disable() {
509539
this.disabled = true;
510-
if(this.craftingState != EnumCraftingState.NOT_MATCHED)
540+
if (this.craftingState != EnumCraftingState.NOT_MATCHED)
511541
handleDestabilize();
512542

513543
getProjectorPositions().forEach(proj -> {
@@ -526,7 +556,7 @@ public void enable() {
526556
getProjectorPositions().forEach(proj -> {
527557
FieldProjectorBlock.activateProjector(level, proj, this.size);
528558
TileEntity projTile = level.getBlockEntity(proj);
529-
if(projTile instanceof FieldProjectorTile) {
559+
if (projTile instanceof FieldProjectorTile) {
530560
((FieldProjectorTile) projTile).setFieldRef(lazyReference);
531561
}
532562
});

src/main/java/dev/compactmods/crafting/field/capability/CapabilityActiveWorldFields.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
package dev.compactmods.crafting.field.capability;
22

33
import javax.annotation.Nullable;
4+
import dev.compactmods.crafting.api.field.IActiveWorldFields;
5+
import dev.compactmods.crafting.api.field.IMiniaturizationField;
46
import dev.compactmods.crafting.data.NbtListCollector;
57
import dev.compactmods.crafting.field.ActiveWorldFields;
68
import dev.compactmods.crafting.field.MiniaturizationField;
7-
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
8-
import dev.compactmods.crafting.api.field.IActiveWorldFields;
9-
import dev.compactmods.crafting.api.field.IMiniaturizationField;
109
import net.minecraft.nbt.CompoundNBT;
1110
import net.minecraft.nbt.INBT;
1211
import net.minecraft.nbt.ListNBT;
13-
import net.minecraft.nbt.NBTUtil;
1412
import net.minecraft.util.Direction;
15-
import net.minecraft.util.math.BlockPos;
1613
import net.minecraftforge.common.capabilities.Capability;
1714
import net.minecraftforge.common.capabilities.CapabilityInject;
1815
import net.minecraftforge.common.capabilities.CapabilityManager;
@@ -48,13 +45,7 @@ public void readNBT(Capability<IActiveWorldFields> capability, IActiveWorldField
4845
if(!(item instanceof CompoundNBT))
4946
return;
5047

51-
CompoundNBT f = (CompoundNBT) item;
52-
MiniaturizationFieldSize size = MiniaturizationFieldSize.valueOf(f.getString("size"));
53-
BlockPos center = NBTUtil.readBlockPos(f.getCompound("center"));
54-
55-
MiniaturizationField field = MiniaturizationField.fromSizeAndCenter(size, center);
56-
field.loadServerData(f);
57-
48+
MiniaturizationField field = new MiniaturizationField((CompoundNBT) item);
5849
instance.addFieldInstance(field);
5950
});
6051
}

src/main/java/dev/compactmods/crafting/projector/FieldProjectorBlock.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ public void onRemove(BlockState oldState, World level, BlockPos pos, BlockState
273273
if (field.enabled()) {
274274
fields.unregisterField(fieldCenter);
275275
field.handleDestabilize();
276+
field.dispose();
276277
}
277278
}
278279
});

0 commit comments

Comments
 (0)