ModPlayerList.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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.biome.BiomeManager;
  36. import net.minecraft.world.server.ServerWorld;
  37. import net.minecraft.world.storage.IWorldInfo;
  38. import net.minecraft.world.storage.PlayerData;
  39. public final class ModPlayerList extends DedicatedPlayerList {
  40. private final DedicatedServer server;
  41. private final List<ServerPlayerEntity> players;
  42. private final Map<UUID, ServerPlayerEntity> uuidToPlayerMap;
  43. @SuppressWarnings("unchecked")
  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 =
  49. ReflectionUtils.getFieldValue(Map.class, PlayerList.class, this, "field_177454_f");
  50. }
  51. @Override
  52. public ServerPlayerEntity getPlayerForLogin(GameProfile profile) {
  53. UUID uuid = PlayerEntity.createPlayerUUID(profile);
  54. List<ServerPlayerEntity> list = Lists.newArrayList();
  55. for(int i = 0; i < this.players.size(); ++i) {
  56. ServerPlayerEntity serverplayerentity = this.players.get(i);
  57. if(serverplayerentity.getUUID().equals(uuid)) {
  58. list.add(serverplayerentity);
  59. }
  60. }
  61. ServerPlayerEntity p = this.uuidToPlayerMap.get(profile.getId());
  62. if(p != null && !list.contains(p)) {
  63. list.add(p);
  64. }
  65. for(ServerPlayerEntity serverplayerentity1 : list) {
  66. serverplayerentity1.connection.disconnect(
  67. new TranslationTextComponent("multiplayer.disconnect.duplicate_login"));
  68. }
  69. ServerWorld w = this.server.overworld();
  70. PlayerInteractionManager manager;
  71. if(this.server.isDemo()) {
  72. manager = new DemoPlayerInteractionManager(w);
  73. } else {
  74. manager = new PlayerInteractionManager(w);
  75. }
  76. return new ModEntityPlayerMP(this.server, w, profile, manager);
  77. }
  78. @Override
  79. public ServerPlayerEntity respawn(ServerPlayerEntity pIn, boolean p_232644_2_) {
  80. Server.scriptEvents.onPlayerPreRespawn(pIn);
  81. this.removePlayer(pIn);
  82. pIn.getLevel().removePlayer(pIn, true); // Forge: keep data until copyFrom called
  83. BlockPos blockpos = pIn.getRespawnPosition();
  84. float f = pIn.getRespawnAngle();
  85. boolean flag = pIn.isRespawnForced();
  86. ServerWorld serverworld = server.getLevel(pIn.getRespawnDimension());
  87. Optional<Vector3d> optional;
  88. if(serverworld != null && blockpos != null) {
  89. optional = PlayerEntity.findRespawnPositionAndUseSpawnBlock(serverworld, blockpos, f,
  90. flag, p_232644_2_);
  91. } else {
  92. optional = Optional.empty();
  93. }
  94. ServerWorld w =
  95. serverworld != null && optional.isPresent() ? serverworld : server.overworld();
  96. PlayerInteractionManager manager;
  97. if(this.server.isDemo()) {
  98. manager = new DemoPlayerInteractionManager(w);
  99. } else {
  100. manager = new PlayerInteractionManager(w);
  101. }
  102. ServerPlayerEntity p = new ModEntityPlayerMP(server, w, pIn.getGameProfile(), manager,
  103. (ModEntityPlayerMP) pIn);
  104. p.connection = pIn.connection;
  105. p.restoreFrom(pIn, p_232644_2_);
  106. pIn.remove(false); // Forge: clone event had a chance to see old data, now discard it
  107. p.setId(pIn.getId());
  108. p.setMainArm(pIn.getMainArm());
  109. for(String s : pIn.getTags()) {
  110. p.addTag(s);
  111. }
  112. this.setPlayerGameTypeBasedOnOther(p, pIn, w);
  113. boolean flag2 = false;
  114. if(optional.isPresent()) {
  115. BlockState blockstate = w.getBlockState(blockpos);
  116. boolean flag1 = blockstate.is(Blocks.RESPAWN_ANCHOR);
  117. Vector3d vector3d = optional.get();
  118. float f1;
  119. if(!blockstate.is(BlockTags.BEDS) && !flag1) {
  120. f1 = f;
  121. } else {
  122. Vector3d vector3d1 =
  123. Vector3d.atBottomCenterOf(blockpos).subtract(vector3d).normalize();
  124. f1 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vector3d1.z, vector3d1.x)
  125. * (double) (180F / (float) Math.PI) - 90.0D);
  126. }
  127. p.moveTo(vector3d.x, vector3d.y, vector3d.z, f1, 0.0F);
  128. p.setRespawnPosition(w.dimension(), blockpos, f, flag, false);
  129. flag2 = !p_232644_2_ && flag1;
  130. } else if(blockpos != null) {
  131. p.connection.send(new SChangeGameStatePacket(
  132. SChangeGameStatePacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F));
  133. }
  134. while(!w.noCollision(p) && p.getY() < 256.0D) {
  135. p.setPos(p.getX(), p.getY() + 1.0D, p.getZ());
  136. }
  137. IWorldInfo iworldinfo = p.level.getLevelData();
  138. p.connection.send(new SRespawnPacket(p.level.dimensionType(), p.level.dimension(),
  139. BiomeManager.obfuscateSeed(p.getLevel().getSeed()),
  140. p.gameMode.getGameModeForPlayer(), p.gameMode.getPreviousGameModeForPlayer(),
  141. p.getLevel().isDebug(), p.getLevel().isFlat(), p_232644_2_));
  142. p.connection.teleport(p.getX(), p.getY(), p.getZ(), p.yRot, p.xRot);
  143. p.connection
  144. .send(new SWorldSpawnChangedPacket(w.getSharedSpawnPos(), w.getSharedSpawnAngle()));
  145. p.connection.send(new SServerDifficultyPacket(iworldinfo.getDifficulty(),
  146. iworldinfo.isDifficultyLocked()));
  147. p.connection.send(new SSetExperiencePacket(p.experienceProgress, p.totalExperience,
  148. p.experienceLevel));
  149. this.sendLevelInfo(p, w);
  150. this.sendPlayerPermissionLevel(p);
  151. w.addRespawnedPlayer(p);
  152. this.addPlayer(p);
  153. this.uuidToPlayerMap.put(p.getUUID(), p);
  154. p.initMenu();
  155. p.setHealth(p.getHealth());
  156. net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerRespawnEvent(p, p_232644_2_);
  157. if(flag2) {
  158. p.connection.send(new SPlaySoundEffectPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE,
  159. SoundCategory.BLOCKS, (double) blockpos.getX(), (double) blockpos.getY(),
  160. (double) blockpos.getZ(), 1.0F, 1.0F));
  161. }
  162. return p;
  163. }
  164. private void setPlayerGameTypeBasedOnOther(ServerPlayerEntity target, ServerPlayerEntity source,
  165. ServerWorld w) {
  166. ReflectionUtils.setPlayerGameTypeBasedOnOther(this, target, source, w);
  167. }
  168. @Override
  169. public void broadcastMessage(ITextComponent message, ChatType chat, UUID uuid) {
  170. if(message instanceof TranslationTextComponent) {
  171. TranslationTextComponent translation = (TranslationTextComponent) message;
  172. switch(translation.getKey()) {
  173. case "multiplayer.player.left":
  174. case "multiplayer.player.joined":
  175. case "multiplayer.player.joined.renamed":
  176. return;
  177. }
  178. }
  179. super.broadcastMessage(message, chat, uuid);
  180. }
  181. }