Skip to content

Commit bbac348

Browse files
committed
防止向EF上传重复的样板
1 parent 8cbedf1 commit bbac348

File tree

5 files changed

+102
-34
lines changed

5 files changed

+102
-34
lines changed
Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
package github.kasuminova.novaeng.common.network;
22

3+
import appeng.api.AEApi;
34
import appeng.api.implementations.guiobjects.IGuiItemObject;
45
import appeng.api.networking.IGridNode;
56
import appeng.api.networking.IMachineSet;
67
import appeng.api.networking.security.IActionHost;
8+
import appeng.api.storage.data.IAEItemStack;
79
import appeng.container.implementations.ContainerPatternEncoder;
810
import appeng.container.slot.SlotRestrictedInput;
11+
import appeng.items.misc.ItemEncodedPattern;
912
import appeng.me.GridAccessException;
1013
import appeng.parts.reporting.AbstractPartEncoder;
14+
import com.glodblock.github.util.EmptyMachineSet;
15+
import com.glodblock.github.util.FluidPatternDetails;
1116
import github.kasuminova.novaeng.common.tile.ecotech.efabricator.EFabricatorMEChannel;
1217
import github.kasuminova.novaeng.mixin.ae2.AccessorContainerPatternEncoder;
1318
import hellfirepvp.modularmachinery.ModularMachinery;
1419
import io.netty.buffer.ByteBuf;
1520
import net.minecraft.entity.player.EntityPlayerMP;
1621
import net.minecraft.inventory.Container;
1722
import net.minecraft.item.ItemStack;
23+
import net.minecraft.util.text.TextComponentTranslation;
1824
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
1925
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
2026
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
@@ -31,46 +37,70 @@ public void toBytes(final ByteBuf buf) {
3137

3238
@Override
3339
public IMessage onMessage(final PktPatternTermUploadPattern message, final MessageContext ctx) {
34-
EntityPlayerMP player = ctx.getServerHandler().player;
40+
final EntityPlayerMP player = ctx.getServerHandler().player;
3541
ModularMachinery.EXECUTE_MANAGER.addSyncTask(() -> {
36-
Container container = player.openContainer;
42+
final Container container = player.openContainer;
3743
if (!(container instanceof ContainerPatternEncoder encoder)) {
3844
return;
3945
}
4046

41-
SlotRestrictedInput patternSlotOUT = ((AccessorContainerPatternEncoder) encoder).getPatternSlotOUT();
42-
ItemStack patternStack = patternSlotOUT.getStack();
47+
final SlotRestrictedInput patternSlotOUT = ((AccessorContainerPatternEncoder) encoder).getPatternSlotOUT();
48+
final ItemStack patternStack = patternSlotOUT.getStack();
4349
if (patternStack.isEmpty()) {
4450
return;
4551
}
4652

47-
try {
48-
AbstractPartEncoder part = encoder.getPart();
49-
IGuiItemObject itemObject = ((AccessorContainerPatternEncoder) encoder).getIGuiItemObject();
50-
IMachineSet channelNodes;
53+
AbstractPartEncoder part = encoder.getPart();
54+
IGuiItemObject itemObject = ((AccessorContainerPatternEncoder) encoder).getIGuiItemObject();
55+
IMachineSet channelNodes;
5156
if (part != null) {
52-
channelNodes = part.getProxy().getGrid().getMachines(EFabricatorMEChannel.class);
57+
try {
58+
channelNodes = part.getProxy().getGrid().getMachines(EFabricatorMEChannel.class);
59+
} catch (GridAccessException ignored) {
60+
channelNodes = EmptyMachineSet.create(EFabricatorMEChannel.class);
61+
}
5362
} else if (itemObject instanceof IActionHost wirelessTerm) {
5463
channelNodes = wirelessTerm.getActionableNode().getGrid().getMachines(EFabricatorMEChannel.class);
5564
} else {
5665
return;
5766
}
58-
for (final IGridNode channelNode : channelNodes) {
67+
68+
final IAEItemStack out;
69+
if (patternStack.getItem() instanceof ItemEncodedPattern item) {
70+
var pattern = item.getPatternForItem(patternStack, player.world);
71+
if (pattern.isCraftable() || pattern instanceof FluidPatternDetails) {
72+
out = pattern.getCondensedOutputs()[0];
73+
} else return;
74+
} else return;
75+
76+
for (final IGridNode channelNode : channelNodes) {
77+
EFabricatorMEChannel channel = (EFabricatorMEChannel) channelNode.getMachine();
78+
for (var patternBus : channel.getController().getPatternBuses()) {
79+
if (patternBus.getAePatterns().contains(out)) {
80+
player.sendMessage(
81+
new TextComponentTranslation(
82+
"novaeng.efabricator_parallel_proc.tooltip.0"
83+
)
84+
);
85+
player.inventory.placeItemBackInInventory(
86+
player.world,
87+
AEApi.instance().definitions().materials().blankPattern().maybeStack(patternSlotOUT.getStack().getCount()).orElse(ItemStack.EMPTY)
88+
);
89+
patternSlotOUT.putStack(ItemStack.EMPTY);
90+
return;
91+
}
92+
}
93+
}
94+
95+
for (final IGridNode channelNode : channelNodes) {
5996
EFabricatorMEChannel channel = (EFabricatorMEChannel) channelNode.getMachine();
6097
if (channel.insertPattern(patternStack)) {
61-
patternStack.shrink(1);
62-
if (patternStack.isEmpty()) {
63-
patternSlotOUT.putStack(ItemStack.EMPTY);
64-
} else {
65-
patternSlotOUT.putStack(patternStack);
66-
}
98+
patternSlotOUT.putStack(ItemStack.EMPTY);
6799
break;
68100
}
69101
}
70-
} catch (GridAccessException ignored) {
71-
}
102+
72103
});
73104
return null;
74105
}
75-
76-
}
106+
}

src/main/java/github/kasuminova/novaeng/common/tile/ecotech/efabricator/EFabricatorController.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@ import hellfirepvp.modularmachinery.common.machine.MachineRegistry
2828
import hellfirepvp.modularmachinery.common.util.ItemUtils
2929
import it.unimi.dsi.fastutil.objects.Object2ObjectAVLTreeMap
3030
import it.unimi.dsi.fastutil.objects.ObjectArrayList
31-
import java.util.function.Consumer
32-
import java.util.function.IntFunction
33-
import java.util.stream.Collectors
34-
import java.util.stream.IntStream
35-
import java.util.stream.Stream
3631
import net.minecraft.block.Block
3732
import net.minecraft.item.ItemStack
3833
import net.minecraft.nbt.NBTTagCompound
@@ -43,6 +38,11 @@ import net.minecraftforge.common.util.Constants
4338
import net.minecraftforge.fluids.FluidStack
4439
import net.minecraftforge.fluids.capability.IFluidHandler
4540
import net.minecraftforge.fml.common.FMLCommonHandler
41+
import java.util.function.Consumer
42+
import java.util.function.IntFunction
43+
import java.util.stream.Collectors
44+
import java.util.stream.IntStream
45+
import java.util.stream.Stream
4646
import kotlin.concurrent.Volatile
4747
import kotlin.math.max
4848
import kotlin.math.min

src/main/java/github/kasuminova/novaeng/common/tile/ecotech/efabricator/EFabricatorPatternBus.kt

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,22 @@ package github.kasuminova.novaeng.common.tile.ecotech.efabricator
33
import appeng.api.implementations.ICraftingPatternItem
44
import appeng.api.networking.crafting.ICraftingPatternDetails
55
import appeng.api.networking.events.MENetworkCraftingPatternChange
6+
import appeng.api.storage.data.IAEItemStack
7+
import appeng.items.misc.ItemEncodedPattern
68
import appeng.me.GridAccessException
79
import appeng.tile.inventory.AppEngInternalInventory
810
import appeng.util.inv.IAEAppEngInventory
911
import appeng.util.inv.InvOperation
1012
import com.glodblock.github.util.FluidCraftingPatternDetails
13+
import com.glodblock.github.util.FluidPatternDetails
1114
import github.kasuminova.mmce.common.util.PatternItemFilter
1215
import github.kasuminova.novaeng.NovaEngineeringCore
1316
import github.kasuminova.novaeng.common.container.ContainerEFabricatorPatternSearch
1417
import github.kasuminova.novaeng.common.container.data.EFabricatorPatternData
1518
import github.kasuminova.novaeng.common.network.PktEFabricatorPatternSearchGUIUpdate
1619
import hellfirepvp.modularmachinery.ModularMachinery
1720
import it.unimi.dsi.fastutil.objects.ObjectArrayList
18-
import java.util.Objects
19-
import java.util.function.Consumer
20-
import java.util.function.IntFunction
21-
import java.util.stream.Collectors
22-
import java.util.stream.IntStream
21+
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
2322
import net.minecraft.entity.player.EntityPlayer
2423
import net.minecraft.entity.player.EntityPlayerMP
2524
import net.minecraft.item.ItemStack
@@ -29,6 +28,11 @@ import net.minecraftforge.common.capabilities.Capability
2928
import net.minecraftforge.fml.common.FMLCommonHandler
3029
import net.minecraftforge.items.CapabilityItemHandler
3130
import net.minecraftforge.items.IItemHandler
31+
import java.util.Objects
32+
import java.util.function.Consumer
33+
import java.util.function.IntFunction
34+
import java.util.stream.Collectors
35+
import java.util.stream.IntStream
3236
import javax.annotation.Nonnull
3337

3438
open class EFabricatorPatternBus : EFabricatorPart(), IAEAppEngInventory {
@@ -37,6 +41,7 @@ open class EFabricatorPatternBus : EFabricatorPart(), IAEAppEngInventory {
3741
val PATTERN_SLOTS = 12 * 6
3842
}
3943

44+
val aePatterns = ObjectOpenHashSet<IAEItemStack>()
4045
val patterns = AppEngInternalInventory(this, PATTERN_SLOTS, 1, PatternItemFilter.INSTANCE)
4146
protected val details = ObjectArrayList<ICraftingPatternDetails?>(PATTERN_SLOTS)
4247

@@ -83,15 +88,43 @@ open class EFabricatorPatternBus : EFabricatorPart(), IAEAppEngInventory {
8388
}
8489

8590
override fun onChangeInventory(
86-
inv: IItemHandler?,
91+
inv: IItemHandler,
8792
slot: Int,
88-
mc: InvOperation?,
89-
removedStack: ItemStack?,
90-
newStack: ItemStack?
93+
mc: InvOperation,
94+
removedStack: ItemStack,
95+
newStack: ItemStack
9196
) {
9297
refreshPattern(slot)
9398
notifyPatternChanged()
9499
sendPatternSearchGUIUpdateToClient(slot)
100+
when (mc) {
101+
InvOperation.EXTRACT -> removePattern(removedStack)
102+
InvOperation.INSERT -> addPattern(newStack)
103+
InvOperation.SET -> {
104+
removePattern(removedStack)
105+
addPattern(newStack)
106+
}
107+
}
108+
}
109+
110+
private fun addPattern(stack: ItemStack) {
111+
val item = stack.item
112+
if (item is ItemEncodedPattern) {
113+
val pattern = item.getPatternForItem(stack, this.world)
114+
if (pattern.isCraftable || pattern is FluidPatternDetails) {
115+
aePatterns.add(pattern.condensedOutputs[0])
116+
}
117+
}
118+
}
119+
120+
private fun removePattern(stack: ItemStack) {
121+
val item = stack.item
122+
if (item is ItemEncodedPattern) {
123+
val pattern = item.getPatternForItem(stack, this.world)
124+
if (pattern.isCraftable || pattern is FluidPatternDetails) {
125+
aePatterns.remove(pattern.condensedOutputs[0])
126+
}
127+
}
95128
}
96129

97130
private fun notifyPatternChanged() {
@@ -165,6 +198,9 @@ open class EFabricatorPatternBus : EFabricatorPart(), IAEAppEngInventory {
165198
override fun readCustomNBT(compound: NBTTagCompound) {
166199
super.readCustomNBT(compound)
167200
patterns.readFromNBT(compound.getCompoundTag("patterns"))
201+
for (stack in patterns) {
202+
addPattern(stack)
203+
}
168204
}
169205

170206
override fun writeCustomNBT(compound: NBTTagCompound?) {

src/main/resources/assets/novaeng_core/lang/en_US.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ novaeng.extendable_calculate_subsystem.info.6= 分配完成后,如果系统
128128
novaeng.extendable_calculate_subsystem.info.7= 只要系统中已分配的 §bvCPU§7 数不超过§e最大线程数§7,则可以一直分配新的 §bvCPU§7,直到上限。
129129
novaeng.extendable_calculate_subsystem.info.8= §bvCPU§7 会在合成任务完成后,并且§e物品全部返还§7时§a立刻销毁§7。
130130

131+
novaeng.efabricator_parallel_proc.tooltip.0=网络已有类似的合成样板,已跳过上传并返还空白样板!
131132
novaeng.efabricator_parallel_proc.info.0=§5并行核心§7为合成子系统提供§5并行数§7。
132133
novaeng.efabricator_parallel_proc.info.1=§5并行数§7可提高§b工作核心§7每次处理合成任务的§a处理数量§7(最大不超过队列深度)。
133134
novaeng.efabricator_parallel_proc.modifiers=§5并行数§7修正:

src/main/resources/assets/novaeng_core/lang/zh_CN.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ novaeng.extendable_calculate_subsystem.info.6= 分配完成后,如果系统
128128
novaeng.extendable_calculate_subsystem.info.7= 只要系统中已分配的 §bvCPU§7 数不超过§e最大线程数§7,则可以一直分配新的 §bvCPU§7,直到上限。
129129
novaeng.extendable_calculate_subsystem.info.8= §bvCPU§7 会在合成任务完成后,并且§e物品全部返还§7时§a立刻销毁§7。
130130

131+
novaeng.efabricator_parallel_proc.tooltip.0=网络已有类似的合成样板,已跳过上传并返还空白样板!
131132
novaeng.efabricator_parallel_proc.info.0=§5并行核心§7为合成子系统提供§5并行数§7。
132133
novaeng.efabricator_parallel_proc.info.1=§5并行数§7可提高§b工作核心§7每次处理合成任务的§a处理数量§7(最大不超过队列深度)。
133134
novaeng.efabricator_parallel_proc.modifiers=§5并行数§7修正:

0 commit comments

Comments
 (0)