Skip to content

Commit f10bb5f

Browse files
committed
:stabolb: CLIENT EVENTS RAGH
1 parent 6579ae9 commit f10bb5f

File tree

15 files changed

+338
-248
lines changed

15 files changed

+338
-248
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,9 @@ default void loadClientData(CompoundNBT nbt) {
9090
void setProgress(int progress);
9191

9292
void setRecipe(ResourceLocation id);
93+
94+
default void handleProjectorBroken() {}
95+
96+
LazyOptional<IMiniaturizationField> getRef();
97+
void setRef(LazyOptional<IMiniaturizationField> ref);
9398
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,9 @@ public AxisAlignedBB getBoundsAtPosition(BlockPos center) {
153153
public String getSerializedName() {
154154
return name;
155155
}
156+
157+
public BlockPos getBoundsAsBlockPos() {
158+
final int dims = getDimensions();
159+
return new BlockPos(dims, dims, dims);
160+
}
156161
}

src/main/java/dev/compactmods/crafting/Registration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public class Registration {
120120
.of(FieldProjectorTile::new, FIELD_PROJECTOR_BLOCK.get())
121121
.build(null));
122122

123+
@SuppressWarnings("deprecation")
123124
public static final RegistryObject<TileEntityType<FieldCraftingPreviewTile>> FIELD_CRAFTING_PREVIEW_TILE = TILE_ENTITIES.register("field_crafting_preview", () ->
124125
TileEntityType.Builder
125126
.of(FieldCraftingPreviewTile::new, FIELD_CRAFTING_PREVIEW_BLOCK.get())

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import javax.annotation.Nullable;
44
import java.util.Objects;
5+
import java.util.stream.Stream;
6+
import dev.compactmods.crafting.CompactCrafting;
57
import dev.compactmods.crafting.api.field.IMiniaturizationField;
68
import dev.compactmods.crafting.field.MiniaturizationField;
79
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
810
import dev.compactmods.crafting.projector.FieldProjectorBlock;
911
import dev.compactmods.crafting.projector.FieldProjectorTile;
12+
import net.minecraft.block.BlockState;
1013
import net.minecraft.client.Minecraft;
1114
import net.minecraft.client.world.ClientWorld;
1215
import net.minecraft.nbt.CompoundNBT;
@@ -27,26 +30,20 @@ public static void handleFieldActivation(IMiniaturizationField field, CompoundNB
2730

2831
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
2932
.ifPresent(fields -> fields.registerField(field));
30-
31-
field.getProjectorPositions().forEach(proj -> {
32-
if (cw.getBlockState(proj).getBlock() instanceof FieldProjectorBlock) {
33-
FieldProjectorBlock.activateProjector(cw, proj, field.getFieldSize());
34-
((FieldProjectorTile) cw.getBlockEntity(proj)).updateFieldInfo();
35-
}
36-
});
37-
3833
});
3934
}
4035

41-
public static void handleFieldDeactivation(BlockPos[] projectorLocations) {
36+
public static void handleFieldDeactivation(BlockPos center) {
4237
Minecraft mc = Minecraft.getInstance();
4338
mc.submitAsync(() -> {
4439
ClientWorld cw = mc.level;
45-
for (BlockPos proj : projectorLocations) {
46-
if (cw.getBlockState(proj).getBlock() instanceof FieldProjectorBlock) {
47-
FieldProjectorBlock.deactivateProjector(cw, proj);
48-
}
49-
}
40+
cw.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS).ifPresent(fields -> {
41+
fields.get(center).map(IMiniaturizationField::getProjectorPositions)
42+
.orElse(Stream.empty())
43+
.forEach(proj -> FieldProjectorBlock.deactivateProjector(cw, proj));
44+
45+
fields.unregisterField(center);
46+
});
5047
});
5148
}
5249

@@ -62,13 +59,19 @@ public static void handleFieldData(CompoundNBT fieldData) {
6259
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
6360
.ifPresent(fields -> {
6461
fields.setLevel(mc.level);
65-
fields.registerField(field);
62+
CompactCrafting.LOGGER.debug("Registering field on client");
63+
final IMiniaturizationField fieldRegistered = fields.registerField(field);
64+
65+
CompactCrafting.LOGGER.debug("Setting field references");
6666

6767
field.getProjectorPositions()
6868
.map(mc.level::getBlockEntity)
6969
.map(tile -> (FieldProjectorTile) tile)
7070
.filter(Objects::nonNull)
71-
.forEach(FieldProjectorTile::updateFieldInfo);
71+
.forEach(tile -> {
72+
final BlockState state = tile.getBlockState();
73+
tile.setFieldRef(fieldRegistered.getRef());
74+
});
7275
});
7376
}
7477

@@ -78,9 +81,7 @@ public static void removeField(BlockPos fieldCenter) {
7881
return;
7982

8083
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
81-
.ifPresent(fields -> {
82-
fields.unregisterField(fieldCenter);
83-
});
84+
.ifPresent(fields -> fields.unregisterField(fieldCenter));
8485
}
8586

8687
public static void handleRecipeChanged(BlockPos center, @Nullable ResourceLocation recipe) {
@@ -89,8 +90,7 @@ public static void handleRecipeChanged(BlockPos center, @Nullable ResourceLocati
8990
return;
9091

9192
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
92-
.resolve()
93-
.flatMap(af -> af.get(center))
94-
.ifPresent(field -> field.setRecipe(recipe));
93+
.lazyMap(af -> af.get(center))
94+
.ifPresent(field -> field.ifPresent(f -> f.setRecipe(recipe)));
9595
}
9696
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package dev.compactmods.crafting.events;
2+
3+
import dev.compactmods.crafting.CompactCrafting;
4+
import static dev.compactmods.crafting.CompactCrafting.MOD_ID;
5+
import dev.compactmods.crafting.field.FieldHelper;
6+
import dev.compactmods.crafting.field.MissingFieldsException;
7+
import net.minecraft.entity.LivingEntity;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.util.math.BlockRayTraceResult;
10+
import net.minecraft.world.IWorld;
11+
import net.minecraft.world.World;
12+
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
13+
import net.minecraftforge.event.world.BlockEvent;
14+
import net.minecraftforge.eventbus.api.SubscribeEvent;
15+
import net.minecraftforge.fml.common.Mod;
16+
17+
@SuppressWarnings("unused")
18+
@Mod.EventBusSubscriber(modid = MOD_ID)
19+
public class BlockEventHandler {
20+
21+
@SubscribeEvent
22+
static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) {
23+
final LivingEntity entity = event.getEntityLiving();
24+
final BlockRayTraceResult hitVec = event.getHitVec();
25+
26+
World w = event.getWorld();
27+
28+
if(w.isClientSide) {
29+
final BlockPos placedAt = hitVec.getBlockPos().relative(hitVec.getDirection());
30+
try {
31+
final boolean allowPlace = FieldHelper.checkBlockPlacement(w, placedAt);
32+
if (!allowPlace) {
33+
event.setCanceled(true);
34+
}
35+
36+
} catch (MissingFieldsException e) {
37+
CompactCrafting.LOGGER.error("Missing the active miniaturization fields capability in the level. Report this!");
38+
}
39+
}
40+
}
41+
42+
@SubscribeEvent
43+
static void onBlockPlaced(final BlockEvent.EntityPlaceEvent blockPlaced) {
44+
blockHandler(blockPlaced);
45+
}
46+
47+
@SubscribeEvent
48+
static void onBlockDestroyed(final BlockEvent.BreakEvent blockDestroyed) {
49+
blockHandler(blockDestroyed);
50+
}
51+
52+
private static void blockHandler(final BlockEvent event) {
53+
// Check if block is in or around a projector field
54+
IWorld world = event.getWorld();
55+
BlockPos pos = event.getPos();
56+
57+
// Send the event position over to the field helper, so any nearby projectors can be notified
58+
if (world instanceof World) {
59+
try {
60+
boolean allowPlace = FieldHelper.checkBlockPlacement((World) world, pos);
61+
if (!allowPlace) {
62+
event.setCanceled(true);
63+
}
64+
} catch (MissingFieldsException e) {
65+
CompactCrafting.LOGGER.error("Missing the active miniaturization fields capability in the level. Report this!");
66+
}
67+
}
68+
}
69+
}

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

Lines changed: 0 additions & 38 deletions
This file was deleted.

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

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import dev.compactmods.crafting.api.field.IMiniaturizationField;
1212
import dev.compactmods.crafting.network.FieldDeactivatedPacket;
1313
import dev.compactmods.crafting.network.NetworkHandler;
14+
import dev.compactmods.crafting.projector.FieldProjectorTile;
15+
import net.minecraft.tileentity.TileEntity;
1416
import net.minecraft.util.math.BlockPos;
1517
import net.minecraft.util.math.ChunkPos;
1618
import net.minecraft.world.World;
@@ -68,7 +70,14 @@ public IMiniaturizationField registerField(IMiniaturizationField field) {
6870

6971
LazyOptional<IMiniaturizationField> lazy = LazyOptional.of(() -> field);
7072
laziness.put(center, lazy);
73+
field.setRef(lazy);
7174

75+
field.getProjectorPositions().forEach(pos -> {
76+
TileEntity tileAt = level.getBlockEntity(pos);
77+
if(tileAt instanceof FieldProjectorTile) {
78+
((FieldProjectorTile) tileAt).setFieldRef(lazy);
79+
}
80+
});
7281
lazy.addListener(lo -> {
7382
lo.ifPresent(this::unregisterField);
7483
});
@@ -77,14 +86,16 @@ public IMiniaturizationField registerField(IMiniaturizationField field) {
7786
}
7887

7988
public void unregisterField(BlockPos center) {
80-
IMiniaturizationField removedField = fields.remove(center);
81-
laziness.remove(center);
82-
83-
if(!level.isClientSide && removedField != null) {
84-
// Send activation packet to clients
85-
NetworkHandler.MAIN_CHANNEL.send(
86-
PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(removedField.getCenter())),
87-
new FieldDeactivatedPacket(removedField.getFieldSize(), removedField.getCenter()));
89+
if(fields.containsKey(center)) {
90+
IMiniaturizationField removedField = fields.remove(center);
91+
laziness.remove(center);
92+
93+
if (!level.isClientSide && removedField != null) {
94+
// Send activation packet to clients
95+
NetworkHandler.MAIN_CHANNEL.send(
96+
PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(removedField.getCenter())),
97+
new FieldDeactivatedPacket(removedField.getFieldSize(), removedField.getCenter()));
98+
}
8899
}
89100
}
90101

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package dev.compactmods.crafting.field;
22

3+
import java.util.Optional;
34
import dev.compactmods.crafting.CompactCrafting;
4-
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
5-
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
5+
import dev.compactmods.crafting.api.EnumCraftingState;
6+
import dev.compactmods.crafting.api.field.IActiveWorldFields;
67
import dev.compactmods.crafting.api.field.IMiniaturizationField;
8+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
9+
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
710
import dev.compactmods.crafting.projector.FieldProjectorBlock;
811
import dev.compactmods.crafting.server.ServerConfig;
912
import net.minecraft.util.math.AxisAlignedBB;
@@ -15,11 +18,7 @@
1518
* Provides utilities to help with projector field management.
1619
*/
1720
public abstract class FieldHelper {
18-
public static void checkBlockPlacement(World level, BlockPos pos) {
19-
// We don't care about client worlds RN
20-
if (level.isClientSide())
21-
return;
22-
21+
public static boolean checkBlockPlacement(World level, BlockPos pos) throws MissingFieldsException {
2322
int maxDimensions = MiniaturizationFieldSize.maximum().getDimensions();
2423
AxisAlignedBB searchArea = new AxisAlignedBB(pos, pos).inflate(maxDimensions);
2524

@@ -29,19 +28,27 @@ public static void checkBlockPlacement(World level, BlockPos pos) {
2928
.map(BlockPos::immutable)
3029
.toArray(BlockPos[]::new);
3130

32-
if(ServerConfig.FIELD_BLOCK_CHANGES.get())
31+
if (ServerConfig.FIELD_BLOCK_CHANGES.get())
3332
CompactCrafting.LOGGER.debug("Found {} nearby projectors near {}.", nearbyProjectors.length, pos);
3433

3534
final Vector3d centerBlockChanged = Vector3d.atCenterOf(pos);
3635
if (nearbyProjectors.length > 0) {
37-
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
38-
.ifPresent(fields -> {
39-
fields.getFields()
40-
.filter(field -> field.getBounds().contains(centerBlockChanged))
41-
.forEach(IMiniaturizationField::fieldContentsChanged);
42-
});
43-
}
44-
}
36+
final IActiveWorldFields fields = level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
37+
.orElseThrow(() -> new MissingFieldsException("Could not fetch fields off level: " + level.dimension()));
38+
39+
final Optional<IMiniaturizationField> affectedField = fields.getFields()
40+
.filter(field -> field.getBounds().contains(centerBlockChanged))
41+
.findFirst();
4542

43+
return affectedField.map(field -> {
44+
if (field.getCraftingState() == EnumCraftingState.CRAFTING)
45+
return false;
4646

47+
field.fieldContentsChanged();
48+
return true;
49+
}).orElse(true);
50+
}
51+
52+
return true;
53+
}
4754
}

0 commit comments

Comments
 (0)