Fixed PlayerListMixin

This commit is contained in:
Frank Bauer 2021-06-24 14:47:23 +02:00
parent f6cbb15917
commit 4bf09362be

View file

@ -1,9 +1,6 @@
package ru.betterend.mixin.common; package ru.betterend.mixin.common;
import java.util.Iterator; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -84,141 +81,153 @@ public class PlayerListMixin {
private Map<UUID, ServerPlayer> playersByUUID; private Map<UUID, ServerPlayer> playersByUUID;
@Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true)
public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { public void be_placeNewPlayer(Connection connection, ServerPlayer serverPlayer, CallbackInfo info) {
if (GeneratorOptions.swapOverworldToEnd()) { if (GeneratorOptions.swapOverworldToEnd()) {
GameProfile gameProfile = player.getGameProfile(); GameProfile gameProfile = serverPlayer.getGameProfile();
GameProfileCache userCache = this.server.getProfileCache(); GameProfileCache userCache = this.server.getProfileCache();
GameProfile gameProfile2 = userCache.get(gameProfile.getId()); GameProfile gameProfile2 = userCache.get(gameProfile.getId());
String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName();
userCache.add(gameProfile); userCache.add(gameProfile);
CompoundTag compoundTag = this.load(player); CompoundTag compoundTag = this.load(serverPlayer);
ResourceKey<Level> var23; ResourceKey<Level> var23;
if (compoundTag != null) { if (compoundTag != null) {
DataResult<ResourceKey<Level>> var10000 = DimensionType.parseLegacy(new Dynamic<Tag>(NbtOps.INSTANCE, compoundTag.get("Dimension"))); DataResult<ResourceKey<Level>> var10000 = DimensionType.parseLegacy(new Dynamic<Tag>(NbtOps.INSTANCE, compoundTag.get("Dimension")));
Logger var10001 = LOGGER; Logger var10001 = LOGGER;
var10001.getClass(); Objects.requireNonNull(var10001);
var23 = (ResourceKey<Level>) var10000.resultOrPartial(var10001::error).orElse(Level.END); var23 = (ResourceKey<Level>) var10000.resultOrPartial(var10001::error).orElse(Level.END);
} } else {
else {
var23 = Level.END; var23 = Level.END;
} }
ResourceKey<Level> registryKey = var23; ResourceKey<Level> registryKey = var23;
ServerLevel serverWorld = this.server.getLevel(registryKey); ServerLevel serverLevel = this.server.getLevel(registryKey);
ServerLevel serverWorld3; ServerLevel serverLevel3;
if (serverWorld == null) { if (serverLevel == null) {
LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey);
serverWorld3 = this.server.overworld(); serverLevel3 = this.server.overworld();
} } else {
else { serverLevel3 = serverLevel;
serverWorld3 = serverWorld;
} }
player.setLevel(serverWorld3); serverPlayer.setLevel(serverLevel3);
player.gameMode.setLevel((ServerLevel) player.level); //serverPlayer.gameMode.setLevel((ServerLevel) serverPlayer.level);
String string2 = "local"; String string2 = "local";
if (connection.getRemoteAddress() != null) { if (connection.getRemoteAddress() != null) {
string2 = connection.getRemoteAddress().toString(); string2 = connection.getRemoteAddress().toString();
} }
LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", serverPlayer.getName().getString(), string2,
LevelData worldProperties = serverWorld3.getLevelData(); serverPlayer.getId(), serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ());
this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); LevelData worldProperties = serverLevel3.getLevelData();
ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); serverPlayer.loadGameTypes(compoundTag);
GameRules gameRules = serverWorld3.getGameRules(); //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 bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN);
boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO);
serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), serverPlayNetworkHandler.send(new ClientboundLoginPacket(serverPlayer.getId(),
worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, serverPlayer.gameMode.getGameModeForPlayer(), serverPlayer.gameMode.getPreviousGameModeForPlayer(),
serverWorld3.isDebug(), serverWorld3.isFlat())); BiomeManager.obfuscateSeed(serverLevel3.getSeed()), worldProperties.isHardcore(),
serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); this.server.levelKeys(), this.registryHolder, serverLevel3.dimensionType(), serverLevel3.dimension(),
serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); this.getMaxPlayers(), this.viewDistance, bl2, !bl, serverLevel3.isDebug(), serverLevel3.isFlat()));
serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND,
serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName())));
serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); serverPlayNetworkHandler
serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); .send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked()));
this.sendPlayerPermissionLevel(player); serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(serverPlayer.getAbilities()));
player.getStats().markAllDirty(); serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(serverPlayer.getInventory().selected));
player.getRecipeBook().sendInitialRecipeBook(player); serverPlayNetworkHandler
this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); .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(); this.server.invalidateStatus();
TranslatableComponent mutableText2; TranslatableComponent mutableText2;
if (player.getGameProfile().getName().equalsIgnoreCase(string)) { if (serverPlayer.getGameProfile().getName().equalsIgnoreCase(string)) {
mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); mutableText2 = new TranslatableComponent("multiplayer.player.joined",
} new Object[] { serverPlayer.getDisplayName() });
else { } else {
mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed",
new Object[] { serverPlayer.getDisplayName(), string });
} }
this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID);
serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); serverPlayNetworkHandler.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(),
this.players.add(player); serverPlayer.getYRot(), serverPlayer.getXRot());
this.playersByUUID.put(player.getUUID(), player); this.players.add(serverPlayer);
this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer);
this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
new ServerPlayer[] { serverPlayer }));
for (int i = 0; i < this.players.size(); ++i) { for (int i = 0; i < this.players.size(); ++i) {
player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
new ServerPlayer[] { (ServerPlayer) this.players.get(i) }));
} }
serverWorld3.addNewPlayer(player); serverLevel3.addNewPlayer(serverPlayer);
this.server.getCustomBossEvents().onPlayerConnect(player); this.server.getCustomBossEvents().onPlayerConnect(serverPlayer);
this.sendLevelInfo(player, serverWorld3); this.sendLevelInfo(serverPlayer, serverLevel3);
if (!this.server.getResourcePack().isEmpty()) { if (!this.server.getResourcePack().isEmpty()) {
player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); serverPlayer.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash(),
this.server.isResourcePackRequired(), this.server.getResourcePackPrompt());
} }
Iterator<?> var24 = player.getActiveEffects().iterator(); Iterator<?> var24 = serverPlayer.getActiveEffects().iterator();
while (var24.hasNext()) { while (var24.hasNext()) {
MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next();
serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); serverPlayNetworkHandler
.send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance));
} }
if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) {
CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle");
Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverLevel3,
return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; (vehicle) -> {
}); return !serverLevel3.addWithUUID(vehicle) ? null : vehicle;
});
if (entity != null) { if (entity != null) {
UUID uUID2; UUID uUID2;
if (compoundTag2.hasUUID("Attach")) { if (compoundTag2.hasUUID("Attach")) {
uUID2 = compoundTag2.getUUID("Attach"); uUID2 = compoundTag2.getUUID("Attach");
} } else {
else {
uUID2 = null; uUID2 = null;
} }
Iterator<?> var21; Iterator<?> var21;
Entity entity3; Entity entity3;
if (entity.getUUID().equals(uUID2)) { if (entity.getUUID().equals(uUID2)) {
player.startRiding(entity, true); serverPlayer.startRiding(entity, true);
} } else {
else {
var21 = entity.getIndirectPassengers().iterator(); var21 = entity.getIndirectPassengers().iterator();
while (var21.hasNext()) { while (var21.hasNext()) {
entity3 = (Entity) var21.next(); entity3 = (Entity) var21.next();
if (entity3.getUUID().equals(uUID2)) { if (entity3.getUUID().equals(uUID2)) {
player.startRiding(entity3, true); serverPlayer.startRiding(entity3, true);
break; break;
} }
} }
} }
if (!player.isPassenger()) { if (!serverPlayer.isPassenger()) {
LOGGER.warn("Couldn't reattach entity to player"); LOGGER.warn("Couldn't reattach entity to player");
serverWorld3.despawn(entity); entity.discard();
var21 = entity.getIndirectPassengers().iterator(); var21 = entity.getIndirectPassengers().iterator();
while (var21.hasNext()) { while (var21.hasNext()) {
entity3 = (Entity) var21.next(); entity3 = (Entity) var21.next();
serverWorld3.despawn(entity3); entity3.discard();
} }
} }
} }
} }
player.initMenu(); serverPlayer.initInventoryMenu();
info.cancel(); info.cancel();
} }
} }
@ -228,8 +237,8 @@ public class PlayerListMixin {
return null; return null;
} }
@Shadow // @Shadow
private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} // private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {}
@Shadow @Shadow
public void sendPlayerPermissionLevel(ServerPlayer player) {} public void sendPlayerPermissionLevel(ServerPlayer player) {}
@ -239,6 +248,9 @@ public class PlayerListMixin {
return 0; return 0;
} }
@Shadow
public int getMaxPlayers() { return 0; }
@Shadow @Shadow
public MinecraftServer getServer() { public MinecraftServer getServer() {
return null; return null;