Several registries.

This commit is contained in:
IzzelAliz 2020-07-17 22:06:21 +08:00
parent 4079a7f421
commit 89c108d1f3
6 changed files with 105 additions and 1 deletions

View File

@ -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) {

View File

@ -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()));
}
}

View File

@ -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()));
}
}

View File

@ -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<Biome> 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<Villager.Profession> 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);

View File

@ -20,6 +20,7 @@
"CraftLegacyMixin",
"CraftMagicNumbersMixin",
"CraftServerMixin",
"CraftVillagerMixin",
"CraftWorldMixin",
"EntityTypeMixin",
"JavaPluginLoaderMixin",

View File

@ -53,6 +53,8 @@ registry {
material = "注册了 {} 个材料,其中 {} 个方块 {} 个物品"
entity-type = "注册了 {} 个新的生物类型"
environment = "注册了 {} 个新的世界类型"
villager-profession = "注册了 {} 个新的村民职业"
biome = "注册了 {} 个新的生物群系"
meta-type {
not-subclass = "{} 不是 {} 的子类"
error = "{} 提供的 itemMetaType {} 无效: {}"