Skip to content

Commit

Permalink
Fix item attribute modification event map being immutable
Browse files Browse the repository at this point in the history
  • Loading branch information
Su5eD committed Oct 19, 2023
1 parent 1812f8b commit 2272fc7
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,21 @@

package net.fabricmc.fabric.impl.item;

import com.google.common.collect.Multimap;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ItemAttributeModifierEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.loading.FMLLoader;

import net.minecraft.entity.attribute.EntityAttribute;
import net.minecraft.entity.attribute.EntityAttributeModifier;

import net.fabricmc.fabric.api.item.v1.ModifyItemAttributeModifiersCallback;
import net.fabricmc.fabric.impl.client.item.ItemApiClientEventHooks;

@Mod("fabric_item_api_v1")
public class FabricItemImpl {

public FabricItemImpl() {
if (FMLLoader.getDist() == Dist.CLIENT) {
MinecraftForge.EVENT_BUS.register(ItemApiClientEventHooks.class);
Expand All @@ -36,6 +39,7 @@ public FabricItemImpl() {
}

private static void modifyItemAttributeModifiers(ItemAttributeModifierEvent event) {
ModifyItemAttributeModifiersCallback.EVENT.invoker().modifyAttributeModifiers(event.getItemStack(), event.getSlotType(), event.getModifiers());
Multimap<EntityAttribute, EntityAttributeModifier> modifiers = FabricItemInternals.getModifiableAttributesMap(event);
ModifyItemAttributeModifiersCallback.EVENT.invoker().modifyAttributeModifiers(event.getItemStack(), event.getSlotType(), modifiers);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,19 @@

package net.fabricmc.fabric.impl.item;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.WeakHashMap;
import java.util.function.Supplier;

import com.google.common.collect.Multimap;
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;

import net.minecraft.entity.attribute.EntityAttribute;
import net.minecraft.entity.attribute.EntityAttributeModifier;

import net.minecraftforge.event.ItemAttributeModifierEvent;
import org.jetbrains.annotations.Nullable;

import net.minecraft.item.Item;
Expand All @@ -29,6 +39,7 @@
public final class FabricItemInternals {
public static final ThreadLocal<Boolean> FORGE_CALL = ThreadLocal.withInitial(() -> false);
private static final WeakHashMap<Item.Settings, ExtraData> extraData = new WeakHashMap<>();
private static final MethodHandle MODIFIABLE_ATTRIBUTES = LamdbaExceptionUtils.uncheck(() -> MethodHandles.privateLookupIn(ItemAttributeModifierEvent.class, MethodHandles.lookup()).findVirtual(ItemAttributeModifierEvent.class, "getModifiableMap", MethodType.methodType(Multimap.class)));

private FabricItemInternals() {
}
Expand Down Expand Up @@ -57,6 +68,14 @@ public static boolean allowForgeCall() {
return !FORGE_CALL.get();
}

public static Multimap<EntityAttribute, EntityAttributeModifier> getModifiableAttributesMap(ItemAttributeModifierEvent event) {
try {
return (Multimap<EntityAttribute, EntityAttributeModifier>) MODIFIABLE_ATTRIBUTES.invokeExact(event);
} catch (Throwable e) {
throw new RuntimeException("Error invoking getModifiableMap", e);
}
}

public static final class ExtraData {
private @Nullable EquipmentSlotProvider equipmentSlotProvider;
private @Nullable CustomDamageHandler customDamageHandler;
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,5 @@ fabric-client-tags-api-v1-version=1.1.1
loom.platform=forge
forge_version=1.20.1-47.1.3
pack_format=15
forgified_version=1.9.25
forgified_version=1.9.26
forge_fabric_loader_version=2.3.4+0.14.21+1.20.1

0 comments on commit 2272fc7

Please sign in to comment.