Skip to content

Commit 1413fb4

Browse files
committed
Merge branch 'enh/38' into 1.16.x
2 parents d9b3a03 + 0b94be5 commit 1413fb4

File tree

6 files changed

+135
-14
lines changed

6 files changed

+135
-14
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,14 @@ default void loadClientData(CompoundNBT nbt) {
9191

9292
void setRecipe(ResourceLocation id);
9393

94-
default void handleProjectorBroken() {}
94+
default void handleDestabilize() {}
9595

9696
LazyOptional<IMiniaturizationField> getRef();
9797
void setRef(LazyOptional<IMiniaturizationField> ref);
98+
99+
void enable();
100+
void disable();
101+
void checkRedstone();
102+
103+
boolean enabled();
98104
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.compactmods.crafting;
22

33
import java.util.function.Supplier;
4+
import dev.compactmods.crafting.api.recipe.layers.RecipeLayerType;
45
import dev.compactmods.crafting.field.block.FieldCraftingPreviewBlock;
56
import dev.compactmods.crafting.field.tile.FieldCraftingPreviewTile;
67
import dev.compactmods.crafting.items.FieldProjectorItem;
@@ -18,7 +19,6 @@
1819
import dev.compactmods.crafting.recipes.layers.MixedComponentRecipeLayer;
1920
import dev.compactmods.crafting.recipes.layers.SimpleRecipeLayerType;
2021
import dev.compactmods.crafting.recipes.setup.BaseRecipeType;
21-
import dev.compactmods.crafting.api.recipe.layers.RecipeLayerType;
2222
import net.minecraft.block.AbstractBlock;
2323
import net.minecraft.block.Block;
2424
import net.minecraft.block.Blocks;
@@ -79,6 +79,10 @@ public class Registration {
7979
public static final RegistryObject<Block> FIELD_PROJECTOR_BLOCK = BLOCKS.register("field_projector", () ->
8080
new FieldProjectorBlock(AbstractBlock.Properties.of(Material.METAL)
8181
.strength(8, 20)
82+
.isRedstoneConductor((state, level, pos) -> true)
83+
.requiresCorrectToolForDrops()
84+
.harvestTool(ToolType.PICKAXE)
85+
.harvestLevel(1) // requires stone pickaxe
8286
));
8387

8488
public static final RegistryObject<Block> FIELD_CRAFTING_PREVIEW_BLOCK = BLOCKS.register("field_crafting_preview", () ->

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.compactmods.crafting.CompactCrafting;
55
import dev.compactmods.crafting.api.EnumCraftingState;
66
import dev.compactmods.crafting.api.field.IActiveWorldFields;
7+
import dev.compactmods.crafting.api.field.IMiniaturizationField;
78
import dev.compactmods.crafting.capability.CapabilityProjectorRenderInfo;
89
import dev.compactmods.crafting.capability.IProjectorRenderInfo;
910
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
@@ -64,6 +65,7 @@ public static void onWorldRender(final RenderWorldLastEvent event) {
6465
.filter(field -> Vector3d.atCenterOf(field.getCenter()).closerThan(mainCamera.getPosition(), viewDistance))
6566
.filter(field -> field.getCraftingState() == EnumCraftingState.CRAFTING)
6667
.filter(field -> field.getCurrentRecipe().isPresent())
68+
.filter(IMiniaturizationField::enabled)
6769
.forEach(field -> {
6870
BlockPos center = field.getCenter();
6971

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

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
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.network.FieldActivatedPacket;
16+
import dev.compactmods.crafting.network.FieldDeactivatedPacket;
1517
import dev.compactmods.crafting.network.FieldRecipeChangedPacket;
1618
import dev.compactmods.crafting.network.NetworkHandler;
19+
import dev.compactmods.crafting.projector.FieldProjectorBlock;
20+
import dev.compactmods.crafting.projector.FieldProjectorTile;
1721
import dev.compactmods.crafting.recipes.MiniaturizationRecipe;
1822
import dev.compactmods.crafting.recipes.blocks.RecipeBlocks;
1923
import dev.compactmods.crafting.server.ServerConfig;
@@ -26,6 +30,7 @@
2630
import net.minecraft.nbt.CompoundNBT;
2731
import net.minecraft.nbt.NBTUtil;
2832
import net.minecraft.particles.ParticleTypes;
33+
import net.minecraft.tileentity.TileEntity;
2934
import net.minecraft.util.Direction;
3035
import net.minecraft.util.ResourceLocation;
3136
import net.minecraft.util.math.AxisAlignedBB;
@@ -61,6 +66,7 @@ public class MiniaturizationField implements IMiniaturizationField {
6166

6267
private final HashSet<LazyOptional<IFieldListener>> listeners = new HashSet<>();
6368
private LazyOptional<IMiniaturizationField> lazyReference = LazyOptional.empty();
69+
private boolean disabled = false;
6470

6571
public MiniaturizationField() {
6672
}
@@ -191,7 +197,7 @@ public EnumCraftingState getCraftingState() {
191197

192198
@Override
193199
public void tick() {
194-
if (level == null)
200+
if (level == null || this.disabled)
195201
return;
196202

197203
// Set in a block update handler to mark that the field has changed
@@ -205,7 +211,7 @@ public void tick() {
205211
tickCrafting();
206212
}
207213

208-
public void tickCrafting() {
214+
private void tickCrafting() {
209215
AxisAlignedBB fieldBounds = getBounds();
210216

211217
if (level == null || this.currentRecipe == null)
@@ -216,6 +222,7 @@ public void tickCrafting() {
216222
case MATCHED:
217223

218224
// We grow the bounds check here a little to support patterns that are exactly the size of the field
225+
// TODO - #35 - Support NBT filters in catalyst items
219226
List<ItemEntity> catalystEntities = getCatalystsInField(level, fieldBounds.inflate(0.25), currentRecipe.getCatalyst().getItem());
220227
if (catalystEntities.size() > 0) {
221228

@@ -440,7 +447,7 @@ public void setRecipe(ResourceLocation id) {
440447
}
441448

442449
@Override
443-
public void handleProjectorBroken() {
450+
public void handleDestabilize() {
444451
if (craftingState != EnumCraftingState.CRAFTING || matchedBlocks == null)
445452
return;
446453

@@ -492,4 +499,52 @@ public LazyOptional<IMiniaturizationField> getRef() {
492499
public void setRef(LazyOptional<IMiniaturizationField> lazyReference) {
493500
this.lazyReference = lazyReference;
494501
}
502+
503+
@Override
504+
public void disable() {
505+
this.disabled = true;
506+
if(this.craftingState != EnumCraftingState.NOT_MATCHED)
507+
handleDestabilize();
508+
509+
getProjectorPositions().forEach(proj -> {
510+
FieldProjectorBlock.deactivateProjector(level, proj);
511+
});
512+
513+
FieldDeactivatedPacket update = new FieldDeactivatedPacket(size, center);
514+
NetworkHandler.MAIN_CHANNEL.send(
515+
PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(center)), update);
516+
}
517+
518+
@Override
519+
public void enable() {
520+
this.disabled = false;
521+
fieldContentsChanged();
522+
getProjectorPositions().forEach(proj -> {
523+
FieldProjectorBlock.activateProjector(level, proj, this.size);
524+
TileEntity projTile = level.getBlockEntity(proj);
525+
if(projTile instanceof FieldProjectorTile) {
526+
((FieldProjectorTile) projTile).setFieldRef(lazyReference);
527+
}
528+
});
529+
530+
FieldActivatedPacket update = new FieldActivatedPacket(this);
531+
NetworkHandler.MAIN_CHANNEL.send(
532+
PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(center)), update);
533+
}
534+
535+
@Override
536+
public void checkRedstone() {
537+
this.disabled = getProjectorPositions()
538+
.anyMatch(proj -> level.getBestNeighborSignal(proj) > 0);
539+
540+
if (disabled) disable();
541+
else enable();
542+
}
543+
544+
@Override
545+
public boolean enabled() {
546+
return !this.disabled;
547+
}
548+
549+
495550
}

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

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,14 @@ public TileEntity createTileEntity(BlockState state, IBlockReader world) {
159159
@SuppressWarnings("deprecation")
160160
public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
161161
if (world.isClientSide) {
162-
player.getCapability(CapabilityProjectorRenderInfo.TEMP_PROJECTOR_RENDERING)
163-
.ifPresent(rend -> {
164-
rend.resetRenderTime();
165-
rend.setProjector(world, pos);
166-
});
162+
final boolean hasMissing = ProjectorHelper.getMissingProjectors(world, pos, state.getValue(FACING)).findAny().isPresent();
163+
if(hasMissing) {
164+
player.getCapability(CapabilityProjectorRenderInfo.TEMP_PROJECTOR_RENDERING)
165+
.ifPresent(rend -> {
166+
rend.resetRenderTime();
167+
rend.setProjector(world, pos);
168+
});
169+
}
167170

168171
return ActionResultType.SUCCESS;
169172
}
@@ -200,7 +203,7 @@ public static BlockPos getFieldCenter(BlockState state, BlockPos projector) {
200203

201204
public static void deactivateProjector(World level, BlockPos pos) {
202205
BlockState currentState = level.getBlockState(pos);
203-
if(currentState.getBlock() instanceof FieldProjectorBlock) {
206+
if (currentState.getBlock() instanceof FieldProjectorBlock) {
204207
BlockState newState = currentState.setValue(SIZE, MiniaturizationFieldSize.INACTIVE);
205208
level.setBlock(pos, newState, Constants.BlockFlags.DEFAULT_AND_RERENDER);
206209
}
@@ -279,11 +282,42 @@ public void onRemove(BlockState oldState, World level, BlockPos pos, BlockState
279282
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS).ifPresent(fields -> {
280283
if (fields.hasActiveField(fieldCenter)) {
281284
final IMiniaturizationField field = fields.get(fieldCenter).orElse(null);
282-
if(field == null) return;
285+
if (field == null) return;
286+
287+
if (field.enabled()) {
288+
fields.unregisterField(fieldCenter);
289+
field.handleDestabilize();
290+
}
291+
}
292+
});
293+
}
294+
}
283295

284-
fields.unregisterField(fieldCenter);
285-
field.handleProjectorBroken();
296+
@Override
297+
public void neighborChanged(BlockState state, World level, BlockPos pos, Block changer, BlockPos changedPos, boolean update) {
298+
super.neighborChanged(state, level, pos, changer, changedPos, update);
299+
if (level.isClientSide)
300+
return;
301+
302+
if (isActive(state)) {
303+
TileEntity tile = level.getBlockEntity(pos);
304+
if (tile instanceof FieldProjectorTile) {
305+
FieldProjectorTile fpt = (FieldProjectorTile) tile;
306+
if (level.getBestNeighborSignal(pos) > 0) {
307+
// receiving power from some side, turn off rendering
308+
fpt.getField().ifPresent(IMiniaturizationField::disable);
309+
} else {
310+
// check other projectors, if there's a redstone signal anywhere, we disable the field
311+
fpt.getField().ifPresent(IMiniaturizationField::checkRedstone);
286312
}
313+
}
314+
} else {
315+
// not active, but we may be re-enabling a disabled field
316+
ProjectorHelper.getClosestOppositeSize(level, pos).ifPresent(size -> {
317+
final BlockPos center = size.getCenterFromProjector(pos, state.getValue(FACING));
318+
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS).ifPresent(fields -> {
319+
fields.get(center).ifPresent(IMiniaturizationField::checkRedstone);
320+
});
287321
});
288322
}
289323
}

src/test/java/dev/compactmods/crafting/tests/api/field/BlankMiniaturizationField.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,24 @@ public LazyOptional<IMiniaturizationField> getRef() {
102102
public void setRef(LazyOptional<IMiniaturizationField> ref) {
103103

104104
}
105+
106+
@Override
107+
public void enable() {
108+
109+
}
110+
111+
@Override
112+
public void disable() {
113+
114+
}
115+
116+
@Override
117+
public void checkRedstone() {
118+
119+
}
120+
121+
@Override
122+
public boolean enabled() {
123+
return true;
124+
}
105125
}

0 commit comments

Comments
 (0)