From 4395cb344410202555d587c128cc45acf48cc8e7 Mon Sep 17 00:00:00 2001 From: nutant <65939836+nutant233@users.noreply.github.com> Date: Mon, 6 Oct 2025 02:51:02 +0800 Subject: [PATCH 1/4] optimize syncEventData --- .../eventbus/api/IPlatformEventHelper.java | 42 +++++++++++-------- .../eventwrapper/forge/ForgeEventHelper.java | 12 +++--- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java index 929b03c..c12e273 100644 --- a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java +++ b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java @@ -1,5 +1,7 @@ package io.github.lounode.eventwrapper.eventbus.api; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; + import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; @@ -8,8 +10,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; public interface IPlatformEventHelper { + + Map, Field[]> NON_FINAL_FIELD_CACHE = new Reference2ReferenceOpenHashMap<>(); + String forgePackageNamePrefix = "net.minecraftforge"; IPlatformEventHelper INSTANCE = ServiceUtil.findService(IPlatformEventHelper.class, null); @@ -41,17 +47,12 @@ static void syncEventData(Object from, Object to) { String name = fromField.getName(); Class type = fromField.getType(); - if (!type.isPrimitive()) { - continue; - } - try { - Field toField = Arrays.stream(toFields).filter(field -> field.getName().equals(name)).findFirst().orElse(null); - if (toField != null && !Modifier.isFinal(toField.getModifiers()) && toField.getType().equals(type)) { - fromField.setAccessible(true); - toField.setAccessible(true); - Object value = fromField.get(from); - toField.set(to, value); + for (Field toField : toFields) { + if (toField.getType() == type && toField.getName().equals(name)) { + Object value = fromField.get(from); + toField.set(to, value); + } } } catch (IllegalAccessException ignored) {} } @@ -67,14 +68,19 @@ static Field[] getFields(Class clazz) { } static Field[] getFieldsWithoutFinal(Class clazz) { - List fieldList = new ArrayList<>(16); - while (clazz != null) { - Field[] fields = clazz.getDeclaredFields(); - fieldList.addAll(Arrays.stream(fields).filter(field -> !Modifier.isFinal(field.getModifiers())).toList()); - clazz = clazz.getSuperclass(); - } - Field[] f = new Field[fieldList.size()]; - return fieldList.toArray(f); + return NON_FINAL_FIELD_CACHE.computeIfAbsent(clazz, c -> { + List fieldList = new ArrayList<>(16); + while (c != null) { + for (Field field : c.getDeclaredFields()) { + if (!Modifier.isFinal(field.getModifiers())) { + field.setAccessible(true); + fieldList.add(field); + } + } + c = c.getSuperclass(); + } + return fieldList.toArray(new Field[0]); + }); } T post(T event); diff --git a/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java b/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java index 669f5a5..0f7d85b 100644 --- a/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java +++ b/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java @@ -134,6 +134,7 @@ private void registerListener(Object target, Method method) { EventPriority priority = annotation != null ? EventPriority.valueOf(annotation.priority().name()) : EventPriority.NORMAL; boolean receiveCanceled = annotation != null && annotation.receiveCanceled(); + method.setAccessible(true); MinecraftForge.EVENT_BUS.addListener(priority, receiveCanceled, forgeEventClass, event -> { try { EventWrapper wrapper; @@ -145,7 +146,11 @@ private void registerListener(Object target, Method method) { */ - wrapper = converter.toWrapper(event); + if ((wrapper = FORGE_EVENT_TRACKER_MAP.get(event)) == null) { + wrapper = converter.toWrapper(event); + } else { + IPlatformEventHelper.syncEventData(event, wrapper); + } /* @@ -154,12 +159,7 @@ private void registerListener(Object target, Method method) { } */ - if (FORGE_EVENT_TRACKER_MAP.containsKey(event)) { - wrapper = FORGE_EVENT_TRACKER_MAP.get(event); - IPlatformEventHelper.syncEventData(event, wrapper); - } - method.setAccessible(true); method.invoke(target, wrapper); IPlatformEventHelper.syncEventData(wrapper, event); From 3a886d794a695029fe9fca41d7859a29093266bd Mon Sep 17 00:00:00 2001 From: nutant <65939836+nutant233@users.noreply.github.com> Date: Mon, 6 Oct 2025 09:44:42 +0800 Subject: [PATCH 2/4] optimize --- .../eventbus/api/IPlatformEventHelper.java | 1 + .../mixin/ItemCooldownEventPoster.java | 34 ++++--------------- .../resources/META-INF/accesstransformer.cfg | 4 ++- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java index c12e273..f4616d1 100644 --- a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java +++ b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java @@ -52,6 +52,7 @@ static void syncEventData(Object from, Object to) { if (toField.getType() == type && toField.getName().equals(name)) { Object value = fromField.get(from); toField.set(to, value); + break; } } } catch (IllegalAccessException ignored) {} diff --git a/common/src/main/java/io/github/lounode/eventwrapper/mixin/ItemCooldownEventPoster.java b/common/src/main/java/io/github/lounode/eventwrapper/mixin/ItemCooldownEventPoster.java index e85ff2a..1830352 100644 --- a/common/src/main/java/io/github/lounode/eventwrapper/mixin/ItemCooldownEventPoster.java +++ b/common/src/main/java/io/github/lounode/eventwrapper/mixin/ItemCooldownEventPoster.java @@ -1,6 +1,5 @@ package io.github.lounode.eventwrapper.mixin; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemCooldowns; @@ -12,7 +11,6 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.lang.reflect.Field; import io.github.lounode.eventwrapper.EventsWrapper; import io.github.lounode.eventwrapper.event.entity.player.ItemCooldownFinishEventWrapper; @@ -29,10 +27,10 @@ public class ItemCooldownEventPoster { private void onCooldownRemove(Item item, CallbackInfo ci) { ItemCooldowns self = (ItemCooldowns) (Object) this; Player player; - if (!isServer(self)) { - player = ClientUtil.getClientPlayer(); + if (self instanceof ServerItemCooldowns cooldowns) { + player = cooldowns.player; } else { - player = getServerPlayerField(self); + player = ClientUtil.getClientPlayer(); } ItemCooldownFinishEventWrapper event = new ItemCooldownFinishEventWrapper(player, item); @@ -48,34 +46,14 @@ private void onCooldownRemove(Item item, CallbackInfo ci) { private int onCooldownStart(int ticks, Item item) { ItemCooldowns self = (ItemCooldowns) (Object) this; Player player; - if (!isServer(self)) { - player = ClientUtil.getClientPlayer(); + if (self instanceof ServerItemCooldowns cooldowns) { + player = cooldowns.player; } else { - player = getServerPlayerField(self); + player = ClientUtil.getClientPlayer(); } ItemCooldownStartEventWrapper event = new ItemCooldownStartEventWrapper(player, item, ticks); EventsWrapper.post(event); return event.isCanceled() ? 0 : event.getTicks(); } - private boolean isServer(ItemCooldowns itemcooldowns) { - return itemcooldowns instanceof ServerItemCooldowns; - } - - private ServerPlayer getServerPlayerField(ItemCooldowns itemcooldowns) { - ServerItemCooldowns cooldowns = (ServerItemCooldowns) itemcooldowns; - - for (Field field : cooldowns.getClass().getDeclaredFields()) { - if (field.getType() == ServerPlayer.class) { - try { - field.setAccessible(true); - return (ServerPlayer) field.get(cooldowns); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - } diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg index 6f1e813..61b3266 100644 --- a/common/src/main/resources/META-INF/accesstransformer.cfg +++ b/common/src/main/resources/META-INF/accesstransformer.cfg @@ -11,4 +11,6 @@ public net.minecraft.world.item.crafting.Ingredient$Value public net.minecraft.world.item.crafting.Ingredient$ItemValue (Lnet/minecraft/world/item/ItemStack;)V public net.minecraft.world.item.crafting.Ingredient$TagValue (Lnet/minecraft/tags/TagKey;)V public-f net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator -public net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator (Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/core/Holder;)V \ No newline at end of file +public net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator (Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/core/Holder;)V + +public net.minecraft.world.item.ServerItemCooldowns f_43065_ # player \ No newline at end of file From 86ec19d7ee54c2551b6b155fef9cd5499acc08a9 Mon Sep 17 00:00:00 2001 From: nutant <65939836+nutant233@users.noreply.github.com> Date: Sun, 19 Oct 2025 12:21:55 +0800 Subject: [PATCH 3/4] fix concurrent --- .../eventbus/api/IPlatformEventHelper.java | 5 ++--- .../eventwrapper/forge/ForgeEventHelper.java | 18 +----------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java index f4616d1..7691837 100644 --- a/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java +++ b/common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java @@ -1,7 +1,5 @@ package io.github.lounode.eventwrapper.eventbus.api; -import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; - import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; @@ -11,10 +9,11 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public interface IPlatformEventHelper { - Map, Field[]> NON_FINAL_FIELD_CACHE = new Reference2ReferenceOpenHashMap<>(); + Map, Field[]> NON_FINAL_FIELD_CACHE = new ConcurrentHashMap<>(); String forgePackageNamePrefix = "net.minecraftforge"; IPlatformEventHelper INSTANCE = ServiceUtil.findService(IPlatformEventHelper.class, null); diff --git a/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java b/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java index 0f7d85b..9522f40 100644 --- a/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java +++ b/forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java @@ -15,8 +15,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.Map; -import java.util.WeakHashMap; import java.util.stream.Stream; import io.github.lounode.eventwrapper.eventbus.api.EventConverter; @@ -28,7 +26,6 @@ public class ForgeEventHelper implements IPlatformEventHelper { private static final Logger LOGGER = LogManager.getLogger(); - private static final Map FORGE_EVENT_TRACKER_MAP = new WeakHashMap<>(); @Override public boolean isForge() { @@ -57,7 +54,6 @@ public T post(T event) { extension.EventWrapper_setEventWrapper(event); */ - track(forgeEvent, event); MinecraftForge.EVENT_BUS.post(forgeEvent); @@ -146,11 +142,7 @@ private void registerListener(Object target, Method method) { */ - if ((wrapper = FORGE_EVENT_TRACKER_MAP.get(event)) == null) { - wrapper = converter.toWrapper(event); - } else { - IPlatformEventHelper.syncEventData(event, wrapper); - } + wrapper = converter.toWrapper(event); /* @@ -271,14 +263,6 @@ private static void checkSupertypes(Class registeredType, Class type) { .forEach(itf -> checkSupertypes(registeredType, itf)); } - public static void track(Event forgeEvent, EventWrapper wrapper) { - FORGE_EVENT_TRACKER_MAP.put(forgeEvent, wrapper); - } - - public static EventWrapper getWrapper(Event forgeEvent) { - return FORGE_EVENT_TRACKER_MAP.get(forgeEvent); - } - @Override public boolean isCorrectToolForDrops(BlockState state, Player player) { return ForgeHooks.isCorrectToolForDrops(state, player); From 4a9090cf0a7d0b24d415ca0a1bd907e5c6c5ff5f Mon Sep 17 00:00:00 2001 From: nutant <65939836+nutant233@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:47:39 +0800 Subject: [PATCH 4/4] add accessWidener --- fabric/src/main/resources/eventwrapper.accesswidener | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fabric/src/main/resources/eventwrapper.accesswidener b/fabric/src/main/resources/eventwrapper.accesswidener index d327555..333fc84 100644 --- a/fabric/src/main/resources/eventwrapper.accesswidener +++ b/fabric/src/main/resources/eventwrapper.accesswidener @@ -10,4 +10,5 @@ extendable method net/minecraft/world/entity/vehicle/AbstractMinecart getDropIte extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator accessible class net/minecraft/client/resources/model/ModelManager$ReloadState accessible class net/minecraft/server/network/ServerGamePacketListenerImpl$EntityInteraction -accessible field net/minecraft/world/level/storage/PlayerDataStorage playerDir Ljava/io/File; \ No newline at end of file +accessible field net/minecraft/world/level/storage/PlayerDataStorage playerDir Ljava/io/File; +accessible field net/minecraft/world/item/ServerItemCooldowns player Lnet/minecraft/server/level/ServerPlayer; \ No newline at end of file