Skip to content

Commit 52ee4e4

Browse files
MemoryCard Ultimine (#10)
1 parent 1e23a41 commit 52ee4e4

9 files changed

Lines changed: 206 additions & 3 deletions

File tree

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ dependencies {
248248

249249
// runtimeOnly fg.deobf("curse.maven:mouse-tweaks-60089:5338457")
250250

251-
runtimeOnly fg.deobf("curse.maven:ftb-library-forge-404465:6164053")
252-
runtimeOnly fg.deobf("curse.maven:ftb-ultimine-forge-386134:6899418")
251+
implementation fg.deobf("curse.maven:ftb-library-forge-404465:6164053")
252+
implementation fg.deobf("curse.maven:ftb-ultimine-forge-386134:6899418")
253253

254254
implementation fg.deobf("curse.maven:jade-324717:6271651")
255255

src/generated/resources/assets/aea/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"block.aea.mirror_ex_pattern_provider": "ME Mirror Extended Pattern Provider",
55
"block.aea.mirror_pattern_provider": "ME Mirror Pattern Provider",
66
"config.jade.plugin_aea.mirror_provider": "Mirror Info",
7+
"ftbultimine.server_settings.right_click_memory_card": "Memory Card: Right-Click multiple blocks",
78
"gui.aea.Blocked": "Blocked",
89
"gui.aea.PatternTimes": "Pattern Times: %s",
910
"gui.tooltips.aea.CycleProcessingInput": "Cycle Inputs",

src/main/java/com/ref/aea/data/AEALangProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ protected void addTranslations() {
4747
this.addEnum(AEAToolTips.class);
4848

4949
this.addJadeProvider(MirrorProvider.INSTANCE.ID, "Mirror Info");
50+
51+
this.add(
52+
"ftbultimine.server_settings.right_click_memory_card",
53+
"Memory Card: Right-Click multiple blocks");
5054
}
5155

5256
public <T extends Enum<T> & LocalizationEnum> void addEnum(Class<T> localizedEnum) {
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.ref.aea.integration.ftbultimine;
2+
3+
import appeng.api.implementations.items.IMemoryCard;
4+
import appeng.api.implementations.items.MemoryCardMessages;
5+
import appeng.api.parts.IPart;
6+
import appeng.api.parts.IPartHost;
7+
import appeng.blockentity.AEBaseBlockEntity;
8+
import appeng.core.definitions.AEBlocks;
9+
import appeng.core.definitions.AEParts;
10+
import appeng.items.tools.MemoryCardItem;
11+
import appeng.util.SettingsFrom;
12+
import dev.ftb.mods.ftbultimine.FTBUltiminePlayerData;
13+
import java.util.Objects;
14+
import net.minecraft.core.BlockPos;
15+
import net.minecraft.core.Direction;
16+
import net.minecraft.nbt.CompoundTag;
17+
import net.minecraft.server.level.ServerPlayer;
18+
import net.minecraft.world.InteractionHand;
19+
import net.minecraft.world.item.Item;
20+
import net.minecraft.world.item.ItemStack;
21+
import net.minecraft.world.level.Level;
22+
import net.minecraft.world.level.block.entity.BlockEntity;
23+
24+
public class AEMemoryCardHandler {
25+
26+
private static final Direction[] ALL_SIDES = {
27+
Direction.DOWN,
28+
Direction.UP,
29+
Direction.NORTH,
30+
Direction.SOUTH,
31+
Direction.WEST,
32+
Direction.EAST,
33+
null
34+
};
35+
36+
public static int applySettings(
37+
ServerPlayer player,
38+
InteractionHand hand,
39+
BlockPos clickPos,
40+
Direction face,
41+
FTBUltiminePlayerData data) {
42+
ItemStack stack = player.getItemInHand(hand);
43+
if (!(stack.getItem() instanceof IMemoryCard memoryCard)) return 0;
44+
45+
String storedName = memoryCard.getSettingsName(stack);
46+
CompoundTag settingsData = memoryCard.getData(stack);
47+
48+
if (storedName == null
49+
|| storedName.isEmpty()
50+
|| settingsData == null
51+
|| settingsData.isEmpty()) {
52+
return 0;
53+
}
54+
55+
int appliedCount = 0;
56+
Level level = player.level();
57+
58+
for (BlockPos pos : data.cachedPositions()) {
59+
BlockEntity be = level.getBlockEntity(pos);
60+
if (be == null) continue;
61+
62+
boolean blockSuccess = false;
63+
64+
if (be instanceof IPartHost host) {
65+
for (Direction side : ALL_SIDES) {
66+
IPart part = host.getPart(side);
67+
if (part != null) {
68+
if (performApply(part, getSettingsId(part), storedName, settingsData, player)) {
69+
blockSuccess = true;
70+
}
71+
}
72+
}
73+
} else if (be instanceof AEBaseBlockEntity aeBe) {
74+
if (performApply(aeBe, getSettingsId(aeBe), storedName, settingsData, player)) {
75+
blockSuccess = true;
76+
}
77+
}
78+
79+
if (blockSuccess) {
80+
appliedCount++;
81+
}
82+
}
83+
if (appliedCount > 0) {
84+
memoryCard.notifyUser(player, MemoryCardMessages.SETTINGS_LOADED);
85+
}
86+
87+
return appliedCount;
88+
}
89+
90+
private static String getSettingsId(Object target) {
91+
if (target instanceof IPart part) {
92+
Item partItem = part.getPartItem().asItem();
93+
if (AEParts.INTERFACE.asItem() == partItem) {
94+
partItem = AEBlocks.INTERFACE.asItem();
95+
} else if (AEParts.PATTERN_PROVIDER.asItem() == partItem) {
96+
partItem = AEBlocks.PATTERN_PROVIDER.asItem();
97+
}
98+
return partItem.getDescriptionId();
99+
} else if (target instanceof AEBaseBlockEntity be) {
100+
return be.getBlockState().getBlock().getDescriptionId();
101+
}
102+
return "";
103+
}
104+
105+
private static boolean performApply(
106+
Object target, String targetName, String storedName, CompoundTag data, ServerPlayer player) {
107+
try {
108+
if (Objects.equals(targetName, storedName)) {
109+
if (target instanceof IPart part) {
110+
part.importSettings(SettingsFrom.MEMORY_CARD, data, player);
111+
} else if (target instanceof AEBaseBlockEntity be) {
112+
be.importSettings(SettingsFrom.MEMORY_CARD, data, player);
113+
}
114+
} else {
115+
if (target instanceof IPart part) {
116+
MemoryCardItem.importGenericSettings(part, data, player);
117+
} else if (target instanceof AEBaseBlockEntity be) {
118+
MemoryCardItem.importGenericSettings(be, data, player);
119+
}
120+
}
121+
return true;
122+
} catch (Exception e) {
123+
return false;
124+
}
125+
}
126+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.ref.aea.integration.ftbultimine;
2+
3+
import dev.ftb.mods.ftblibrary.snbt.config.BooleanValue;
4+
5+
public class FTBUltimineServerConfigBridge {
6+
public static BooleanValue RIGHT_CLICK_MEMORY_CARD;
7+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.ref.aea.mixin.ftbultimine;
2+
3+
import com.ref.aea.integration.ftbultimine.FTBUltimineServerConfigBridge;
4+
import dev.ftb.mods.ftbultimine.FTBUltimine;
5+
import dev.ftb.mods.ftbultimine.config.FTBUltimineServerConfig;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
@Mixin(value = FTBUltimine.class, remap = false)
12+
public abstract class FTBUltimineMixin {
13+
14+
@Inject(method = "serverStarting", at = @At("HEAD"))
15+
private void beforeConfigLoad(CallbackInfo ci) {
16+
if (FTBUltimineServerConfigBridge.RIGHT_CLICK_MEMORY_CARD == null) {
17+
FTBUltimineServerConfigBridge.RIGHT_CLICK_MEMORY_CARD =
18+
FTBUltimineServerConfig.CONFIG
19+
.addBoolean("right_click_memory_card", true)
20+
.comment(
21+
"Right-click with a Memory Card with the Ultimine key held to paste the saved configuration to multiple blocks");
22+
}
23+
}
24+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.ref.aea.mixin.ftbultimine;
2+
3+
import appeng.api.implementations.items.IMemoryCard;
4+
import com.ref.aea.integration.ftbultimine.AEMemoryCardHandler;
5+
import com.ref.aea.integration.ftbultimine.FTBUltimineServerConfigBridge;
6+
import dev.ftb.mods.ftbultimine.FTBUltiminePlayerData;
7+
import dev.ftb.mods.ftbultimine.shape.ShapeContext;
8+
import dev.ftb.mods.ftbultimine.utils.forge.PlatformMethodsImpl;
9+
import net.minecraft.core.BlockPos;
10+
import net.minecraft.core.Direction;
11+
import net.minecraft.server.level.ServerPlayer;
12+
import net.minecraft.world.InteractionHand;
13+
import org.spongepowered.asm.mixin.Mixin;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
17+
18+
@Mixin(value = PlatformMethodsImpl.class, remap = false)
19+
public class PlatformMethodsImplMixin {
20+
21+
@Inject(method = "blockRightClick", at = @At("HEAD"), cancellable = true)
22+
private static void onBlockRightClick(
23+
ShapeContext shapeContext,
24+
ServerPlayer serverPlayer,
25+
InteractionHand hand,
26+
BlockPos clickPos,
27+
Direction face,
28+
FTBUltiminePlayerData data,
29+
CallbackInfoReturnable<Integer> cir) {
30+
if (FTBUltimineServerConfigBridge.RIGHT_CLICK_MEMORY_CARD.get()
31+
&& serverPlayer.getItemInHand(hand).getItem() instanceof IMemoryCard) {
32+
int result = AEMemoryCardHandler.applySettings(serverPlayer, hand, clickPos, face, data);
33+
if (result > 0) {
34+
cir.setReturnValue(result);
35+
}
36+
}
37+
}
38+
}

src/main/resources/aea.mixins.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
"ae.recipe.InscriberRecipeCategoryMixin",
2323
"buildinggadgets2.PacketUpdateTemplateManagerAccessor",
2424
"buildinggadgets2.PacketUpdateTemplateManagerMixin",
25-
"buildinggadgets2.TemplateManagerHandlerMixin"
25+
"buildinggadgets2.TemplateManagerHandlerMixin",
26+
"ftbultimine.FTBUltimineMixin",
27+
"ftbultimine.PlatformMethodsImplMixin"
2628
],
2729
"client": [
2830
"ae.AEBaseScreenMixin",

src/main/resources/assets/aea/lang/zh_cn.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"block.aea.mirror_ex_pattern_provider": "ME镜像扩展样板供应器",
55
"block.aea.mirror_pattern_provider": "ME镜像样板供应器",
66
"config.jade.plugin_aea.mirror_provider": "镜像信息",
7+
"ftbultimine.server_settings.right_click_memory_card": "内存卡: 右键单击多个方块",
78
"gui.aea.Blocked": "阻塞",
89
"gui.aea.PatternTimes": "发配次数:%s",
910
"gui.tooltips.aea.CycleProcessingInput": "轮换原料位置",

0 commit comments

Comments
 (0)