Skip to content

Commit 2e3ff4b

Browse files
committed
- Allows automatic assembly of machines containing dynamic patterns.
- Fix MEItemBus and MEFluidBus not working. - Fix occasional crashes.
1 parent c14b163 commit 2e3ff4b

File tree

13 files changed

+232
-39
lines changed

13 files changed

+232
-39
lines changed

src/main/java/com/cleanroommc/client/preview/renderer/scene/WorldSceneRenderer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,8 @@ public boolean isCompilerThreadAlive() {
408408
}
409409

410410
public float getCompileProgress() {
411-
// 1000 blocks, 11 is per block unit.
412-
if (maxProgress <= 1000 * TOTAL_PROGRESS_UNIT) {
411+
// 2000 blocks, 11 is per block unit.
412+
if (maxProgress <= 2000 * TOTAL_PROGRESS_UNIT) {
413413
return -1;
414414
}
415415
return (float) progress.get() / maxProgress;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package github.kasuminova.mmce.common.network;
2+
3+
import ink.ikx.mmce.core.AssemblyEventHandler;
4+
import io.netty.buffer.ByteBuf;
5+
import net.minecraft.entity.player.EntityPlayer;
6+
import net.minecraft.entity.player.EntityPlayerMP;
7+
import net.minecraft.util.EnumHand;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
10+
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
11+
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
12+
13+
public class PktAutoAssemblyRequest implements IMessage, IMessageHandler<PktAutoAssemblyRequest, IMessage> {
14+
15+
protected BlockPos pos;
16+
protected short dynamicPatternSize;
17+
18+
public PktAutoAssemblyRequest() {
19+
}
20+
21+
public PktAutoAssemblyRequest(final BlockPos pos, final short dynamicPatternSize) {
22+
this.pos = pos;
23+
this.dynamicPatternSize = dynamicPatternSize;
24+
}
25+
26+
@Override
27+
public void fromBytes(final ByteBuf buf) {
28+
pos = BlockPos.fromLong(buf.readLong());
29+
dynamicPatternSize = buf.readShort();
30+
}
31+
32+
@Override
33+
public void toBytes(final ByteBuf buf) {
34+
buf.writeLong(pos.toLong());
35+
buf.writeShort(dynamicPatternSize);
36+
}
37+
38+
@Override
39+
public IMessage onMessage(final PktAutoAssemblyRequest message, final MessageContext ctx) {
40+
BlockPos target = message.pos;
41+
short patternSize = message.dynamicPatternSize;
42+
EntityPlayerMP player = ctx.getServerHandler().player;
43+
44+
if (isOutOfRange(player, target)) {
45+
return null;
46+
}
47+
48+
AssemblyEventHandler.INSTANCE.processAutoAssembly(player, player.getHeldItem(EnumHand.MAIN_HAND), target, patternSize);
49+
return null;
50+
}
51+
52+
private static boolean isOutOfRange(final EntityPlayer player, final BlockPos target) {
53+
BlockPos playerPos = player.getPosition();
54+
return target.getDistance(playerPos.getX(), playerPos.getY(), playerPos.getZ()) >= 8.0D;
55+
}
56+
57+
}

src/main/java/github/kasuminova/mmce/common/tile/base/MEFluidBus.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import javax.annotation.Nonnull;
2828
import javax.annotation.Nullable;
2929
import java.util.BitSet;
30+
import java.util.stream.IntStream;
3031

3132
public abstract class MEFluidBus extends MEMachineComponent implements
3233
IAEFluidInventory,
@@ -42,13 +43,19 @@ public abstract class MEFluidBus extends MEMachineComponent implements
4243
protected final BitSet changedSlots = new BitSet();
4344
protected final UpgradeInventory upgrades;
4445
protected final AEFluidInventoryUpgradeable tanks;
46+
protected int fullCheckCounter = 5;
4547

4648
public MEFluidBus() {
4749
this.tanks = new AEFluidInventoryUpgradeable(this, TANK_SLOT_AMOUNT, TANK_DEFAULT_CAPACITY);
4850
this.upgrades = new StackUpgradeInventory(proxy.getMachineRepresentation(), this, 5);
4951
}
5052

5153
protected int[] getNeedUpdateSlots() {
54+
fullCheckCounter++;
55+
if (fullCheckCounter >= 5) {
56+
fullCheckCounter = 0;
57+
return IntStream.range(0, tanks.getSlots()).toArray();
58+
}
5259
return changedSlots.stream().toArray();
5360
}
5461

src/main/java/github/kasuminova/mmce/common/tile/base/MEItemBus.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import appeng.api.AEApi;
44
import appeng.api.storage.channels.IItemStorageChannel;
55
import hellfirepvp.modularmachinery.common.util.IOInventory;
6-
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
7-
import it.unimi.dsi.fastutil.ints.IntSet;
86
import net.minecraft.item.ItemStack;
97
import net.minecraft.nbt.NBTTagCompound;
108
import net.minecraft.util.EnumFacing;
@@ -15,16 +13,23 @@
1513
import javax.annotation.Nonnull;
1614
import javax.annotation.Nullable;
1715
import java.util.BitSet;
16+
import java.util.stream.IntStream;
1817

1918
public abstract class MEItemBus extends MEMachineComponent {
2019

2120
protected final IItemStorageChannel channel = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class);
2221
protected final BitSet changedSlots = new BitSet();
2322
protected IOInventory inventory = buildInventory();
23+
protected int fullCheckCounter = 5;
2424

2525
public abstract IOInventory buildInventory();
2626

2727
protected int[] getNeedUpdateSlots() {
28+
fullCheckCounter++;
29+
if (fullCheckCounter >= 5) {
30+
fullCheckCounter = 0;
31+
return IntStream.range(0, inventory.getSlots()).toArray();
32+
}
2833
return changedSlots.stream().toArray();
2934
}
3035

src/main/java/github/kasuminova/mmce/common/world/MMWorldEventListener.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ public void onChunkUnload(final ChunkEvent.Unload event) {
7676
int zEnd = pos.getZEnd();
7777

7878
StructureBoundingBox structureArea = new StructureBoundingBox(xStart, zStart, xEnd, zEnd);
79-
worldChangedChunks.get(world).put(ChunkPos.asLong(pos.x, pos.z), structureArea);
79+
Long2ObjectMap<StructureBoundingBox> changedChunks = worldChangedChunks.get(world);
80+
if (changedChunks == null) {
81+
return;
82+
}
83+
changedChunks.put(ChunkPos.asLong(pos.x, pos.z), structureArea);
8084
}
8185

8286
public boolean isAreaChanged(@Nonnull final World worldIn,

src/main/java/hellfirepvp/modularmachinery/ModularMachinery.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
package hellfirepvp.modularmachinery;
1010

1111
import github.kasuminova.mmce.common.concurrent.TaskExecutor;
12+
import github.kasuminova.mmce.common.network.PktAutoAssemblyRequest;
1213
import github.kasuminova.mmce.common.network.PktMEInputBusInvAction;
1314
import github.kasuminova.mmce.common.network.PktPerformanceReport;
1415
import hellfirepvp.modularmachinery.common.CommonProxy;
@@ -91,19 +92,20 @@ public void preInit(FMLPreInitializationEvent event) {
9192
NET_CHANNEL.registerMessage(PktSyncSelection.class, PktSyncSelection.class, 1, Side.CLIENT);
9293
NET_CHANNEL.registerMessage(PktPerformanceReport.class, PktPerformanceReport.class, 2, Side.CLIENT);
9394
NET_CHANNEL.registerMessage(PktAssemblyReport.class, PktAssemblyReport.class, 3, Side.CLIENT);
95+
if (Mods.ASTRAL_SORCERY.isPresent()) {
96+
NET_CHANNEL.registerMessage(StarlightMessage.StarlightMessageHandler.class, StarlightMessage.class, 4, Side.CLIENT);
97+
}
9498

9599
NET_CHANNEL.registerMessage(PktInteractFluidTankGui.class, PktInteractFluidTankGui.class, 100, Side.SERVER);
96100
NET_CHANNEL.registerMessage(PktSmartInterfaceUpdate.class, PktSmartInterfaceUpdate.class, 101, Side.SERVER);
97101
NET_CHANNEL.registerMessage(PktParallelControllerUpdate.class, PktParallelControllerUpdate.class, 102, Side.SERVER);
98102
NET_CHANNEL.registerMessage(PktMEInputBusInvAction.class, PktMEInputBusInvAction.class, 103, Side.SERVER);
99-
100-
proxy.loadModData(event.getModConfigurationDirectory());
101-
103+
NET_CHANNEL.registerMessage(PktAutoAssemblyRequest.class, PktAutoAssemblyRequest.class, 104, Side.SERVER);
102104
if (Mods.ASTRAL_SORCERY.isPresent()) {
103-
NET_CHANNEL.registerMessage(StarlightMessage.StarlightMessageHandler.class, StarlightMessage.class, 0, Side.SERVER);
104-
NET_CHANNEL.registerMessage(StarlightMessage.StarlightMessageHandler.class, StarlightMessage.class, 0, Side.CLIENT);
105+
NET_CHANNEL.registerMessage(StarlightMessage.StarlightMessageHandler.class, StarlightMessage.class, 105, Side.SERVER);
105106
}
106107

108+
CommonProxy.loadModData(event.getModConfigurationDirectory());
107109
proxy.preInit();
108110
}
109111

src/main/java/hellfirepvp/modularmachinery/client/util/BlockArrayPreviewRenderHelper.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
package hellfirepvp.modularmachinery.client.util;
1010

11-
import github.kasuminova.mmce.client.gui.widget.preview.WorldSceneRendererWidget;
1211
import hellfirepvp.modularmachinery.common.block.BlockController;
1312
import hellfirepvp.modularmachinery.common.block.BlockFactoryController;
1413
import hellfirepvp.modularmachinery.common.machine.DynamicMachine;
@@ -50,6 +49,7 @@ public class BlockArrayPreviewRenderHelper {
5049
private DynamicMachine machine = null;
5150
private BlockPos attachedPosition = null;
5251
private int renderedLayer = -1;
52+
private DynamicMachineRenderContext context = null;
5353

5454
@Nullable
5555
private static RayTraceResult getLookBlock(Entity e, boolean stopTraceOnLiquids, boolean ignoreBlockWithoutBoundingBox, double range) {
@@ -77,6 +77,7 @@ public boolean startPreview(DynamicMachineRenderContext currentContext) {
7777
this.renderHelper.sampleSnap = currentContext.getShiftSnap(); //Just for good measure
7878
this.renderHelperOffset = currentContext.getMoveOffset();
7979
this.machine = currentContext.getDisplayedMachine();
80+
this.context = currentContext;
8081
this.attachedPosition = null;
8182
if (Minecraft.getMinecraft().player != null) {
8283
Minecraft.getMinecraft().player.sendMessage(new TextComponentTranslation("gui.blueprint.popout.place"));
@@ -107,6 +108,11 @@ public boolean placePreview() {
107108
}
108109
attachedPosition = attachPos;
109110
updateLayers();
111+
if (Minecraft.getMinecraft().player != null) {
112+
if (context.getDynamicPatternSize() > 0) {
113+
Minecraft.getMinecraft().player.sendMessage(new TextComponentTranslation("gui.blueprint.popout.placed.dynamic_pattern"));
114+
}
115+
}
110116
return true;
111117
}
112118
}
@@ -337,10 +343,15 @@ private void clearSelection() {
337343
this.renderHelperOffset = null;
338344
this.attachedPosition = null;
339345
this.machine = null;
346+
this.context = null;
340347
}
341348

342349
public void unloadWorld() {
343350
clearSelection();
344351
}
345352

353+
public DynamicMachineRenderContext getContext() {
354+
return context;
355+
}
356+
346357
}

src/main/java/hellfirepvp/modularmachinery/client/util/SelectionBoxRenderHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ public void onRightClick(PlayerInteractEvent event) {
6060
event instanceof PlayerInteractEvent.RightClickEmpty ||
6161
event instanceof PlayerInteractEvent.RightClickItem)) {
6262
if (ClientProxy.renderHelper.placePreview()) {
63-
event.setCancellationResult(EnumActionResult.FAIL);
6463
if (event.isCancelable()) {
6564
event.setCanceled(true);
6665
}
66+
event.setCancellationResult(EnumActionResult.SUCCESS);
6767
}
6868
}
6969
}

src/main/java/hellfirepvp/modularmachinery/common/crafting/helper/RecipeCraftingContext.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.annotation.Nonnull;
3030
import javax.annotation.Nullable;
3131
import java.util.*;
32+
import java.util.concurrent.CopyOnWriteArrayList;
3233
import java.util.concurrent.atomic.AtomicBoolean;
3334
import java.util.concurrent.atomic.AtomicReference;
3435
import java.util.function.Predicate;
@@ -135,7 +136,7 @@ public ActiveMachineRecipe getActiveRecipe() {
135136

136137
@Nonnull
137138
public List<RecipeModifier> getModifiers(RequirementType<?, ?> target) {
138-
return modifiers.computeIfAbsent(target, t -> new LinkedList<>());
139+
return modifiers.computeIfAbsent(target, t -> new CopyOnWriteArrayList<>());
139140
}
140141

141142
@Nonnull
@@ -532,7 +533,7 @@ public void addModifier(RecipeModifier modifier) {
532533
if (target == null) {
533534
target = RequirementTypesMM.REQUIREMENT_DURATION;
534535
}
535-
this.modifiers.computeIfAbsent(target, t -> new LinkedList<>()).add(modifier);
536+
this.modifiers.computeIfAbsent(target, t -> new CopyOnWriteArrayList<>()).add(modifier);
536537
updateModifierApplier(target);
537538
}
538539
}
@@ -545,7 +546,7 @@ public void addModifier(Collection<RecipeModifier> modifiers) {
545546
if (target == null) {
546547
target = RequirementTypesMM.REQUIREMENT_DURATION;
547548
}
548-
this.modifiers.computeIfAbsent(target, t -> new LinkedList<>()).add(modifier);
549+
this.modifiers.computeIfAbsent(target, t -> new CopyOnWriteArrayList<>()).add(modifier);
549550
changed.add(target);
550551
}
551552

@@ -572,7 +573,7 @@ public void addPermanentModifier(RecipeModifier modifier) {
572573
}
573574

574575
public void updateModifierApplier(RequirementType<?, ?> reqType) {
575-
addModifierApplier(reqType, modifiers.computeIfAbsent(reqType, v -> new LinkedList<>()));
576+
addModifierApplier(reqType, modifiers.computeIfAbsent(reqType, v -> new CopyOnWriteArrayList<>()));
576577
}
577578

578579
public void addModifierApplier(final RequirementType<?, ?> reqType, final List<RecipeModifier> recipeModifiers) {

src/main/java/ink/ikx/mmce/common/assembly/MachineAssembly.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import hellfirepvp.modularmachinery.ModularMachinery;
44
import hellfirepvp.modularmachinery.common.network.PktAssemblyReport;
5+
import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController;
56
import hellfirepvp.modularmachinery.common.util.ItemUtils;
67
import ink.ikx.mmce.common.utils.FluidUtils;
78
import ink.ikx.mmce.common.utils.StructureIngredient;
@@ -305,6 +306,11 @@ public boolean isCompleted() {
305306
return ingredient.itemIngredient().isEmpty() && ingredient.fluidIngredient().isEmpty();
306307
}
307308

309+
public boolean isControllerInvalid() {
310+
TileEntity te = world.getTileEntity(ctrlPos);
311+
return !(te instanceof TileMultiblockMachineController);
312+
}
313+
308314
public void assembly(boolean consumeInventory) {
309315
List<StructureIngredient.ItemIngredient> itemIngredient = ingredient.itemIngredient();
310316
List<StructureIngredient.FluidIngredient> fluidIngredient = ingredient.fluidIngredient();

0 commit comments

Comments
 (0)