Skip to content

Commit 3d46692

Browse files
authored
Merge pull request #4 from nutant233/1.20.1
optimize syncEventData
2 parents d2d102e + 4a9090c commit 3d46692

5 files changed

Lines changed: 36 additions & 65 deletions

File tree

common/src/main/java/io/github/lounode/eventwrapper/eventbus/api/IPlatformEventHelper.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88
import java.util.ArrayList;
99
import java.util.Arrays;
1010
import java.util.List;
11+
import java.util.Map;
12+
import java.util.concurrent.ConcurrentHashMap;
1113

1214
public interface IPlatformEventHelper {
15+
16+
Map<Class<?>, Field[]> NON_FINAL_FIELD_CACHE = new ConcurrentHashMap<>();
17+
1318
String forgePackageNamePrefix = "net.minecraftforge";
1419
IPlatformEventHelper INSTANCE = ServiceUtil.findService(IPlatformEventHelper.class, null);
1520

@@ -41,17 +46,13 @@ static void syncEventData(Object from, Object to) {
4146
String name = fromField.getName();
4247
Class<?> type = fromField.getType();
4348

44-
if (!type.isPrimitive()) {
45-
continue;
46-
}
47-
4849
try {
49-
Field toField = Arrays.stream(toFields).filter(field -> field.getName().equals(name)).findFirst().orElse(null);
50-
if (toField != null && !Modifier.isFinal(toField.getModifiers()) && toField.getType().equals(type)) {
51-
fromField.setAccessible(true);
52-
toField.setAccessible(true);
53-
Object value = fromField.get(from);
54-
toField.set(to, value);
50+
for (Field toField : toFields) {
51+
if (toField.getType() == type && toField.getName().equals(name)) {
52+
Object value = fromField.get(from);
53+
toField.set(to, value);
54+
break;
55+
}
5556
}
5657
} catch (IllegalAccessException ignored) {}
5758
}
@@ -67,14 +68,19 @@ static Field[] getFields(Class<?> clazz) {
6768
}
6869

6970
static Field[] getFieldsWithoutFinal(Class<?> clazz) {
70-
List<Field> fieldList = new ArrayList<>(16);
71-
while (clazz != null) {
72-
Field[] fields = clazz.getDeclaredFields();
73-
fieldList.addAll(Arrays.stream(fields).filter(field -> !Modifier.isFinal(field.getModifiers())).toList());
74-
clazz = clazz.getSuperclass();
75-
}
76-
Field[] f = new Field[fieldList.size()];
77-
return fieldList.toArray(f);
71+
return NON_FINAL_FIELD_CACHE.computeIfAbsent(clazz, c -> {
72+
List<Field> fieldList = new ArrayList<>(16);
73+
while (c != null) {
74+
for (Field field : c.getDeclaredFields()) {
75+
if (!Modifier.isFinal(field.getModifiers())) {
76+
field.setAccessible(true);
77+
fieldList.add(field);
78+
}
79+
}
80+
c = c.getSuperclass();
81+
}
82+
return fieldList.toArray(new Field[0]);
83+
});
7884
}
7985

8086
<T extends EventWrapper> T post(T event);
Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.lounode.eventwrapper.mixin;
22

3-
import net.minecraft.server.level.ServerPlayer;
43
import net.minecraft.world.entity.player.Player;
54
import net.minecraft.world.item.Item;
65
import net.minecraft.world.item.ItemCooldowns;
@@ -12,7 +11,6 @@
1211
import org.spongepowered.asm.mixin.injection.ModifyVariable;
1312
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1413

15-
import java.lang.reflect.Field;
1614

1715
import io.github.lounode.eventwrapper.EventsWrapper;
1816
import io.github.lounode.eventwrapper.event.entity.player.ItemCooldownFinishEventWrapper;
@@ -29,10 +27,10 @@ public class ItemCooldownEventPoster {
2927
private void onCooldownRemove(Item item, CallbackInfo ci) {
3028
ItemCooldowns self = (ItemCooldowns) (Object) this;
3129
Player player;
32-
if (!isServer(self)) {
33-
player = ClientUtil.getClientPlayer();
30+
if (self instanceof ServerItemCooldowns cooldowns) {
31+
player = cooldowns.player;
3432
} else {
35-
player = getServerPlayerField(self);
33+
player = ClientUtil.getClientPlayer();
3634
}
3735

3836
ItemCooldownFinishEventWrapper event = new ItemCooldownFinishEventWrapper(player, item);
@@ -48,34 +46,14 @@ private void onCooldownRemove(Item item, CallbackInfo ci) {
4846
private int onCooldownStart(int ticks, Item item) {
4947
ItemCooldowns self = (ItemCooldowns) (Object) this;
5048
Player player;
51-
if (!isServer(self)) {
52-
player = ClientUtil.getClientPlayer();
49+
if (self instanceof ServerItemCooldowns cooldowns) {
50+
player = cooldowns.player;
5351
} else {
54-
player = getServerPlayerField(self);
52+
player = ClientUtil.getClientPlayer();
5553
}
5654
ItemCooldownStartEventWrapper event = new ItemCooldownStartEventWrapper(player, item, ticks);
5755
EventsWrapper.post(event);
5856
return event.isCanceled() ? 0 : event.getTicks();
5957
}
6058

61-
private boolean isServer(ItemCooldowns itemcooldowns) {
62-
return itemcooldowns instanceof ServerItemCooldowns;
63-
}
64-
65-
private ServerPlayer getServerPlayerField(ItemCooldowns itemcooldowns) {
66-
ServerItemCooldowns cooldowns = (ServerItemCooldowns) itemcooldowns;
67-
68-
for (Field field : cooldowns.getClass().getDeclaredFields()) {
69-
if (field.getType() == ServerPlayer.class) {
70-
try {
71-
field.setAccessible(true);
72-
return (ServerPlayer) field.get(cooldowns);
73-
} catch (IllegalAccessException e) {
74-
e.printStackTrace();
75-
}
76-
}
77-
}
78-
return null;
79-
}
80-
8159
}

common/src/main/resources/META-INF/accesstransformer.cfg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public net.minecraft.world.item.crafting.Ingredient$Value
1111
public net.minecraft.world.item.crafting.Ingredient$ItemValue <init>(Lnet/minecraft/world/item/ItemStack;)V
1212
public net.minecraft.world.item.crafting.Ingredient$TagValue <init>(Lnet/minecraft/tags/TagKey;)V
1313
public-f net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator
14-
public net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator <init>(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/core/Holder;)V
14+
public net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator <init>(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/core/Holder;)V
15+
16+
public net.minecraft.world.item.ServerItemCooldowns f_43065_ # player

fabric/src/main/resources/eventwrapper.accesswidener

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ extendable method net/minecraft/world/entity/vehicle/AbstractMinecart getDropIte
1010
extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator
1111
accessible class net/minecraft/client/resources/model/ModelManager$ReloadState
1212
accessible class net/minecraft/server/network/ServerGamePacketListenerImpl$EntityInteraction
13-
accessible field net/minecraft/world/level/storage/PlayerDataStorage playerDir Ljava/io/File;
13+
accessible field net/minecraft/world/level/storage/PlayerDataStorage playerDir Ljava/io/File;
14+
accessible field net/minecraft/world/item/ServerItemCooldowns player Lnet/minecraft/server/level/ServerPlayer;

forge/src/main/java/io/github/lounode/eventwrapper/forge/ForgeEventHelper.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
import java.lang.reflect.Method;
1717
import java.lang.reflect.Modifier;
18-
import java.util.Map;
19-
import java.util.WeakHashMap;
2018
import java.util.stream.Stream;
2119

2220
import io.github.lounode.eventwrapper.eventbus.api.EventConverter;
@@ -28,7 +26,6 @@
2826
public class ForgeEventHelper implements IPlatformEventHelper {
2927

3028
private static final Logger LOGGER = LogManager.getLogger();
31-
private static final Map<Event, EventWrapper> FORGE_EVENT_TRACKER_MAP = new WeakHashMap<>();
3229

3330
@Override
3431
public boolean isForge() {
@@ -57,7 +54,6 @@ public <T extends EventWrapper> T post(T event) {
5754
extension.EventWrapper_setEventWrapper(event);
5855
5956
*/
60-
track(forgeEvent, event);
6157

6258
MinecraftForge.EVENT_BUS.post(forgeEvent);
6359

@@ -134,6 +130,7 @@ private void registerListener(Object target, Method method) {
134130
EventPriority priority = annotation != null ? EventPriority.valueOf(annotation.priority().name()) : EventPriority.NORMAL;
135131
boolean receiveCanceled = annotation != null && annotation.receiveCanceled();
136132

133+
method.setAccessible(true);
137134
MinecraftForge.EVENT_BUS.addListener(priority, receiveCanceled, forgeEventClass, event -> {
138135
try {
139136
EventWrapper wrapper;
@@ -154,12 +151,7 @@ private void registerListener(Object target, Method method) {
154151
}
155152
156153
*/
157-
if (FORGE_EVENT_TRACKER_MAP.containsKey(event)) {
158-
wrapper = FORGE_EVENT_TRACKER_MAP.get(event);
159-
IPlatformEventHelper.syncEventData(event, wrapper);
160-
}
161154

162-
method.setAccessible(true);
163155
method.invoke(target, wrapper);
164156

165157
IPlatformEventHelper.syncEventData(wrapper, event);
@@ -271,14 +263,6 @@ private static void checkSupertypes(Class<?> registeredType, Class<?> type) {
271263
.forEach(itf -> checkSupertypes(registeredType, itf));
272264
}
273265

274-
public static void track(Event forgeEvent, EventWrapper wrapper) {
275-
FORGE_EVENT_TRACKER_MAP.put(forgeEvent, wrapper);
276-
}
277-
278-
public static EventWrapper getWrapper(Event forgeEvent) {
279-
return FORGE_EVENT_TRACKER_MAP.get(forgeEvent);
280-
}
281-
282266
@Override
283267
public boolean isCorrectToolForDrops(BlockState state, Player player) {
284268
return ForgeHooks.isCorrectToolForDrops(state, player);

0 commit comments

Comments
 (0)