|
@@ -7,9 +7,7 @@ import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.Optional;
|
|
import java.util.UUID;
|
|
import java.util.UUID;
|
|
-import me.hammerle.snuviscript.code.ISnuviScheduler;
|
|
|
|
import me.km.Server;
|
|
import me.km.Server;
|
|
-import me.km.networking.ModPacketHandler;
|
|
|
|
import me.km.utils.ReflectionUtils;
|
|
import me.km.utils.ReflectionUtils;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityType;
|
|
import net.minecraft.entity.EntityType;
|
|
@@ -50,20 +48,18 @@ import net.minecraft.world.dimension.DimensionType;
|
|
import net.minecraft.world.storage.WorldInfo;
|
|
import net.minecraft.world.storage.WorldInfo;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
|
|
-public class ModPlayerList extends DedicatedPlayerList
|
|
+public final class ModPlayerList extends DedicatedPlayerList
|
|
{
|
|
{
|
|
private final DedicatedServer server;
|
|
private final DedicatedServer server;
|
|
private final List<ServerPlayerEntity> players;
|
|
private final List<ServerPlayerEntity> players;
|
|
private final Map<UUID, ServerPlayerEntity> uuidToPlayerMap;
|
|
private final Map<UUID, ServerPlayerEntity> uuidToPlayerMap;
|
|
- private final ISnuviScheduler scheduler;
|
|
|
|
|
|
|
|
- public ModPlayerList(DedicatedServer server, ISnuviScheduler scheduler)
|
|
+ public ModPlayerList(DedicatedServer server)
|
|
{
|
|
{
|
|
super(server);
|
|
super(server);
|
|
this.server = server;
|
|
this.server = server;
|
|
this.players = getPlayers();
|
|
this.players = getPlayers();
|
|
this.uuidToPlayerMap = ReflectionUtils.getFieldValue(Map.class, PlayerList.class, this, "field_177454_f");
|
|
this.uuidToPlayerMap = ReflectionUtils.getFieldValue(Map.class, PlayerList.class, this, "field_177454_f");
|
|
- this.scheduler = scheduler;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -71,41 +67,16 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
{
|
|
{
|
|
GameProfile profile = p.getGameProfile();
|
|
GameProfile profile = p.getGameProfile();
|
|
PlayerProfileCache cache = this.server.getPlayerProfileCache();
|
|
PlayerProfileCache cache = this.server.getPlayerProfileCache();
|
|
- GameProfile cachedProfile = cache.getProfileByUUID(profile.getId());
|
|
|
|
- String s = cachedProfile == null ? profile.getName() : cachedProfile.getName();
|
|
|
|
cache.addEntry(profile);
|
|
cache.addEntry(profile);
|
|
CompoundNBT compoundnbt = this.readPlayerDataFromFile(p);
|
|
CompoundNBT compoundnbt = this.readPlayerDataFromFile(p);
|
|
-
|
|
+
|
|
-
|
|
+ ServerWorld sw = this.server.getWorld(p.dimension);
|
|
- DimensionType type = p.dimension;
|
|
+ if (sw == null)
|
|
- boolean noSchedule = true;
|
|
|
|
- if(type == null || !type.isVanilla())
|
|
|
|
{
|
|
{
|
|
- ServerWorld overWorld = this.server.getWorld(DimensionType.OVERWORLD);
|
|
|
|
p.dimension = DimensionType.OVERWORLD;
|
|
p.dimension = DimensionType.OVERWORLD;
|
|
- if(type != null && this.server.getWorld(type) != null)
|
|
+ sw = this.server.getWorld(p.dimension);
|
|
- {
|
|
+ p.setPosition(sw.getWorldInfo().getSpawnX(), sw.getWorldInfo().getSpawnY(), sw.getWorldInfo().getSpawnZ());
|
|
- double x = p.posX;
|
|
|
|
- double y = p.posY;
|
|
|
|
- double z = p.posZ;
|
|
|
|
- float yaw = p.rotationYaw;
|
|
|
|
- float pitch = p.rotationPitch;
|
|
|
|
- noSchedule = false;
|
|
|
|
- scheduler.scheduleTask(() ->
|
|
|
|
- {
|
|
|
|
- ServerWorld ws = server.getWorld(type);
|
|
|
|
- if(ws != null)
|
|
|
|
- {
|
|
|
|
- p.teleport(ws, x, y, z, yaw, pitch);
|
|
|
|
- }
|
|
|
|
- net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerLoggedIn(p);
|
|
|
|
- }, 2);
|
|
|
|
- }
|
|
|
|
- WorldInfo wi = overWorld.getWorldInfo();
|
|
|
|
- p.setPosition(wi.getSpawnX(), wi.getSpawnY(), wi.getSpawnZ());
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
- ServerWorld sw = this.server.getWorld(p.dimension);
|
|
|
|
p.setWorld(sw);
|
|
p.setWorld(sw);
|
|
p.interactionManager.setWorld((ServerWorld) p.world);
|
|
p.interactionManager.setWorld((ServerWorld) p.world);
|
|
String s1 = "local";
|
|
String s1 = "local";
|
|
@@ -114,41 +85,42 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
s1 = netManager.getRemoteAddress().toString();
|
|
s1 = netManager.getRemoteAddress().toString();
|
|
}
|
|
}
|
|
|
|
|
|
- LogManager.getLogger().info("{}[{}] logged in with entity id {} at ({}, {}, {})", p.getName().getString(), s1, p.getEntityId(), p.posX, p.posY, p.posZ);
|
|
+ LogManager.getLogger().info("{}[{}] logged in with entity id {} at ({}, {}, {})", p.getName().getString(), s1, p.getEntityId(), p.getPosX(), p.getPosY(), p.getPosZ());
|
|
WorldInfo wi = sw.getWorldInfo();
|
|
WorldInfo wi = sw.getWorldInfo();
|
|
setPlayerGameTypeBasedOnOther(p, null, sw);
|
|
setPlayerGameTypeBasedOnOther(p, null, sw);
|
|
- ServerPlayNetHandler spnh = new ServerPlayNetHandler(this.server, netManager, p);
|
|
+ ServerPlayNetHandler spnh = new ServerPlayNetHandler(server, netManager, p);
|
|
- ModPacketHandler.syncDimensions(p);
|
|
|
|
net.minecraftforge.fml.network.NetworkHooks.sendMCRegistryPackets(netManager, "PLAY_TO_CLIENT");
|
|
net.minecraftforge.fml.network.NetworkHooks.sendMCRegistryPackets(netManager, "PLAY_TO_CLIENT");
|
|
- spnh.sendPacket(new SJoinGamePacket(p.getEntityId(), p.interactionManager.getGameType(), wi.isHardcore(), sw.dimension.getType(), this.getMaxPlayers(), wi.getGenerator(), getViewDistance(), sw.getGameRules().getBoolean(GameRules.REDUCED_DEBUG_INFO)));
|
|
+ net.minecraftforge.fml.network.NetworkHooks.sendDimensionDataPacket(netManager, p);
|
|
|
|
+ GameRules gamerules = sw.getGameRules();
|
|
|
|
+ spnh.sendPacket(new SJoinGamePacket(p.getEntityId(), p.interactionManager.getGameType(), WorldInfo.byHashing(wi.getSeed()), wi.isHardcore(), sw.dimension.getType(), this.getMaxPlayers(), wi.getGenerator(), getViewDistance(), gamerules.getBoolean(GameRules.REDUCED_DEBUG_INFO), !gamerules.getBoolean(GameRules.DO_IMMEDIATE_RESPAWN)));
|
|
spnh.sendPacket(new SCustomPayloadPlayPacket(SCustomPayloadPlayPacket.BRAND, (new PacketBuffer(Unpooled.buffer())).writeString(this.getServer().getServerModName())));
|
|
spnh.sendPacket(new SCustomPayloadPlayPacket(SCustomPayloadPlayPacket.BRAND, (new PacketBuffer(Unpooled.buffer())).writeString(this.getServer().getServerModName())));
|
|
spnh.sendPacket(new SServerDifficultyPacket(wi.getDifficulty(), wi.isDifficultyLocked()));
|
|
spnh.sendPacket(new SServerDifficultyPacket(wi.getDifficulty(), wi.isDifficultyLocked()));
|
|
spnh.sendPacket(new SPlayerAbilitiesPacket(p.abilities));
|
|
spnh.sendPacket(new SPlayerAbilitiesPacket(p.abilities));
|
|
spnh.sendPacket(new SHeldItemChangePacket(p.inventory.currentItem));
|
|
spnh.sendPacket(new SHeldItemChangePacket(p.inventory.currentItem));
|
|
- spnh.sendPacket(new SUpdateRecipesPacket(this.server.getRecipeManager().getRecipes()));
|
|
+ spnh.sendPacket(new SUpdateRecipesPacket(server.getRecipeManager().getRecipes()));
|
|
- spnh.sendPacket(new STagsListPacket(this.server.getNetworkTagManager()));
|
|
+ spnh.sendPacket(new STagsListPacket(server.getNetworkTagManager()));
|
|
this.updatePermissionLevel(p);
|
|
this.updatePermissionLevel(p);
|
|
p.getStats().markAllDirty();
|
|
p.getStats().markAllDirty();
|
|
p.getRecipeBook().init(p);
|
|
p.getRecipeBook().init(p);
|
|
this.sendScoreboard(sw.getScoreboard(), p);
|
|
this.sendScoreboard(sw.getScoreboard(), p);
|
|
this.server.refreshStatusNextTick();
|
|
this.server.refreshStatusNextTick();
|
|
|
|
|
|
- spnh.setPlayerLocation(p.posX, p.posY, p.posZ, p.rotationYaw, p.rotationPitch);
|
|
+ spnh.setPlayerLocation(p.getPosX(), p.getPosY(), p.getPosZ(), p.rotationYaw, p.rotationPitch);
|
|
this.addPlayer(p);
|
|
this.addPlayer(p);
|
|
this.uuidToPlayerMap.put(p.getUniqueID(), p);
|
|
this.uuidToPlayerMap.put(p.getUniqueID(), p);
|
|
this.sendPacketToAllPlayers(new SPlayerListItemPacket(SPlayerListItemPacket.Action.ADD_PLAYER, p));
|
|
this.sendPacketToAllPlayers(new SPlayerListItemPacket(SPlayerListItemPacket.Action.ADD_PLAYER, p));
|
|
|
|
|
|
- for(int i = 0; i < this.players.size(); ++i)
|
|
+ for(int i = 0; i < this.players.size(); i++)
|
|
{
|
|
{
|
|
- p.connection.sendPacket(new SPlayerListItemPacket(SPlayerListItemPacket.Action.ADD_PLAYER, this.players.get(i)));
|
|
+ p.connection.sendPacket(new SPlayerListItemPacket(SPlayerListItemPacket.Action.ADD_PLAYER, players.get(i)));
|
|
}
|
|
}
|
|
|
|
|
|
sw.addNewPlayer(p);
|
|
sw.addNewPlayer(p);
|
|
- this.server.getCustomBossEvents().onPlayerLogin(p);
|
|
+ server.getCustomBossEvents().onPlayerLogin(p);
|
|
- this.sendWorldInfo(p, sw);
|
|
+ sendWorldInfo(p, sw);
|
|
if(!this.server.getResourcePackUrl().isEmpty())
|
|
if(!this.server.getResourcePackUrl().isEmpty())
|
|
{
|
|
{
|
|
- p.loadResourcePack(this.server.getResourcePackUrl(), this.server.getResourcePackHash());
|
|
+ p.loadResourcePack(server.getResourcePackUrl(), server.getResourcePackHash());
|
|
}
|
|
}
|
|
|
|
|
|
for(EffectInstance effectinstance : p.getActivePotionEffects())
|
|
for(EffectInstance effectinstance : p.getActivePotionEffects())
|
|
@@ -186,7 +158,7 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
if(!p.isPassenger())
|
|
if(!p.isPassenger())
|
|
{
|
|
{
|
|
LogManager.getLogger().warn("Couldn't reattach entity to player");
|
|
LogManager.getLogger().warn("Couldn't reattach entity to player");
|
|
- sw.removeEntity(entity1);
|
|
+ p.removeEntity(entity1);
|
|
|
|
|
|
for(Entity entity2 : entity1.getRecursivePassengers())
|
|
for(Entity entity2 : entity1.getRecursivePassengers())
|
|
{
|
|
{
|
|
@@ -197,10 +169,7 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
}
|
|
}
|
|
|
|
|
|
p.addSelfToInternalCraftingInventory();
|
|
p.addSelfToInternalCraftingInventory();
|
|
- if(noSchedule)
|
|
+ net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerLoggedIn(p);
|
|
- {
|
|
|
|
- net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerLoggedIn(p);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -209,34 +178,34 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
UUID uuid = PlayerEntity.getUUID(profile);
|
|
UUID uuid = PlayerEntity.getUUID(profile);
|
|
List<ServerPlayerEntity> list = Lists.newArrayList();
|
|
List<ServerPlayerEntity> list = Lists.newArrayList();
|
|
|
|
|
|
- for(int i = 0; i < this.players.size(); ++i)
|
|
+ for(int i = 0; i < this.players.size(); i++)
|
|
{
|
|
{
|
|
- ServerPlayerEntity serverplayerentity = this.players.get(i);
|
|
+ ServerPlayerEntity p = this.players.get(i);
|
|
- if(serverplayerentity.getUniqueID().equals(uuid))
|
|
+ if(p.getUniqueID().equals(uuid))
|
|
{
|
|
{
|
|
- list.add(serverplayerentity);
|
|
+ list.add(p);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- ServerPlayerEntity serverplayerentity2 = this.uuidToPlayerMap.get(profile.getId());
|
|
+ ServerPlayerEntity p2 = this.uuidToPlayerMap.get(profile.getId());
|
|
- if(serverplayerentity2 != null && !list.contains(serverplayerentity2))
|
|
+ if(p2 != null && !list.contains(p2))
|
|
{
|
|
{
|
|
- list.add(serverplayerentity2);
|
|
+ list.add(p2);
|
|
}
|
|
}
|
|
|
|
|
|
- for(ServerPlayerEntity serverplayerentity1 : list)
|
|
+ for(ServerPlayerEntity p : list)
|
|
{
|
|
{
|
|
- serverplayerentity1.connection.disconnect(new TranslationTextComponent("multiplayer.disconnect.duplicate_login"));
|
|
+ p.connection.disconnect(new TranslationTextComponent("multiplayer.disconnect.duplicate_login"));
|
|
}
|
|
}
|
|
|
|
|
|
PlayerInteractionManager playerinteractionmanager;
|
|
PlayerInteractionManager playerinteractionmanager;
|
|
- if(this.server.isDemo())
|
|
+ if(server.isDemo())
|
|
{
|
|
{
|
|
- playerinteractionmanager = new DemoPlayerInteractionManager(this.server.getWorld(DimensionType.OVERWORLD));
|
|
+ playerinteractionmanager = new DemoPlayerInteractionManager(server.getWorld(DimensionType.OVERWORLD));
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- playerinteractionmanager = new PlayerInteractionManager(this.server.getWorld(DimensionType.OVERWORLD));
|
|
+ playerinteractionmanager = new PlayerInteractionManager(server.getWorld(DimensionType.OVERWORLD));
|
|
}
|
|
}
|
|
|
|
|
|
return new ModEntityPlayerMP(this.server, this.server.getWorld(DimensionType.OVERWORLD), profile, playerinteractionmanager);
|
|
return new ModEntityPlayerMP(this.server, this.server.getWorld(DimensionType.OVERWORLD), profile, playerinteractionmanager);
|
|
@@ -259,7 +228,7 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
{
|
|
{
|
|
dim = DimensionType.OVERWORLD;
|
|
dim = DimensionType.OVERWORLD;
|
|
}
|
|
}
|
|
-
|
|
+
|
|
this.removePlayer(pIn);
|
|
this.removePlayer(pIn);
|
|
pIn.getServerWorld().removePlayer(pIn, true);
|
|
pIn.getServerWorld().removePlayer(pIn, true);
|
|
BlockPos blockpos = pIn.getBedLocation(dim);
|
|
BlockPos blockpos = pIn.getBedLocation(dim);
|
|
@@ -288,38 +257,39 @@ public class ModPlayerList extends DedicatedPlayerList
|
|
p.addTag(s);
|
|
p.addTag(s);
|
|
}
|
|
}
|
|
|
|
|
|
- ServerWorld serverworld = this.server.getWorld(pIn.dimension);
|
|
+ ServerWorld sw = this.server.getWorld(pIn.dimension);
|
|
- this.setPlayerGameTypeBasedOnOther(p, pIn, serverworld);
|
|
+ setPlayerGameTypeBasedOnOther(p, pIn, sw);
|
|
if(blockpos != null)
|
|
if(blockpos != null)
|
|
{
|
|
{
|
|
- Optional<Vec3d> optional = PlayerEntity.func_213822_a(this.server.getWorld(pIn.dimension), blockpos, flag);
|
|
+ Optional<Vec3d> optional = PlayerEntity.func_213822_a(server.getWorld(pIn.dimension), blockpos, flag);
|
|
if(optional.isPresent())
|
|
if(optional.isPresent())
|
|
{
|
|
{
|
|
Vec3d vec3d = optional.get();
|
|
Vec3d vec3d = optional.get();
|
|
- p.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, 0.0F, 0.0F);
|
|
+ p.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, 0.0f, 0.0f);
|
|
- p.setSpawnPoint(blockpos, flag, dim);
|
|
+ p.setSpawnPoint(blockpos, flag, false, dim);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- p.connection.sendPacket(new SChangeGameStatePacket(0, 0.0F));
|
|
+ p.connection.sendPacket(new SChangeGameStatePacket(0, 0.0f));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+ while(!sw.func_226669_j_(p) && p.getPosY() < 256.0D)
|
|
-
|
|
+ {
|
|
-
|
|
+ p.setPosition(p.getPosX(), p.getPosY() + 1.0, p.getPosZ());
|
|
-
|
|
+ }
|
|
|
|
|
|
WorldInfo wi = p.world.getWorldInfo();
|
|
WorldInfo wi = p.world.getWorldInfo();
|
|
- p.connection.sendPacket(new SRespawnPacket(p.dimension, wi.getGenerator(), p.interactionManager.getGameType()));
|
|
+ net.minecraftforge.fml.network.NetworkHooks.sendDimensionDataPacket(p.connection.netManager, p);
|
|
- BlockPos pos = serverworld.getSpawnPoint();
|
|
+ p.connection.sendPacket(new SRespawnPacket(p.dimension, WorldInfo.byHashing(wi.getSeed()), wi.getGenerator(), p.interactionManager.getGameType()));
|
|
- p.connection.setPlayerLocation(p.posX, p.posY, p.posZ, p.rotationYaw, p.rotationPitch);
|
|
+ BlockPos pos = sw.getSpawnPoint();
|
|
|
|
+ p.connection.setPlayerLocation(p.getPosX(), p.getPosY(), p.getPosZ(), p.rotationYaw, p.rotationPitch);
|
|
p.connection.sendPacket(new SSpawnPositionPacket(pos));
|
|
p.connection.sendPacket(new SSpawnPositionPacket(pos));
|
|
p.connection.sendPacket(new SServerDifficultyPacket(wi.getDifficulty(), wi.isDifficultyLocked()));
|
|
p.connection.sendPacket(new SServerDifficultyPacket(wi.getDifficulty(), wi.isDifficultyLocked()));
|
|
p.connection.sendPacket(new SSetExperiencePacket(p.experience, p.experienceTotal, p.experienceLevel));
|
|
p.connection.sendPacket(new SSetExperiencePacket(p.experience, p.experienceTotal, p.experienceLevel));
|
|
- this.sendWorldInfo(p, serverworld);
|
|
+ sendWorldInfo(p, sw);
|
|
- this.updatePermissionLevel(p);
|
|
+ updatePermissionLevel(p);
|
|
- serverworld.addRespawnedPlayer(p);
|
|
+ sw.addRespawnedPlayer(p);
|
|
this.addPlayer(p);
|
|
this.addPlayer(p);
|
|
this.uuidToPlayerMap.put(p.getUniqueID(), p);
|
|
this.uuidToPlayerMap.put(p.getUniqueID(), p);
|
|
p.addSelfToInternalCraftingInventory();
|
|
p.addSelfToInternalCraftingInventory();
|