Level biome source fix (WIP)
This commit is contained in:
parent
708c4d6fa2
commit
8bea55a8d2
6 changed files with 27 additions and 340 deletions
|
@ -1,7 +1,12 @@
|
||||||
package ru.betterend;
|
package ru.betterend;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtIo;
|
||||||
import ru.bclib.api.datafixer.DataFixerAPI;
|
import ru.bclib.api.datafixer.DataFixerAPI;
|
||||||
import ru.bclib.api.datafixer.Patch;
|
import ru.bclib.api.datafixer.Patch;
|
||||||
|
import ru.bclib.api.datafixer.PatchFunction;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
public class DataFixer {
|
public class DataFixer {
|
||||||
public static void register() {
|
public static void register() {
|
||||||
|
@ -13,7 +18,21 @@ public class DataFixer {
|
||||||
private static final class BetterEndPatch extends Patch {
|
private static final class BetterEndPatch extends Patch {
|
||||||
protected BetterEndPatch() {
|
protected BetterEndPatch() {
|
||||||
super(BetterEnd.MOD_ID, "0.11.0");
|
super(BetterEnd.MOD_ID, "0.11.0");
|
||||||
System.out.println("BE Patch!");
|
}
|
||||||
|
|
||||||
|
/*public PatchFunction<CompoundTag, Boolean> getLevelDatPatcher() {
|
||||||
|
return (root, profile) -> {
|
||||||
|
CompoundTag dimensions = root.getCompound("Data").getCompound("WorldGenSettings").getCompound("dimensions");
|
||||||
|
if (dimensions.contains("minecraft:the_end")) {
|
||||||
|
CompoundTag biomeSource = dimensions.getCompound("minecraft:the_end").getCompound("generator").getCompound("biome_source");
|
||||||
|
if (!biomeSource.getString("type").equals("betterend:better_end_biome_source")) {
|
||||||
|
BetterEnd.LOGGER.info("Applying biome source patch");
|
||||||
|
biomeSource.putString("type", "betterend:better_end_biome_source");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,16 +61,17 @@ public abstract class MinecraftServerMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {
|
private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {}
|
||||||
}
|
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
@Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true)
|
@Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true)
|
||||||
private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) {
|
private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) {
|
||||||
if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) {
|
if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) {
|
||||||
info.cancel();
|
info.cancel();
|
||||||
}
|
}
|
||||||
|
if (GeneratorOptions.changeSpawn() && world.dimension() == Level.END) {
|
||||||
|
world.setDefaultSpawnPos(GeneratorOptions.getSpawn(), 0F);
|
||||||
|
info.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,332 +0,0 @@
|
||||||
package ru.betterend.mixin.common;
|
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
|
||||||
import com.mojang.serialization.DataResult;
|
|
||||||
import com.mojang.serialization.Dynamic;
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
import net.minecraft.ChatFormatting;
|
|
||||||
import net.minecraft.Util;
|
|
||||||
import net.minecraft.core.RegistryAccess;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.nbt.NbtOps;
|
|
||||||
import net.minecraft.nbt.Tag;
|
|
||||||
import net.minecraft.network.Connection;
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.network.chat.ChatType;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.network.chat.TranslatableComponent;
|
|
||||||
import net.minecraft.network.protocol.Packet;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundLoginPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket;
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
import net.minecraft.server.ServerScoreboard;
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
|
||||||
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
|
||||||
import net.minecraft.server.players.GameProfileCache;
|
|
||||||
import net.minecraft.server.players.PlayerList;
|
|
||||||
import net.minecraft.world.effect.MobEffectInstance;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.EntityType;
|
|
||||||
import net.minecraft.world.level.GameRules;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.biome.BiomeManager;
|
|
||||||
import net.minecraft.world.level.dimension.DimensionType;
|
|
||||||
import net.minecraft.world.level.storage.LevelData;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import ru.betterend.world.generator.GeneratorOptions;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Mixin(PlayerList.class)
|
|
||||||
public class PlayerListMixin {
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private static Logger LOGGER;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private MinecraftServer server;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private RegistryAccess.RegistryHolder registryHolder;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private int viewDistance;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private List<ServerPlayer> players;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
private Map<UUID, ServerPlayer> playersByUUID;
|
|
||||||
|
|
||||||
@Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true)
|
|
||||||
public void be_placeNewPlayer(Connection connection, ServerPlayer serverPlayer, CallbackInfo info) {
|
|
||||||
if (GeneratorOptions.swapOverworldToEnd()) {
|
|
||||||
GameProfile gameProfile = serverPlayer.getGameProfile();
|
|
||||||
GameProfileCache userCache = this.server.getProfileCache();
|
|
||||||
Optional<GameProfile> gameProfile2 = userCache.get(gameProfile.getId());
|
|
||||||
String string = gameProfile2.isPresent() ? gameProfile2.get().getName() : gameProfile.getName();
|
|
||||||
userCache.add(gameProfile);
|
|
||||||
CompoundTag compoundTag = this.load(serverPlayer);
|
|
||||||
ResourceKey<Level> var23;
|
|
||||||
if (compoundTag != null) {
|
|
||||||
DataResult<ResourceKey<Level>> var10000 = DimensionType.parseLegacy(new Dynamic<Tag>(
|
|
||||||
NbtOps.INSTANCE,
|
|
||||||
compoundTag.get("Dimension")
|
|
||||||
));
|
|
||||||
Logger var10001 = LOGGER;
|
|
||||||
Objects.requireNonNull(var10001);
|
|
||||||
var23 = (ResourceKey<Level>) var10000.resultOrPartial(var10001::error).orElse(Level.END);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var23 = Level.END;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResourceKey<Level> registryKey = var23;
|
|
||||||
ServerLevel serverLevel = this.server.getLevel(registryKey);
|
|
||||||
ServerLevel serverLevel3;
|
|
||||||
if (serverLevel == null) {
|
|
||||||
LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey);
|
|
||||||
serverLevel3 = this.server.overworld();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
serverLevel3 = serverLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
serverPlayer.setLevel(serverLevel3);
|
|
||||||
//serverPlayer.gameMode.setLevel((ServerLevel) serverPlayer.level);
|
|
||||||
String string2 = "local";
|
|
||||||
if (connection.getRemoteAddress() != null) {
|
|
||||||
string2 = connection.getRemoteAddress().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
LOGGER.info(
|
|
||||||
"{}[{}] logged in with entity id {} at ({}, {}, {})",
|
|
||||||
serverPlayer.getName().getString(),
|
|
||||||
string2,
|
|
||||||
serverPlayer.getId(),
|
|
||||||
serverPlayer.getX(),
|
|
||||||
serverPlayer.getY(),
|
|
||||||
serverPlayer.getZ()
|
|
||||||
);
|
|
||||||
LevelData worldProperties = serverLevel3.getLevelData();
|
|
||||||
serverPlayer.loadGameTypes(compoundTag);
|
|
||||||
//this.updatePlayerGameMode(serverPlayer, (ServerPlayer) null, serverLevel3);
|
|
||||||
ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(
|
|
||||||
this.server,
|
|
||||||
connection,
|
|
||||||
serverPlayer
|
|
||||||
);
|
|
||||||
GameRules gameRules = serverLevel3.getGameRules();
|
|
||||||
boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN);
|
|
||||||
boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO);
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundLoginPacket(
|
|
||||||
serverPlayer.getId(),
|
|
||||||
serverPlayer.gameMode.getGameModeForPlayer(),
|
|
||||||
serverPlayer.gameMode.getPreviousGameModeForPlayer(),
|
|
||||||
BiomeManager.obfuscateSeed(serverLevel3.getSeed()),
|
|
||||||
worldProperties.isHardcore(),
|
|
||||||
this.server.levelKeys(),
|
|
||||||
this.registryHolder,
|
|
||||||
serverLevel3.dimensionType(),
|
|
||||||
serverLevel3.dimension(),
|
|
||||||
this.getMaxPlayers(),
|
|
||||||
this.viewDistance,
|
|
||||||
bl2,
|
|
||||||
!bl,
|
|
||||||
serverLevel3.isDebug(),
|
|
||||||
serverLevel3.isFlat()
|
|
||||||
));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(
|
|
||||||
ClientboundCustomPayloadPacket.BRAND,
|
|
||||||
(new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName())
|
|
||||||
));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(
|
|
||||||
worldProperties.getDifficulty(),
|
|
||||||
worldProperties.isDifficultyLocked()
|
|
||||||
));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(serverPlayer.getAbilities()));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(serverPlayer.getInventory().selected));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager()
|
|
||||||
.getRecipes()));
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags()
|
|
||||||
.serializeToNetwork(this.registryHolder)));
|
|
||||||
this.sendPlayerPermissionLevel(serverPlayer);
|
|
||||||
serverPlayer.getStats().markAllDirty();
|
|
||||||
serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer);
|
|
||||||
this.updateEntireScoreboard(serverLevel3.getScoreboard(), serverPlayer);
|
|
||||||
this.server.invalidateStatus();
|
|
||||||
TranslatableComponent mutableText2;
|
|
||||||
if (serverPlayer.getGameProfile().getName().equalsIgnoreCase(string)) {
|
|
||||||
mutableText2 = new TranslatableComponent(
|
|
||||||
"multiplayer.player.joined",
|
|
||||||
new Object[] {serverPlayer.getDisplayName()}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mutableText2 = new TranslatableComponent(
|
|
||||||
"multiplayer.player.joined.renamed",
|
|
||||||
new Object[] {serverPlayer.getDisplayName(), string}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID);
|
|
||||||
serverPlayNetworkHandler.teleport(
|
|
||||||
serverPlayer.getX(),
|
|
||||||
serverPlayer.getY(),
|
|
||||||
serverPlayer.getZ(),
|
|
||||||
serverPlayer.getYRot(),
|
|
||||||
serverPlayer.getXRot()
|
|
||||||
);
|
|
||||||
this.players.add(serverPlayer);
|
|
||||||
this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer);
|
|
||||||
this.broadcastAll(new ClientboundPlayerInfoPacket(
|
|
||||||
ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
|
||||||
new ServerPlayer[] {serverPlayer}
|
|
||||||
));
|
|
||||||
|
|
||||||
for (ServerPlayer player : this.players) {
|
|
||||||
serverPlayer.connection.send(new ClientboundPlayerInfoPacket(
|
|
||||||
ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
|
||||||
new ServerPlayer[] {(ServerPlayer) player}
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
serverLevel3.addNewPlayer(serverPlayer);
|
|
||||||
this.server.getCustomBossEvents().onPlayerConnect(serverPlayer);
|
|
||||||
this.sendLevelInfo(serverPlayer, serverLevel3);
|
|
||||||
if (!this.server.getResourcePack().isEmpty()) {
|
|
||||||
serverPlayer.sendTexturePack(
|
|
||||||
this.server.getResourcePack(),
|
|
||||||
this.server.getResourcePackHash(),
|
|
||||||
this.server.isResourcePackRequired(),
|
|
||||||
this.server.getResourcePackPrompt()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (MobEffectInstance statusEffectInstance : serverPlayer.getActiveEffects()) {
|
|
||||||
serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(
|
|
||||||
serverPlayer.getId(),
|
|
||||||
statusEffectInstance
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) {
|
|
||||||
CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle");
|
|
||||||
Entity entity = EntityType.loadEntityRecursive(
|
|
||||||
compoundTag2.getCompound("Entity"),
|
|
||||||
serverLevel3,
|
|
||||||
(vehicle) -> {
|
|
||||||
return !serverLevel3.addWithUUID(vehicle) ? null : vehicle;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (entity != null) {
|
|
||||||
UUID uUID2;
|
|
||||||
if (compoundTag2.hasUUID("Attach")) {
|
|
||||||
uUID2 = compoundTag2.getUUID("Attach");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uUID2 = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterator<?> var21;
|
|
||||||
Entity entity3;
|
|
||||||
if (entity.getUUID().equals(uUID2)) {
|
|
||||||
serverPlayer.startRiding(entity, true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var21 = entity.getIndirectPassengers().iterator();
|
|
||||||
|
|
||||||
while (var21.hasNext()) {
|
|
||||||
entity3 = (Entity) var21.next();
|
|
||||||
if (entity3.getUUID().equals(uUID2)) {
|
|
||||||
serverPlayer.startRiding(entity3, true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!serverPlayer.isPassenger()) {
|
|
||||||
LOGGER.warn("Couldn't reattach entity to player");
|
|
||||||
entity.discard();
|
|
||||||
var21 = entity.getIndirectPassengers().iterator();
|
|
||||||
|
|
||||||
while (var21.hasNext()) {
|
|
||||||
entity3 = (Entity) var21.next();
|
|
||||||
entity3.discard();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serverPlayer.initInventoryMenu();
|
|
||||||
info.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public CompoundTag load(ServerPlayer player) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Shadow
|
|
||||||
// private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public void sendPlayerPermissionLevel(ServerPlayer player) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public int getPlayerCount() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public int getMaxPlayers() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public MinecraftServer getServer() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public void broadcastMessage(Component message, ChatType type, UUID senderUuid) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public void broadcastAll(Packet<?> packet) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public void sendLevelInfo(ServerPlayer player, ServerLevel world) {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -125,7 +125,7 @@
|
||||||
"block.betterend.dense_vine": "Dense Vine",
|
"block.betterend.dense_vine": "Dense Vine",
|
||||||
"block.betterend.bubble_coral": "Bubble Coral",
|
"block.betterend.bubble_coral": "Bubble Coral",
|
||||||
"block.betterend.aurora_crystal": "Aurora Crystal",
|
"block.betterend.aurora_crystal": "Aurora Crystal",
|
||||||
"item.betterend.crystal_shards": "Crystal Shards",
|
"item.betterend.crystal_shards": "Aurora Crystal Shards",
|
||||||
|
|
||||||
"block.betterend.pythadendron_sapling": "Pythadendron Sapling",
|
"block.betterend.pythadendron_sapling": "Pythadendron Sapling",
|
||||||
"block.betterend.pythadendron_bark": "Pythadendron Bark",
|
"block.betterend.pythadendron_bark": "Pythadendron Bark",
|
||||||
|
|
|
@ -125,7 +125,7 @@
|
||||||
"block.betterend.dense_vine": "Плотная лоза",
|
"block.betterend.dense_vine": "Плотная лоза",
|
||||||
"block.betterend.bubble_coral": "Пузырчатый коралл",
|
"block.betterend.bubble_coral": "Пузырчатый коралл",
|
||||||
"block.betterend.aurora_crystal": "Кристалл авроры",
|
"block.betterend.aurora_crystal": "Кристалл авроры",
|
||||||
"item.betterend.crystal_shards": "Осколки кристаллов",
|
"item.betterend.crystal_shards": "Осколки кристаллов авроры",
|
||||||
|
|
||||||
"block.betterend.pythadendron_sapling": "Саженец пифадендрона",
|
"block.betterend.pythadendron_sapling": "Саженец пифадендрона",
|
||||||
"block.betterend.pythadendron_bark": "Кора пифадендрона",
|
"block.betterend.pythadendron_bark": "Кора пифадендрона",
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
"ServerPlayerMixin",
|
"ServerPlayerMixin",
|
||||||
"SpikeFeatureMixin",
|
"SpikeFeatureMixin",
|
||||||
"ServerLevelMixin",
|
"ServerLevelMixin",
|
||||||
"PlayerListMixin",
|
|
||||||
"AnvilMenuMixin",
|
"AnvilMenuMixin",
|
||||||
"EnderManMixin",
|
"EnderManMixin",
|
||||||
"EndSpikeMixin",
|
"EndSpikeMixin",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue