Create Fabric

Create Fabric

7M Downloads

Mistaken Mixin for enchantment boolean and not void ?

JosephMillsAtWork opened this issue · 3 comments

commented

Describe the Bug

When putting together a custom modpack for personal use. I noticed that items that could be enchanted in loot chests would crash the game.

java.lang.AbstractMethodError: Missing implementation of resolved method 'abstract boolean canEnchant(net.minecraft.world.item.Item)' of abstract class net.minecraft.world.item.enchantment.EnchantmentCategory.
	at net.minecraft.world.item.enchantment.Enchantment.canEnchant(Enchantment.java:129)
	at net.minecraft.world.level.storage.loot.functions.EnchantRandomlyFunction.m_enujhsln(EnchantRandomlyFunction.java:57)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at net.minecraft.world.level.storage.loot.functions.EnchantRandomlyFunction.run(EnchantRandomlyFunction.java:58)
	at net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction.apply(LootItemConditionalFunction.java:31)
	at net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction.apply(LootItemConditionalFunction.java:20)
	at net.minecraft.world.level.storage.loot.functions.LootItemFunction.m_xmlqtcgv(LootItemFunction.java:14)
	at net.minecraft.world.level.storage.loot.entries.LootItem.createItemStack(LootItem.java:33)
	at net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer$1.createItemStack(LootPoolSingletonContainer.java:59)
	at net.minecraft.world.level.storage.loot.LootPool.addRandomItem(LootPool.java:81)
	at net.minecraft.world.level.storage.loot.LootPool.addRandomItems(LootPool.java:96)
	at net.minecraft.world.level.storage.loot.LootTable.getRandomItemsRaw(LootTable.java:73)
	at net.minecraft.world.level.storage.loot.LootTable.getRandomItems(LootTable.java:82)
	at net.minecraft.world.level.storage.loot.LootTable.getRandomItems(LootTable.java:87)
	at net.minecraft.world.level.storage.loot.LootTable.fill(LootTable.java:106)
	at net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity.unpackLootTable(RandomizableContainerBlockEntity.java:82)
	at net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity.createMenu(RandomizableContainerBlockEntity.java:160)
	at net.minecraft.server.level.ServerPlayer.openMenu(ServerPlayer.java:1032)
	at net.minecraft.world.level.block.ChestBlock.use(ChestBlock.java:208)

Took a look at the mixin and it was returning a void

src/main/java/com/simibubi/create/lib/mixin/common/EnchantmentMixin.java

@Mixin(Enchantment.class)
public abstract class EnchantmentMixin {
	@Inject(method = "canEnchant", at = @At("HEAD"), cancellable = true)
	private void create$canEnchant(ItemStack itemStack, CallbackInfoReturnable<Boolean> cir) {
		Set<Supplier<Enchantment>> enchants = EnchantmentUtil.ITEMS_TO_ENCHANTS.get(itemStack.getItem());
		if (enchants != null) {
			for (Supplier<Enchantment> enchant : enchants) {
				if (enchant.get() == (Object) this) {
					cir.setReturnValue(true);
				}
			}
		}
	}
}

Looking at net.minecraft.world.item.enchantment.Enchantment;

I see canEnchant like so.

    public boolean canEnchant(ItemStack stack) {
        return this.category.canEnchant(stack.getItem());
    }

maybe the injection is meant to be returning a bool ? I'm not sure,

@Mixin(Enchantment.class)
public abstract class EnchantmentMixin {
	@Inject(method = "canEnchant", at = @At("HEAD"), cancellable = true)
	private boolean create$canEnchant(ItemStack itemStack, CallbackInfoReturnable<Boolean> cir) {
		Set<Supplier<Enchantment>> enchants = EnchantmentUtil.ITEMS_TO_ENCHANTS.get(itemStack.getItem());
		if (enchants != null) {
			for (Supplier<Enchantment> enchant : enchants) {
				if (enchant.get() == (Object) this) {
					cir.setReturnValue(true);
				}
			}
		}
		return cir.getReturnValue();
	}
}

Seems to stop the crashing.

Reproduction Steps

  1. build and install some other mods that have enchant-able gear in chests
  2. try to open chest
  3. crash

Expected Result

Open chest and the game does not crash

Screenshots and Videos

No response

Crash Report or Log

No response

Operating System

Custom Linux distro

Mod Version

0.4.0c

Minecraft Version

1.18.1

Other Mods

  •   additionaladditions: Additional Additions 3.0.1
    
  •             advanced_runtime_resource_pack: Runtime Resource Pack 0.5.4
    
  •             advancementinfo: AdvancementInfo 1.18-fabric0.43.1-1.3
    
  •             adventurez: AdventureZ 1.4.7
    
  •             ae2: Applied Energistics 2 10.0.0-beta.5
    
  •             ae2things: AE2Things 1.0.0-beta.3
    
  •             ae2wtlib: AE2WTLib 10.0.0-beta.5
    
  •             amecsapi: Amecs API 1.3.3+mc1.18-pre1
    
  •             apoli: Apoli 2.2.2
    
  •             appleskin: AppleSkin mc1.18-2.2.0
    
  •             architectury: Architectury 3.4.9
    
  •             attributefix: AttributeFix 13.0.3
    
  •             autoconfig1u: Auto Config v1 Updated 3.3.1
    
  •             axolotlitemfix: Axolotl Item Fix 1.1.3
    
  •             backslot: BackSlot 1.2.4
    
  •             backslotaddon: BackSlot Addon 1.0.7
    
  •             basicaiots: Basic AIOTs 1.3.3+1.18.1
    
  •             basicshields: Basic Shields [Fabric] 1.2.1-1.18.1
    
  •             bcc: BetterCompatibilityChecker fabric-1.0.4
    
  •             bclib: BCLib 1.2.2
    
  •             betterend: Better End 1.0.0
    
  •             bettermounthud: Better Mount HUD 1.1.3
    
  •             betternether: Better Nether 6.0.8
    
  •             bewitchment: Bewitchment 1.18-4
    
  •             bitsandchisels: BitsAndChisels 2.6.4
    
  •             blockus: Blockus 2.3.4+1.18.1
    
  •             blue_endless_jankson: jankson 1.2.1
    
  •             boatcontainer: BoatContainer 1.0.4
    
  •             botania: Botania 1.18.1-427-FABRIC
    
  •             bountiful: Bountiful 2.0.1
    
  •             breakprogress: Break Progress 1.0.1
    
  •             buildinggadgets: st'ructure tools 1.0.10
    
  •             cacao: Croptopia's Chocolaterie 0.5
    
  •             calio: Calio 1.4.2
    
  •             campchair: Camp Chair 1.0.0
    
  •             can-i-mine-this-block: cAn i MiNe thIS bLOCk? 1.1.0
    
  •             cardinal-components-base: Cardinal Components API (base) 4.0.1
    
  •             cardinal-components-block: Cardinal Components API (blocks) 4.0.1
    
  •             cardinal-components-entity: Cardinal Components API (entities) 4.0.1
    
  •             cardinal-components-item: Cardinal Components API (items) 4.0.1
    
  •             cardinal-components-level: Cardinal Components API (world saves) 4.0.0
    
  •             cardinal-components-world: Cardinal Components API (worlds) 4.0.0
    
  •             catwalksinc: Catwalks Inc. 1.1.0
    
  •             chisel: Chisel Refabricated 1.4.4
    
  •             chord: Chord 1.8.0+1.18-fabric
    
  •             cloth-armor-api-v1: Cloth Armor API v1 1.5.47
    
  •             cloth-basic-math: cloth-basic-math 0.6.0
    
  •             cloth-common-events-v1: Cloth Common Events v1 1.5.47
    
  •             cloth-config: Cloth Config v6 6.1.48
    
  •             com_electronwill_night-config_core: core 3.6.5
    
  •             com_electronwill_night-config_toml: toml 3.6.5
    
  •             com_moandjiezana_toml_toml4j: toml4j 0.7.2
    
  •             com_typesafe_config: config 1.4.1
    
  •             confabricate: confabricate 2.2.0-SNAPSHOT+4.1.1
    
  •             couplings: Couplings 1.7.1+1.18
    
  •             create: Create mc1.18.1_v0.4c
    
  •             crookedcrooks: Crooked Crooks 2.0.1+1.18.1
    
  •             croptopia: Croptopia 1.8.0
    
  •             croptosis: Croptosis 1.4.2
    
  •             dankstorage: Dank Storage 3.1-1.18.1
    
  •             darkpaintings: DarkPaintings 9.0.2
    
  •             deepslatecutting: Deepslate Cutting 1.3.0
    
  •             disable_custom_worlds_advice: Disable Custom Worlds Advice 1.4
    
  •             drinkbeer: Drink Beer 3.0.2
    
  •             dripstone_fluid_lib: Dripstone Fluid Lib 1.1.1
    
  •             earthtojavamobs: Earth2Java 1.7.4+1.18
    
  •             elytratrinket: Elytra Trinket 3.0.0-1.18.1
    
  •             fabric: Fabric API 0.46.1+1.18
    
  •             fabric-api-base: Fabric API Base 0.4.1+b4f4f6cd65
    
  •             fabric-api-lookup-api-v1: Fabric API Lookup API (v1) 1.5.0+17be577f65
    
  •             fabric-biome-api-v1: Fabric Biome API (v1) 6.0.1+ded849a965
    
  •             fabric-blockrenderlayer-v1: Fabric BlockRenderLayer Registration (v1) 1.1.9+3ac43d9565
    
  •             fabric-command-api-v1: Fabric Command API (v1) 1.1.6+3ac43d9565
    
  •             fabric-commands-v0: Fabric Commands (v0) 0.2.5+b4f4f6cd65
    
  •             fabric-containers-v0: Fabric Containers (v0) 0.1.18+d154e2c665
    
  •             fabric-content-registries-v0: Fabric Content Registries (v0) 0.4.5+6f53a73d65
    
  •             fabric-crash-report-info-v1: Fabric Crash Report Info (v1) 0.1.8+3ac43d9565
    
  •             fabric-data-generation-api-v1: Fabric Data Generation API (v1) 1.1.2+1254045365
    
  •             fabric-dimensions-v1: Fabric Dimensions API (v1) 2.1.9+a1d9bbf565
    
  •             fabric-entity-events-v1: Fabric Entity Events (v1) 1.4.5+6b21378a65
    
  •             fabric-events-interaction-v0: Fabric Events Interaction (v0) 0.4.16+bfa23f1765
    
  •             fabric-events-lifecycle-v0: Fabric Events Lifecycle (v0) 0.2.6+b4f4f6cd65
    
  •             fabric-game-rule-api-v1: Fabric Game Rule API (v1) 1.0.10+3ac43d9565
    
  •             fabric-gametest-api-v1: Fabric Game Test API (v1) 1.0.7+c5d03bcd65
    
  •             fabric-item-api-v1: Fabric Item API (v1) 1.3.0+691a79b565
    
  •             fabric-item-groups-v0: Fabric Item Groups (v0) 0.3.3+3ac43d9565
    
  •             fabric-key-binding-api-v1: Fabric Key Binding API (v1) 1.0.8+c8aba2f365
    
  •             fabric-keybindings-v0: Fabric Key Bindings (v0) 0.2.6+b4f4f6cd65
    
  •             fabric-language-kotlin: Fabric Language Kotlin 1.7.1+kotlin.1.6.10
    
  •             fabric-lifecycle-events-v1: Fabric Lifecycle Events (v1) 1.4.10+c15ca33565
    
  •             fabric-loot-tables-v1: Fabric Loot Tables (v1) 1.0.8+3ac43d9565
    
  •             fabric-mining-level-api-v1: Fabric Mining Level API (v1) 1.0.3+3ac43d9565
    
  •             fabric-mining-levels-v0: Fabric Mining Levels (v0) 0.1.8+b4f4f6cd65
    
  •             fabric-models-v0: Fabric Models (v0) 0.3.3+3ac43d9565
    
  •             fabric-networking-api-v1: Fabric Networking API (v1) 1.0.18+3ac43d9565
    
  •             fabric-networking-v0: Fabric Networking (v0) 0.3.5+b4f4f6cd65
    
  •             fabric-object-builder-api-v1: Fabric Object Builder API (v1) 1.11.1+3b82842e65
    
  •             fabric-object-builders-v0: Fabric Object Builders (v0) 0.7.9+3ac43d9565
    
  •             fabric-particles-v1: Fabric Particles (v1) 0.2.9+526dc1ac65
    
  •             fabric-permissions-api-v0: fabric-permissions-api 0.1-SNAPSHOT
    
  •             fabric-registry-sync-v0: Fabric Registry Sync (v0) 0.9.0+befed49e65
    
  •             fabric-renderer-api-v1: Fabric Renderer API (v1) 0.4.10+b0b66fc365
    
  •             fabric-renderer-indigo: Fabric Renderer - Indigo 0.4.13+b0b66fc365
    
  •             fabric-renderer-registries-v1: Fabric Renderer Registries (v1) 3.2.7+b4f4f6cd65
    
  •             fabric-rendering-data-attachment-v1: Fabric Rendering Data Attachment (v1) 0.3.4+7242e9d765
    
  •             fabric-rendering-fluids-v1: Fabric Rendering Fluids (v1) 0.1.18+3ac43d9565
    
  •             fabric-rendering-v0: Fabric Rendering (v0) 1.1.9+b4f4f6cd65
    
  •             fabric-rendering-v1: Fabric Rendering (v1) 1.10.3+6b21378a65
    
  •             fabric-resource-conditions-api-v1: Fabric Resource Conditions API (v1) 1.0.1+13eda06565
    
  •             fabric-resource-loader-v0: Fabric Resource Loader (v0) 0.4.11+3ac43d9565
    
  •             fabric-screen-api-v1: Fabric Screen API (v1) 1.0.7+3ac43d9565
    
  •             fabric-screen-handler-api-v1: Fabric Screen Handler API (v1) 1.1.11+3ac43d9565
    
  •             fabric-structure-api-v1: Fabric Structure API (v1) 2.1.0+0a73a6c265
    
  •             fabric-tag-extensions-v0: Fabric Tag Extensions (v0) 1.2.5+3ac43d9565
    
  •             fabric-textures-v0: Fabric Textures (v0) 1.0.9+3ac43d9565
    
  •             fabric-tool-attribute-api-v1: Fabric Tool Attribute API (v1) 1.3.5+fb3b57b465
    
  •             fabric-transfer-api-v1: Fabric Transfer API (v1) 1.5.6+b4f4f6cd65
    
  •             fabricloader: Fabric Loader 0.12.12
    
  •             fabricshieldlib: Fabric Shield Lib 1.4.5-1.18
    
  •             fake-player-api: Fake Player API 0.3.0
    
  •             farmersdelight: Farmer's Delight 1.18.1-0.2.0
    
  •             fiber: fiber 0.23.0-2
    
  •             floral_flair: Floral Flair 1.1.0
    
  •             flywheel: Flywheel 1.18-0.5.1.14
    
  •             forge_tags: Forge Tags 1.3
    
  •             forgeconfigapiport: Forge Config API Port 3.1.0
    
  •             glassential: Glassential 1.3.0
    
  •             goblintraders: Goblin Traders 1.4.1
    
  •             guild: Guild 0.3.8
    
  •             harvest_scythes: Harvest Scythes 2.4.0
    
  •             healthoverlay: Health Overlay 6.0.1
    
  •             horseinfo: Horse Info 0.4.1-1.18
    
  •             iceberg: Iceberg 1.0.38
    
  •             iknowwhatimdoing: I Know What I'm Doing 4.0.0
    
  •             impaled: Impaled 1.0.2
    
  •             impersonate: Impersonate 2.4.0
    
  •             improved-stations: Improved Stations 2.0.8
    
  •             incubus_core: Incubus Core 1.6.3
    
  •             inventorysorter: Inventory Sorter 1.8.4-1.18
    
  •             io_leangen_geantyref_geantyref: geantyref 1.3.11
    
  •             iron-jetpacks: Iron Jetpacks 0.4.3
    
  •             jankson: Jankson 4.0.0+j1.2.0
    
  •             java: OpenJDK 64-Bit Server VM 17
    
  •             kambrik: Kambrik 3.0.0
    
  •             kanos_config: Kanos Config 0.1.4+1.14.4-1.17.1
    
  •             kyrptconfig: Kyrpt Config 1.3.4-1.18
    
  •             lazydfu: LazyDFU 0.1.2
    
  •             legendarytooltips: Legendary Tooltips 1.1.5
    
  •             libcd: LibCapableData 3.0.3+1.16.3
    
  •             libgui: LibGui 5.2.0+1.18
    
  •             libninepatch: LibNinePatch 1.1.0
    
  •             lovely_snails: Lovely Snails 1.0.3+1.18
    
  •             magna: Magna 1.7.0-1.18-pre1
    
  •             maybe-data: Maybe data 1.0.1-1.17
    
  •             maybe-more-data: Maybe More Data 1.0.0-1.18
    
  •             mcdict: MCDict 2.1.0+1.17.1
    
  •             megane: megane 6.2.0
    
  •             megane-applied-energistics-2: megane-applied-energistics-2 6.2.0+10.0.0-alpha.1
    
  •             megane-base: megane-base 6.2.0
    
  •             megane-fabric-transfer: megane-fabric-transfer 6.2.0+1.5.4-b4f4f6cda9
    
  •             megane-modern-industrialization: megane-modern-industrialization 6.2.0+1.0.0-alpha.02
    
  •             megane-reborn-core: megane-reborn-core 6.2.0+5.1.0-beta.2
    
  •             megane-runtime: megane-runtime 6.2.0
    
  •             megane-team-reborn-energy: megane-team-reborn-energy 6.2.0+2.0.0-beta1
    
  •             megane-tech-reborn: megane-tech-reborn 6.2.0+5.1.0-beta.2
    
  •             megane-vanilla: megane-vanilla 6.2.0+1.18.1
    
  •             megane-wireless-networks: megane-wireless-networks 6.2.0+1.4.0
    
  •             milk: Milk Lib 0.1.6
    
  •             minecraft: Minecraft 1.18.1
    
  •             mm: Manningham Mills 2.3
    
  •             mocolors: Mo' Colors 1.3.0
    
  •             modern_industrialization: Modern Industrialization 1.0.4
    
  •             modmenu: Mod Menu 3.0.0
    
  •             morevillagers-fabric: MoreVillagersFabric 3.1.1-SNAPSHOT
    
  •             mostructures: Mo' Structures 1.3.0-pre1+1.18
    
  •             mousetweaks: Mouse Tweaks 2.22
    
  •             naturescompass: Nature's Compass 1.18.1-2.0.2-fabric
    
  •             omega-config: OmegaConfig 1.1.0
    
  •             org_jetbrains_kotlin_kotlin-reflect: kotlin-reflect 1.6.10
    
  •             org_jetbrains_kotlin_kotlin-stdlib: kotlin-stdlib 1.6.10
    
  •             org_jetbrains_kotlin_kotlin-stdlib-jdk7: kotlin-stdlib-jdk7 1.6.10
    
  •             org_jetbrains_kotlin_kotlin-stdlib-jdk8: kotlin-stdlib-jdk8 1.6.10
    
  •             org_jetbrains_kotlinx_kotlinx-coroutines-core-jvm: kotlinx-coroutines-core-jvm 1.5.2
    
  •             org_jetbrains_kotlinx_kotlinx-coroutines-jdk8: kotlinx-coroutines-jdk8 1.5.2
    
  •             org_jetbrains_kotlinx_kotlinx-serialization-cbor-jvm: kotlinx-serialization-cbor-jvm 1.3.1
    
  •             org_jetbrains_kotlinx_kotlinx-serialization-core-jvm: kotlinx-serialization-core-jvm 1.3.1
    
  •             org_jetbrains_kotlinx_kotlinx-serialization-json-jvm: kotlinx-serialization-json-jvm 1.3.1
    
  •             org_spongepowered_configurate-core: configurate-core 4.1.1
    
  •             org_spongepowered_configurate-extra-dfu4: configurate-extra-dfu4 4.1.1
    
  •             org_spongepowered_configurate-gson: configurate-gson 4.1.1
    
  •             org_spongepowered_configurate-hocon: configurate-hocon 4.1.1
    
  •             origins: Origins 1.3.1
    
  •             owo: oωo 0.3.14+1.18
    
  •             patchouli: Patchouli 1.18.1-64-FABRIC
    
  •             pehkui: Pehkui 3.0.0+1.14.4-1.18
    
  •             playerabilitylib: Pal 1.5.0
    
  •             pling: Pling 1.5.0
    
  •             plushies: Plushie Mod 1.1
    
  •             reach-entity-attributes: Reach Entity Attributes 2.1.1
    
  •             reborncore: Reborn Core 5.1.0-beta.5
    
  •             redstonebits: Redstone Bits 1.6.2
    
  •             registrate-fabric: Registrate for Fabric MC1.18.1-1.0.7
    
  •             roughlyenoughitems: Roughly Enough Items 7.0.346
    
  •             simpleteleporters: Simple Teleporters 2.3.0
    
  •             spectrum: Spectrum 1.2.6-1.18.1-midgame7
    
  •             stacc: Stacc 1.2.3
    
  •             staffofbuilding: Staff of Building 1.4.1-1.18.1
    
  •             static-content: Static Content 1.0.2-1.16.2
    
  •             staticdata: Static Data 1.1.2
    
  •             step-height-entity-attribute: Step Height Entity Attribute 1.0.0
    
  •             stoneholm: Stoneholm 1.4.1
    
  •             team_reborn_energy: Energy 2.1.0
    
  •             techreborn: Tech Reborn 5.1.0-beta.5
    
  •             terraform-wood-api-v1: Terraform Wood API (v1) 2.0.2
    
  •             thonkutil: ThonkUtil 1.3
    
  •             tooltipfix: ToolTip Fix 1.0.4-1.18
    
  •             towers_of_the_wild_reworked: Towers of the Wild: Reworked 2.1.0
    
  •             transportables: Transportables 1.1
    
  •             trapexpansion: Trap Expansion 1.3.3
    
  •             trinkets: Trinkets 3.1.0
    
  •             vanilla-hammers: Vanilla Hammers 3.2.0-1.18.1
    
  •             vanillaexcavators: Vanilla Excavators 1.1.0
    
  •             villager-hats: Villager Hats Mod 1.2.1
    
  •             waystones: Waystones 2.4.1
    
  •             wilderworld: WilderWorld 1.0.0
    
  •             wirelessnetworks: Wireless Networks 1.4.1
    
  •             wthit: wthit 4.4.1
    
  •             xaerominimap: Xaero's Minimap 21.22.6
    
  •             xaeroworldmap: Xaero's World Map 1.18.9
    
  •             xp_storage: XP Storage 1.4.3+1.18
    
  •             xp_storage_trinkets: XP Storage - Trinkets 0.1+1.18
    
  •             xps: Xp Obelisk 0.3.2.r_for_1.18.x_Fabric
    
  •             yigd: You're in Grave Danger 1.2.11
    

Additional Context

thanks for porting to fabric been having a bunch of fun with it.

commented

@TropheusJ I took a look again and ran the client in debug mode. As it turns out it is a mix of create enchantments and harvest scythes mod and the enchantment Crop Reaper it was locking at

                } while(!enchantment.category.canEnchant(item) && !bl);

from the class
net.minecraft.world.item.enchantment.EnchantmentHelper.class

function
getAvailableEnchantmentResults

This showed me that it was a book called Crop Reaper

Sorry to waste time.

commented

injects must return void, it's likely just not injecting now. Please send a log from the "fixed" version.

commented

@TropheusJ will do when I get home from work today. I did notice that it propagated after the "fix" to enchant category .

I took a bit of a deeper dive and noticed that there is only 2 class enchantments. I started refactoring them the "fabric" way. I'll fork and commit and push later on tonight and point to this issue.

Have a good day.