ModPlayerList.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package me.km.overrides;
  2. import com.google.common.collect.Lists;
  3. import com.mojang.authlib.GameProfile;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Optional;
  7. import java.util.UUID;
  8. import me.km.Server;
  9. import me.km.utils.ReflectionUtils;
  10. import net.minecraft.block.BlockState;
  11. import net.minecraft.block.Blocks;
  12. import net.minecraft.entity.player.PlayerEntity;
  13. import net.minecraft.entity.player.ServerPlayerEntity;
  14. import net.minecraft.network.play.server.SChangeGameStatePacket;
  15. import net.minecraft.network.play.server.SPlaySoundEffectPacket;
  16. import net.minecraft.network.play.server.SRespawnPacket;
  17. import net.minecraft.network.play.server.SServerDifficultyPacket;
  18. import net.minecraft.network.play.server.SSetExperiencePacket;
  19. import net.minecraft.network.play.server.SWorldSpawnChangedPacket;
  20. import net.minecraft.server.dedicated.DedicatedPlayerList;
  21. import net.minecraft.server.dedicated.DedicatedServer;
  22. import net.minecraft.server.management.DemoPlayerInteractionManager;
  23. import net.minecraft.server.management.PlayerInteractionManager;
  24. import net.minecraft.server.management.PlayerList;
  25. import net.minecraft.tags.BlockTags;
  26. import net.minecraft.util.SoundCategory;
  27. import net.minecraft.util.SoundEvents;
  28. import net.minecraft.util.math.BlockPos;
  29. import net.minecraft.util.math.MathHelper;
  30. import net.minecraft.util.math.vector.Vector3d;
  31. import net.minecraft.util.registry.DynamicRegistries;
  32. import net.minecraft.util.text.ChatType;
  33. import net.minecraft.util.text.ITextComponent;
  34. import net.minecraft.util.text.TranslationTextComponent;
  35. import net.minecraft.world.IWorld;
  36. import net.minecraft.world.biome.BiomeManager;
  37. import net.minecraft.world.server.ServerWorld;
  38. import net.minecraft.world.storage.IWorldInfo;
  39. import net.minecraft.world.storage.PlayerData;
  40. public final class ModPlayerList extends DedicatedPlayerList {
  41. private final DedicatedServer server;
  42. private final List<ServerPlayerEntity> players;
  43. private final Map<UUID, ServerPlayerEntity> uuidToPlayerMap;
  44. public ModPlayerList(DedicatedServer server, DynamicRegistries.Impl registries, PlayerData pd) {
  45. super(server, registries, pd);
  46. this.server = server;
  47. this.players = getPlayers();
  48. this.uuidToPlayerMap = ReflectionUtils.getFieldValue(Map.class, PlayerList.class, this, "field_177454_f");
  49. }
  50. @Override
  51. public ServerPlayerEntity createPlayerForUser(GameProfile profile) {
  52. UUID uuid = PlayerEntity.getUUID(profile);
  53. List<ServerPlayerEntity> list = Lists.newArrayList();
  54. for(int i = 0; i < this.players.size(); ++i) {
  55. ServerPlayerEntity serverplayerentity = this.players.get(i);
  56. if(serverplayerentity.getUniqueID().equals(uuid)) {
  57. list.add(serverplayerentity);
  58. }
  59. }
  60. ServerPlayerEntity p = this.uuidToPlayerMap.get(profile.getId());
  61. if(p != null && !list.contains(p)) {
  62. list.add(p);
  63. }
  64. for(ServerPlayerEntity serverplayerentity1 : list) {
  65. serverplayerentity1.connection.disconnect(new TranslationTextComponent("multiplayer.disconnect.duplicate_login"));
  66. }
  67. ServerWorld w = this.server.func_241755_D_();
  68. PlayerInteractionManager manager;
  69. if(this.server.isDemo()) {
  70. manager = new DemoPlayerInteractionManager(w);
  71. } else {
  72. manager = new PlayerInteractionManager(w);
  73. }
  74. return new ModEntityPlayerMP(this.server, w, profile, manager);
  75. }
  76. @Override
  77. public ServerPlayerEntity func_232644_a_(ServerPlayerEntity pIn, boolean p_232644_2_) {
  78. Server.scriptEvents.onPlayerPreRespawn(pIn);
  79. this.removePlayer(pIn);
  80. pIn.getServerWorld().removePlayer(pIn, true); // Forge: keep data until copyFrom called
  81. BlockPos blockpos = pIn.func_241140_K_();
  82. float f = pIn.func_242109_L();
  83. boolean flag = pIn.func_241142_M_();
  84. ServerWorld serverworld = server.getWorld(pIn.func_241141_L_());
  85. Optional<Vector3d> optional;
  86. if(serverworld != null && blockpos != null) {
  87. optional = PlayerEntity.func_242374_a(serverworld, blockpos, f, flag, p_232644_2_);
  88. } else {
  89. optional = Optional.empty();
  90. }
  91. ServerWorld w = serverworld != null && optional.isPresent() ? serverworld : server.func_241755_D_();
  92. PlayerInteractionManager manager;
  93. if(this.server.isDemo()) {
  94. manager = new DemoPlayerInteractionManager(w);
  95. } else {
  96. manager = new PlayerInteractionManager(w);
  97. }
  98. ServerPlayerEntity p = new ModEntityPlayerMP(server, w, pIn.getGameProfile(), manager, (ModEntityPlayerMP) pIn);
  99. p.connection = pIn.connection;
  100. p.copyFrom(pIn, p_232644_2_);
  101. pIn.remove(false); // Forge: clone event had a chance to see old data, now discard it
  102. p.setEntityId(pIn.getEntityId());
  103. p.setPrimaryHand(pIn.getPrimaryHand());
  104. for(String s : pIn.getTags()) {
  105. p.addTag(s);
  106. }
  107. this.setPlayerGameTypeBasedOnOther(p, pIn, w);
  108. boolean flag2 = false;
  109. if(optional.isPresent()) {
  110. BlockState blockstate = w.getBlockState(blockpos);
  111. boolean flag1 = blockstate.isIn(Blocks.RESPAWN_ANCHOR);
  112. Vector3d vector3d = optional.get();
  113. float f1;
  114. if(!blockstate.isIn(BlockTags.BEDS) && !flag1) {
  115. f1 = f;
  116. } else {
  117. Vector3d vector3d1 = Vector3d.copyCenteredHorizontally(blockpos).subtract(vector3d).normalize();
  118. f1 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vector3d1.z, vector3d1.x) * (double) (180F / (float) Math.PI) - 90.0D);
  119. }
  120. p.setLocationAndAngles(vector3d.x, vector3d.y, vector3d.z, f1, 0.0F);
  121. p.func_242111_a(w.getDimensionKey(), blockpos, f, flag, false);
  122. flag2 = !p_232644_2_ && flag1;
  123. } else if(blockpos != null) {
  124. p.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241764_a_, 0.0F));
  125. }
  126. while(!w.hasNoCollisions(p) && p.getPosY() < 256.0D) {
  127. p.setPosition(p.getPosX(), p.getPosY() + 1.0D, p.getPosZ());
  128. }
  129. IWorldInfo iworldinfo = p.world.getWorldInfo();
  130. p.connection.sendPacket(new SRespawnPacket(p.world.getDimensionType(), p.world.getDimensionKey(), BiomeManager.getHashedSeed(p.getServerWorld().getSeed()), p.interactionManager.getGameType(), p.interactionManager.func_241815_c_(), p.getServerWorld().isDebug(), p.getServerWorld().func_241109_A_(), p_232644_2_));
  131. p.connection.setPlayerLocation(p.getPosX(), p.getPosY(), p.getPosZ(), p.rotationYaw, p.rotationPitch);
  132. p.connection.sendPacket(new SWorldSpawnChangedPacket(w.getSpawnPoint(), w.func_242107_v()));
  133. p.connection.sendPacket(new SServerDifficultyPacket(iworldinfo.getDifficulty(), iworldinfo.isDifficultyLocked()));
  134. p.connection.sendPacket(new SSetExperiencePacket(p.experience, p.experienceTotal, p.experienceLevel));
  135. this.sendWorldInfo(p, w);
  136. this.updatePermissionLevel(p);
  137. w.addRespawnedPlayer(p);
  138. this.addPlayer(p);
  139. this.uuidToPlayerMap.put(p.getUniqueID(), p);
  140. p.addSelfToInternalCraftingInventory();
  141. p.setHealth(p.getHealth());
  142. net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerRespawnEvent(p, p_232644_2_);
  143. if(flag2) {
  144. p.connection.sendPacket(new SPlaySoundEffectPacket(SoundEvents.BLOCK_RESPAWN_ANCHOR_DEPLETE, SoundCategory.BLOCKS, (double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ(), 1.0F, 1.0F));
  145. }
  146. return p;
  147. }
  148. private void setPlayerGameTypeBasedOnOther(ServerPlayerEntity target, ServerPlayerEntity source, IWorld w) {
  149. ReflectionUtils.setPlayerGameTypeBasedOnOther(this, target, source, w);
  150. }
  151. @Override
  152. public void func_232641_a_(ITextComponent message, ChatType chat, UUID uuid) {
  153. if(message instanceof TranslationTextComponent) {
  154. TranslationTextComponent translation = (TranslationTextComponent) message;
  155. switch(translation.getKey()) {
  156. case "multiplayer.player.left":
  157. case "multiplayer.player.joined":
  158. case "multiplayer.player.joined.renamed":
  159. return;
  160. }
  161. }
  162. super.func_232641_a_(message, chat, uuid);
  163. }
  164. }