Skip to content

Commit 7105b70

Browse files
committed
WIP
[no ci]
1 parent 95ce3eb commit 7105b70

File tree

18 files changed

+523
-352
lines changed

18 files changed

+523
-352
lines changed

neoforge-api/src/main/java/dev/compactmods/crafting/api/field/IActiveWorldFields.java

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package dev.compactmods.crafting.api.field;
22

3-
import java.util.Optional;
43
import java.util.stream.Stream;
54
import dev.compactmods.crafting.api.EnumCraftingState;
5+
import dev.compactmods.crafting.api.projector.FieldProjectorSet;
66
import dev.compactmods.crafting.api.recipe.IMiniaturizationRecipe;
77
import net.minecraft.core.BlockPos;
8-
import net.minecraft.nbt.CompoundTag;
9-
import net.minecraft.resources.ResourceLocation;
8+
import net.minecraft.world.item.crafting.Recipe;
109
import net.minecraft.world.item.crafting.RecipeHolder;
1110
import net.minecraft.world.level.Level;
1211
import net.minecraft.world.phys.AABB;
1312

14-
public interface IMiniaturizationField {
13+
public interface IMiniaturizationField<T extends IMiniaturizationRecipe & Recipe<?>> {
1514

1615
default void dispose() {}
1716

@@ -21,41 +20,25 @@ default void dispose() {}
2120

2221
BlockPos getCenter();
2322

24-
void setCenter(BlockPos center);
25-
26-
void setSize(MiniaturizationFieldSize size);
27-
2823
int getProgress();
2924

30-
default Stream<BlockPos> getProjectorPositions() {
31-
return Stream.empty();
32-
}
33-
34-
void clearRecipe();
25+
FieldProjectorSet getProjectors();
3526

3627
EnumCraftingState getCraftingState();
3728

38-
void setCraftingState(EnumCraftingState state);
39-
40-
default void tick() {
41-
}
42-
43-
boolean isLoaded();
29+
boolean isAreaLoaded();
4430

4531
default void checkLoaded() {
4632
}
4733

4834
void fieldContentsChanged();
4935

50-
void setLevel(Level level);
51-
52-
void setProgress(int progress);
53-
5436
default void handleDestabilize() {}
5537

56-
void enable();
57-
void disable();
5838
void checkRedstone();
5939

6040
boolean enabled();
41+
42+
RecipeHolder<T> recipeHolder();
43+
T currentRecipe();
6144
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.compactmods.crafting.api.field;
2+
3+
public interface ITickingMiniaturizationField {
4+
5+
void tick();
6+
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package dev.compactmods.crafting.api.projector;
2+
3+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
4+
import net.minecraft.core.Direction;
5+
import net.minecraft.world.level.block.state.properties.DirectionProperty;
6+
import net.minecraft.world.level.block.state.properties.EnumProperty;
7+
8+
public class FieldProjectorProperties {
9+
10+
public static final DirectionProperty FACING = DirectionProperty.create("facing", Direction.Plane.HORIZONTAL);
11+
public static final EnumProperty<MiniaturizationFieldSize> SIZE = EnumProperty.create("field", MiniaturizationFieldSize.class);
12+
13+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.compactmods.crafting.api.projector;
2+
3+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.world.level.Level;
6+
import net.minecraft.world.level.block.Block;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
9+
import java.lang.ref.WeakReference;
10+
import java.util.Set;
11+
12+
public record FieldProjectorSet(WeakReference<Level> level, Set<BlockPos> locations, MiniaturizationFieldSize fieldSize) {
13+
public void enableAll() {
14+
final var level1 = level.get();
15+
locations.forEach(pos -> {
16+
BlockState currentState = level1.getBlockState(pos);
17+
if (currentState.hasProperty(FieldProjectorProperties.SIZE) &&
18+
currentState.getValue(FieldProjectorProperties.SIZE) != fieldSize) {
19+
20+
BlockState newState = currentState.setValue(FieldProjectorProperties.SIZE, fieldSize);
21+
level1.setBlock(pos, newState, Block.UPDATE_ALL);
22+
}
23+
});
24+
}
25+
26+
public void disableAll() {
27+
final var level1 = level.get();
28+
locations.forEach(pos -> {
29+
BlockState currentState = level1.getBlockState(pos);
30+
if (currentState.hasProperty(FieldProjectorProperties.SIZE)) {
31+
BlockState newState = currentState.setValue(FieldProjectorProperties.SIZE, MiniaturizationFieldSize.INACTIVE);
32+
level1.setBlock(pos, newState, Block.UPDATE_ALL);
33+
level1.removeBlockEntity(pos);
34+
}
35+
});
36+
}
37+
}
Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
package dev.compactmods.crafting.client;
22

33
import dev.compactmods.crafting.api.field.IMiniaturizationField;
4+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
45
import dev.compactmods.crafting.data.CCAttachments;
6+
import dev.compactmods.crafting.field.IMutableMiniaturizationField;
57
import dev.compactmods.crafting.field.MiniaturizationField;
8+
import dev.compactmods.crafting.network.FieldActivatedPacket;
69
import dev.compactmods.crafting.projector.FieldProjectorBlock;
10+
import dev.compactmods.crafting.recipes.MiniaturizationRecipe;
711
import net.minecraft.client.Minecraft;
812
import net.minecraft.client.multiplayer.ClientLevel;
913
import net.minecraft.core.BlockPos;
1014
import net.minecraft.nbt.CompoundTag;
11-
import net.minecraft.resources.ResourceLocation;
12-
import org.jetbrains.annotations.Nullable;
15+
import net.minecraft.world.item.crafting.RecipeHolder;
1316

1417
import java.util.stream.Stream;
1518

1619
public abstract class ClientPacketHandler {
1720

18-
public static void handleFieldActivation(IMiniaturizationField field, CompoundTag fieldClientData) {
21+
public static void handleFieldActivation(IMiniaturizationField<MiniaturizationRecipe> field, CompoundTag fieldClientData) {
1922
Minecraft mc = Minecraft.getInstance();
2023
mc.submitAsync(() -> {
2124
ClientLevel cw = mc.level;
2225
if (cw == null)
2326
return;
2427

25-
field.setLevel(cw);
2628
// FIXME field.loadClientData(fieldClientData);
2729

2830
mc.level.getData(CCAttachments.ACTIVE_FIELDS).registerField(field);
@@ -35,60 +37,82 @@ public static void handleFieldDeactivation(BlockPos center) {
3537

3638
mc.submitAsync(() -> {
3739
mc.level.getExistingData(CCAttachments.ACTIVE_FIELDS).ifPresent(fields -> {
38-
fields.get(center)
39-
.map(IMiniaturizationField::getProjectorPositions)
40-
.orElse(Stream.empty())
41-
.forEach(proj -> FieldProjectorBlock.deactivateProjector(mc.level, proj));
40+
fields.get(center).ifPresent(field -> {
41+
final var projectors = field.getProjectors();
42+
projectors.disableAll();
43+
});
4244

4345
fields.unregisterField(center);
4446
});
4547
});
4648
}
4749

48-
public static void handleFieldData(CompoundTag fieldData) {
50+
// public static void handleFieldData(CompoundTag fieldData) {
51+
// Minecraft mc = Minecraft.getInstance();
52+
// if (mc.level == null)
53+
// return;
54+
//
55+
// MiniaturizationField field = new MiniaturizationField();
56+
// field.setLevel(mc.level);
57+
// // FIXME field.loadClientData(fieldData);
58+
//
59+
//// mc.level.getCapability(CCCapabilities.FIELDS)
60+
//// .ifPresent(fields -> {
61+
//// fields.setLevel(mc.level);
62+
//// CompactCrafting.LOGGER.debug("Registering field on client");
63+
//// final IMiniaturizationField fieldRegistered = fields.registerField(field);
64+
////
65+
//// CompactCrafting.LOGGER.debug("Setting field references");
66+
////
67+
//// field.getProjectorPositions()
68+
//// .map(mc.level::getBlockEntity)
69+
//// .map(tile -> (FieldProjectorEntity) tile)
70+
//// .filter(Objects::nonNull)
71+
//// .forEach(tile -> {
72+
//// final BlockState state = tile.getBlockState();
73+
//// tile.setFieldRef(fieldRegistered.getRef());
74+
//// });
75+
//// });
76+
// }
77+
78+
public static void removeField(BlockPos fieldCenter) {
4979
Minecraft mc = Minecraft.getInstance();
5080
if (mc.level == null)
5181
return;
5282

53-
MiniaturizationField field = new MiniaturizationField();
54-
field.setLevel(mc.level);
55-
// FIXME field.loadClientData(fieldData);
56-
57-
// mc.level.getCapability(CCCapabilities.FIELDS)
58-
// .ifPresent(fields -> {
59-
// fields.setLevel(mc.level);
60-
// CompactCrafting.LOGGER.debug("Registering field on client");
61-
// final IMiniaturizationField fieldRegistered = fields.registerField(field);
62-
//
63-
// CompactCrafting.LOGGER.debug("Setting field references");
64-
//
65-
// field.getProjectorPositions()
66-
// .map(mc.level::getBlockEntity)
67-
// .map(tile -> (FieldProjectorEntity) tile)
68-
// .filter(Objects::nonNull)
69-
// .forEach(tile -> {
70-
// final BlockState state = tile.getBlockState();
71-
// tile.setFieldRef(fieldRegistered.getRef());
72-
// });
73-
// });
83+
mc.level.getData(CCAttachments.ACTIVE_FIELDS).unregisterField(fieldCenter);
7484
}
7585

76-
public static void removeField(BlockPos fieldCenter) {
86+
public static void clearFieldRecipe(BlockPos center) {
7787
Minecraft mc = Minecraft.getInstance();
7888
if (mc.level == null)
7989
return;
8090

81-
// mc.level.getCapability(CCCapabilities.FIELDS)
82-
// .ifPresent(fields -> fields.unregisterField(fieldCenter));
91+
mc.level.getData(CCAttachments.ACTIVE_FIELDS)
92+
.get(center)
93+
.filter(field -> field instanceof IMutableMiniaturizationField)
94+
.map(IMutableMiniaturizationField.class::cast)
95+
.ifPresent(IMutableMiniaturizationField::clearRecipe);
8396
}
8497

85-
public static void handleRecipeChanged(BlockPos center, @Nullable ResourceLocation recipe) {
98+
public static void changeFieldRecipe(BlockPos center, RecipeHolder<MiniaturizationRecipe> recipe) {
8699
Minecraft mc = Minecraft.getInstance();
87100
if (mc.level == null)
88101
return;
89102

90-
// mc.level.getCapability(CCCapabilities.FIELDS)
91-
// .lazyMap(af -> af.get(center))
92-
// .ifPresent(field -> field.ifPresent(f -> f.setRecipe(recipe)));
103+
mc.level.getData(CCAttachments.ACTIVE_FIELDS)
104+
.get(center)
105+
.filter(field -> field instanceof IMutableMiniaturizationField)
106+
.map(IMutableMiniaturizationField.class::cast)
107+
.ifPresent(field -> {
108+
field.setRecipe(recipe);
109+
field.spawnParticlesAtProjectors(MiniaturizationField.RECIPE_MATCHED_PARTICLE_OPTS);
110+
});
111+
112+
}
113+
114+
public static FieldActivatedPacket createFieldActivationPacket(MiniaturizationFieldSize fieldSize, BlockPos center, CompoundTag clientData) {
115+
var field = new MiniaturizationField(Minecraft.getInstance().level, fieldSize, center);
116+
return new FieldActivatedPacket(field, clientData);
93117
}
94118
}

0 commit comments

Comments
 (0)