Skip to content

Commit 304693b

Browse files
committed
WIP field code
1 parent 314fea4 commit 304693b

File tree

6 files changed

+66
-79
lines changed

6 files changed

+66
-79
lines changed

src/main/java/dev/compactmods/crafting/client/ClientEventHandler.java

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,24 @@
22

33
import com.mojang.blaze3d.matrix.MatrixStack;
44
import dev.compactmods.crafting.CompactCrafting;
5-
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
6-
import dev.compactmods.crafting.field.render.CraftingPreviewRenderer;
7-
import dev.compactmods.crafting.network.ClientFieldUnwatchPacket;
8-
import dev.compactmods.crafting.network.ClientFieldWatchPacket;
9-
import dev.compactmods.crafting.network.NetworkHandler;
105
import dev.compactmods.crafting.api.EnumCraftingState;
116
import dev.compactmods.crafting.api.field.IActiveWorldFields;
7+
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
8+
import dev.compactmods.crafting.field.render.CraftingPreviewRenderer;
129
import net.minecraft.client.Minecraft;
1310
import net.minecraft.client.renderer.ActiveRenderInfo;
1411
import net.minecraft.client.renderer.IRenderTypeBuffer;
1512
import net.minecraft.client.renderer.WorldRenderer;
1613
import net.minecraft.client.renderer.texture.OverlayTexture;
1714
import net.minecraft.client.world.ClientWorld;
18-
import net.minecraft.entity.player.ServerPlayerEntity;
1915
import net.minecraft.util.math.BlockPos;
20-
import net.minecraft.util.math.ChunkPos;
2116
import net.minecraft.util.math.RayTraceResult;
2217
import net.minecraft.util.math.vector.Vector3d;
23-
import net.minecraft.world.server.ServerWorld;
2418
import net.minecraftforge.api.distmarker.Dist;
2519
import net.minecraftforge.client.event.RenderWorldLastEvent;
2620
import net.minecraftforge.event.TickEvent;
27-
import net.minecraftforge.event.world.ChunkWatchEvent;
2821
import net.minecraftforge.eventbus.api.SubscribeEvent;
2922
import net.minecraftforge.fml.common.Mod;
30-
import net.minecraftforge.fml.network.PacketDistributor;
3123

3224
@Mod.EventBusSubscriber(modid = CompactCrafting.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE)
3325
public class ClientEventHandler {
@@ -43,46 +35,6 @@ public static void onTick(final TickEvent.ClientTickEvent evt) {
4335
}
4436
}
4537

46-
@SubscribeEvent
47-
public static void onStartChunkTracking(final ChunkWatchEvent.Watch event) {
48-
final ServerPlayerEntity player = event.getPlayer();
49-
final ChunkPos pos = event.getPos();
50-
final ServerWorld level = event.getWorld();
51-
52-
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
53-
.map(f -> f.getFields(pos))
54-
.ifPresent(activeFields -> {
55-
activeFields.forEach(field -> {
56-
ClientFieldWatchPacket pkt = new ClientFieldWatchPacket(field);
57-
58-
NetworkHandler.MAIN_CHANNEL.send(
59-
PacketDistributor.PLAYER.with(() -> player),
60-
pkt
61-
);
62-
});
63-
});
64-
}
65-
66-
@SubscribeEvent
67-
public static void onStopChunkTracking(final ChunkWatchEvent.UnWatch event) {
68-
final ServerPlayerEntity player = event.getPlayer();
69-
final ChunkPos pos = event.getPos();
70-
final ServerWorld level = event.getWorld();
71-
72-
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
73-
.map(f -> f.getFields(pos))
74-
.ifPresent(activeFields -> {
75-
activeFields.forEach(field -> {
76-
ClientFieldUnwatchPacket pkt = new ClientFieldUnwatchPacket(field.getCenter());
77-
78-
NetworkHandler.MAIN_CHANNEL.send(
79-
PacketDistributor.PLAYER.with(() -> player),
80-
pkt
81-
);
82-
});
83-
});
84-
}
85-
8638
@SubscribeEvent
8739
public static void onWorldRender(final RenderWorldLastEvent event) {
8840
final WorldRenderer renderer = event.getContext();

src/main/java/dev/compactmods/crafting/client/ClientPacketHandler.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.compactmods.crafting.client;
22

33
import javax.annotation.Nullable;
4-
import java.util.concurrent.atomic.AtomicReference;
4+
import java.util.Objects;
55
import dev.compactmods.crafting.api.field.IMiniaturizationField;
66
import dev.compactmods.crafting.field.MiniaturizationField;
77
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
@@ -12,7 +12,6 @@
1212
import net.minecraft.nbt.CompoundNBT;
1313
import net.minecraft.util.ResourceLocation;
1414
import net.minecraft.util.math.BlockPos;
15-
import net.minecraftforge.common.util.LazyOptional;
1615

1716
public abstract class ClientPacketHandler {
1817

@@ -26,17 +25,13 @@ public static void handleFieldActivation(IMiniaturizationField field, CompoundNB
2625
field.setLevel(cw);
2726
field.loadClientData(fieldClientData);
2827

29-
AtomicReference<LazyOptional<IMiniaturizationField>> fieldLazy = new AtomicReference<>(LazyOptional.empty());
3028
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
31-
.ifPresent(fields -> {
32-
fields.registerField(field);
33-
fieldLazy.set(fields.getLazy(field.getCenter()));
34-
});
29+
.ifPresent(fields -> fields.registerField(field));
3530

3631
field.getProjectorPositions().forEach(proj -> {
3732
if (cw.getBlockState(proj).getBlock() instanceof FieldProjectorBlock) {
3833
FieldProjectorBlock.activateProjector(cw, proj, field.getFieldSize());
39-
((FieldProjectorTile) cw.getBlockEntity(proj)).setField(fieldLazy.get());
34+
((FieldProjectorTile) cw.getBlockEntity(proj)).updateFieldInfo();
4035
}
4136
});
4237

@@ -68,6 +63,12 @@ public static void handleFieldData(CompoundNBT fieldData) {
6863
.ifPresent(fields -> {
6964
fields.setLevel(mc.level);
7065
fields.registerField(field);
66+
67+
field.getProjectorPositions()
68+
.map(mc.level::getBlockEntity)
69+
.map(tile -> (FieldProjectorTile) tile)
70+
.filter(Objects::nonNull)
71+
.forEach(FieldProjectorTile::updateFieldInfo);
7172
});
7273
}
7374

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@
44
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
55
import dev.compactmods.crafting.api.field.IActiveWorldFields;
66
import dev.compactmods.crafting.api.field.IMiniaturizationField;
7+
import dev.compactmods.crafting.network.ClientFieldUnwatchPacket;
8+
import dev.compactmods.crafting.network.ClientFieldWatchPacket;
9+
import dev.compactmods.crafting.network.NetworkHandler;
10+
import net.minecraft.entity.player.ServerPlayerEntity;
711
import net.minecraft.server.MinecraftServer;
812
import net.minecraft.util.concurrent.TickDelayedTask;
913
import net.minecraft.util.math.BlockPos;
14+
import net.minecraft.util.math.ChunkPos;
1015
import net.minecraft.world.World;
1116
import net.minecraft.world.chunk.Chunk;
1217
import net.minecraft.world.server.ServerWorld;
1318
import net.minecraftforge.event.TickEvent;
1419
import net.minecraftforge.event.world.ChunkEvent;
20+
import net.minecraftforge.event.world.ChunkWatchEvent;
1521
import net.minecraftforge.eventbus.api.SubscribeEvent;
1622
import net.minecraftforge.fml.common.Mod;
1723
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
24+
import net.minecraftforge.fml.network.PacketDistributor;
1825

1926
@SuppressWarnings("unused")
2027
@Mod.EventBusSubscriber(modid = CompactCrafting.MOD_ID)
@@ -44,6 +51,46 @@ public static void onWorldTick(final TickEvent.WorldTickEvent evt) {
4451
.ifPresent(IActiveWorldFields::tickFields);
4552
}
4653

54+
@SubscribeEvent
55+
public static void onStartChunkTracking(final ChunkWatchEvent.Watch event) {
56+
final ServerPlayerEntity player = event.getPlayer();
57+
final ChunkPos pos = event.getPos();
58+
final ServerWorld level = event.getWorld();
59+
60+
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
61+
.map(f -> f.getFields(pos))
62+
.ifPresent(activeFields -> {
63+
activeFields.forEach(field -> {
64+
ClientFieldWatchPacket pkt = new ClientFieldWatchPacket(field);
65+
66+
NetworkHandler.MAIN_CHANNEL.send(
67+
PacketDistributor.PLAYER.with(() -> player),
68+
pkt
69+
);
70+
});
71+
});
72+
}
73+
74+
@SubscribeEvent
75+
public static void onStopChunkTracking(final ChunkWatchEvent.UnWatch event) {
76+
final ServerPlayerEntity player = event.getPlayer();
77+
final ChunkPos pos = event.getPos();
78+
final ServerWorld level = event.getWorld();
79+
80+
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
81+
.map(f -> f.getFields(pos))
82+
.ifPresent(activeFields -> {
83+
activeFields.forEach(field -> {
84+
ClientFieldUnwatchPacket pkt = new ClientFieldUnwatchPacket(field.getCenter());
85+
86+
NetworkHandler.MAIN_CHANNEL.send(
87+
PacketDistributor.PLAYER.with(() -> player),
88+
pkt
89+
);
90+
});
91+
});
92+
}
93+
4794
@SubscribeEvent
4895
public static void onChunkLoadStatusChanged(final ChunkEvent cEvent) {
4996
if (cEvent instanceof ChunkEvent.Load || cEvent instanceof ChunkEvent.Unload) {

src/main/java/dev/compactmods/crafting/network/ClientFieldWatchPacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static void encode(ClientFieldWatchPacket pkt, PacketBuffer buf) {
2828
}
2929

3030
public static boolean handle(ClientFieldWatchPacket pkt, Supplier<NetworkEvent.Context> context) {
31-
context.get().enqueueWork(() -> ClientPacketHandler.handleFieldData(pkt.clientData));
31+
ClientPacketHandler.handleFieldData(pkt.clientData);
3232
return true;
3333
}
3434
}

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

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import javax.annotation.Nonnull;
44
import javax.annotation.Nullable;
55
import java.util.Optional;
6+
import dev.compactmods.crafting.CompactCrafting;
67
import dev.compactmods.crafting.Registration;
78
import dev.compactmods.crafting.api.field.IActiveWorldFields;
89
import dev.compactmods.crafting.api.field.IMiniaturizationField;
@@ -71,15 +72,12 @@ public void setLevelAndPosition(World level, BlockPos position) {
7172
server.submitAsync(new TickDelayedTask(server.getTickCount() + 3, this::updateFieldInfo));
7273
}
7374

74-
private void updateFieldInfo() {
75+
public void updateFieldInfo() {
7576
if (this.level == null)
7677
return;
7778

7879
this.levelFields = level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS);
7980

80-
if (level.isClientSide)
81-
return;
82-
8381
BlockPos center = BlockPos.ZERO;
8482
final BlockState state = getBlockState();
8583
if (this.fieldBounds == null) {
@@ -89,10 +87,6 @@ private void updateFieldInfo() {
8987
center = new BlockPos(fieldBounds.getCenter());
9088
}
9189

92-
final MinecraftServer server = level.getServer();
93-
if (server == null)
94-
return;
95-
9690
final BlockPos finalCenter = center.immutable();
9791
levelFields.ifPresent(fields -> {
9892
if (!fields.hasActiveField(finalCenter)) {
@@ -104,6 +98,7 @@ private void updateFieldInfo() {
10498
new FieldActivatedPacket(field));
10599
}
106100

101+
CompactCrafting.LOGGER.debug("Changing field: updateFI");
107102
this.fieldCap = fields.getLazy(finalCenter);
108103
});
109104
}
@@ -127,6 +122,7 @@ public void invalidateField() {
127122
.forEach(p -> FieldProjectorBlock.deactivateProjector(level, p));
128123

129124
fieldCap.ifPresent(f -> {
125+
CompactCrafting.LOGGER.debug("Unsetting field: invalidate");
130126
fieldCap.invalidate();
131127
levelFields.ifPresent(fields -> {
132128
fields.unregisterField(f);
@@ -142,18 +138,11 @@ public void invalidateField() {
142138
.send(trk, new FieldDeactivatedPacket(fieldSize, fieldCenter));
143139
});
144140

141+
CompactCrafting.LOGGER.debug("Unsetting field: invalidate");
145142
this.fieldCap = LazyOptional.empty();
146143
this.setChanged();
147144
}
148145

149-
public void setField(LazyOptional<IMiniaturizationField> field) {
150-
this.fieldCap.invalidate();
151-
this.fieldCap = field;
152-
field.addListener(f -> {
153-
this.fieldCap = LazyOptional.empty();
154-
});
155-
}
156-
157146
@Nonnull
158147
@Override
159148
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
@@ -184,6 +173,6 @@ public AxisAlignedBB getRenderBoundingBox() {
184173
}
185174

186175
public LazyOptional<IMiniaturizationField> getField() {
187-
return this.fieldCap;
176+
return this.fieldCap.cast();
188177
}
189178
}

src/main/java/dev/compactmods/crafting/projector/render/FieldProjectorRenderer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ public void render(FieldProjectorTile tile, float partialTicks, MatrixStack matr
6464

6565
renderDish(tile, matrixStack, buffers, combinedLightIn, combinedOverlayIn, gameTime);
6666

67-
LazyOptional<IMiniaturizationField> fieldRef = tile.getField();
68-
69-
fieldRef.ifPresent(field -> {
67+
tile.getField().ifPresent(field -> {
7068
double scale = MathUtil.calculateFieldScale(field);
7169

7270
AxisAlignedBB bounds = field.getBounds().deflate((1 - scale) * (field.getFieldSize().getSize() / 2.0));

0 commit comments

Comments
 (0)