mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-26 07:03:45 +01:00 
			
		
		
		
	Compare commits
	
		
			16 Commits
		
	
	
		
			fix/big-bo
			...
			fix/chunk-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 8fff833e84 | ||
|   | f867867a42 | ||
|   | 59eefd6865 | ||
|   | 587a286d05 | ||
|   | e10caf6aa0 | ||
|   | 08b325e37d | ||
|   | c394108ba6 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 31e89019f1 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 3a7075e28d | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8373b7874e | ||
|   | fe13882b97 | ||
|   | f45064c4c4 | ||
|   | af32399dd2 | ||
|   | f3c03348d9 | ||
|   | a53330e39b | ||
|   | e2ba93dab9 | 
							
								
								
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							| @@ -4,6 +4,7 @@ | |||||||
|     "config:base", |     "config:base", | ||||||
|     ":semanticCommitsDisabled" |     ":semanticCommitsDisabled" | ||||||
|   ], |   ], | ||||||
|  |   "automerge": true, | ||||||
|   "labels": [ |   "labels": [ | ||||||
|     "dependencies" |     "dependencies" | ||||||
|   ], |   ], | ||||||
|   | |||||||
| @@ -50,7 +50,6 @@ import com.plotsquared.bukkit.util.BukkitUtil; | |||||||
| import com.plotsquared.bukkit.util.BukkitWorld; | import com.plotsquared.bukkit.util.BukkitWorld; | ||||||
| import com.plotsquared.bukkit.util.SetGenCB; | import com.plotsquared.bukkit.util.SetGenCB; | ||||||
| import com.plotsquared.bukkit.util.TranslationUpdateManager; | import com.plotsquared.bukkit.util.TranslationUpdateManager; | ||||||
| import com.plotsquared.bukkit.util.UpdateUtility; |  | ||||||
| import com.plotsquared.bukkit.util.task.BukkitTaskManager; | import com.plotsquared.bukkit.util.task.BukkitTaskManager; | ||||||
| import com.plotsquared.bukkit.util.task.PaperTimeConverter; | import com.plotsquared.bukkit.util.task.PaperTimeConverter; | ||||||
| import com.plotsquared.bukkit.util.task.SpigotTimeConverter; | import com.plotsquared.bukkit.util.task.SpigotTimeConverter; | ||||||
| @@ -303,9 +302,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl | |||||||
|  |  | ||||||
|         this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE); |         this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE); | ||||||
|  |  | ||||||
|  |         /* TODO Enable update checker before v7 is released to GA | ||||||
|         if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { |         if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { | ||||||
|             injector.getInstance(UpdateUtility.class).updateChecker(); |             injector.getInstance(UpdateUtility.class).updateChecker(); | ||||||
|         } |         } | ||||||
|  |          */ | ||||||
|  |  | ||||||
|         if (PremiumVerification.isPremium()) { |         if (PremiumVerification.isPremium()) { | ||||||
|             LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID()); |             LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID()); | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator; | |||||||
| import com.plotsquared.core.util.ChunkManager; | import com.plotsquared.core.util.ChunkManager; | ||||||
| import com.sk89q.worldedit.bukkit.BukkitAdapter; | import com.sk89q.worldedit.bukkit.BukkitAdapter; | ||||||
| import com.sk89q.worldedit.math.BlockVector2; | import com.sk89q.worldedit.math.BlockVector2; | ||||||
|  | import com.sk89q.worldedit.math.BlockVector3; | ||||||
| import org.apache.logging.log4j.LogManager; | import org.apache.logging.log4j.LogManager; | ||||||
| import org.apache.logging.log4j.Logger; | import org.apache.logging.log4j.Logger; | ||||||
| import org.bukkit.HeightMap; | import org.bukkit.HeightMap; | ||||||
| @@ -420,7 +421,11 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap | |||||||
|         if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) { |         if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) { | ||||||
|             return lastPlotArea; |             return lastPlotArea; | ||||||
|         } |         } | ||||||
|         PlotArea area = UncheckedWorldLocation.at(name, chunkX << 4, 0, chunkZ << 4).getPlotArea(); |         BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4); | ||||||
|  |         if (lastPlotArea != null && lastPlotArea.getRegion().contains(loc) && lastPlotArea.getRegion().contains(loc)) { | ||||||
|  |             return lastPlotArea; | ||||||
|  |         } | ||||||
|  |         PlotArea area = UncheckedWorldLocation.at(name, loc).getPlotArea(); | ||||||
|         if (area == null) { |         if (area == null) { | ||||||
|             throw new IllegalStateException(String.format( |             throw new IllegalStateException(String.format( | ||||||
|                     "Cannot generate chunk that does not belong to a plot area. World: %s", |                     "Cannot generate chunk that does not belong to a plot area. World: %s", | ||||||
|   | |||||||
| @@ -1116,6 +1116,7 @@ public class BlockEventListener implements Listener { | |||||||
|             if (plot != null) { |             if (plot != null) { | ||||||
|                 plot.debug("Explosion was cancelled because explosion = false"); |                 plot.debug("Explosion was cancelled because explosion = false"); | ||||||
|             } |             } | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|         event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation())))); |         event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation())))); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot; | |||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag; | ||||||
| import com.plotsquared.core.util.PlotFlagUtil; | import com.plotsquared.core.util.PlotFlagUtil; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
| import org.bukkit.block.Block; | import org.bukkit.block.Block; | ||||||
| @@ -96,12 +97,12 @@ public class BlockEventListener117 implements Listener { | |||||||
|                 area, |                 area, | ||||||
|                 MiscInteractFlag.class, |                 MiscInteractFlag.class, | ||||||
|                 true |                 true | ||||||
|         ) || plot != null && !plot.getFlag( |         ) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) { | ||||||
|                 MiscInteractFlag.class)) { |  | ||||||
|             if (plotPlayer != null) { |             if (plotPlayer != null) { | ||||||
|                 if (plot != null) { |                 if (plot != null) { | ||||||
|                     if (!plot.isAdded(plotPlayer.getUUID())) { |                     if (!plot.isAdded(plotPlayer.getUUID())) { | ||||||
|                         plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); |                         plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " + | ||||||
|  |                                 "sculk-sensor-interact and misc-interact = false"); | ||||||
|                         event.setCancelled(true); |                         event.setCancelled(true); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -112,13 +113,15 @@ public class BlockEventListener117 implements Listener { | |||||||
|                 if (plot != null) { |                 if (plot != null) { | ||||||
|                     if (itemThrower == null && (itemThrower = item.getOwner()) == null) { |                     if (itemThrower == null && (itemThrower = item.getOwner()) == null) { | ||||||
|                         plot.debug( |                         plot.debug( | ||||||
|                                 "A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved."); |                                 "A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " + | ||||||
|  |                                         "misc-interact = false and the item's owner could not be resolved."); | ||||||
|                         event.setCancelled(true); |                         event.setCancelled(true); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     if (!plot.isAdded(itemThrower)) { |                     if (!plot.isAdded(itemThrower)) { | ||||||
|                         if (!plot.isAdded(itemThrower)) { |                         if (!plot.isAdded(itemThrower)) { | ||||||
|                             plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false"); |                             plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " + | ||||||
|  |                                     "misc-interact = false"); | ||||||
|                             event.setCancelled(true); |                             event.setCancelled(true); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
| @@ -137,7 +140,6 @@ public class BlockEventListener117 implements Listener { | |||||||
|         if (area == null) { |         if (area == null) { | ||||||
|             for (int i = blocks.size() - 1; i >= 0; i--) { |             for (int i = blocks.size() - 1; i >= 0; i--) { | ||||||
|                 Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); |                 Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); | ||||||
|                 blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation()); |  | ||||||
|                 if (blockLocation.isPlotArea()) { |                 if (blockLocation.isPlotArea()) { | ||||||
|                     blocks.remove(i); |                     blocks.remove(i); | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot; | |||||||
| import com.plotsquared.core.plot.PlotArea; | import com.plotsquared.core.plot.PlotArea; | ||||||
| import com.plotsquared.core.plot.world.PlotAreaManager; | import com.plotsquared.core.plot.world.PlotAreaManager; | ||||||
| import com.plotsquared.core.plot.world.SinglePlotArea; | import com.plotsquared.core.plot.world.SinglePlotArea; | ||||||
|  | import com.plotsquared.core.util.ReflectionUtils; | ||||||
| import com.plotsquared.core.util.ReflectionUtils.RefClass; | import com.plotsquared.core.util.ReflectionUtils.RefClass; | ||||||
| import com.plotsquared.core.util.ReflectionUtils.RefField; | import com.plotsquared.core.util.ReflectionUtils.RefField; | ||||||
| import com.plotsquared.core.util.ReflectionUtils.RefMethod; | import com.plotsquared.core.util.ReflectionUtils.RefMethod; | ||||||
| @@ -64,9 +65,11 @@ public class ChunkListener implements Listener { | |||||||
|     private final PlotAreaManager plotAreaManager; |     private final PlotAreaManager plotAreaManager; | ||||||
|     private final int version; |     private final int version; | ||||||
|  |  | ||||||
|  |     private RefMethod methodSetUnsaved; | ||||||
|     private RefMethod methodGetHandleChunk; |     private RefMethod methodGetHandleChunk; | ||||||
|     private RefMethod methodGetHandleWorld; |     private RefMethod methodGetHandleWorld; | ||||||
|     private RefField mustSave; |     private RefField mustNotSave; | ||||||
|  |     private Object objChunkStatusFull = null; | ||||||
|     /* |     /* | ||||||
|     private RefMethod methodGetFullChunk; |     private RefMethod methodGetFullChunk; | ||||||
|     private RefMethod methodGetBukkitChunk; |     private RefMethod methodGetBukkitChunk; | ||||||
| @@ -79,7 +82,6 @@ public class ChunkListener implements Listener { | |||||||
|     */ |     */ | ||||||
|     private Chunk lastChunk; |     private Chunk lastChunk; | ||||||
|     private boolean ignoreUnload = false; |     private boolean ignoreUnload = false; | ||||||
|     private boolean isTrueForNotSave = true; |  | ||||||
|  |  | ||||||
|     @Inject |     @Inject | ||||||
|     public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) { |     public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) { | ||||||
| @@ -90,22 +92,27 @@ public class ChunkListener implements Listener { | |||||||
|         } |         } | ||||||
|         try { |         try { | ||||||
|             RefClass classCraftWorld = getRefClass("{cb}.CraftWorld"); |             RefClass classCraftWorld = getRefClass("{cb}.CraftWorld"); | ||||||
|             this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle"); |  | ||||||
|             RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); |             RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); | ||||||
|             this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle"); |             ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess"); | ||||||
|  |             this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class); | ||||||
|  |             try { | ||||||
|  |                 this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle"); | ||||||
|  |             } catch (NoSuchMethodException ignored) { | ||||||
|  |                 try { | ||||||
|  |                     RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus"); | ||||||
|  |                     this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null); | ||||||
|  |                     this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()); | ||||||
|  |                 } catch (NoSuchMethodException ex) { | ||||||
|  |                     throw new RuntimeException(ex); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|             try { |             try { | ||||||
|                 if (version < 17) { |                 if (version < 17) { | ||||||
|                     RefClass classChunk = getRefClass("{nms}.Chunk"); |                     RefClass classChunk = getRefClass("{nms}.Chunk"); | ||||||
|                     if (version == 13) { |                     this.mustNotSave = classChunk.getField("mustNotSave"); | ||||||
|                         this.mustSave = classChunk.getField("mustSave"); |  | ||||||
|                         this.isTrueForNotSave = false; |  | ||||||
|                     } else { |  | ||||||
|                         this.mustSave = classChunk.getField("mustNotSave"); |  | ||||||
|                     } |  | ||||||
|                 } else { |                 } else { | ||||||
|                     RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk"); |                     RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk"); | ||||||
|                     this.mustSave = classChunk.getField("mustNotSave"); |                     this.mustNotSave = classChunk.getField("mustNotSave"); | ||||||
|  |  | ||||||
|                 } |                 } | ||||||
|             } catch (NoSuchFieldException e) { |             } catch (NoSuchFieldException e) { | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
| @@ -167,10 +174,13 @@ public class ChunkListener implements Listener { | |||||||
|         if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) { |         if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         Object c = this.methodGetHandleChunk.of(chunk).call(); |         Object c = objChunkStatusFull != null | ||||||
|         RefField.RefExecutor field = this.mustSave.of(c); |                 ? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull) | ||||||
|         if ((Boolean) field.get() != isTrueForNotSave) { |                 : this.methodGetHandleChunk.of(chunk).call(); | ||||||
|             field.set(isTrueForNotSave); |         RefField.RefExecutor field = this.mustNotSave.of(c); | ||||||
|  |         methodSetUnsaved.of(c).call(false); | ||||||
|  |         if (!((Boolean) field.get())) { | ||||||
|  |             field.set(true); | ||||||
|             if (chunk.isLoaded()) { |             if (chunk.isLoaded()) { | ||||||
|                 ignoreUnload = true; |                 ignoreUnload = true; | ||||||
|                 chunk.unload(false); |                 chunk.unload(false); | ||||||
|   | |||||||
| @@ -1167,7 +1167,7 @@ public class PlayerEventListener implements Listener { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (type.isEdible()) { |                 if (type.isEdible()) { | ||||||
|                     //Allow all players to eat while also allowing the block place event ot be fired |                     //Allow all players to eat while also allowing the block place event to be fired | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 if (type == Material.ARMOR_STAND) { |                 if (type == Material.ARMOR_STAND) { | ||||||
|   | |||||||
| @@ -31,45 +31,39 @@ import org.bukkit.event.Listener; | |||||||
| import org.bukkit.event.world.ChunkEvent; | import org.bukkit.event.world.ChunkEvent; | ||||||
| import org.bukkit.event.world.ChunkLoadEvent; | import org.bukkit.event.world.ChunkLoadEvent; | ||||||
|  |  | ||||||
| import java.lang.reflect.Field; |  | ||||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||||
|  |  | ||||||
| import static com.plotsquared.core.util.ReflectionUtils.getRefClass; | import static com.plotsquared.core.util.ReflectionUtils.getRefClass; | ||||||
|  |  | ||||||
| public class SingleWorldListener implements Listener { | public class SingleWorldListener implements Listener { | ||||||
|  |  | ||||||
|     private final Method methodGetHandleChunk; |     private final Method methodSetUnsaved; | ||||||
|     private Field shouldSave = null; |     private Method methodGetHandleChunk; | ||||||
|  |     private Object objChunkStatusFull = null; | ||||||
|  |  | ||||||
|     public SingleWorldListener() throws Exception { |     public SingleWorldListener() throws Exception { | ||||||
|         ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); |         ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); | ||||||
|         this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod(); |         ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess"); | ||||||
|  |         this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod(); | ||||||
|         try { |         try { | ||||||
|             if (PlotSquared.platform().serverVersion()[1] < 17) { |             this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod(); | ||||||
|                 ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk"); |         } catch (NoSuchMethodException ignored) { | ||||||
|                 if (PlotSquared.platform().serverVersion()[1] == 13) { |             try { | ||||||
|                     this.shouldSave = classChunk.getField("mustSave").getRealField(); |                 ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus"); | ||||||
|                 } else { |                 this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null); | ||||||
|                     this.shouldSave = classChunk.getField("s").getRealField(); |                 this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod(); | ||||||
|                 } |             } catch (NoSuchMethodException ex) { | ||||||
|             } else if (PlotSquared.platform().serverVersion()[1] == 17) { |                 throw new RuntimeException(ex); | ||||||
|                 ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk"); |  | ||||||
|                 this.shouldSave = classChunk.getField("r").getRealField(); |  | ||||||
|             } else if (PlotSquared.platform().serverVersion()[1] == 18) { |  | ||||||
|                 ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess"); |  | ||||||
|                 this.shouldSave = classChunk.getField("b").getRealField(); |  | ||||||
|             } |             } | ||||||
|         } catch (NoSuchFieldException e) { |  | ||||||
|             e.printStackTrace(); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void markChunkAsClean(Chunk chunk) { |     public void markChunkAsClean(Chunk chunk) { | ||||||
|         try { |         try { | ||||||
|             Object nmsChunk = methodGetHandleChunk.invoke(chunk); |             Object nmsChunk = objChunkStatusFull != null | ||||||
|             if (shouldSave != null) { |                     ? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull) | ||||||
|                 this.shouldSave.set(nmsChunk, false); |                     : this.methodGetHandleChunk.invoke(chunk); | ||||||
|             } |             methodSetUnsaved.invoke(nmsChunk, false); | ||||||
|         } catch (Throwable e) { |         } catch (Throwable e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
| @@ -85,7 +79,12 @@ public class SingleWorldListener implements Listener { | |||||||
|         if (!SinglePlotArea.isSinglePlotWorld(name)) { |         if (!SinglePlotArea.isSinglePlotWorld(name)) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         int x = event.getChunk().getX(); | ||||||
|  |         int z = event.getChunk().getZ(); | ||||||
|  |         if (x < 16 && x > -16 && z < 16 && z > -16) { | ||||||
|  |             // Allow spawn to generate | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         markChunkAsClean(event.getChunk()); |         markChunkAsClean(event.getChunk()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ import java.nio.file.Paths; | |||||||
| import java.util.stream.Stream; | import java.util.stream.Stream; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * This is a helper class which replaces occurrences of 'suggest_command' with 'run_command' in messages_%.json. |  * This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json. | ||||||
|  * MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences |  * MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences | ||||||
|  * while loading PlotSquared. |  * while loading PlotSquared. | ||||||
|  * |  * | ||||||
| @@ -38,14 +38,22 @@ import java.util.stream.Stream; | |||||||
| public class TranslationUpdateManager { | public class TranslationUpdateManager { | ||||||
|  |  | ||||||
|     public static void upgradeTranslationFile() throws IOException { |     public static void upgradeTranslationFile() throws IOException { | ||||||
|         String searchText = "suggest_command"; |         String suggestCommand = "suggest_command"; | ||||||
|         String replacementText = "run_command"; |         String suggestCommandReplacement = "run_command"; | ||||||
|  |         String minHeight = "minHeight"; | ||||||
|  |         String minheightReplacement = "minheight"; | ||||||
|  |         String maxHeight = "maxHeight"; | ||||||
|  |         String maxheightReplacement = "maxheight"; | ||||||
|  |  | ||||||
|         try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) { |         try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) { | ||||||
|             paths |             paths | ||||||
|                     .filter(Files::isRegularFile) |                     .filter(Files::isRegularFile) | ||||||
|                     .filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json")) |                     .filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json")) | ||||||
|                     .forEach(p -> replaceInFile(p, searchText, replacementText)); |                     .forEach(p -> { | ||||||
|  |                         replaceInFile(p, suggestCommand, suggestCommandReplacement); | ||||||
|  |                         replaceInFile(p, minHeight, minheightReplacement); | ||||||
|  |                         replaceInFile(p, maxHeight, maxheightReplacement); | ||||||
|  |                     }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -298,7 +298,7 @@ public class Auto extends SubCommand { | |||||||
|             PlotExpression costExp = plotarea.getPrices().get("claim"); |             PlotExpression costExp = plotarea.getPrices().get("claim"); | ||||||
|             PlotExpression mergeCostExp = plotarea.getPrices().get("merge"); |             PlotExpression mergeCostExp = plotarea.getPrices().get("merge"); | ||||||
|             int size = sizeX * sizeZ; |             int size = sizeX * sizeZ; | ||||||
|             double mergeCost = size > 1 && mergeCostExp == null ? 0d : mergeCostExp.evaluate(size); |             double mergeCost = size <= 1 || mergeCostExp == null ? 0d : mergeCostExp.evaluate(size); | ||||||
|             double cost = costExp.evaluate(Settings.Limit.GLOBAL ? |             double cost = costExp.evaluate(Settings.Limit.GLOBAL ? | ||||||
|                     player.getPlotCount() : |                     player.getPlotCount() : | ||||||
|                     player.getPlotCount(plotarea.getWorldName())); |                     player.getPlotCount(plotarea.getWorldName())); | ||||||
|   | |||||||
| @@ -112,15 +112,15 @@ public class Kick extends SubCommand { | |||||||
|                 for (PlotPlayer<?> player2 : players) { |                 for (PlotPlayer<?> player2 : players) { | ||||||
|                     if (!plot.equals(player2.getCurrentPlot())) { |                     if (!plot.equals(player2.getCurrentPlot())) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("errors.invalid_player"), |                                 TranslatableCaption.of("kick.player_not_in_plot"), | ||||||
|                                 TagResolver.resolver("value", Tag.inserting(Component.text(args[0]))) |                                 TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName()))) | ||||||
|                         ); |                         ); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { |                     if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) { | ||||||
|                         player.sendMessage( |                         player.sendMessage( | ||||||
|                                 TranslatableCaption.of("cluster.cannot_kick_player"), |                                 TranslatableCaption.of("kick.cannot_kick_player"), | ||||||
|                                 TagResolver.resolver("name", Tag.inserting(Component.text(player2.getName()))) |                                 TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName()))) | ||||||
|                         ); |                         ); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|   | |||||||
| @@ -69,8 +69,8 @@ public class HybridGen extends IndependentPlotGenerator { | |||||||
|             EnumSet<SchematicFeature> features |             EnumSet<SchematicFeature> features | ||||||
|     ) { |     ) { | ||||||
|         int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT); |         int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT); | ||||||
|         if ((features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ROAD_ON_TOP) |         boolean isRoad = features.contains(SchematicFeature.ROAD); | ||||||
|                 || (!features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ON_TOP)) { |         if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) { | ||||||
|             minY = world.SCHEM_Y; |             minY = world.SCHEM_Y; | ||||||
|         } else { |         } else { | ||||||
|             minY = world.getMinBuildHeight(); |             minY = world.getMinBuildHeight(); | ||||||
|   | |||||||
| @@ -162,6 +162,7 @@ public class HybridPlotManager extends ClassicPlotManager { | |||||||
|         } else { |         } else { | ||||||
|             minY = hybridPlotWorld.getMinBuildHeight(); |             minY = hybridPlotWorld.getMinBuildHeight(); | ||||||
|         } |         } | ||||||
|  |         int schemYDiff = (isRoad ? hybridPlotWorld.getRoadYStart() : hybridPlotWorld.getPlotYStart()) - minY; | ||||||
|         BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock(); |         BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock(); | ||||||
|         for (int x = pos1.getX(); x <= pos2.getX(); x++) { |         for (int x = pos1.getX(); x <= pos2.getX(); x++) { | ||||||
|             short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size); |             short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size); | ||||||
| @@ -178,10 +179,14 @@ public class HybridPlotManager extends ClassicPlotManager { | |||||||
|                     for (int y = 0; y < blocks.length; y++) { |                     for (int y = 0; y < blocks.length; y++) { | ||||||
|                         if (blocks[y] != null) { |                         if (blocks[y] != null) { | ||||||
|                             queue.setBlock(x, minY + y, z, blocks[y]); |                             queue.setBlock(x, minY + y, z, blocks[y]); | ||||||
|                         } else if (!isRoad) { |                         } else if (y > schemYDiff) { | ||||||
|                             // This is necessary, otherwise any blocks not specified in the schematic will remain after a clear |                             // This is necessary, otherwise any blocks not specified in the schematic will remain after a clear. | ||||||
|                             //  Do not set air for road as this may cause cavernous roads when debugroadregen is used |                             // This should only be done where the schematic has actually "started" | ||||||
|                             queue.setBlock(x, minY + y, z, airBlock); |                             queue.setBlock(x, minY + y, z, airBlock); | ||||||
|  |                         } else if (isRoad) { | ||||||
|  |                             queue.setBlock(x, minY + y, z, hybridPlotWorld.ROAD_BLOCK.toPattern()); | ||||||
|  |                         } else { | ||||||
|  |                             queue.setBlock(x, minY + y, z, hybridPlotWorld.MAIN_BLOCK.toPattern()); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -76,6 +76,9 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|      * The Y level at which schematic generation will start, lowest of either road or plot schematic generation. |      * The Y level at which schematic generation will start, lowest of either road or plot schematic generation. | ||||||
|      */ |      */ | ||||||
|     public int SCHEM_Y; |     public int SCHEM_Y; | ||||||
|  |  | ||||||
|  |     private int plotY; | ||||||
|  |     private int roadY; | ||||||
|     private Location SIGN_LOCATION; |     private Location SIGN_LOCATION; | ||||||
|     private File root = null; |     private File root = null; | ||||||
|     private int lastOverlayHeightError = Integer.MIN_VALUE; |     private int lastOverlayHeightError = Integer.MIN_VALUE; | ||||||
| @@ -252,13 +255,13 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|  |  | ||||||
|         SCHEM_Y = schematicStartHeight(); |         SCHEM_Y = schematicStartHeight(); | ||||||
|  |  | ||||||
|         // plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB |         // plotY and roadY are important to allow plot and/or road schematic "overflow" into each other | ||||||
|         //  exceptions when attempting either to set blocks to, or get block from G_SCH |         // without causing AIOOB exceptions when attempting either to set blocks to, or get block from G_SCH | ||||||
|         // Default plot schematic start height, normalized to the minimum height schematics are pasted from. |         // Default plot schematic start height, normalized to the minimum height schematics are pasted from. | ||||||
|         int plotY = PLOT_HEIGHT - SCHEM_Y; |         plotY = PLOT_HEIGHT - SCHEM_Y; | ||||||
|         int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT; |         int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT; | ||||||
|         // Default road schematic start height, normalized to the minimum height schematics are pasted from. |         // Default road schematic start height, normalized to the minimum height schematics are pasted from. | ||||||
|         int roadY = minRoadWall - SCHEM_Y; |         roadY = minRoadWall - SCHEM_Y; | ||||||
|  |  | ||||||
|         int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; |         int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; | ||||||
|  |  | ||||||
| @@ -267,14 +270,15 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|  |  | ||||||
|         // SCHEM_Y should be normalised to the plot "start" height |         // SCHEM_Y should be normalised to the plot "start" height | ||||||
|         if (schematic3 != null) { |         if (schematic3 != null) { | ||||||
|             plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY(); |             plotSchemHeight = schematic3.getClipboard().getDimensions().getY(); | ||||||
|             if (maxSchematicHeight == worldGenHeight) { |             if (plotSchemHeight == worldGenHeight) { | ||||||
|                 SCHEM_Y = getMinGenHeight(); |                 SCHEM_Y = getMinGenHeight(); | ||||||
|                 plotY = 0; |                 plotY = 0; | ||||||
|             } else if (!Settings.Schematics.PASTE_ON_TOP) { |             } else if (!Settings.Schematics.PASTE_ON_TOP) { | ||||||
|                 SCHEM_Y = getMinBuildHeight(); |                 SCHEM_Y = getMinBuildHeight(); | ||||||
|                 plotY = 0; |                 plotY = 0; | ||||||
|             } |             } | ||||||
|  |             maxSchematicHeight = plotY + plotSchemHeight; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         int roadSchemHeight; |         int roadSchemHeight; | ||||||
| @@ -554,4 +558,24 @@ public class HybridPlotWorld extends ClassicPlotWorld { | |||||||
|         return this.root; |         return this.root; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get the y value where the plot schematic should be pasted from. | ||||||
|  |      * | ||||||
|  |      * @return plot schematic y start value | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public int getPlotYStart() { | ||||||
|  |         return SCHEM_Y + plotY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get the y value where the road schematic should be pasted from. | ||||||
|  |      * | ||||||
|  |      * @return road schematic y start value | ||||||
|  |      * @since TODO | ||||||
|  |      */ | ||||||
|  |     public int getRoadYStart() { | ||||||
|  |         return SCHEM_Y + roadY; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -668,7 +668,7 @@ public class HybridUtils { | |||||||
|                     } |                     } | ||||||
|                     if (condition) { |                     if (condition) { | ||||||
|                         BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ)); |                         BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ)); | ||||||
|                         int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1; |                         int minY = plotWorld.getRoadYStart(); | ||||||
|                         int maxDy = Math.max(extend, blocks.length); |                         int maxDy = Math.max(extend, blocks.length); | ||||||
|                         for (int dy = 0; dy < maxDy; dy++) { |                         for (int dy = 0; dy < maxDy; dy++) { | ||||||
|                             if (dy > blocks.length - 1) { |                             if (dy > blocks.length - 1) { | ||||||
|   | |||||||
| @@ -657,9 +657,9 @@ public abstract class PlotArea implements ComponentLike { | |||||||
|             player.sendMessage( |             player.sendMessage( | ||||||
|                     TranslatableCaption.of("height.height_limit"), |                     TranslatableCaption.of("height.height_limit"), | ||||||
|                     TagResolver.builder() |                     TagResolver.builder() | ||||||
|                             .tag("minHeight", Tag.inserting(Component.text(minBuildHeight))) |                             .tag("minheight", Tag.inserting(Component.text(minBuildHeight))) | ||||||
|                             .tag( |                             .tag( | ||||||
|                                     "maxHeight", |                                     "maxheight", | ||||||
|                                     Tag.inserting(Component.text(maxBuildHeight)) |                                     Tag.inserting(Component.text(maxBuildHeight)) | ||||||
|                             ).build() |                             ).build() | ||||||
|             ); |             ); | ||||||
|   | |||||||
| @@ -91,6 +91,7 @@ import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; | |||||||
| import com.plotsquared.core.plot.flag.implementations.PveFlag; | import com.plotsquared.core.plot.flag.implementations.PveFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.PvpFlag; | import com.plotsquared.core.plot.flag.implementations.PvpFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.RedstoneFlag; | import com.plotsquared.core.plot.flag.implementations.RedstoneFlag; | ||||||
|  | import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; | import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.SnowFormFlag; | import com.plotsquared.core.plot.flag.implementations.SnowFormFlag; | ||||||
| import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag; | import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag; | ||||||
| @@ -172,6 +173,7 @@ public final class GlobalFlagContainer extends FlagContainer { | |||||||
|         this.addFlag(MobBreakFlag.MOB_BREAK_FALSE); |         this.addFlag(MobBreakFlag.MOB_BREAK_FALSE); | ||||||
|         this.addFlag(MobPlaceFlag.MOB_PLACE_FALSE); |         this.addFlag(MobPlaceFlag.MOB_PLACE_FALSE); | ||||||
|         this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE); |         this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE); | ||||||
|  |         this.addFlag(SculkSensorInteractFlag.SCULK_SENSOR_INTERACT_FALSE); | ||||||
|         this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE); |         this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE); | ||||||
|         this.addFlag(MycelGrowFlag.MYCEL_GROW_TRUE); |         this.addFlag(MycelGrowFlag.MYCEL_GROW_TRUE); | ||||||
|         this.addFlag(NotifyEnterFlag.NOTIFY_ENTER_FALSE); |         this.addFlag(NotifyEnterFlag.NOTIFY_ENTER_FALSE); | ||||||
|   | |||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | /* | ||||||
|  |  * PlotSquared, a land and world management plugin for Minecraft. | ||||||
|  |  * Copyright (C) IntellectualSites <https://intellectualsites.com> | ||||||
|  |  * Copyright (C) IntellectualSites team and contributors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.plotsquared.core.plot.flag.implementations; | ||||||
|  |  | ||||||
|  | import com.plotsquared.core.configuration.caption.TranslatableCaption; | ||||||
|  | import com.plotsquared.core.plot.flag.types.BooleanFlag; | ||||||
|  | import org.checkerframework.checker.nullness.qual.NonNull; | ||||||
|  |  | ||||||
|  | public class SculkSensorInteractFlag extends BooleanFlag<SculkSensorInteractFlag> { | ||||||
|  |  | ||||||
|  |     public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_TRUE = new SculkSensorInteractFlag(true); | ||||||
|  |     public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_FALSE = new SculkSensorInteractFlag(false); | ||||||
|  |  | ||||||
|  |     private SculkSensorInteractFlag(boolean value) { | ||||||
|  |         super(value, TranslatableCaption.of("flags.flag_description_sculk_sensor_interact")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected SculkSensorInteractFlag flagOf(@NonNull Boolean value) { | ||||||
|  |         return value ? SCULK_SENSOR_INTERACT_TRUE : SCULK_SENSOR_INTERACT_FALSE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -29,17 +29,17 @@ import org.checkerframework.checker.nullness.qual.NonNull; | |||||||
| import org.checkerframework.checker.nullness.qual.Nullable; | import org.checkerframework.checker.nullness.qual.Nullable; | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | import java.util.concurrent.ConcurrentHashMap; | ||||||
|  |  | ||||||
| @Singleton | @Singleton | ||||||
| public class DefaultPlotAreaManager implements PlotAreaManager { | public class DefaultPlotAreaManager implements PlotAreaManager { | ||||||
|  |  | ||||||
|     final PlotArea[] noPlotAreas = new PlotArea[0]; |     final PlotArea[] noPlotAreas = new PlotArea[0]; | ||||||
|     private final Map<String, PlotWorld> plotWorlds = new HashMap<>(); |     private final Map<String, PlotWorld> plotWorlds = new ConcurrentHashMap<>(); | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public @NonNull PlotArea[] getAllPlotAreas() { |     public @NonNull PlotArea[] getAllPlotAreas() { | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ | |||||||
|   "cluster.cluster_deleted": "<prefix><dark_aqua>Successfully deleted the cluster </dark_aqua><gold><cluster></gold><dark_aqua>.</dark_aqua>", |   "cluster.cluster_deleted": "<prefix><dark_aqua>Successfully deleted the cluster </dark_aqua><gold><cluster></gold><dark_aqua>.</dark_aqua>", | ||||||
|   "cluster.cluster_resized": "<prefix><dark_aqua>Successfully resized the cluster.</dark_aqua>", |   "cluster.cluster_resized": "<prefix><dark_aqua>Successfully resized the cluster.</dark_aqua>", | ||||||
|   "cluster.cluster_added_user": "<prefix><dark_aqua>Successfully added user to the cluster.</dark_aqua>", |   "cluster.cluster_added_user": "<prefix><dark_aqua>Successfully added user to the cluster.</dark_aqua>", | ||||||
|   "cluster.cannot_kick_player": "<prefix><red>You cannot kick that player: </red><gray><name></gray>", |   "cluster.cannot_kick_player": "<prefix><red>You cannot kick the player <gray><name></gray>.</red>", | ||||||
|   "cluster.cluster_invited": "<prefix><gold>You have been invited to the following cluster: </gold><gray><cluster>.</gray>", |   "cluster.cluster_invited": "<prefix><gold>You have been invited to the following cluster: </gold><gray><cluster>.</gray>", | ||||||
|   "cluster.cluster_removed": "<prefix><gold>You have been removed from cluster: </gold><gray><cluster>.</gray>", |   "cluster.cluster_removed": "<prefix><gold>You have been removed from cluster: </gold><gray><cluster>.</gray>", | ||||||
|   "cluster.cluster_kicked_user": "<prefix><dark_aqua>Successfully kicked the user from the cluster.</dark_aqua>", |   "cluster.cluster_kicked_user": "<prefix><dark_aqua>Successfully kicked the user from the cluster.</dark_aqua>", | ||||||
| @@ -411,6 +411,8 @@ | |||||||
|   "deny.no_enter": "<prefix><red>You are denied from the plot <red><gold><plot></gold><red> and therefore not allowed to enter.</red>", |   "deny.no_enter": "<prefix><red>You are denied from the plot <red><gold><plot></gold><red> and therefore not allowed to enter.</red>", | ||||||
|   "deny.you_got_denied": "<prefix><red>You are denied from the plot you were previously on, and got teleported to spawn.</red>", |   "deny.you_got_denied": "<prefix><red>You are denied from the plot you were previously on, and got teleported to spawn.</red>", | ||||||
|   "deny.cant_remove_owner": "<prefix><red>You can't remove the plot owner.</red>", |   "deny.cant_remove_owner": "<prefix><red>You can't remove the plot owner.</red>", | ||||||
|  |   "kick.player_not_in_plot": "<prefix><red>The player <gray><player></gray> is not on this plot.</red>", | ||||||
|  |   "kick.cannot_kick_player": "<prefix><red>You cannot kick the player <gray><player></gray>.</red>", | ||||||
|   "kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>", |   "kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>", | ||||||
|   "trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>", |   "trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>", | ||||||
|   "trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>", |   "trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>", | ||||||
| @@ -486,7 +488,7 @@ | |||||||
|   "single.get_position": "<prefix><gold>Go to the first corner and use: <gray><command> to create position 1.</gold>", |   "single.get_position": "<prefix><gold>Go to the first corner and use: <gray><command> to create position 1.</gold>", | ||||||
|   "single.delete_world_region": "<prefix><red>Stop the server and delete: <world>/region.</red>", |   "single.delete_world_region": "<prefix><red>Stop the server and delete: <world>/region.</red>", | ||||||
|   "single.regeneration_complete": "<prefix><gold>Regeneration complete.</gold>", |   "single.regeneration_complete": "<prefix><gold>Regeneration complete.</gold>", | ||||||
|   "single.worldcreation_location": "<prefix><gold>World creation settings may be stored in multiple locations:</gold>\n<dark_gray> - </dark_gray><gray>bukkit.yml in your server's root folder.</gray>\n<dark_gray> - </dark_gray><gray>PlotSquared's settings.yml</gray>\n<dark_gray> - </dark_gray><gray>Hyperverse's worlds.yml (or any world management plugin)</gray>\n<dark_gray> - </dark_gray><red>Stop the server and delete it from these locations.</red>", |   "single.worldcreation_location": "<prefix><gold>World creation settings may be stored in multiple locations:</gold>\n<dark_gray> - </dark_gray><gray>bukkit.yml in your server's root folder.</gray>\n<dark_gray> - </dark_gray><gray>PlotSquared's worlds.yml</gray>\n<dark_gray> - </dark_gray><gray>Hyperverse's worlds.yml (or any world management plugin)</gray>\n<dark_gray> - </dark_gray><red>Stop the server and delete it from these locations.</red>", | ||||||
|   "legacyconfig.legacy_config_found": "<prefix><green>A legacy configuration file was detected. Conversion will be attempted.</green>", |   "legacyconfig.legacy_config_found": "<prefix><green>A legacy configuration file was detected. Conversion will be attempted.</green>", | ||||||
|   "legacyconfig.legacy_config_backup": "<prefix><gold>A copy of worlds.yml has been saved in the file worlds.yml.old</gold>.", |   "legacyconfig.legacy_config_backup": "<prefix><gold>A copy of worlds.yml has been saved in the file worlds.yml.old</gold>.", | ||||||
|   "legacyconfig.legacy_config_replaced": "<prefix><gray><value1> has been replaced with <value2></gray>", |   "legacyconfig.legacy_config_replaced": "<prefix><gray><value1> has been replaced with <value2></gray>", | ||||||
| @@ -572,6 +574,7 @@ | |||||||
|   "flags.flag_description_misc_break": "<gray>Set to `true` to allow guests to break miscellaneous items.</gray>", |   "flags.flag_description_misc_break": "<gray>Set to `true` to allow guests to break miscellaneous items.</gray>", | ||||||
|   "flags.flag_description_misc_cap": "<gray>Set to an integer value to limit the amount of miscellaneous entities on the plot.</gray>", |   "flags.flag_description_misc_cap": "<gray>Set to an integer value to limit the amount of miscellaneous entities on the plot.</gray>", | ||||||
|   "flags.flag_description_misc_interact": "<gray>Set to `true` to allow guests to interact with miscellaneous items.</gray>", |   "flags.flag_description_misc_interact": "<gray>Set to `true` to allow guests to interact with miscellaneous items.</gray>", | ||||||
|  |   "flags.flag_description_sculk_sensor_interact": "<gray>Set to `true` to allow guests to interact with sculk sensors.</gray>", | ||||||
|   "flags.flag_description_misc_place": "<gray>Set to `true` to allow guests to place miscellaneous items.</gray>", |   "flags.flag_description_misc_place": "<gray>Set to `true` to allow guests to place miscellaneous items.</gray>", | ||||||
|   "flags.flag_description_mob_break": "<gray>Set to `true` to allow mobs to break blocks within the plot.</gray>", |   "flags.flag_description_mob_break": "<gray>Set to `true` to allow mobs to break blocks within the plot.</gray>", | ||||||
|   "flags.flag_description_mob_cap": "<gray>Set to an integer value to limit the amount of mobs on the plot.</gray>", |   "flags.flag_description_mob_cap": "<gray>Set to an integer value to limit the amount of mobs on the plot.</gray>", | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ subprojects { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|         implementation(platform("com.intellectualsites.bom:bom-newest:1.29")) |         implementation(platform("com.intellectualsites.bom:bom-newest:1.31")) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     dependencies { |     dependencies { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ guice = "7.0.0" | |||||||
| spotbugs = "4.7.3" | spotbugs = "4.7.3" | ||||||
|  |  | ||||||
| # Plugins | # Plugins | ||||||
| worldedit = "7.2.14" | worldedit = "7.2.15" | ||||||
| placeholderapi = "2.11.3" | placeholderapi = "2.11.3" | ||||||
| luckperms = "5.4" | luckperms = "5.4" | ||||||
| essentialsx = "2.20.0" | essentialsx = "2.20.0" | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,7 @@ | |||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip | ||||||
| networkTimeout=10000 | networkTimeout=10000 | ||||||
|  | validateDistributionUrl=true | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
| zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -130,10 +130,13 @@ location of your Java installation." | |||||||
|     fi |     fi | ||||||
| else | else | ||||||
|     JAVACMD=java |     JAVACMD=java | ||||||
|     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |     if ! command -v java >/dev/null 2>&1 | ||||||
|  |     then | ||||||
|  |         die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  |  | ||||||
| Please set the JAVA_HOME variable in your environment to match the | Please set the JAVA_HOME variable in your environment to match the | ||||||
| location of your Java installation." | location of your Java installation." | ||||||
|  |     fi | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Increase the maximum file descriptors if we can. | # Increase the maximum file descriptors if we can. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user