From 2a9619205fad23014dcd34ed79ecb9c3ad1ee441 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 8 Jul 2020 17:48:42 +0800 Subject: [PATCH] Prevent registration duplicate. --- .../common/mixin/bukkit/CraftLegacyMixin.java | 26 +++++++++++++++++++ .../common/mixin/bukkit/EntityTypeMixin.java | 4 +++ .../common/mod/server/BukkitRegistry.java | 13 +++++----- .../common/mod/util/ResourceLocationUtil.java | 5 ++-- .../resources/mixins.arclight.bukkit.json | 1 + build.gradle | 2 +- 6 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftLegacyMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftLegacyMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftLegacyMixin.java new file mode 100644 index 00000000..bb6711dd --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftLegacyMixin.java @@ -0,0 +1,26 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import org.bukkit.Material; +import org.bukkit.craftbukkit.v.util.CraftLegacy; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import java.util.Arrays; + +@Mixin(value = CraftLegacy.class, remap = false) +public class CraftLegacyMixin { + + private static Material[] moddedMaterials; + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static Material[] modern_values() { + if (moddedMaterials == null) { + moddedMaterials = Arrays.stream(Material.values()).filter(it -> !it.isLegacy()).toArray(Material[]::new); + } + return moddedMaterials; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/EntityTypeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/EntityTypeMixin.java index 98c19a7b..05fc5b1b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/EntityTypeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/EntityTypeMixin.java @@ -22,8 +22,11 @@ import java.util.function.Function; @Mixin(value = EntityType.class, remap = false) public class EntityTypeMixin implements EntityTypeBridge { + // @formatter:off @Shadow @Final @Mutable private NamespacedKey key; @Shadow @Final @Mutable private Class clazz; + @Shadow @Final @Mutable private String name; + // @formatter:on private net.minecraft.entity.EntityType handleType; private EntityPropertySpec spec; @@ -32,6 +35,7 @@ public class EntityTypeMixin implements EntityTypeBridge { @Override public void bridge$setup(ResourceLocation location, net.minecraft.entity.EntityType entityType, EntityPropertySpec spec) { this.key = CraftNamespacedKey.fromMinecraft(location); + this.name = location.toString(); this.handleType = entityType; this.spec = spec.clone(); this.setup(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index d917086a..661153bb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -31,7 +31,6 @@ import org.bukkit.potion.PotionEffectType; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; @@ -70,7 +69,7 @@ public class BukkitRegistry { } if (!found) { String name = ResourceLocationUtil.standardize(location); - entityType = EnumHelper.makeEnum(EntityType.class, name, i++, ENTITY_CTOR, ImmutableList.of(ResourceLocationUtil.standardize(location).toLowerCase(Locale.ROOT), Entity.class, -1)); + entityType = EnumHelper.makeEnum(EntityType.class, name, i++, ENTITY_CTOR, ImmutableList.of(location.getPath(), Entity.class, -1)); ((EntityTypeBridge) (Object) entityType).bridge$setup(location, type, entitySpec(location)); newTypes.add(entityType); ArclightMod.LOGGER.debug("Registered {} as entity {}", location, entityType); @@ -102,7 +101,7 @@ public class BukkitRegistry { String name = ResourceLocationUtil.standardize(entry.getKey()); ArclightPotionEffect effect = new ArclightPotionEffect(entry.getValue(), name); PotionEffectType.registerPotionEffectType(effect); - ArclightMod.LOGGER.debug("Registered {}: {} as potion", entry.getKey(), effect); + ArclightMod.LOGGER.debug("Registered {} as potion {}", entry.getKey(), effect); } PotionEffectType.stopAcceptingRegistrations(); ArclightMod.LOGGER.info("registry.potion", size - origin); @@ -116,9 +115,9 @@ public class BukkitRegistry { for (Map.Entry entry : ForgeRegistries.BLOCKS.getEntries()) { ResourceLocation location = entry.getKey(); Block block = entry.getValue(); - Material material = Material.matchMaterial(location.toString()); + String name = ResourceLocationUtil.standardize(location); + Material material = BY_NAME.get(name); if (material == null) { - String name = ResourceLocationUtil.standardize(location); material = EnumHelper.makeEnum(Material.class, name, i, MAT_CTOR, ImmutableList.of(i)); ((MaterialBridge) (Object) material).bridge$setupBlock(location, block, matSpec(location)); BY_NAME.put(name, material); @@ -139,9 +138,9 @@ public class BukkitRegistry { for (Map.Entry entry : ForgeRegistries.ITEMS.getEntries()) { ResourceLocation location = entry.getKey(); Item item = entry.getValue(); - Material material = Material.matchMaterial(location.toString()); + String name = ResourceLocationUtil.standardize(location); + Material material = BY_NAME.get(name); if (material == null) { - String name = ResourceLocationUtil.standardize(location); material = EnumHelper.makeEnum(Material.class, name, i, MAT_CTOR, ImmutableList.of(i)); ((MaterialBridge) (Object) material).bridge$setupItem(location, item, matSpec(location)); BY_NAME.put(name, material); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ResourceLocationUtil.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ResourceLocationUtil.java index eb70b571..cdbb0b5b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ResourceLocationUtil.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ResourceLocationUtil.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.mod.util; import com.google.common.base.Preconditions; import net.minecraft.util.ResourceLocation; +import org.bukkit.NamespacedKey; import org.jetbrains.annotations.Contract; import java.util.Locale; @@ -11,7 +12,7 @@ public class ResourceLocationUtil { @Contract("null -> fail") public static String standardize(ResourceLocation location) { Preconditions.checkNotNull(location, "location"); - return location.toString() + return (location.getNamespace().equals(NamespacedKey.MINECRAFT) ? location.getPath() : location.toString()) .replace(':', '_') .replaceAll("\\s+", "_") .replaceAll("\\W", "") @@ -19,7 +20,7 @@ public class ResourceLocationUtil { } public static String standardizeLower(ResourceLocation location) { - return location.toString() + return (location.getNamespace().equals(NamespacedKey.MINECRAFT) ? location.getPath() : location.toString()) .replace(':', '_') .replaceAll("\\s+", "_") .replaceAll("\\W", "") diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index d3852ee8..1b655295 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -17,6 +17,7 @@ "CraftEventFactoryMixin", "CraftInventoryMixin", "CraftItemFactoryMixin", + "CraftLegacyMixin", "CraftMagicNumbersMixin", "CraftServerMixin", "CraftWorldMixin", diff --git a/build.gradle b/build.gradle index a2c43252..ec45f956 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ import java.nio.file.attribute.BasicFileAttributes allprojects { group 'io.izzel.arclight' - version '1.0.1' + version '1.0.2-SNAPSHOT' ext { agpVersion = '1.7'