From 7defe0bb291cfd6726e320b2f3eecca9fca607d8 Mon Sep 17 00:00:00 2001 From: Prototik Date: Sun, 18 Oct 2015 23:58:28 +0700 Subject: [PATCH] Some portion of optimizations: * Clear outgoing packet queue after player disconnect * Disable sleep between chunk saving * Put 2x4096 bytes instead 2048x4 bytes for region file aligment * Using map to search player by name instead iterating over all players * Some tweaks for decorations (item frames, maps) --- build.gradle | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 52141 -> 53638 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 6 +- .../entity/item/EntityItemFrame.java.patch | 9 +++ .../network/NetHandlerPlayServer.java.patch | 6 +- .../network/NetworkManager.java.patch | 9 ++- .../ServerConfigurationManager.java.patch | 62 ++++++++++++------ .../world/chunk/storage/RegionFile.java.patch | 33 ++++++++++ .../world/storage/MapData.java.patch | 43 +++++++++++- .../storage/ThreadedFileIOBase.java.patch | 19 ++++++ src/main/java/kcauldron/KCauldron.java | 14 ++++ .../updater/DefaultUpdateCallback.java | 15 ++++- .../kcauldron/updater/KVersionRetriever.java | 1 + .../craftbukkit/map/CraftMapRenderer.java | 11 +++- .../CaseInsensitiveHashingStrategy.java | 18 +++++ .../java/org/spigotmc/CaseInsensitiveMap.java | 15 +++++ 17 files changed, 225 insertions(+), 41 deletions(-) create mode 100644 patches/net/minecraft/world/chunk/storage/RegionFile.java.patch create mode 100644 patches/net/minecraft/world/storage/ThreadedFileIOBase.java.patch create mode 100644 src/main/java/org/spigotmc/CaseInsensitiveHashingStrategy.java create mode 100644 src/main/java/org/spigotmc/CaseInsensitiveMap.java diff --git a/build.gradle b/build.gradle index 1330641..ec88240 100644 --- a/build.gradle +++ b/build.gradle @@ -173,6 +173,7 @@ def generateManifest(boolean legacy = false) { 'KCauldron-Channel' : project.name, 'KCauldron-Version' : project.version, 'KCauldron-Legacy' : legacy, + 'KCauldron-Official' : project.hasProperty('officialBuild'), 'Implementation-Vendor' : 'Prototik', 'Implementation-Title' : project.name, 'Implementation-Version': project.version, diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 085a1cdc27db1185342f15a00441734e74fe3735..e8c6bf7bb47dff6b81c2cf7a349eb7e912c9fbe2 100644 GIT binary patch delta 19202 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 583fab1..c8806d9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Jun 16 17:21:00 KRAT 2015 +#Fri Oct 16 21:29:47 KRAT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip diff --git a/gradlew b/gradlew index 91a7e26..97fac78 100755 --- a/gradlew +++ b/gradlew @@ -42,11 +42,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/patches/net/minecraft/entity/item/EntityItemFrame.java.patch b/patches/net/minecraft/entity/item/EntityItemFrame.java.patch index 2edbf57..3f12c3e 100644 --- a/patches/net/minecraft/entity/item/EntityItemFrame.java.patch +++ b/patches/net/minecraft/entity/item/EntityItemFrame.java.patch @@ -14,6 +14,15 @@ this.func_146065_b(p_70097_1_.getEntity(), false); this.setDisplayedItem((ItemStack)null); } +@@ -115,7 +122,7 @@ + if (p_110131_1_.getItem() == Items.filled_map) + { + MapData mapdata = ((ItemMap)p_110131_1_.getItem()).getMapData(p_110131_1_, this.worldObj); +- mapdata.playersVisibleOnMap.remove("frame-" + this.getEntityId()); ++ mapdata.playersVisibleOnMap.remove(java.util.UUID.nameUUIDFromBytes(("frame-" + this.getEntityId()).getBytes(org.apache.commons.codec.Charsets.US_ASCII))); + } + + p_110131_1_.setItemFrame((EntityItemFrame)null); @@ -203,4 +210,11 @@ return true; diff --git a/patches/net/minecraft/network/NetHandlerPlayServer.java.patch b/patches/net/minecraft/network/NetHandlerPlayServer.java.patch index 0d71fbc..9e3bea5 100644 --- a/patches/net/minecraft/network/NetHandlerPlayServer.java.patch +++ b/patches/net/minecraft/network/NetHandlerPlayServer.java.patch @@ -608,7 +608,7 @@ } + // CraftBukkit start -+ if (p_147359_1_ == null) ++ if (p_147359_1_ == null || this.processedDisconnect) // KCauldron + { + return; + } @@ -1822,7 +1822,7 @@ { packetbuffer = new PacketBuffer(Unpooled.wrappedBuffer(p_147349_1_.func_149558_e())); @@ -1093,16 +2409,18 @@ - + { if (itemstack.getItem() == Items.writable_book && itemstack.getItem() == itemstack1.getItem()) { - itemstack1.setTagInfo("pages", itemstack.getTagCompound().getTagList("pages", 8)); @@ -1845,7 +1845,7 @@ finally { @@ -1135,19 +2453,18 @@ - { + if (itemstack.getItem() == Items.written_book && itemstack1.getItem() == Items.writable_book) { - itemstack1.setTagInfo("author", new NBTTagString(this.playerEntity.getCommandSenderName())); diff --git a/patches/net/minecraft/network/NetworkManager.java.patch b/patches/net/minecraft/network/NetworkManager.java.patch index 98f6fce..d33a717 100644 --- a/patches/net/minecraft/network/NetworkManager.java.patch +++ b/patches/net/minecraft/network/NetworkManager.java.patch @@ -77,7 +77,7 @@ packet.processPacket(this.netHandler); } -@@ -225,6 +257,8 @@ +@@ -225,8 +257,11 @@ public void closeChannel(IChatComponent p_150718_1_) { @@ -85,8 +85,11 @@ + if (this.channel.isOpen()) { ++ this.outboundPacketsQueue.clear(); // KCauldron this.channel.close(); -@@ -254,7 +288,7 @@ + this.terminationReason = p_150718_1_; + } +@@ -254,7 +289,7 @@ { ; } @@ -95,7 +98,7 @@ try { p_initChannel_1_.config().setOption(ChannelOption.TCP_NODELAY, Boolean.valueOf(false)); -@@ -322,6 +356,13 @@ +@@ -322,6 +357,13 @@ return channel; } diff --git a/patches/net/minecraft/server/management/ServerConfigurationManager.java.patch b/patches/net/minecraft/server/management/ServerConfigurationManager.java.patch index 74fd628..9418b51 100644 --- a/patches/net/minecraft/server/management/ServerConfigurationManager.java.patch +++ b/patches/net/minecraft/server/management/ServerConfigurationManager.java.patch @@ -58,12 +58,13 @@ protected int maxPlayers; private int viewDistance; private WorldSettings.GameType gameType; -@@ -91,8 +115,17 @@ +@@ -91,8 +115,18 @@ private int playerPingIndex; private static final String __OBFID = "CL_00001423"; + // CraftBukkit start + private CraftServer cserver; ++ private final Map playersByName = new org.spigotmc.CaseInsensitiveMap(); // KCauldron + public ServerConfigurationManager(MinecraftServer p_i1500_1_) { @@ -76,7 +77,7 @@ this.bannedPlayers = new UserListBans(field_152613_a); this.bannedIPs = new BanList(field_152614_b); this.ops = new UserListOps(field_152615_c); -@@ -131,12 +164,32 @@ +@@ -131,12 +165,32 @@ s1 = p_72355_1_.getSocketAddress().toString(); } @@ -111,7 +112,7 @@ nethandlerplayserver.sendPacket(new S3FPacketCustomPayload("MC|Brand", this.getServerInstance().getServerModName().getBytes(Charsets.UTF_8))); nethandlerplayserver.sendPacket(new S05PacketSpawnPosition(chunkcoordinates.posX, chunkcoordinates.posY, chunkcoordinates.posZ)); nethandlerplayserver.sendPacket(new S39PacketPlayerAbilities(p_72355_2_.capabilities)); -@@ -145,6 +198,7 @@ +@@ -145,6 +199,7 @@ p_72355_2_.func_147099_x().func_150884_b(p_72355_2_); this.func_96456_a((ServerScoreboard)worldserver.getScoreboard(), p_72355_2_); this.mcServer.func_147132_au(); @@ -119,7 +120,7 @@ ChatComponentTranslation chatcomponenttranslation; if (!p_72355_2_.getCommandSenderName().equalsIgnoreCase(s)) -@@ -158,6 +212,7 @@ +@@ -158,6 +213,7 @@ chatcomponenttranslation.getChatStyle().setColor(EnumChatFormatting.YELLOW); this.sendChatMsg(chatcomponenttranslation); @@ -127,7 +128,7 @@ this.playerLoggedIn(p_72355_2_); nethandlerplayserver.setPlayerLocation(p_72355_2_.posX, p_72355_2_.posY, p_72355_2_.posZ, p_72355_2_.rotationYaw, p_72355_2_.rotationPitch); this.updateTimeAndWeatherForPlayer(p_72355_2_, worldserver); -@@ -192,7 +247,7 @@ +@@ -192,7 +248,7 @@ } } @@ -136,7 +137,7 @@ { HashSet hashset = new HashSet(); Iterator iterator = p_96456_1_.getTeams().iterator(); -@@ -225,6 +280,7 @@ +@@ -225,6 +281,7 @@ public void setPlayerManager(WorldServer[] p_72364_1_) { @@ -144,7 +145,7 @@ this.playerNBTManagerObj = p_72364_1_[0].getSaveHandler().getSaveHandler(); } -@@ -248,7 +304,7 @@ +@@ -248,7 +305,7 @@ public NBTTagCompound readPlayerDataFromFile(EntityPlayerMP p_72380_1_) { @@ -153,7 +154,7 @@ NBTTagCompound nbttagcompound1; if (p_72380_1_.getCommandSenderName().equals(this.mcServer.getServerOwner()) && nbttagcompound != null) -@@ -294,18 +350,61 @@ +@@ -294,18 +351,62 @@ public void playerLoggedIn(EntityPlayerMP p_72377_1_) { @@ -161,6 +162,7 @@ + cserver.detectListNameConflict(p_72377_1_); // CraftBukkit + // this.sendPacketToAllPlayers(new S38PacketPlayerListItem(p_72377_1_.getCommandSenderName(), true, 1000)); // CraftBukkit - replaced with loop below this.playerEntityList.add(p_72377_1_); ++ this.playersByName.put(p_72377_1_.getCommandSenderName(), p_72377_1_); WorldServer worldserver = this.mcServer.worldServerForDimension(p_72377_1_.dimension); + // CraftBukkit start + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(p_72377_1_), "\u00A7e" + p_72377_1_.getCommandSenderName() @@ -219,7 +221,7 @@ } public void updatePlayerPertinentChunks(EntityPlayerMP p_72358_1_) -@@ -313,14 +412,33 @@ +@@ -313,14 +414,33 @@ p_72358_1_.getServerForPlayer().getPlayerManager().updatePlayerPertinentChunks(p_72358_1_); } @@ -255,13 +257,14 @@ { worldserver.removePlayerEntityDangerously(p_72367_1_.ridingEntity); logger.debug("removing player mount"); -@@ -329,9 +447,35 @@ +@@ -329,9 +449,36 @@ worldserver.removeEntity(p_72367_1_); worldserver.getPlayerManager().removePlayer(p_72367_1_); this.playerEntityList.remove(p_72367_1_); - this.field_148547_k.remove(p_72367_1_.getUniqueID()); - net.minecraftforge.common.chunkio.ChunkIOExecutor.adjustPoolSize(this.getCurrentPlayerCount()); - this.sendPacketToAllPlayers(new S38PacketPlayerListItem(p_72367_1_.getCommandSenderName(), false, 9999)); ++ this.playersByName.remove(p_72367_1_.getCommandSenderName()); + this.field_148547_k.remove(p_72367_1_.getCommandSenderName()); + ChunkIOExecutor.adjustPoolSize(this.getCurrentPlayerCount()); // CraftBukkit + // CraftBukkit start - .name -> .listName, replace sendAll with loop @@ -294,7 +297,7 @@ } public String allowUserToConnect(SocketAddress p_148542_1_, GameProfile p_148542_2_) -@@ -372,6 +516,71 @@ +@@ -372,6 +519,71 @@ } } @@ -366,7 +369,7 @@ public EntityPlayerMP createPlayerForUser(GameProfile p_148545_1_) { UUID uuid = EntityPlayer.func_146094_a(p_148545_1_); -@@ -410,80 +619,199 @@ +@@ -410,80 +622,201 @@ return new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(0), p_148545_1_, (ItemInWorldManager)object); } @@ -482,6 +485,7 @@ + // par1EntityPlayerMP.getServerForPlayer().getEntityTracker().removeEntityFromAllTrackingPlayers(par1EntityPlayerMP); // CraftBukkit + par1EntityPlayerMP.getServerForPlayer().getPlayerManager().removePlayer(par1EntityPlayerMP); + this.playerEntityList.remove(par1EntityPlayerMP); ++ this.playersByName.remove(par1EntityPlayerMP.getCommandSenderName()); + this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension).removePlayerEntityDangerously(par1EntityPlayerMP); + + // Phase 4 - handle bed spawn @@ -594,6 +598,7 @@ + targetWorld.getPlayerManager().addPlayer(entityplayermp1); + targetWorld.spawnEntityInWorld(entityplayermp1); this.playerEntityList.add(entityplayermp1); ++ this.playersByName.put(entityplayermp1.getCommandSenderName(), entityplayermp1); entityplayermp1.addSelfToInternalCraftingInventory(); entityplayermp1.setHealth(entityplayermp1.getHealth()); - FMLCommonHandler.instance().firePlayerRespawnEvent(entityplayermp1); @@ -606,7 +611,7 @@ return entityplayermp1; } -@@ -492,34 +820,112 @@ +@@ -492,34 +825,112 @@ transferPlayerToDimension(p_72356_1_, p_72356_2_, mcServer.worldServerForDimension(p_72356_2_).getDefaultTeleporter()); } @@ -738,7 +743,7 @@ } public void transferEntityToWorld(Entity p_82448_1_, int p_82448_2_, WorldServer p_82448_3_, WorldServer p_82448_4_, Teleporter teleporter) -@@ -605,6 +1011,109 @@ +@@ -605,6 +1016,109 @@ p_82448_1_.setWorld(p_82448_4_); } @@ -848,7 +853,7 @@ public void sendPlayerInfoToAllPlayers() { if (++this.playerPingIndex > 600) -@@ -612,11 +1121,13 @@ +@@ -612,11 +1126,13 @@ this.playerPingIndex = 0; } @@ -862,7 +867,26 @@ } public void sendPacketToAllPlayers(Packet p_148540_1_) -@@ -877,13 +1388,24 @@ +@@ -719,7 +1235,7 @@ + + public EntityPlayerMP func_152612_a(String p_152612_1_) + { +- Iterator iterator = this.playerEntityList.iterator(); ++ /*Iterator iterator = this.playerEntityList.iterator(); // KCauldron + EntityPlayerMP entityplayermp; + + do +@@ -733,7 +1249,8 @@ + } + while (!entityplayermp.getCommandSenderName().equalsIgnoreCase(p_152612_1_)); + +- return entityplayermp; ++ return entityplayermp;*/ // KCauldron ++ return playersByName.get(p_152612_1_); + } + + public List findPlayers(ChunkCoordinates p_82449_1_, int p_82449_2_, int p_82449_3_, int p_82449_4_, int p_82449_5_, int p_82449_6_, int p_82449_7_, Map p_82449_8_, String p_82449_9_, String p_82449_10_, World p_82449_11_) +@@ -877,13 +1394,24 @@ for (int j = 0; j < this.playerEntityList.size(); ++j) { EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(j); @@ -889,7 +913,7 @@ if (d4 * d4 + d5 * d5 + d6 * d6 < p_148543_8_ * p_148543_8_) { entityplayermp.playerNetServerHandler.sendPacket(p_148543_11_); -@@ -941,13 +1463,16 @@ +@@ -941,13 +1469,16 @@ p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(1, 0.0F)); p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(7, p_72354_2_.getRainStrength(1.0F))); p_72354_1_.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(8, p_72354_2_.getWeightedThunderStrength(1.0F))); @@ -907,7 +931,7 @@ p_72385_1_.playerNetServerHandler.sendPacket(new S09PacketHeldItemChange(p_72385_1_.inventory.currentItem)); } -@@ -961,9 +1486,17 @@ +@@ -961,9 +1492,17 @@ return this.maxPlayers; } @@ -926,7 +950,7 @@ } public void setWhiteListEnabled(boolean p_72371_1_) -@@ -1032,12 +1565,30 @@ +@@ -1032,12 +1571,30 @@ public void removeAllPlayers() { diff --git a/patches/net/minecraft/world/chunk/storage/RegionFile.java.patch b/patches/net/minecraft/world/chunk/storage/RegionFile.java.patch new file mode 100644 index 0000000..b234bd8 --- /dev/null +++ b/patches/net/minecraft/world/chunk/storage/RegionFile.java.patch @@ -0,0 +1,33 @@ +--- ../src-base/minecraft/net/minecraft/world/chunk/storage/RegionFile.java ++++ ../src-work/minecraft/net/minecraft/world/chunk/storage/RegionFile.java +@@ -43,7 +43,8 @@ + + if (this.dataFile.length() < 4096L) + { +- for (i = 0; i < 1024; ++i) ++ // KCauldron start ++ /*for (i = 0; i < 1024; ++i) + { + this.dataFile.writeInt(0); + } +@@ -51,7 +52,10 @@ + for (i = 0; i < 1024; ++i) + { + this.dataFile.writeInt(0); +- } ++ }*/ ++ dataFile.write(emptySector); ++ dataFile.write(emptySector); ++ // KCauldron end + + this.sizeDelta += 8192; + } +@@ -209,7 +213,7 @@ + + public DataOutputStream getChunkDataOutputStream(int p_76710_1_, int p_76710_2_) + { +- return this.outOfBounds(p_76710_1_, p_76710_2_) ? null : new DataOutputStream(new DeflaterOutputStream(new RegionFile.ChunkBuffer(p_76710_1_, p_76710_2_))); ++ return this.outOfBounds(p_76710_1_, p_76710_2_) ? null : new DataOutputStream(new java.io.BufferedOutputStream(new DeflaterOutputStream(new RegionFile.ChunkBuffer(p_76710_1_, p_76710_2_)))); // KCauldron + } + + protected synchronized void write(int p_76706_1_, int p_76706_2_, byte[] p_76706_3_, int p_76706_4_) diff --git a/patches/net/minecraft/world/storage/MapData.java.patch b/patches/net/minecraft/world/storage/MapData.java.patch index fb5fc73..1795440 100644 --- a/patches/net/minecraft/world/storage/MapData.java.patch +++ b/patches/net/minecraft/world/storage/MapData.java.patch @@ -15,10 +15,12 @@ public class MapData extends WorldSavedData { public int xCenter; -@@ -24,11 +32,21 @@ +@@ -23,12 +31,22 @@ + public byte[] colors = new byte[16384]; public List playersArrayList = new ArrayList(); private Map playersHashMap = new HashMap(); - public Map playersVisibleOnMap = new LinkedHashMap(); +- public Map playersVisibleOnMap = new LinkedHashMap(); ++ public Map playersVisibleOnMap = new LinkedHashMap(); + + // CraftBukkit start + public final CraftMapView mapView; @@ -37,7 +39,7 @@ } public void readFromNBT(NBTTagCompound p_76184_1_) -@@ -107,7 +125,7 @@ +@@ -107,14 +125,14 @@ { if (!this.playersHashMap.containsKey(p_76191_1_)) { @@ -46,6 +48,41 @@ this.playersHashMap.put(p_76191_1_, mapinfo); this.playersArrayList.add(mapinfo); } + + if (!p_76191_1_.inventory.hasItemStack(p_76191_2_)) + { +- this.playersVisibleOnMap.remove(p_76191_1_.getCommandSenderName()); ++ this.playersVisibleOnMap.remove(p_76191_1_.getUniqueID()); + } + + for (int i = 0; i < this.playersArrayList.size(); ++i) +@@ -166,7 +184,7 @@ + { + if (Math.abs(f) >= 320.0F || Math.abs(f1) >= 320.0F) + { +- this.playersVisibleOnMap.remove(p_82567_3_); ++ this.playersVisibleOnMap.remove(java.util.UUID.nameUUIDFromBytes(p_82567_3_.getBytes(org.apache.commons.codec.Charsets.US_ASCII))); + return; + } + +@@ -194,7 +212,7 @@ + } + } + +- this.playersVisibleOnMap.put(p_82567_3_, new MapData.MapCoord((byte)p_82567_1_, b0, b1, b2)); ++ this.playersVisibleOnMap.put(java.util.UUID.nameUUIDFromBytes(p_82567_3_.getBytes(org.apache.commons.codec.Charsets.US_ASCII)), new MapData.MapCoord((byte)p_82567_1_, b0, b1, b2)); + } + + public byte[] getUpdatePacketData(ItemStack p_76193_1_, World p_76193_2_, EntityPlayer p_76193_3_) +@@ -250,7 +268,7 @@ + byte b3 = p_76192_1_[i * 3 + 2]; + byte b0 = p_76192_1_[i * 3 + 3]; + byte b1 = (byte)(p_76192_1_[i * 3 + 1] & 15); +- this.playersVisibleOnMap.put("icon-" + i, new MapData.MapCoord(b2, b3, b0, b1)); ++ this.playersVisibleOnMap.put(java.util.UUID.nameUUIDFromBytes(("icon-" + i).getBytes(org.apache.commons.codec.Charsets.US_ASCII)), new MapData.MapCoord(b2, b3, b0, b1)); + } + } + else if (p_76192_1_[0] == 2) @@ -265,7 +283,7 @@ if (mapinfo == null) diff --git a/patches/net/minecraft/world/storage/ThreadedFileIOBase.java.patch b/patches/net/minecraft/world/storage/ThreadedFileIOBase.java.patch new file mode 100644 index 0000000..5e6b988 --- /dev/null +++ b/patches/net/minecraft/world/storage/ThreadedFileIOBase.java.patch @@ -0,0 +1,19 @@ +--- ../src-base/minecraft/net/minecraft/world/storage/ThreadedFileIOBase.java ++++ ../src-work/minecraft/net/minecraft/world/storage/ThreadedFileIOBase.java +@@ -39,14 +39,14 @@ + ++this.savedIOCounter; + } + +- try ++ /*try // KCauldron start + { + Thread.sleep(this.isThreadWaiting ? 0L : 10L); + } + catch (InterruptedException interruptedexception1) + { + interruptedexception1.printStackTrace(); +- } ++ }*/ // KCauldron end + } + + if (this.threadedIOQueue.isEmpty()) diff --git a/src/main/java/kcauldron/KCauldron.java b/src/main/java/kcauldron/KCauldron.java index bdf9e05..156cbdd 100644 --- a/src/main/java/kcauldron/KCauldron.java +++ b/src/main/java/kcauldron/KCauldron.java @@ -41,6 +41,8 @@ public class KCauldron { sGroup = manifest.getProperty("KCauldron-Group"); sBranch = manifest.getProperty("KCauldron-Branch"); sChannel = manifest.getProperty("KCauldron-Channel"); + sLegacy = Boolean.parseBoolean(manifest.getProperty("KCauldron-Legacy")); + sOfficial = Boolean.parseBoolean(manifest.getProperty("KCauldron-Official")); break; } manifest.clear(); @@ -99,6 +101,18 @@ public class KCauldron { parseManifest(); return sChannel; } + + private static boolean sLegacy, sOfficial; + + public static boolean isLegacy() { + parseManifest(); + return sLegacy; + } + + public static boolean isOfficial() { + parseManifest(); + return sOfficial; + } public static File sNewServerLocation; public static String sNewServerVersion; diff --git a/src/main/java/kcauldron/updater/DefaultUpdateCallback.java b/src/main/java/kcauldron/updater/DefaultUpdateCallback.java index ecab5bd..f3442a8 100644 --- a/src/main/java/kcauldron/updater/DefaultUpdateCallback.java +++ b/src/main/java/kcauldron/updater/DefaultUpdateCallback.java @@ -6,6 +6,7 @@ import kcauldron.updater.KVersionRetriever.IVersionCheckCallback; import net.minecraft.server.MinecraftServer; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerJoinEvent; @@ -19,13 +20,21 @@ public class DefaultUpdateCallback implements IVersionCheckCallback { public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - if (mHasUpdate && hasPermission(player)) { - sendUpdate(player); + if (hasPermission(player)) { + if (KCauldron.isLegacy()) { + player.sendMessage(ChatColor.YELLOW + "We're running on legacy version on KCauldron, please update your version"); + } + if (!KCauldron.isOfficial()) { + player.sendMessage(ChatColor.YELLOW + "We're running on non-official version on KCauldron, please update your version"); + } + if (mHasUpdate) { + sendUpdate(player); + } } } private boolean hasPermission(CommandSender player) { - return player.hasPermission(KCauldronCommand.UPDATE); + return player.hasPermission(KCauldronCommand.UPDATE) || player.isOp(); } private void sendUpdate(CommandSender player) { diff --git a/src/main/java/kcauldron/updater/KVersionRetriever.java b/src/main/java/kcauldron/updater/KVersionRetriever.java index d72674b..a351958 100644 --- a/src/main/java/kcauldron/updater/KVersionRetriever.java +++ b/src/main/java/kcauldron/updater/KVersionRetriever.java @@ -83,6 +83,7 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { .get() .setUri("https://api.prok.pw/repo/version/" + mGroup + "/" + mName) + .addParameter("version", KCauldron.getCurrentVersion()) .addParameter("hostname", sServer.getHostname()) .addParameter("port", "" + sServer.getPort()).build(); HttpResponse response = HttpClientBuilder.create() diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java index 4dbbca5..bbe768d 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java @@ -1,6 +1,9 @@ package org.bukkit.craftbukkit.map; +import java.util.Map; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.map.MapCanvas; @@ -8,6 +11,8 @@ import org.bukkit.map.MapCursorCollection; import org.bukkit.map.MapRenderer; import org.bukkit.map.MapView; +import net.minecraft.world.storage.MapData; + public class CraftMapRenderer extends MapRenderer { private final net.minecraft.world.storage.MapData worldMap; @@ -32,14 +37,14 @@ public class CraftMapRenderer extends MapRenderer { cursors.removeCursor(cursors.getCursor(0)); } - for (Object key : worldMap.playersVisibleOnMap.keySet()) { + for (Map.Entry key : worldMap.playersVisibleOnMap.entrySet()) { // If this cursor is for a player check visibility with vanish system - Player other = Bukkit.getPlayerExact((String) key); + Player other = Bukkit.getPlayer(key.getKey()); if (other != null && !player.canSee(other)) { continue; } - net.minecraft.world.storage.MapData.MapCoord decoration = (net.minecraft.world.storage.MapData.MapCoord) worldMap.playersVisibleOnMap.get(key); + MapData.MapCoord decoration = key.getValue(); cursors.addCursor(decoration.centerX, decoration.centerZ, (byte) (decoration.iconRotation & 15), decoration.iconSize); } } diff --git a/src/main/java/org/spigotmc/CaseInsensitiveHashingStrategy.java b/src/main/java/org/spigotmc/CaseInsensitiveHashingStrategy.java new file mode 100644 index 0000000..365887f --- /dev/null +++ b/src/main/java/org/spigotmc/CaseInsensitiveHashingStrategy.java @@ -0,0 +1,18 @@ +package org.spigotmc; + +import gnu.trove.strategy.HashingStrategy; + +class CaseInsensitiveHashingStrategy implements HashingStrategy { + private static final long serialVersionUID = -9212222772914758878L; + static final CaseInsensitiveHashingStrategy INSTANCE = new CaseInsensitiveHashingStrategy(); + + @Override + public int computeHashCode(String object) { + return object.toLowerCase().hashCode(); + } + + @Override + public boolean equals(String o1, String o2) { + return o1.equalsIgnoreCase(o2); + } +} \ No newline at end of file diff --git a/src/main/java/org/spigotmc/CaseInsensitiveMap.java b/src/main/java/org/spigotmc/CaseInsensitiveMap.java new file mode 100644 index 0000000..e16535a --- /dev/null +++ b/src/main/java/org/spigotmc/CaseInsensitiveMap.java @@ -0,0 +1,15 @@ +package org.spigotmc; + +import gnu.trove.map.hash.TCustomHashMap; +import java.util.Map; + +public class CaseInsensitiveMap extends TCustomHashMap { + + public CaseInsensitiveMap() { + super(CaseInsensitiveHashingStrategy.INSTANCE); + } + + public CaseInsensitiveMap(Map map) { + super(CaseInsensitiveHashingStrategy.INSTANCE, map); + } +} \ No newline at end of file