From 89c108d1f311229a88fd6ea59dc47750c60eee05 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Fri, 17 Jul 2020 22:06:21 +0800 Subject: [PATCH] Several registries. --- .../arclight/common/asm/SwitchTableFixer.java | 2 + .../common/mixin/bukkit/CraftBlockMixin.java | 23 ++++++++ .../mixin/bukkit/CraftVillagerMixin.java | 21 +++++++ .../common/mod/server/BukkitRegistry.java | 57 ++++++++++++++++++- .../resources/mixins.arclight.bukkit.json | 1 + .../main/resources/META-INF/i18n/zh_cn.conf | 2 + 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftVillagerMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java b/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java index 447d36d0..9886f3a5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/asm/SwitchTableFixer.java @@ -30,6 +30,8 @@ public class SwitchTableFixer implements Implementer { .add("org/bukkit/Material") .add("org/bukkit/entity/EntityType") .add("org/bukkit/World$Environment") + .add("org/bukkit/entity/Villager$Profession") + .add("org/bukkit/block/Biome") .build(); public byte[] processClass(byte[] bytes) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java index bd7efc38..14d3c22c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftBlockMixin.java @@ -1,11 +1,16 @@ package io.izzel.arclight.common.mixin.bukkit; import io.izzel.arclight.common.bridge.bukkit.MaterialBridge; +import io.izzel.arclight.common.mod.util.ResourceLocationUtil; import io.izzel.arclight.i18n.conf.MaterialPropertySpec; +import net.minecraftforge.registries.ForgeRegistries; import org.bukkit.Material; +import org.bukkit.block.Biome; import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -25,4 +30,22 @@ public abstract class CraftBlockMixin { cir.setReturnValue(bridge.bridge$blockStateFactory().apply((CraftBlock) (Object) this)); } } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static Biome biomeBaseToBiome(net.minecraft.world.biome.Biome base) { + return Biome.valueOf(ResourceLocationUtil.standardize(base.getRegistryName())); + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static net.minecraft.world.biome.Biome biomeToBiomeBase(Biome bio) { + return ForgeRegistries.BIOMES.getValue(CraftNamespacedKey.toMinecraft(bio.getKey())); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftVillagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftVillagerMixin.java new file mode 100644 index 00000000..9fca6ab5 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftVillagerMixin.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import io.izzel.arclight.common.mod.util.ResourceLocationUtil; +import net.minecraft.entity.merchant.villager.VillagerProfession; +import org.bukkit.craftbukkit.v.entity.CraftVillager; +import org.bukkit.entity.Villager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +@Mixin(CraftVillager.class) +public class CraftVillagerMixin { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static Villager.Profession nmsToBukkitProfession(VillagerProfession nms) { + return Villager.Profession.valueOf(ResourceLocationUtil.standardize(nms.getRegistryName())); + } +} 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 3e544b0b..a7df2e0d 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 @@ -14,6 +14,7 @@ import io.izzel.arclight.i18n.ArclightConfig; import io.izzel.arclight.i18n.conf.EntityPropertySpec; import io.izzel.arclight.i18n.conf.MaterialPropertySpec; import net.minecraft.block.Block; +import net.minecraft.entity.merchant.villager.VillagerProfession; import net.minecraft.item.Item; import net.minecraft.potion.Effect; import net.minecraft.util.ResourceLocation; @@ -26,16 +27,20 @@ import net.minecraftforge.registries.IForgeRegistry; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.craftbukkit.v.CraftCrashReport; import org.bukkit.craftbukkit.v.enchantments.CraftEnchantment; import org.bukkit.craftbukkit.v.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Villager; import org.bukkit.potion.PotionEffectType; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; @@ -60,6 +65,56 @@ public class BukkitRegistry { loadPotions(); loadEnchantments(); loadEntities(); + loadVillagerProfessions(); + loadBiomes(); + } + + private static void loadBiomes() { + int i = Biome.values().length; + List newTypes = new ArrayList<>(); + Field key = Arrays.stream(Biome.class.getDeclaredFields()).filter(it -> it.getName().equals("key")).findAny().orElse(null); + long keyOffset = Unsafe.objectFieldOffset(key); + for (net.minecraft.world.biome.Biome biome : ForgeRegistries.BIOMES) { + String name = ResourceLocationUtil.standardize(biome.getRegistryName()); + Biome bukkit; + try { + bukkit = Biome.valueOf(name); + } catch (Throwable t) { + bukkit = null; + } + if (bukkit == null) { + bukkit = EnumHelper.makeEnum(Biome.class, name, i++, ImmutableList.of(), ImmutableList.of()); + newTypes.add(bukkit); + Unsafe.putObject(bukkit, keyOffset, CraftNamespacedKey.fromMinecraft(biome.getRegistryName())); + ArclightMod.LOGGER.debug("Registered {} as biome {}", biome.getRegistryName(), bukkit); + } + } + EnumHelper.addEnums(Biome.class, newTypes); + ArclightMod.LOGGER.info("registry.biome", newTypes.size()); + } + + private static void loadVillagerProfessions() { + int i = Villager.Profession.values().length; + List newTypes = new ArrayList<>(); + Field key = Arrays.stream(Villager.Profession.class.getDeclaredFields()).filter(it -> it.getName().equals("key")).findAny().orElse(null); + long keyOffset = Unsafe.objectFieldOffset(key); + for (VillagerProfession villagerProfession : ForgeRegistries.PROFESSIONS) { + String name = ResourceLocationUtil.standardize(villagerProfession.getRegistryName()); + Villager.Profession profession; + try { + profession = Villager.Profession.valueOf(name); + } catch (Throwable t) { + profession = null; + } + if (profession == null) { + profession = EnumHelper.makeEnum(Villager.Profession.class, name, i++, ImmutableList.of(), ImmutableList.of()); + newTypes.add(profession); + Unsafe.putObject(profession, keyOffset, CraftNamespacedKey.fromMinecraft(villagerProfession.getRegistryName())); + ArclightMod.LOGGER.debug("Registered {} as villager profession {}", villagerProfession.getRegistryName(), profession); + } + } + EnumHelper.addEnums(Villager.Profession.class, newTypes); + ArclightMod.LOGGER.info("registry.villager-profession", newTypes.size()); } public static void registerEnvironments() { @@ -73,7 +128,7 @@ public class BukkitRegistry { environment = EnumHelper.makeEnum(World.Environment.class, name, i++, ENV_CTOR, ImmutableList.of(actual.getId())); newTypes.add(environment); ENVIRONMENT_MAP.put(actual.getId(), environment); - ArclightMod.LOGGER.debug("Registered {} as entity {}", actual.getRegistryName(), environment); + ArclightMod.LOGGER.debug("Registered {} as environment {}", actual.getRegistryName(), environment); } } EnumHelper.addEnums(World.Environment.class, newTypes); diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index 1b655295..13c041df 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -20,6 +20,7 @@ "CraftLegacyMixin", "CraftMagicNumbersMixin", "CraftServerMixin", + "CraftVillagerMixin", "CraftWorldMixin", "EntityTypeMixin", "JavaPluginLoaderMixin", diff --git a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf index d3d21f67..21b3c1a7 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf @@ -53,6 +53,8 @@ registry { material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品" entity-type = "注册了 {} 个新的生物类型" environment = "注册了 {} 个新的世界类型" + villager-profession = "注册了 {} 个新的村民职业" + biome = "注册了 {} 个新的生物群系" meta-type { not-subclass = "{} 不是 {} 的子类" error = "{} 提供的 itemMetaType {} 无效: {}"