diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java index ee6bfeb..b24a3e8 100644 --- a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java +++ b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java @@ -145,21 +145,11 @@ super(p_i45285_2_, p_i45285_3_); p_i45285_4_.thisPlayerMP = this; this.theItemInWorldManager = p_i45285_4_; - ChunkCoordinates chunkcoordinates = p_i45285_2_.provider.getRandomizedSpawnPoint(); - int i = chunkcoordinates.posX; - int j = chunkcoordinates.posZ; - int k = chunkcoordinates.posY; this.mcServer = p_i45285_1_; this.field_147103_bO = p_i45285_1_.getConfigurationManager().func_152602_a(this); this.stepHeight = 0.0F; this.yOffset = 0.0F; - this.setLocationAndAngles((double)i + 0.5D, (double)k, (double)j + 0.5D, 0.0F, 0.0F); - - while (!p_i45285_2_.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty()) - { - this.setPosition(this.posX, this.posY + 1.0D, this.posZ); - } renderDistance = p_i45285_1_.getConfigurationManager().getViewDistance(); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index b4258c2..14819a3 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -142,13 +142,11 @@ private final MinecraftSessionService field_147143_S; private long field_147142_T = 0L; private final GameProfileRepository field_152365_W; - private final PlayerProfileCache field_152366_X; + protected PlayerProfileCache field_152366_X; private static final String __OBFID = "CL_00001462"; public MinecraftServer(File p_i45281_1_, Proxy p_i45281_2_) { - field_152367_a = new File(getDataDirectory(), "usercache.json"); - this.field_152366_X = new PlayerProfileCache(this, field_152367_a); mcServer = this; this.serverProxy = p_i45281_2_; this.anvilFile = p_i45281_1_; diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index 2641bf0..1e735b7 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -26,6 +26,7 @@ import net.minecraft.profiler.PlayerUsageSnooper; import net.minecraft.server.MinecraftServer; import net.minecraft.server.gui.MinecraftServerGui; +import net.minecraft.server.management.PlayerProfileCache; import net.minecraft.server.management.PreYggdrasilConverter; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.CryptManager; @@ -64,6 +65,8 @@ public DedicatedServer(File p_i1508_1_) { super(p_i1508_1_, Proxy.NO_PROXY); + field_152367_a = new File(getDataDirectory(), "usercache.json"); + field_152366_X = new PlayerProfileCache(this, field_152367_a); Thread thread = new Thread("Server Infinisleeper") { private static final String __OBFID = "CL_00001787"; diff --git a/src/main/java/net/minecraft/server/integrated/IntegratedServer.java b/src/main/java/net/minecraft/server/integrated/IntegratedServer.java index f58ccac..1a4bdcf 100644 --- a/src/main/java/net/minecraft/server/integrated/IntegratedServer.java +++ b/src/main/java/net/minecraft/server/integrated/IntegratedServer.java @@ -3,16 +3,19 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.util.concurrent.Callable; + import net.minecraft.client.ClientBrandRetriever; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ThreadLanServerPing; import net.minecraft.crash.CrashReport; import net.minecraft.profiler.PlayerUsageSnooper; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.management.PlayerProfileCache; import net.minecraft.util.CryptManager; import net.minecraft.util.HttpUtil; import net.minecraft.world.EnumDifficulty; @@ -26,6 +29,7 @@ import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.permission.PermissionRepository; @@ -54,6 +58,8 @@ this.mc = p_i1317_1_; this.func_152361_a(new IntegratedPlayerList(this)); this.theWorldSettings = p_i1317_4_; + field_152367_a = new File(getDataDirectory(), "usercache.json"); + field_152366_X = new PlayerProfileCache(this, field_152367_a); } protected void loadAllWorlds(String p_71247_1_, String p_71247_2_, long p_71247_3_, WorldType p_71247_5_, String p_71247_6_) diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index c96bd04..104fe62 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -69,10 +69,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.permission.MinecraftPermissions; +import org.ultramine.server.ConfigurationHandler; import org.ultramine.server.PermissionHandler; import org.ultramine.permission.internal.OpPermissionProxySet; import org.ultramine.server.chunk.IChunkLoadCallback; import org.ultramine.server.data.ServerDataLoader; +import org.ultramine.server.util.WarpLocation; public abstract class ServerConfigurationManager { @@ -448,6 +450,8 @@ } EntityPlayerMP entityplayermp1 = new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(p_72368_1_.dimension), p_72368_1_.getGameProfile(), (ItemInWorldManager)object); + WarpLocation spawn = getDataLoader().getWarp(getServerInstance().isSinglePlayer() ? "spawn" : ConfigurationHandler.getServerConfig().spawnLocations.deathSpawn).randomize(); + entityplayermp1.setLocationAndAngles(spawn.x, spawn.y, spawn.z, spawn.yaw, spawn.pitch); entityplayermp1.playerNetServerHandler = p_72368_1_.playerNetServerHandler; entityplayermp1.clonePlayer(p_72368_1_, p_72368_3_); entityplayermp1.dimension = p_72368_2_; @@ -456,7 +460,7 @@ this.func_72381_a(entityplayermp1, p_72368_1_, worldserver); ChunkCoordinates chunkcoordinates1; - if (chunkcoordinates != null) + if (chunkcoordinates != null && (getServerInstance().isSinglePlayer() || ConfigurationHandler.getServerConfig().spawnLocations.respawnOnBed)) { chunkcoordinates1 = EntityPlayer.verifyRespawnCoordinates(this.mcServer.worldServerForDimension(p_72368_1_.dimension), chunkcoordinates, flag1); @@ -471,11 +475,14 @@ } } - worldserver.theChunkProviderServer.loadChunk((int)entityplayermp1.posX >> 4, (int)entityplayermp1.posZ >> 4); - - while (!worldserver.getCollidingBoundingBoxes(entityplayermp1, entityplayermp1.boundingBox).isEmpty()) + if(getServerInstance().isSinglePlayer()) { - entityplayermp1.setPosition(entityplayermp1.posX, entityplayermp1.posY + 1.0D, entityplayermp1.posZ); + worldserver.theChunkProviderServer.loadChunk((int)entityplayermp1.posX >> 4, (int)entityplayermp1.posZ >> 4); + + while (!worldserver.getCollidingBoundingBoxes(entityplayermp1, entityplayermp1.boundingBox).isEmpty()) + { + entityplayermp1.setPosition(entityplayermp1.posX, entityplayermp1.posY + 1.0D, entityplayermp1.posZ); + } } entityplayermp1.playerNetServerHandler.sendPacket(new S07PacketRespawn(entityplayermp1.dimension, entityplayermp1.worldObj.difficultySetting, entityplayermp1.worldObj.getWorldInfo().getTerrainType(), entityplayermp1.theItemInWorldManager.getGameType())); diff --git a/src/main/java/net/minecraft/world/WorldServer.java b/src/main/java/net/minecraft/world/WorldServer.java index 43238ab..bbcee39 100644 --- a/src/main/java/net/minecraft/world/WorldServer.java +++ b/src/main/java/net/minecraft/world/WorldServer.java @@ -652,7 +652,7 @@ } } - this.worldInfo.setSpawnPosition(i, j, k); + this.worldInfo.setSpawnPosition(i, getHeightValue(i, k), k); this.findingSpawnPoint = false; if (p_73052_1_.isBonusChestEnabled()) diff --git a/src/main/java/net/minecraft/world/chunk/Chunk.java b/src/main/java/net/minecraft/world/chunk/Chunk.java index 2a4e6b3..2733434 100644 --- a/src/main/java/net/minecraft/world/chunk/Chunk.java +++ b/src/main/java/net/minecraft/world/chunk/Chunk.java @@ -25,6 +25,7 @@ import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; @@ -928,7 +929,7 @@ } MinecraftForge.EVENT_BUS.post(new ChunkEvent.Load(this)); - loadTime = unbindTime = ((WorldServer)worldObj).func_73046_m().getTickCounter(); + loadTime = unbindTime = MinecraftServer.getServer().getTickCounter(); lastsavePendingCount = pendingUpdatesSet == null ? 0 : pendingUpdatesSet.size(); } diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index 8c1527d..670f9a9 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -426,6 +426,11 @@ } } + public void loadAsync(int x, int z) + { + loadAsync(x, z, IChunkLoadCallback.EMPTY); + } + public void loadAsyncRadius(int cx, int cz, int radius, IChunkLoadCallback callback) { for(int x = cx - radius; x <= cx + radius; x++) diff --git a/src/main/java/org/ultramine/commands/basic/BasicCommands.java b/src/main/java/org/ultramine/commands/basic/BasicCommands.java index 8aa519f..ac7619e 100644 --- a/src/main/java/org/ultramine/commands/basic/BasicCommands.java +++ b/src/main/java/org/ultramine/commands/basic/BasicCommands.java @@ -156,4 +156,25 @@ for(Map.Entry ent : MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarps().entrySet()) ctx.sendMessage(GOLD, " - %s [%s](%s, %s, %s)", ent.getKey(), ent.getValue().dimension, (int)ent.getValue().x, (int)ent.getValue().y, (int)ent.getValue().z); } + + @Command( + name = "fastwarp", + group = "admin", + permissions = {"command.fastwarp"}, + syntax = {"[add remove] <%name>"} + ) + public static void fastwarp(CommandContext ctx) + { + String name = ctx.get("name").asString(); + ctx.check(!name.equals("spawn"), "command.fastwarp.fail.spawn"); + if(ctx.getAction().equals("add")) + { + MinecraftServer.getServer().getConfigurationManager().getDataLoader().addFastWarp(name); + } + else if(ctx.getAction().equals("remove")) + { + MinecraftServer.getServer().getConfigurationManager().getDataLoader().removeFastWarp(name); + } + ctx.sendMessage("command.fastwarp.success."+ctx.getAction()); + } } diff --git a/src/main/java/org/ultramine/commands/basic/FastWarpCommand.java b/src/main/java/org/ultramine/commands/basic/FastWarpCommand.java new file mode 100644 index 0000000..ddc0843 --- /dev/null +++ b/src/main/java/org/ultramine/commands/basic/FastWarpCommand.java @@ -0,0 +1,90 @@ +package org.ultramine.commands.basic; + +import java.util.Collections; +import java.util.List; + +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; + +import org.ultramine.commands.IExtendedCommand; +import org.ultramine.server.PermissionHandler; +import org.ultramine.server.Teleporter; + +public class FastWarpCommand implements IExtendedCommand +{ + private final String name; + + public FastWarpCommand(String name) + { + this.name = name; + } + + @Override + public String getCommandName() + { + return name; + } + + @Override + public String getCommandUsage(ICommandSender p_71518_1_) + { + return '/'+name; + } + + @Override + public List getCommandAliases() + { + return Collections.emptyList(); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) + { + Teleporter.tpLater((EntityPlayerMP)sender, MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarp(name)); + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) + { + return sender instanceof EntityPlayerMP && PermissionHandler.getInstance().has(sender, "command."+name); + } + + @Override + public List addTabCompletionOptions(ICommandSender p_71516_1_, String[] p_71516_2_) + { + return null; + } + + @Override + public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_) + { + return false; + } + + @Override + public int compareTo(Object o) + { + if (o instanceof IExtendedCommand) + { + int result = getGroup().compareTo(((IExtendedCommand) o).getGroup()); + if (result == 0) + result = getCommandName().compareTo(((IExtendedCommand) o).getCommandName()); + + return result; + } + return -1; + } + + @Override + public String getDescription() + { + return "command.fastwarp.use.description"; + } + + @Override + public String getGroup() + { + return "basic"; + } +} diff --git a/src/main/java/org/ultramine/server/MultiWorld.java b/src/main/java/org/ultramine/server/MultiWorld.java index 77e113d..50d2a22 100644 --- a/src/main/java/org/ultramine/server/MultiWorld.java +++ b/src/main/java/org/ultramine/server/MultiWorld.java @@ -135,7 +135,15 @@ conf.settings = new WorldConfig.Settings(); conf.chunkLoading = new WorldConfig.ChunkLoading(); for(WorldServer world : server.worldServers) + { world.setConfig(conf); + String name = world.getWorldInfo().getWorldName(); + dimToWorldMap.put(world.provider.dimensionId, world); + if(nameToWorldMap.containsKey(name)) + nameToWorldMap.put(name + world.provider.dimensionId, world); + else + nameToWorldMap.put(name, world); + } } @SideOnly(Side.SERVER) diff --git a/src/main/java/org/ultramine/server/Teleporter.java b/src/main/java/org/ultramine/server/Teleporter.java index f3aa229..38f67f7 100644 --- a/src/main/java/org/ultramine/server/Teleporter.java +++ b/src/main/java/org/ultramine/server/Teleporter.java @@ -37,7 +37,7 @@ public static void tpNow(EntityPlayerMP target, WarpLocation dst) { if(target == null || dst == null) return; - doTeleportation(target, dst.dimension, dst.x, dst.y, dst.z, dst.yaw, dst.pitch); + doTeleportation(target, dst); } public static void tpLater(EntityPlayerMP target, WarpLocation dst) @@ -70,6 +70,12 @@ } } + private static void doTeleportation(EntityPlayerMP target, WarpLocation dst) + { + dst = dst.randomize(); + doTeleportation(target, dst.dimension, dst.x, dst.y, dst.z, dst.yaw, dst.pitch); + } + private static void doTeleportation(EntityPlayerMP player, int dimension, double x, double y, double z, float yaw, float pitch) { player.getData().core().setLastLocation(WarpLocation.getFromPlayer(player)); @@ -118,7 +124,7 @@ { if(timeEnd - System.currentTimeMillis() <= 0) { - doTeleportation(target, dst.dimension, dst.x, dst.y, dst.z, dst.yaw, dst.pitch); + doTeleportation(target, dst); return true; } diff --git a/src/main/java/org/ultramine/server/UltramineServerConfig.java b/src/main/java/org/ultramine/server/UltramineServerConfig.java index e22d08e..ad25eca 100644 --- a/src/main/java/org/ultramine/server/UltramineServerConfig.java +++ b/src/main/java/org/ultramine/server/UltramineServerConfig.java @@ -7,6 +7,7 @@ { public WatchdogThreadConfig watchdogThread = new WatchdogThreadConfig(); public Teleportation teleportation = new Teleportation(); + public SpawnLocations spawnLocations = new SpawnLocations(); public VanillaConfig vanilla = new VanillaConfig(); public static class WatchdogThreadConfig @@ -21,6 +22,13 @@ public int delay = 5; } + public static class SpawnLocations + { + public String firstSpawn = "spawn"; + public String deathSpawn = "spawn"; + public boolean respawnOnBed = true; + } + public static class VanillaConfig diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index dbf8eb5..c98eeaf 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; +import net.minecraft.command.CommandHandler; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.MinecraftForge; @@ -27,12 +28,15 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; +import org.ultramine.commands.CommandRegistry; import org.ultramine.commands.basic.BasicCommands; +import org.ultramine.commands.basic.FastWarpCommand; import org.ultramine.commands.basic.TechCommands; import org.ultramine.commands.basic.VanillaCommands; import org.ultramine.commands.syntax.DefaultCompleters; import org.ultramine.permission.commands.BasicPermissionCommands; import org.ultramine.permission.internal.OpPermissionProxySet; +import org.ultramine.server.data.ServerDataLoader; import org.ultramine.server.data.player.PlayerCoreData; public class UltramineServerModContainer extends DummyModContainer @@ -103,7 +107,12 @@ @Subscribe public void serverStarted(FMLServerStartedEvent e) { - MinecraftServer.getServer().getConfigurationManager().getDataLoader().loadCache(); + ServerDataLoader loader = MinecraftServer.getServer().getConfigurationManager().getDataLoader(); + CommandRegistry reg = ((CommandHandler)MinecraftServer.getServer().getCommandManager()).getRegistry(); + loader.loadCache(); + loader.addDefaultWarps(); + for(String name : loader.getFastWarps()) + reg.registerCommand(new FastWarpCommand(name)); } @Subscribe diff --git a/src/main/java/org/ultramine/server/data/IDataProvider.java b/src/main/java/org/ultramine/server/data/IDataProvider.java index 39eb470..751c55e 100644 --- a/src/main/java/org/ultramine/server/data/IDataProvider.java +++ b/src/main/java/org/ultramine/server/data/IDataProvider.java @@ -31,4 +31,10 @@ void saveWarp(String name, WarpLocation warp); void removeWarp(String name); + + List loadFastWarps(); + + void saveFastWarp(String name); + + void removeFastWarp(String name); } diff --git a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java index f0781d7..7ee84dc 100644 --- a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java +++ b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java @@ -32,6 +32,7 @@ private final ServerConfigurationManager mgr; private File umPlayerDir; + private List fastWarps = Collections.emptyList(); public NBTFileDataProvider(ServerConfigurationManager mgr) { @@ -118,6 +119,7 @@ if(file.exists()) { YamlWarpList warps = YamlConfigProvider.getOrCreateConfig(file, YamlWarpList.class); + fastWarps = warps.fastWarps; return warps.warps; } @@ -136,6 +138,24 @@ writeWarpList(); } + @Override + public List loadFastWarps() + { + return fastWarps; + } + + @Override + public void saveFastWarp(String name) + { + writeWarpList(); + } + + @Override + public void removeFastWarp(String name) + { + writeWarpList(); + } + private void checkPlayerDir() { if(umPlayerDir == null) @@ -202,11 +222,13 @@ File file = mgr.getServerInstance().getFile("warps.yml"); YamlWarpList warps = new YamlWarpList(); warps.warps = mgr.getDataLoader().getWarps(); + warps.fastWarps = mgr.getDataLoader().getFastWarps(); YamlConfigProvider.saveConfig(file, warps); } private static class YamlWarpList { public Map warps; + public List fastWarps; } } diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 405a850..359fe1c 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -6,6 +6,8 @@ import java.util.Map; import java.util.UUID; +import org.ultramine.commands.basic.FastWarpCommand; +import org.ultramine.server.ConfigurationHandler; import org.ultramine.server.data.player.PlayerData; import org.ultramine.server.data.player.PlayerDataExtension; import org.ultramine.server.data.player.PlayerDataExtensionInfo; @@ -15,12 +17,14 @@ import com.mojang.authlib.GameProfile; import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.command.CommandHandler; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.server.management.ServerConfigurationManager; import net.minecraft.world.storage.SaveHandler; +import net.minecraft.world.storage.WorldInfo; import net.minecraftforge.event.ForgeEventFactory; public class ServerDataLoader @@ -31,6 +35,7 @@ private final List dataExtinfos = new ArrayList(); private final Map playerDataCache = new HashMap(); private final Map warps = new HashMap(); + private final List fastWarps = new ArrayList(); public ServerDataLoader(ServerConfigurationManager mgr) { @@ -80,12 +85,53 @@ return warps; } + public void addFastWarp(String name) + { + if(fastWarps.add(name)) + { + dataProvider.saveFastWarp(name); + ((CommandHandler)mgr.getServerInstance().getCommandManager()).getRegistry().registerCommand(new FastWarpCommand(name)); + } + } + + public void removeFastWarp(String name) + { + if(fastWarps.remove(name)) + dataProvider.removeFastWarp(name); + } + + public List getFastWarps() + { + return fastWarps; + } + public void loadCache() { for(PlayerData data : dataProvider.loadAllPlayerData()) playerDataCache.put(data.getProfile().getId(), data); warps.putAll(dataProvider.loadWarps()); - + fastWarps.addAll(dataProvider.loadFastWarps()); + } + + public void addDefaultWarps() + { + if(!warps.containsKey("spawn")) + { + WorldInfo wi = mgr.getServerInstance().getMultiWorld().getWorldByID(0).getWorldInfo(); + setWarp("spawn", new WarpLocation(0, wi.getSpawnX(), wi.getSpawnY(), wi.getSpawnZ(), 0, 0, 20)); + } + if(!fastWarps.contains("spawn")) + { + fastWarps.add("spawn"); + dataProvider.saveFastWarp("spawn"); + } + if(!isClient) + { + String firstSpawn = ConfigurationHandler.getServerConfig().spawnLocations.firstSpawn; + String deathSpawn = ConfigurationHandler.getServerConfig().spawnLocations.deathSpawn; + if(!warps.containsKey(firstSpawn)) setWarp(firstSpawn, getWarp("spawn")); + if(!warps.containsKey(deathSpawn)) setWarp(deathSpawn, getWarp("spawn")); + } } public void initializeConnectionToPlayer(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler) @@ -113,6 +159,11 @@ { player.setData(playerDataCache.get(player.getGameProfile().getId())); } + if(nbt == null) //first login + { + WarpLocation spawn = getWarp(isClient ? "spawn" : ConfigurationHandler.getServerConfig().spawnLocations.firstSpawn).randomize(); + player.setLocationAndAngles(spawn.x, spawn.y, spawn.z, spawn.yaw, spawn.pitch); + } ForgeEventFactory.firePlayerLoadingEvent(player, ((SaveHandler)mgr.getPlayerNBTLoader()).getPlayerSaveDir(), player.getUniqueID().toString()); mgr.initializeConnectionToPlayer_body(network, player, nethandler, nbt); } diff --git a/src/main/java/org/ultramine/server/util/WarpLocation.java b/src/main/java/org/ultramine/server/util/WarpLocation.java index 9a7d1b8..88fe198 100644 --- a/src/main/java/org/ultramine/server/util/WarpLocation.java +++ b/src/main/java/org/ultramine/server/util/WarpLocation.java @@ -1,7 +1,11 @@ package org.ultramine.server.util; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.MathHelper; +import net.minecraft.world.WorldServer; public class WarpLocation { @@ -35,14 +39,26 @@ this(dimension, x, y, z, 0, 0); } - public void round() + public WarpLocation randomize() { - x = (double)Math.round(x*100)/100.0; - y = (double)Math.round(y*100)/100.0; - z = (double)Math.round(z*100)/100.0; + if(randomRadius == 0) + return this; - yaw = (float)Math.round(yaw*100)/100.0F; - pitch = (float)Math.round(pitch*100)/100.0F; + WorldServer world = MinecraftServer.getServer().getMultiWorld().getWorldByID(dimension); + double newX = x + randomRadius*world.rand.nextDouble(); + double newZ = z + randomRadius*world.rand.nextDouble(); + double newY = y; + int intX = MathHelper.floor_double(newX); + int intZ = MathHelper.floor_double(newZ); + if(world.chunkExists(intX >> 4, intZ >> 4)) + { + while(world.getBlock(intX, MathHelper.floor_double(newY), intZ) != Blocks.air) + newY++; + while(world.getBlock(intX, MathHelper.floor_double(newY)-1, intZ) == Blocks.air) + newY--; + } + + return new WarpLocation(dimension, newX, newY, newZ, yaw, pitch, 0); } public boolean equals(WarpLocation loc) @@ -86,8 +102,11 @@ public static WarpLocation getFromPlayer(EntityPlayer player) { - WarpLocation s = new WarpLocation(player.dimension, player.posX, player.posY, player.posZ, player.rotationYaw, player.rotationPitch); - s.round(); - return s; + return new WarpLocation(player.dimension, + (double)Math.round(player.posX*100)/100.0, + (double)Math.round(player.posY*100)/100.0, + (double)Math.round(player.posZ*100)/100.0, + (float)Math.round(player.rotationYaw*100)/100.0F, + (float)Math.round(player.rotationPitch*100)/100.0F); } } diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 9c9045d..de1fb02 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -91,6 +91,13 @@ command.warplist.description=Displays list of all server warps command.warplist.head=Warp list: +command.fastwarp.usage=/fastwarp +command.fastwarp.description=Add fastwarp +command.fastwarp.fail.spawn=Can't change spawn fastwarp +command.fastwarp.success.add=Fastwarp added +command.fastwarp.success.remove=Fastwarp removed +command.fastwarp.use.description=Teleport to this point + #Technical commands command.id.usage=/id command.id.description=Displays information about specified item id