Skip to content

Commit 3ecb6eb

Browse files
committed
Support the forge anvil event for compatibility
1 parent d0fc708 commit 3ecb6eb

4 files changed

Lines changed: 76 additions & 11 deletions

File tree

common/src/main/java/com/oroarmor/netherite_plus/screen/NetheriteAnvilScreenHandler.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
import net.fabricmc.api.Environment;
2525

2626
public class NetheriteAnvilScreenHandler extends ForgingScreenHandler {
27-
private final Property levelCost;
28-
private int repairItemUsage;
27+
public final Property levelCost;
28+
public int repairItemUsage;
2929
private String newItemName;
3030

3131
public NetheriteAnvilScreenHandler(int syncId, PlayerInventory inventory) {
@@ -188,10 +188,7 @@ public void updateResult() {
188188
bl4 = true;
189189
}
190190

191-
Iterator<Enchantment> var17 = map.keySet().iterator();
192-
193-
while (var17.hasNext()) {
194-
Enchantment enchantment2 = var17.next();
191+
for (Enchantment enchantment2 : map.keySet()) {
195192
if (enchantment2 != enchantment && !enchantment.canCombine(enchantment2)) {
196193
bl4 = false;
197194
++i;

forge/build.gradle

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@ repositories {
1919
}
2020

2121
loom {
22-
mixinConfigs = ["netherite_plus.mixins.json", "multi-item-lib.mixins.json"]
22+
mixinConfigs = ["netherite_plus.mixins.json", "multi-item-lib.mixins.json", "netherite-plus-forge.mixins.json"]
2323
useFabricMixin = true
2424
}
2525

26-
//minecraft {
27-
// accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
28-
//}
29-
3026
dependencies {
3127
minecraft("com.mojang:minecraft:${rootProject.architectury.minecraft}")
3228
mappings("net.fabricmc:yarn:${rootProject.mappings}:v2")
3329
forge("net.minecraftforge:forge:${rootProject.architectury.minecraft}-${rootProject.forge_version}")
30+
3431
modCompile("me.shedaniel:architectury:${rootProject.architectury_version}:forge") {
3532
exclude(module: "fabric-loader")
3633
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.oroarmor.netherite_plus.mixin;
2+
3+
import java.util.Map;
4+
5+
import com.oroarmor.netherite_plus.client.gui.screen.NetheriteAnvilScreen;
6+
import com.oroarmor.netherite_plus.screen.NetheriteAnvilScreenHandler;
7+
import javax.annotation.Nonnull;
8+
import javax.annotation.Nullable;
9+
import net.minecraftforge.common.ForgeHooks;
10+
import net.minecraftforge.common.MinecraftForge;
11+
import net.minecraftforge.event.AnvilUpdateEvent;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
18+
19+
import net.minecraft.enchantment.Enchantment;
20+
import net.minecraft.entity.player.PlayerEntity;
21+
import net.minecraft.entity.player.PlayerInventory;
22+
import net.minecraft.inventory.Inventory;
23+
import net.minecraft.item.ItemStack;
24+
import net.minecraft.screen.ForgingScreenHandler;
25+
import net.minecraft.screen.ScreenHandlerContext;
26+
import net.minecraft.screen.ScreenHandlerType;
27+
28+
@Mixin(NetheriteAnvilScreenHandler.class)
29+
public abstract class NetheriteAnvilScreenHandlerMixin extends ForgingScreenHandler {
30+
@Shadow(remap = false)
31+
private String newItemName;
32+
33+
public NetheriteAnvilScreenHandlerMixin(@Nullable ScreenHandlerType<?> arg, int i, PlayerInventory arg2, ScreenHandlerContext arg3) {
34+
super(arg, i, arg2, arg3);
35+
}
36+
37+
@Inject(method = "updateResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/EnchantedBookItem;getEnchantmentTag(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/nbt/ListTag;", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
38+
public void injectAnvilUpdate(CallbackInfo info, ItemStack itemStack, int i, int j, int k, ItemStack itemStack2, ItemStack itemStack3, Map<Enchantment, Integer> map) {
39+
if (!onAnvilChange((NetheriteAnvilScreenHandler) (Object) this, itemStack, itemStack2, this.output, this.newItemName, j, this.player)) {
40+
info.cancel();
41+
}
42+
}
43+
44+
private static boolean onAnvilChange(NetheriteAnvilScreenHandler container, @Nonnull ItemStack left, @Nonnull ItemStack right, Inventory outputSlot, String name, int baseCost, PlayerEntity player) {
45+
AnvilUpdateEvent e = new AnvilUpdateEvent(left, right, name, baseCost, player);
46+
if (MinecraftForge.EVENT_BUS.post(e)) {
47+
return false;
48+
} else if (e.getOutput().isEmpty()) {
49+
return true;
50+
} else {
51+
outputSlot.setStack(0, e.getOutput());
52+
container.levelCost.set(e.getCost());
53+
container.repairItemUsage = e.getMaterialCost();
54+
return false;
55+
}
56+
}
57+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"required": true,
3+
"minVersion": "0.8",
4+
"package": "com.oroarmor.netherite_plus.mixin",
5+
"compatibilityLevel": "JAVA_8",
6+
"mixins": [
7+
"NetheriteAnvilScreenHandlerMixin"
8+
],
9+
"client": [
10+
],
11+
"injectors": {
12+
"defaultRequire": 1
13+
}
14+
}

0 commit comments

Comments
 (0)