123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- package me.km.overrides;
- import com.google.common.collect.Lists;
- import com.mojang.authlib.GameProfile;
- import java.util.List;
- import java.util.Map;
- import java.util.Optional;
- import java.util.UUID;
- import me.km.Server;
- import me.km.utils.ReflectionUtils;
- import net.minecraft.block.BlockState;
- import net.minecraft.block.Blocks;
- import net.minecraft.entity.player.PlayerEntity;
- import net.minecraft.entity.player.ServerPlayerEntity;
- import net.minecraft.network.play.server.SChangeGameStatePacket;
- import net.minecraft.network.play.server.SPlaySoundEffectPacket;
- import net.minecraft.network.play.server.SRespawnPacket;
- import net.minecraft.network.play.server.SServerDifficultyPacket;
- import net.minecraft.network.play.server.SSetExperiencePacket;
- import net.minecraft.network.play.server.SWorldSpawnChangedPacket;
- import net.minecraft.server.dedicated.DedicatedPlayerList;
- import net.minecraft.server.dedicated.DedicatedServer;
- import net.minecraft.server.management.DemoPlayerInteractionManager;
- import net.minecraft.server.management.PlayerInteractionManager;
- import net.minecraft.server.management.PlayerList;
- import net.minecraft.tags.BlockTags;
- import net.minecraft.util.SoundCategory;
- import net.minecraft.util.SoundEvents;
- import net.minecraft.util.math.BlockPos;
- import net.minecraft.util.math.MathHelper;
- import net.minecraft.util.math.vector.Vector3d;
- import net.minecraft.util.registry.DynamicRegistries;
- import net.minecraft.util.text.ChatType;
- import net.minecraft.util.text.ITextComponent;
- import net.minecraft.util.text.TranslationTextComponent;
- import net.minecraft.world.biome.BiomeManager;
- import net.minecraft.world.server.ServerWorld;
- import net.minecraft.world.storage.IWorldInfo;
- import net.minecraft.world.storage.PlayerData;
- public final class ModPlayerList extends DedicatedPlayerList {
- private final DedicatedServer server;
- private final List<ServerPlayerEntity> players;
- private final Map<UUID, ServerPlayerEntity> uuidToPlayerMap;
- @SuppressWarnings("unchecked")
- public ModPlayerList(DedicatedServer server, DynamicRegistries.Impl registries, PlayerData pd) {
- super(server, registries, pd);
- this.server = server;
- this.players = getPlayers();
- this.uuidToPlayerMap =
- ReflectionUtils.getFieldValue(Map.class, PlayerList.class, this, "field_177454_f");
- }
- @Override
- public ServerPlayerEntity getPlayerForLogin(GameProfile profile) {
- UUID uuid = PlayerEntity.createPlayerUUID(profile);
- List<ServerPlayerEntity> list = Lists.newArrayList();
- for(int i = 0; i < this.players.size(); ++i) {
- ServerPlayerEntity serverplayerentity = this.players.get(i);
- if(serverplayerentity.getUUID().equals(uuid)) {
- list.add(serverplayerentity);
- }
- }
- ServerPlayerEntity p = this.uuidToPlayerMap.get(profile.getId());
- if(p != null && !list.contains(p)) {
- list.add(p);
- }
- for(ServerPlayerEntity serverplayerentity1 : list) {
- serverplayerentity1.connection.disconnect(
- new TranslationTextComponent("multiplayer.disconnect.duplicate_login"));
- }
- ServerWorld w = this.server.overworld();
- PlayerInteractionManager manager;
- if(this.server.isDemo()) {
- manager = new DemoPlayerInteractionManager(w);
- } else {
- manager = new PlayerInteractionManager(w);
- }
- return new ModEntityPlayerMP(this.server, w, profile, manager);
- }
- @Override
- public ServerPlayerEntity respawn(ServerPlayerEntity pIn, boolean p_232644_2_) {
- Server.scriptEvents.onPlayerPreRespawn(pIn);
- this.removePlayer(pIn);
- pIn.getLevel().removePlayer(pIn, true); // Forge: keep data until copyFrom called
- BlockPos blockpos = pIn.getRespawnPosition();
- float f = pIn.getRespawnAngle();
- boolean flag = pIn.isRespawnForced();
- ServerWorld serverworld = server.getLevel(pIn.getRespawnDimension());
- Optional<Vector3d> optional;
- if(serverworld != null && blockpos != null) {
- optional = PlayerEntity.findRespawnPositionAndUseSpawnBlock(serverworld, blockpos, f,
- flag, p_232644_2_);
- } else {
- optional = Optional.empty();
- }
- ServerWorld w =
- serverworld != null && optional.isPresent() ? serverworld : server.overworld();
- PlayerInteractionManager manager;
- if(this.server.isDemo()) {
- manager = new DemoPlayerInteractionManager(w);
- } else {
- manager = new PlayerInteractionManager(w);
- }
- ServerPlayerEntity p = new ModEntityPlayerMP(server, w, pIn.getGameProfile(), manager,
- (ModEntityPlayerMP) pIn);
- p.connection = pIn.connection;
- p.restoreFrom(pIn, p_232644_2_);
- pIn.remove(false); // Forge: clone event had a chance to see old data, now discard it
- p.setId(pIn.getId());
- p.setMainArm(pIn.getMainArm());
- for(String s : pIn.getTags()) {
- p.addTag(s);
- }
- this.setPlayerGameTypeBasedOnOther(p, pIn, w);
- boolean flag2 = false;
- if(optional.isPresent()) {
- BlockState blockstate = w.getBlockState(blockpos);
- boolean flag1 = blockstate.is(Blocks.RESPAWN_ANCHOR);
- Vector3d vector3d = optional.get();
- float f1;
- if(!blockstate.is(BlockTags.BEDS) && !flag1) {
- f1 = f;
- } else {
- Vector3d vector3d1 =
- Vector3d.atBottomCenterOf(blockpos).subtract(vector3d).normalize();
- f1 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vector3d1.z, vector3d1.x)
- * (double) (180F / (float) Math.PI) - 90.0D);
- }
- p.moveTo(vector3d.x, vector3d.y, vector3d.z, f1, 0.0F);
- p.setRespawnPosition(w.dimension(), blockpos, f, flag, false);
- flag2 = !p_232644_2_ && flag1;
- } else if(blockpos != null) {
- p.connection.send(new SChangeGameStatePacket(
- SChangeGameStatePacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F));
- }
- while(!w.noCollision(p) && p.getY() < 256.0D) {
- p.setPos(p.getX(), p.getY() + 1.0D, p.getZ());
- }
- IWorldInfo iworldinfo = p.level.getLevelData();
- p.connection.send(new SRespawnPacket(p.level.dimensionType(), p.level.dimension(),
- BiomeManager.obfuscateSeed(p.getLevel().getSeed()),
- p.gameMode.getGameModeForPlayer(), p.gameMode.getPreviousGameModeForPlayer(),
- p.getLevel().isDebug(), p.getLevel().isFlat(), p_232644_2_));
- p.connection.teleport(p.getX(), p.getY(), p.getZ(), p.yRot, p.xRot);
- p.connection
- .send(new SWorldSpawnChangedPacket(w.getSharedSpawnPos(), w.getSharedSpawnAngle()));
- p.connection.send(new SServerDifficultyPacket(iworldinfo.getDifficulty(),
- iworldinfo.isDifficultyLocked()));
- p.connection.send(new SSetExperiencePacket(p.experienceProgress, p.totalExperience,
- p.experienceLevel));
- this.sendLevelInfo(p, w);
- this.sendPlayerPermissionLevel(p);
- w.addRespawnedPlayer(p);
- this.addPlayer(p);
- this.uuidToPlayerMap.put(p.getUUID(), p);
- p.initMenu();
- p.setHealth(p.getHealth());
- net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerRespawnEvent(p, p_232644_2_);
- if(flag2) {
- p.connection.send(new SPlaySoundEffectPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE,
- SoundCategory.BLOCKS, (double) blockpos.getX(), (double) blockpos.getY(),
- (double) blockpos.getZ(), 1.0F, 1.0F));
- }
- return p;
- }
- private void setPlayerGameTypeBasedOnOther(ServerPlayerEntity target, ServerPlayerEntity source,
- ServerWorld w) {
- ReflectionUtils.setPlayerGameTypeBasedOnOther(this, target, source, w);
- }
- @Override
- public void broadcastMessage(ITextComponent message, ChatType chat, UUID uuid) {
- if(message instanceof TranslationTextComponent) {
- TranslationTextComponent translation = (TranslationTextComponent) message;
- switch(translation.getKey()) {
- case "multiplayer.player.left":
- case "multiplayer.player.joined":
- case "multiplayer.player.joined.renamed":
- return;
- }
- }
- super.broadcastMessage(message, chat, uuid);
- }
- }
|