Level biome source fix (WIP)

This commit is contained in:
paulevsGitch 2021-08-10 14:39:34 +03:00
parent 708c4d6fa2
commit 8bea55a8d2
6 changed files with 27 additions and 340 deletions

View file

@ -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;
};
}*/
}
} }

View file

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

View file

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

View file

@ -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",

View file

@ -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": "Кора пифадендрона",

View file

@ -26,7 +26,6 @@
"ServerPlayerMixin", "ServerPlayerMixin",
"SpikeFeatureMixin", "SpikeFeatureMixin",
"ServerLevelMixin", "ServerLevelMixin",
"PlayerListMixin",
"AnvilMenuMixin", "AnvilMenuMixin",
"EnderManMixin", "EnderManMixin",
"EndSpikeMixin", "EndSpikeMixin",