From e781d9ef01ba2cbb35e8ef6c20c9228dfe97f1a2 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 15:00:20 -0600 Subject: [PATCH 01/60] Skip namespace remapping on Paper 1.20.5+ --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index b24d029d..e9424cee 100755 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,18 @@ 11 + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + mojang + + + + org.apache.maven.plugins maven-shade-plugin From 371e4963518f3609f05d99a18002f7a151094ccb Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 15:56:58 -0600 Subject: [PATCH 02/60] Changed "#endercrystal" to now log as "#end_crystal" --- .../net/coreprotect/listener/block/BlockExplodeListener.java | 2 +- .../net/coreprotect/listener/entity/EntityExplodeListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/block/BlockExplodeListener.java b/src/main/java/net/coreprotect/listener/block/BlockExplodeListener.java index 6ec0b07f..1d71ae08 100644 --- a/src/main/java/net/coreprotect/listener/block/BlockExplodeListener.java +++ b/src/main/java/net/coreprotect/listener/block/BlockExplodeListener.java @@ -156,7 +156,7 @@ protected void onBlockExplode(BlockExplodeEvent event) { user = "#tnt"; } else if (user.contains("end_crystal")) { - user = "#ender_crystal"; + user = "#end_crystal"; } if (!user.startsWith("#")) { user = "#explosion"; diff --git a/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java b/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java index db1800eb..e2c677e5 100755 --- a/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java @@ -46,7 +46,7 @@ else if (entity instanceof Wither || entity instanceof WitherSkull) { user = "#wither"; } else if (entity instanceof EnderCrystal) { - user = "#ender_crystal"; + user = "#end_crystal"; } boolean log = false; From 37fc9af300b3bcab6dcb549dc7255acb4c982b57 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 17:30:18 -0600 Subject: [PATCH 03/60] Added MC 1.21 support --- .../net/coreprotect/bukkit/BukkitAdapter.java | 2 +- .../database/rollback/Rollback.java | 9 ++++++- .../database/rollback/RollbackUtil.java | 3 +-- .../player/PlayerInteractListener.java | 5 ++-- .../java/net/coreprotect/utility/Util.java | 26 +++++++++++-------- .../worldedit/WorldEditBlockState.java | 6 +++++ 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index a2955511..9818afd7 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -271,7 +271,7 @@ public boolean isSignFront(SignChangeEvent event) { @Override public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) { PotionData data = arrow.getBasePotionData(); - if (data.getType() != PotionType.UNCRAFTABLE) { + if (data.getType() != PotionType.valueOf("UNCRAFTABLE")) { itemStack = new ItemStack(Material.TIPPED_ARROW); PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); meta.setBasePotionData(data); diff --git a/src/main/java/net/coreprotect/database/rollback/Rollback.java b/src/main/java/net/coreprotect/database/rollback/Rollback.java index 666f4623..7e848722 100644 --- a/src/main/java/net/coreprotect/database/rollback/Rollback.java +++ b/src/main/java/net/coreprotect/database/rollback/Rollback.java @@ -649,7 +649,14 @@ else if ((rowType == Material.END_CRYSTAL)) { } if (!exists) { - Entity entity = block.getLocation().getWorld().spawnEntity(location1, EntityType.ENDER_CRYSTAL); + EntityType END_CRYSTAL = null; + try { + END_CRYSTAL = EntityType.valueOf("END_CRYSTAL"); // 1.21+ + } + catch (Exception e) { + END_CRYSTAL = EntityType.valueOf("ENDER_CRYSTAL"); // <= 1.20 + } + Entity entity = block.getLocation().getWorld().spawnEntity(location1, END_CRYSTAL); EnderCrystal enderCrystal = (EnderCrystal) entity; enderCrystal.setShowingBottom((rowData != 0)); PaperAdapter.ADAPTER.teleportAsync(entity, location1); diff --git a/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java b/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java index 0ee37fb0..921a2164 100644 --- a/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java +++ b/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java @@ -7,7 +7,6 @@ import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Builder; import org.bukkit.Material; -import org.bukkit.Tag; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; import org.bukkit.block.Jukebox; @@ -93,7 +92,7 @@ else if (type != null && type.equals(Material.ITEM_FRAME)) { else if (type != null && type.equals(Material.JUKEBOX)) { Jukebox jukebox = (Jukebox) container; if (jukebox != null) { - if (action == 1 && Tag.ITEMS_MUSIC_DISCS.isTagged(itemstack.getType())) { + if (action == 1 && itemstack.getType().name().startsWith("MUSIC_DISC")) { itemstack.setAmount(1); } else { diff --git a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java index 84506c27..6faf5c3f 100755 --- a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java @@ -11,7 +11,6 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Tag; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -684,10 +683,10 @@ else if (type == Material.JUKEBOX) { ItemStack mainHand = player.getInventory().getItemInMainHand(); ItemStack offHand = player.getInventory().getItemInOffHand(); - if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && Tag.ITEMS_MUSIC_DISCS.isTagged(mainHand.getType())) { + if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && mainHand.getType().name().startsWith("MUSIC_DISC")) { handItem = mainHand; } - else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null && Tag.ITEMS_MUSIC_DISCS.isTagged(offHand.getType())) { + else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null && offHand.getType().name().startsWith("MUSIC_DISC")) { handItem = offHand; } else { diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index aa3aa602..625cd1bb 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -917,26 +917,30 @@ else if (internal) { } public static Material getEntityMaterial(EntityType type) { - switch (type) { - case ARMOR_STAND: + switch (type.name()) { + case "ARMOR_STAND": return Material.ARMOR_STAND; - case ITEM_FRAME: + case "ITEM_FRAME": return Material.ITEM_FRAME; - case ENDER_CRYSTAL: + case "END_CRYSTAL": + case "ENDER_CRYSTAL": return Material.END_CRYSTAL; - case ENDER_PEARL: + case "ENDER_PEARL": return Material.ENDER_PEARL; - case SPLASH_POTION: + case "POTION": + case "SPLASH_POTION": return Material.SPLASH_POTION; - case THROWN_EXP_BOTTLE: + case "EXPERIENCE_BOTTLE": + case "THROWN_EXP_BOTTLE": return Material.EXPERIENCE_BOTTLE; - case TRIDENT: + case "TRIDENT": return Material.TRIDENT; - case FIREWORK: + case "FIREWORK_ROCKET": + case "FIREWORK": return Material.FIREWORK_ROCKET; - case EGG: + case "EGG": return Material.EGG; - case SNOWBALL: + case "SNOWBALL": return Material.SNOWBALL; default: return BukkitAdapter.ADAPTER.getFrameType(type); diff --git a/src/main/java/net/coreprotect/worldedit/WorldEditBlockState.java b/src/main/java/net/coreprotect/worldedit/WorldEditBlockState.java index c7737ffb..86c1a3db 100644 --- a/src/main/java/net/coreprotect/worldedit/WorldEditBlockState.java +++ b/src/main/java/net/coreprotect/worldedit/WorldEditBlockState.java @@ -211,4 +211,10 @@ public BlockState copy() { return null; } + @Override + public BlockState copy(Location location) { + // TODO Auto-generated method stub + return null; + } + } From aa2ee7225cc7d3a21ccd7396e39d5796fca998dd Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 17:34:18 -0600 Subject: [PATCH 04/60] Added logging for droppers adding items to other containers --- .../listener/player/HopperPullListener.java | 4 ++-- .../listener/player/HopperPushListener.java | 4 ++-- .../listener/player/InventoryChangeListener.java | 12 +++++++++--- src/main/java/net/coreprotect/utility/Validate.java | 5 +++++ 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/player/HopperPullListener.java b/src/main/java/net/coreprotect/listener/player/HopperPullListener.java index e85fe4ed..5b47f929 100644 --- a/src/main/java/net/coreprotect/listener/player/HopperPullListener.java +++ b/src/main/java/net/coreprotect/listener/player/HopperPullListener.java @@ -18,7 +18,7 @@ public final class HopperPullListener { - static void processHopperPull(Location location, InventoryHolder sourceHolder, InventoryHolder destinationHolder, ItemStack item) { + static void processHopperPull(Location location, String user, InventoryHolder sourceHolder, InventoryHolder destinationHolder, ItemStack item) { String loggingChestId = "#hopper-pull." + location.getBlockX() + "." + location.getBlockY() + "." + location.getBlockZ(); Object[] lastAbort = ConfigHandler.hopperAbort.get(loggingChestId); if (lastAbort != null) { @@ -91,7 +91,7 @@ static void processHopperPull(Location location, InventoryHolder sourceHolder, I originalSource[inventoryContents.length] = movedItem; InventoryChangeListener.checkTasks(taskStarted); - InventoryChangeListener.onInventoryInteract("#hopper", sourceInventory, originalSource, null, sourceInventory.getLocation(), true); + InventoryChangeListener.onInventoryInteract(user, sourceInventory, originalSource, null, sourceInventory.getLocation(), true); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/listener/player/HopperPushListener.java b/src/main/java/net/coreprotect/listener/player/HopperPushListener.java index 8655435f..cb8d733e 100644 --- a/src/main/java/net/coreprotect/listener/player/HopperPushListener.java +++ b/src/main/java/net/coreprotect/listener/player/HopperPushListener.java @@ -18,7 +18,7 @@ public final class HopperPushListener { - static void processHopperPush(Location location, InventoryHolder sourceHolder, InventoryHolder destinationHolder, ItemStack item) { + static void processHopperPush(Location location, String user, InventoryHolder sourceHolder, InventoryHolder destinationHolder, ItemStack item) { Location destinationLocation = destinationHolder.getInventory().getLocation(); if (destinationLocation == null) { return; @@ -97,7 +97,7 @@ static void processHopperPush(Location location, InventoryHolder sourceHolder, I } InventoryChangeListener.checkTasks(taskStarted); - InventoryChangeListener.onInventoryInteract("#hopper", destinationInventory, originalDestination, null, destinationInventory.getLocation(), true); + InventoryChangeListener.onInventoryInteract(user, destinationInventory, originalDestination, null, destinationInventory.getLocation(), true); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java index 4aa4a0f1..9beeb565 100644 --- a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java +++ b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java @@ -344,10 +344,16 @@ protected void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { if (hopperTransactions) { if (Validate.isHopper(destinationHolder) && (Validate.isContainer(sourceHolder) && !Validate.isHopper(sourceHolder))) { - HopperPullListener.processHopperPull(location, sourceHolder, destinationHolder, event.getItem()); + HopperPullListener.processHopperPull(location, "#hopper", sourceHolder, destinationHolder, event.getItem()); } else if (Validate.isHopper(sourceHolder) && (Validate.isContainer(destinationHolder) && !Validate.isHopper(destinationHolder))) { - HopperPushListener.processHopperPush(location, sourceHolder, destinationHolder, event.getItem()); + HopperPushListener.processHopperPush(location, "#hopper", sourceHolder, destinationHolder, event.getItem()); + } + else if (Validate.isDropper(sourceHolder) && (Validate.isContainer(destinationHolder))) { + HopperPullListener.processHopperPull(location, "#dropper", sourceHolder, destinationHolder, event.getItem()); + if (!Validate.isHopper(destinationHolder)) { + HopperPushListener.processHopperPush(location, "#dropper", sourceHolder, destinationHolder, event.getItem()); + } } return; @@ -362,6 +368,6 @@ else if (Validate.isHopper(sourceHolder) && (Validate.isContainer(destinationHol return; } - HopperPullListener.processHopperPull(location, sourceHolder, destinationHolder, event.getItem()); + HopperPullListener.processHopperPull(location, "#hopper", sourceHolder, destinationHolder, event.getItem()); } } diff --git a/src/main/java/net/coreprotect/utility/Validate.java b/src/main/java/net/coreprotect/utility/Validate.java index 414db388..5f154396 100644 --- a/src/main/java/net/coreprotect/utility/Validate.java +++ b/src/main/java/net/coreprotect/utility/Validate.java @@ -1,6 +1,7 @@ package net.coreprotect.utility; import org.bukkit.block.DoubleChest; +import org.bukkit.block.Dropper; import org.bukkit.block.Hopper; import org.bukkit.entity.minecart.HopperMinecart; import org.bukkit.inventory.BlockInventoryHolder; @@ -16,6 +17,10 @@ public static boolean isHopper(InventoryHolder inventoryHolder) { return (inventoryHolder instanceof Hopper || inventoryHolder instanceof HopperMinecart); } + public static boolean isDropper(InventoryHolder inventoryHolder) { + return (inventoryHolder instanceof Dropper); + } + /* check if valid hopper destination */ public static boolean isContainer(InventoryHolder inventoryHolder) { return (inventoryHolder instanceof BlockInventoryHolder || inventoryHolder instanceof DoubleChest); From 057a635030ebdafba43c849e4d75ab1464fa3190 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 17:51:01 -0600 Subject: [PATCH 05/60] Added logging for dispensers removing blocks from the world --- .../listener/block/BlockDispenseListener.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java b/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java index 6915eaf9..cbd761ec 100644 --- a/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java +++ b/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java @@ -93,7 +93,7 @@ else if (type != Material.FIRE && (!Config.getConfig(world).BUCKETS || (!Config. return; } - if (!type.equals(Material.AIR)) { + if (!type.equals(Material.AIR) || !newBlock.getType().equals(Material.AIR)) { if (type == Material.FIRE) { // lit a lightable block type = newBlock.getType(); if (BlockGroup.LIGHTABLES.contains(type)) { @@ -111,7 +111,12 @@ else if (dispenseRelative) { } } - queueBlockPlace(user, newBlock.getState(), newBlock.getType(), blockState, type, 1, 1, null); + if (!type.equals(Material.AIR)) { + queueBlockPlace(user, newBlock.getState(), newBlock.getType(), blockState, type, 1, 1, null); + } + else { + Queue.queueBlockBreak(user, newBlock.getState(), newBlock.getType(), newBlock.getBlockData().getAsString(), 0); + } } } } From 3e8083becf119ff2b136e19cdb84bedc3a100075 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 18:06:04 -0600 Subject: [PATCH 06/60] Fixed wind charges incorrectly logging false #explosion data (fixes #555) --- .../coreprotect/listener/entity/EntityExplodeListener.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java b/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java index e2c677e5..4490777f 100755 --- a/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java @@ -24,6 +24,10 @@ public final class EntityExplodeListener extends Queue implements Listener { @EventHandler(priority = EventPriority.MONITOR) protected void onEntityExplode(EntityExplodeEvent event) { Entity entity = event.getEntity(); + if (entity.getType().name().equals("WIND_CHARGE")) { + return; + } + World world = event.getLocation().getWorld(); String user = "#explosion"; From 3d32320a3302e3c37cc129f358512d9c39f8c435 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 18:31:33 -0600 Subject: [PATCH 07/60] Added support for MC 1.21 block/entity types --- .github/workflows/build.yml | 8 +++--- build.gradle | 4 +-- pom.xml | 4 +-- .../net/coreprotect/bukkit/BukkitAdapter.java | 6 ++++- .../net/coreprotect/bukkit/Bukkit_v1_21.java | 25 +++++++++++++++++++ .../player/PlayerInteractListener.java | 6 +++++ .../net/coreprotect/paper/PaperAdapter.java | 2 ++ .../net/coreprotect/spigot/SpigotAdapter.java | 2 ++ .../java/net/coreprotect/utility/Util.java | 2 ++ 9 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 24aa094a..ef2d4132 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,13 +10,13 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 17 - uses: actions/setup-java@v2 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '21' distribution: 'temurin' - name: Cache Maven packages uses: actions/cache@v1 diff --git a/build.gradle b/build.gradle index 727d0194..d22c2de8 100644 --- a/build.gradle +++ b/build.gradle @@ -29,10 +29,10 @@ repositories { } dependencies { - implementation(platform("com.intellectualsites.bom:bom-newest:1.44")) // Ref: https://github.com/IntellectualSites/bom + implementation(platform("com.intellectualsites.bom:bom-newest:1.45")) // Ref: https://github.com/IntellectualSites/bom compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") - compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT' implementation 'org.bstats:bstats-bukkit-lite:1.8' implementation 'com.zaxxer:HikariCP:5.0.1' } diff --git a/pom.xml b/pom.xml index e9424cee..966b88ee 100755 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ com.intellectualsites.bom bom-newest - 1.44 + 1.45 import pom @@ -122,7 +122,7 @@ io.papermc.paper paper-api - 1.20.4-R0.1-SNAPSHOT + 1.21-R0.1-SNAPSHOT provided diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index 9818afd7..59c5878a 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -42,6 +42,7 @@ public class BukkitAdapter implements BukkitInterface { public static final int BUKKIT_V1_18 = 18; public static final int BUKKIT_V1_19 = 19; public static final int BUKKIT_V1_20 = 20; + public static final int BUKKIT_V1_21 = 21; public static void loadAdapter() { switch (ConfigHandler.SERVER_VERSION) { @@ -63,9 +64,12 @@ public static void loadAdapter() { BukkitAdapter.ADAPTER = new Bukkit_v1_19(); break; case BUKKIT_V1_20: - default: BukkitAdapter.ADAPTER = new Bukkit_v1_20(); break; + case BUKKIT_V1_21: + default: + BukkitAdapter.ADAPTER = new Bukkit_v1_21(); + break; } } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java new file mode 100644 index 00000000..4b133b5d --- /dev/null +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -0,0 +1,25 @@ +package net.coreprotect.bukkit; + +import org.bukkit.Material; +import org.bukkit.Tag; + +import net.coreprotect.model.BlockGroup; + +public class Bukkit_v1_21 extends Bukkit_v1_20 implements BukkitInterface { + + public Bukkit_v1_21() { + for (Material value : Tag.TRAPDOORS.getValues()) { + if (value == Material.IRON_TRAPDOOR) { + continue; + } + + if (!BlockGroup.INTERACT_BLOCKS.contains(value)) { + BlockGroup.INTERACT_BLOCKS.add(value); + } + if (!BlockGroup.SAFE_INTERACT_BLOCKS.contains(value)) { + BlockGroup.SAFE_INTERACT_BLOCKS.add(value); + } + } + } + +} diff --git a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java index 6faf5c3f..9a95afc1 100755 --- a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java @@ -835,6 +835,12 @@ else if (type == Material.DRAGON_EGG) { if (event.useItemInHand() != Event.Result.DENY) { List entityBlockTypes = Arrays.asList(Material.ARMOR_STAND, Material.END_CRYSTAL, Material.BOW, Material.CROSSBOW, Material.TRIDENT, Material.EXPERIENCE_BOTTLE, Material.SPLASH_POTION, Material.LINGERING_POTION, Material.ENDER_PEARL, Material.FIREWORK_ROCKET, Material.EGG, Material.SNOWBALL); + try { + entityBlockTypes.add(Material.valueOf("WIND_CHARGE")); + } + catch (Exception e) { + // not running MC 1.21+ + } ItemStack handItem = null; ItemStack mainHand = player.getInventory().getItemInMainHand(); ItemStack offHand = player.getInventory().getItemInOffHand(); diff --git a/src/main/java/net/coreprotect/paper/PaperAdapter.java b/src/main/java/net/coreprotect/paper/PaperAdapter.java index e0933d5a..e510aea2 100644 --- a/src/main/java/net/coreprotect/paper/PaperAdapter.java +++ b/src/main/java/net/coreprotect/paper/PaperAdapter.java @@ -23,6 +23,7 @@ public class PaperAdapter implements PaperInterface { public static final int PAPER_V1_18 = BukkitAdapter.BUKKIT_V1_18; public static final int PAPER_V1_19 = BukkitAdapter.BUKKIT_V1_19; public static final int PAPER_V1_20 = BukkitAdapter.BUKKIT_V1_20; + public static final int PAPER_V1_21 = BukkitAdapter.BUKKIT_V1_21; public static void loadAdapter() { int paperVersion = ConfigHandler.SERVER_VERSION; @@ -48,6 +49,7 @@ public static void loadAdapter() { PaperAdapter.ADAPTER = new Paper_v1_17(); break; case PAPER_V1_20: + case PAPER_V1_21: default: PaperAdapter.ADAPTER = new Paper_v1_20(); break; diff --git a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java index 175f7dab..04602fac 100644 --- a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java +++ b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java @@ -21,6 +21,7 @@ public class SpigotAdapter implements SpigotInterface { public static final int SPIGOT_V1_18 = BukkitAdapter.BUKKIT_V1_18; public static final int SPIGOT_V1_19 = BukkitAdapter.BUKKIT_V1_19; public static final int SPIGOT_V1_20 = BukkitAdapter.BUKKIT_V1_20; + public static final int SPIGOT_V1_21 = BukkitAdapter.BUKKIT_V1_21; public static void loadAdapter() { int spigotVersion = ConfigHandler.SERVER_VERSION; @@ -42,6 +43,7 @@ public static void loadAdapter() { case SPIGOT_V1_18: case SPIGOT_V1_19: case SPIGOT_V1_20: + case SPIGOT_V1_21: default: SpigotAdapter.ADAPTER = new Spigot_v1_16(); break; diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 625cd1bb..7014d7d4 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -942,6 +942,8 @@ public static Material getEntityMaterial(EntityType type) { return Material.EGG; case "SNOWBALL": return Material.SNOWBALL; + case "WIND_CHARGE": + return Material.valueOf("WIND_CHARGE"); default: return BukkitAdapter.ADAPTER.getFrameType(type); } From 957bf70c260b77adbb75b4ee4b8d1c0ff94e9358 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 18:44:46 -0600 Subject: [PATCH 08/60] Hide entity deserialization errors unless using development branch (fixes #552) --- .../coreprotect/database/statement/EntityStatement.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/database/statement/EntityStatement.java b/src/main/java/net/coreprotect/database/statement/EntityStatement.java index 517f9859..a3c91ce2 100644 --- a/src/main/java/net/coreprotect/database/statement/EntityStatement.java +++ b/src/main/java/net/coreprotect/database/statement/EntityStatement.java @@ -12,6 +12,7 @@ import org.bukkit.util.io.BukkitObjectInputStream; import org.bukkit.util.io.BukkitObjectOutputStream; +import net.coreprotect.config.ConfigHandler; import net.coreprotect.database.Database; public class EntityStatement { @@ -64,8 +65,10 @@ public static List getData(Statement statement, BlockState block, String resultSet.close(); } - catch (Exception e) { - e.printStackTrace(); + catch (Exception e) { // only display this exception on development branch + if (!ConfigHandler.EDITION_BRANCH.contains("-dev")) { + e.printStackTrace(); + } } return result; From aaa7a3536a1c78e171fab51c2bba016aacba9637 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 18:49:43 -0600 Subject: [PATCH 09/60] Hide item deserialization errors unless using development branch (fixes #550) --- .../database/statement/EntityStatement.java | 2 +- src/main/java/net/coreprotect/utility/Util.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/coreprotect/database/statement/EntityStatement.java b/src/main/java/net/coreprotect/database/statement/EntityStatement.java index a3c91ce2..355e8d57 100644 --- a/src/main/java/net/coreprotect/database/statement/EntityStatement.java +++ b/src/main/java/net/coreprotect/database/statement/EntityStatement.java @@ -65,7 +65,7 @@ public static List getData(Statement statement, BlockState block, String resultSet.close(); } - catch (Exception e) { // only display this exception on development branch + catch (Exception e) { // only display exception on development branch if (!ConfigHandler.EDITION_BRANCH.contains("-dev")) { e.printStackTrace(); } diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 7014d7d4..27faced9 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -586,9 +586,18 @@ public static byte[] convertByteData(Object data) { return result; } - public static ItemMeta deserializeItemMeta(Class itemMetaClass, Map args) { - DelegateDeserialization delegate = itemMetaClass.getAnnotation(DelegateDeserialization.class); - return (ItemMeta) ConfigurationSerialization.deserializeObject(args, delegate.value()); + public static ItemMeta deserializeItemMetax(Class itemMetaClass, Map args) { + try { + DelegateDeserialization delegate = itemMetaClass.getAnnotation(DelegateDeserialization.class); + return (ItemMeta) ConfigurationSerialization.deserializeObject(args, delegate.value()); + } + catch (Exception e) { // only display exception on development branch + if (!ConfigHandler.EDITION_BRANCH.contains("-dev")) { + e.printStackTrace(); + } + } + + return null; } public static > SortedSet> entriesSortedByValues(Map map) { From 49eb176ee6b7259bd03f92c4def25123e62bc9bd Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 17 Jun 2024 18:52:25 -0600 Subject: [PATCH 10/60] Fixed invalid method name from previous commit --- src/main/java/net/coreprotect/utility/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 27faced9..644458fe 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -586,7 +586,7 @@ public static byte[] convertByteData(Object data) { return result; } - public static ItemMeta deserializeItemMetax(Class itemMetaClass, Map args) { + public static ItemMeta deserializeItemMeta(Class itemMetaClass, Map args) { try { DelegateDeserialization delegate = itemMetaClass.getAnnotation(DelegateDeserialization.class); return (ItemMeta) ConfigurationSerialization.deserializeObject(args, delegate.value()); From fa1de08c0d99c0157f5d27be723f884c800ea22f Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 18 Jun 2024 16:04:35 -0600 Subject: [PATCH 11/60] Use proper adapter for EntityType.END_CRYSTAL --- .../java/net/coreprotect/bukkit/BukkitAdapter.java | 10 ++++++++++ .../java/net/coreprotect/bukkit/BukkitInterface.java | 2 ++ .../java/net/coreprotect/bukkit/Bukkit_v1_21.java | 11 +++++++++++ .../net/coreprotect/database/rollback/Rollback.java | 9 +-------- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index 59c5878a..db618d5f 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -288,4 +288,14 @@ public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) { return itemStack; } + @Override + public EntityType getEntityType(Material material) { + switch (material) { + case END_CRYSTAL: + return EntityType.valueOf("ENDER_CRYSTAL"); + default: + return EntityType.UNKNOWN; + } + } + } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index 48fe07e6..f8dbffab 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -87,4 +87,6 @@ public interface BukkitInterface { public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack); + public EntityType getEntityType(Material material); + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index 4b133b5d..afd53b0c 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -2,6 +2,7 @@ import org.bukkit.Material; import org.bukkit.Tag; +import org.bukkit.entity.EntityType; import net.coreprotect.model.BlockGroup; @@ -22,4 +23,14 @@ public Bukkit_v1_21() { } } + @Override + public EntityType getEntityType(Material material) { + switch (material) { + case END_CRYSTAL: + return EntityType.valueOf("END_CRYSTAL"); + default: + return EntityType.UNKNOWN; + } + } + } diff --git a/src/main/java/net/coreprotect/database/rollback/Rollback.java b/src/main/java/net/coreprotect/database/rollback/Rollback.java index 7e848722..a15f2397 100644 --- a/src/main/java/net/coreprotect/database/rollback/Rollback.java +++ b/src/main/java/net/coreprotect/database/rollback/Rollback.java @@ -649,14 +649,7 @@ else if ((rowType == Material.END_CRYSTAL)) { } if (!exists) { - EntityType END_CRYSTAL = null; - try { - END_CRYSTAL = EntityType.valueOf("END_CRYSTAL"); // 1.21+ - } - catch (Exception e) { - END_CRYSTAL = EntityType.valueOf("ENDER_CRYSTAL"); // <= 1.20 - } - Entity entity = block.getLocation().getWorld().spawnEntity(location1, END_CRYSTAL); + Entity entity = block.getLocation().getWorld().spawnEntity(location1, BukkitAdapter.ADAPTER.getEntityType(Material.END_CRYSTAL)); EnderCrystal enderCrystal = (EnderCrystal) entity; enderCrystal.setShowingBottom((rowData != 0)); PaperAdapter.ADAPTER.teleportAsync(entity, location1); From 40e7f04774a37bd158e08e376f264fae9f8023a5 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 18 Jun 2024 16:10:09 -0600 Subject: [PATCH 12/60] Added support for logging Crafter transactions (#565) --- src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index afd53b0c..2815f7a3 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -1,5 +1,8 @@ package net.coreprotect.bukkit; +import java.util.Arrays; +import java.util.HashSet; + import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.entity.EntityType; @@ -9,6 +12,10 @@ public class Bukkit_v1_21 extends Bukkit_v1_20 implements BukkitInterface { public Bukkit_v1_21() { + BlockGroup.CONTAINERS = new HashSet<>(Arrays.asList(Material.JUKEBOX, Material.DISPENSER, Material.CHEST, Material.FURNACE, Material.BREWING_STAND, Material.TRAPPED_CHEST, Material.HOPPER, Material.DROPPER, Material.ARMOR_STAND, Material.ITEM_FRAME, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.SMOKER, Material.LECTERN, Material.CHISELED_BOOKSHELF, Material.DECORATED_POT, Material.CRAFTER)); + BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.MANGROVE_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE, Material.LEVER, Material.REPEATER, Material.MANGROVE_TRAPDOOR, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST, Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE, Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE, Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER, Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR, Material.CRAFTER)); + BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT, Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET, Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER, Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.GLOW_LICHEN, Material.LIGHT, Material.LAVA_CAULDRON, Material.CHISELED_BOOKSHELF, Material.CRAFTER)); + for (Material value : Tag.TRAPDOORS.getValues()) { if (value == Material.IRON_TRAPDOOR) { continue; From ce8c194e0dbcc1b5e7a7a4b7c9d78e8c3ede5c6f Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 24 Jun 2024 17:02:01 -0600 Subject: [PATCH 13/60] Fixed IncompatibleClassChangeError on inventory transactions (fixes #571) --- .../listener/player/CraftItemListener.java | 2 +- .../player/InventoryChangeListener.java | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/player/CraftItemListener.java b/src/main/java/net/coreprotect/listener/player/CraftItemListener.java index 756e3fa3..b93ccf14 100644 --- a/src/main/java/net/coreprotect/listener/player/CraftItemListener.java +++ b/src/main/java/net/coreprotect/listener/player/CraftItemListener.java @@ -80,7 +80,7 @@ protected static void playerCraftItem(InventoryClickEvent event, boolean isTrade return; } - Inventory bottomInventory = event.getView().getBottomInventory(); + Inventory bottomInventory = player.getInventory(); if (bottomInventory.getType() != InventoryType.PLAYER) { return; } diff --git a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java index 9beeb565..01082e04 100644 --- a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java +++ b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java @@ -22,7 +22,6 @@ import org.bukkit.inventory.BlockInventoryHolder; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import net.coreprotect.CoreProtect; @@ -251,7 +250,12 @@ protected void onInventoryClick(InventoryClickEvent event) { // Perform this check to prevent triggering onInventoryInteractAsync when a user is just clicking items in their own inventory Inventory inventory = null; try { - inventory = event.getView().getInventory(event.getRawSlot()); + try { + inventory = event.getView().getInventory(event.getRawSlot()); + } + catch (IncompatibleClassChangeError e) { + inventory = event.getClickedInventory(); + } } catch (Exception e) { return; @@ -288,19 +292,16 @@ protected void onInventoryClick(InventoryClickEvent event) { protected void onInventoryDragEvent(InventoryDragEvent event) { boolean movedItem = false; boolean enderChest = false; - InventoryView inventoryView = event.getView(); - for (Integer slot : event.getRawSlots()) { - Inventory inventory = inventoryView.getInventory(slot); - if (inventory == null) { - continue; - } - InventoryHolder inventoryHolder = inventory.getHolder(); - enderChest = inventory.equals(event.getWhoClicked().getEnderChest()); - if ((inventoryHolder != null && (inventoryHolder instanceof BlockInventoryHolder || inventoryHolder instanceof DoubleChest)) || enderChest) { - movedItem = true; - break; - } + Inventory inventory = event.getInventory(); + if (inventory == null || inventory.equals(event.getWhoClicked().getInventory())) { + return; + } + + InventoryHolder inventoryHolder = inventory.getHolder(); + enderChest = inventory.equals(event.getWhoClicked().getEnderChest()); + if ((inventoryHolder != null && (inventoryHolder instanceof BlockInventoryHolder || inventoryHolder instanceof DoubleChest)) || enderChest) { + movedItem = true; } if (!movedItem) { From c67e69755d95ada658bdf6af17a12e481ab4403e Mon Sep 17 00:00:00 2001 From: Intelli Date: Sat, 6 Jul 2024 11:45:32 -0600 Subject: [PATCH 14/60] Fixed IllegalStateException error on some servers during server shutdowns. --- .../java/net/coreprotect/database/logger/BlockBreakLogger.java | 3 ++- .../java/net/coreprotect/database/logger/BlockPlaceLogger.java | 3 ++- .../java/net/coreprotect/database/logger/CommandLogger.java | 3 ++- .../java/net/coreprotect/database/logger/ContainerLogger.java | 3 ++- .../java/net/coreprotect/database/logger/EntityKillLogger.java | 3 ++- src/main/java/net/coreprotect/database/logger/ItemLogger.java | 3 ++- .../net/coreprotect/database/logger/PlayerInteractLogger.java | 3 ++- .../java/net/coreprotect/database/logger/PlayerKillLogger.java | 3 ++- .../java/net/coreprotect/database/logger/SignTextLogger.java | 3 ++- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java b/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java index c5fd2c6a..7e106695 100644 --- a/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java +++ b/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -54,7 +55,7 @@ else if (checkType == Material.PAINTING || BukkitAdapter.ADAPTER.isItemFrame(che } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java b/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java index cfc30e17..85c66139 100644 --- a/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java +++ b/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.BlockState; @@ -84,7 +85,7 @@ else if (type == Material.WATER || type == Material.LAVA) { } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/CommandLogger.java b/src/main/java/net/coreprotect/database/logger/CommandLogger.java index 759bb31c..046d4a3e 100644 --- a/src/main/java/net/coreprotect/database/logger/CommandLogger.java +++ b/src/main/java/net/coreprotect/database/logger/CommandLogger.java @@ -3,6 +3,7 @@ import java.sql.PreparedStatement; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Location; import net.coreprotect.CoreProtect; @@ -29,7 +30,7 @@ public static void log(PreparedStatement preparedStmt, int batchCount, long time } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/ContainerLogger.java b/src/main/java/net/coreprotect/database/logger/ContainerLogger.java index 8e09e98d..04655f10 100644 --- a/src/main/java/net/coreprotect/database/logger/ContainerLogger.java +++ b/src/main/java/net/coreprotect/database/logger/ContainerLogger.java @@ -7,6 +7,7 @@ import java.util.Locale; import java.util.Map; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -173,7 +174,7 @@ protected static void logTransaction(PreparedStatement preparedStmt, int batchCo } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/EntityKillLogger.java b/src/main/java/net/coreprotect/database/logger/EntityKillLogger.java index 2fd3d9ce..5225a5bd 100644 --- a/src/main/java/net/coreprotect/database/logger/EntityKillLogger.java +++ b/src/main/java/net/coreprotect/database/logger/EntityKillLogger.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.block.BlockState; import net.coreprotect.CoreProtect; @@ -30,7 +31,7 @@ public static void log(PreparedStatement preparedStmt, PreparedStatement prepare } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/ItemLogger.java b/src/main/java/net/coreprotect/database/logger/ItemLogger.java index 4c32003d..ba399ebe 100644 --- a/src/main/java/net/coreprotect/database/logger/ItemLogger.java +++ b/src/main/java/net/coreprotect/database/logger/ItemLogger.java @@ -6,6 +6,7 @@ import java.util.Locale; import java.util.Map; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.inventory.ItemStack; @@ -126,7 +127,7 @@ protected static void logTransaction(PreparedStatement preparedStmt, int batchCo } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/PlayerInteractLogger.java b/src/main/java/net/coreprotect/database/logger/PlayerInteractLogger.java index f2791594..e8fafc49 100644 --- a/src/main/java/net/coreprotect/database/logger/PlayerInteractLogger.java +++ b/src/main/java/net/coreprotect/database/logger/PlayerInteractLogger.java @@ -3,6 +3,7 @@ import java.sql.PreparedStatement; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.BlockState; @@ -28,7 +29,7 @@ public static void log(PreparedStatement preparedStmt, int batchCount, String us } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/PlayerKillLogger.java b/src/main/java/net/coreprotect/database/logger/PlayerKillLogger.java index fe0fb0bf..2b81c3de 100644 --- a/src/main/java/net/coreprotect/database/logger/PlayerKillLogger.java +++ b/src/main/java/net/coreprotect/database/logger/PlayerKillLogger.java @@ -3,6 +3,7 @@ import java.sql.PreparedStatement; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.block.BlockState; import net.coreprotect.CoreProtect; @@ -30,7 +31,7 @@ public static void log(PreparedStatement preparedStmt, int batchCount, String us } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/coreprotect/database/logger/SignTextLogger.java b/src/main/java/net/coreprotect/database/logger/SignTextLogger.java index 0572ee82..3241e33c 100644 --- a/src/main/java/net/coreprotect/database/logger/SignTextLogger.java +++ b/src/main/java/net/coreprotect/database/logger/SignTextLogger.java @@ -3,6 +3,7 @@ import java.sql.PreparedStatement; import java.util.Locale; +import org.bukkit.Bukkit; import org.bukkit.Location; import net.coreprotect.CoreProtect; @@ -26,7 +27,7 @@ public static void log(PreparedStatement preparedStmt, int batchCount, String us } CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user); - if (Config.getGlobal().API_ENABLED) { + if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) { CoreProtect.getInstance().getServer().getPluginManager().callEvent(event); } From 4af95632d5e76629ce01126fe25e8ca38a147844 Mon Sep 17 00:00:00 2001 From: Intelli Date: Sat, 6 Jul 2024 12:03:54 -0600 Subject: [PATCH 15/60] Fix inventory drag event not properly checking if a player is dragging within their own inventory --- .../coreprotect/listener/player/InventoryChangeListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java index 01082e04..2cbdf35b 100644 --- a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java +++ b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java @@ -294,11 +294,11 @@ protected void onInventoryDragEvent(InventoryDragEvent event) { boolean enderChest = false; Inventory inventory = event.getInventory(); - if (inventory == null || inventory.equals(event.getWhoClicked().getInventory())) { + InventoryHolder inventoryHolder = inventory.getHolder(); + if (inventory == null || inventoryHolder != null && inventoryHolder.equals(event.getWhoClicked())) { return; } - InventoryHolder inventoryHolder = inventory.getHolder(); enderChest = inventory.equals(event.getWhoClicked().getEnderChest()); if ((inventoryHolder != null && (inventoryHolder instanceof BlockInventoryHolder || inventoryHolder instanceof DoubleChest)) || enderChest) { movedItem = true; From d4cc7ec7297cf274d67ac35267e9e5be8d03aa2c Mon Sep 17 00:00:00 2001 From: Intelli Date: Sat, 6 Jul 2024 12:07:31 -0600 Subject: [PATCH 16/60] Hide item serialization errors unless using development branch --- src/main/java/net/coreprotect/utility/Util.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 644458fe..fc3f5c31 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -579,8 +579,10 @@ public static byte[] convertByteData(Object data) { bos.close(); result = bos.toByteArray(); } - catch (Exception e) { - e.printStackTrace(); + catch (Exception e) { // only display exception on development branch + if (!ConfigHandler.EDITION_BRANCH.contains("-dev")) { + e.printStackTrace(); + } } return result; From 24a09b49d253088be824e57cf1703797b59d7870 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 8 Jul 2024 11:42:08 -0600 Subject: [PATCH 17/60] Added base Korean translation file --- lang/ko.yml | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 lang/ko.yml diff --git a/lang/ko.yml b/lang/ko.yml new file mode 100644 index 00000000..251fbf85 --- /dev/null +++ b/lang/ko.yml @@ -0,0 +1,202 @@ +# CoreProtect Language File (ko) + +ACTION_NOT_SUPPORTED: "해당 작업은 지원되지 않습니다." +AMOUNT_BLOCK: "{0} {블록|블록}" +AMOUNT_CHUNK: "{0} {덩어리|덩어리}" +AMOUNT_ENTITY: "{0} {엔터티|엔티티}" +AMOUNT_ITEM: "{0} {아이템|아이템}" +API_TEST: "API 테스트에 성공했습니다." +CACHE_ERROR: "경고: 유효성을 검사하는 중 오류가 발생했습니다. {0} 은닉처." +CACHE_RELOAD: "강제로 다시 로드 {매핑|세계} 데이터베이스에서 캐시합니다." +CHECK_CONFIG: "config.yml을 확인하세요." +COMMAND_CONSOLE: "콘솔에서 명령을 실행해 보세요." +COMMAND_NOT_FOUND: "명령 \"{0}\" 찾을 수 없습니다." +COMMAND_THROTTLED: "잠시 후에 다시 시도해 주세요." +CONSUMER_ERROR: "이미 소비자 대기열 처리 중 {일시중지됨|재개됨}." +CONSUMER_TOGGLED: "소비자 대기열 처리가 완료되었습니다. {일시중지됨|재개됨}." +CONTAINER_HEADER: "컨테이너 거래" +DATABASE_BUSY: "데이터베이스가 사용 중입니다. 나중에 다시 시도 해주십시오." +DATABASE_INDEX_ERROR: "데이터베이스 인덱스의 유효성을 검사할 수 없습니다." +DATABASE_LOCKED_1: "데이터베이스가 잠겨 있습니다. 최대 15초 동안 대기..." +DATABASE_LOCKED_2: "데이터베이스가 이미 사용 중입니다. 다시 시도해 주세요." +DATABASE_LOCKED_3: "데이터베이스 잠금을 비활성화하려면 \"database-lock: false\"를 설정합니다." +DATABASE_LOCKED_4: "데이터베이스 잠금을 비활성화하면 데이터가 손상될 수 있습니다." +DATABASE_UNREACHABLE: "데이터베이스에 연결할 수 없습니다. 데이터를 삭제하고 종료합니다." +DEVELOPMENT_BRANCH: "개발 분기가 감지되어 패치 스크립트를 건너뜁니다." +DISABLE_SUCCESS: "성공! 장애가 있는 {0}" +ENABLE_FAILED: "{0} 시작할 수 없었습니다." +ENABLE_SUCCESS: "{0} 이제 활성화되었습니다!" +ENJOY_COREPROTECT: "즐기다 {0}? 우리의 Discord!" +FINISHING_CONVERSION: "데이터 변환을 마무리합니다. 기다리세요..." +FINISHING_LOGGING: "데이터 로깅을 마무리합니다. 기다리세요..." +FIRST_VERSION: "초기 DB: {0}" +GLOBAL_LOOKUP: "전역 조회를 수행하려면 반경을 지정하지 마세요." +GLOBAL_ROLLBACK: "사용 \"{0}\" 글로벌을 하려고 {롤백|복원}" +HELP_ACTION_1: "조회를 작업으로 제한합니다." +HELP_ACTION_2: "예: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]" +HELP_COMMAND: "추가 정보를 표시합니다." +HELP_EXCLUDE_1: "블록/사용자를 제외합니다." +HELP_EXCLUDE_2: "예: [e:stone], [e:Notch], [e:stone,Notch]" +HELP_HEADER: "{0} 돕다" +HELP_INCLUDE_1: "블록/엔티티를 포함합니다." +HELP_INCLUDE_2: "예: [i:stone], [i:zombie], [i:stone,wood,bedrock]" +HELP_INSPECT_1: "검사기를 활성화하면 다음을 수행할 수 있습니다." +HELP_INSPECT_2: "배치를 보려면 마우스 왼쪽 버튼을 클릭하세요." +HELP_INSPECT_3: "인접한 제거 항목을 보려면 마우스 오른쪽 버튼을 클릭하세요." +HELP_INSPECT_4: "블록을 배치하면 제거되는 모습을 볼 수 있습니다." +HELP_INSPECT_5: "배치를 확인하려면 블록을 액체에 넣으세요." +HELP_INSPECT_6: "상자 거래를 보려면 마우스 오른쪽 버튼을 클릭하세요." +HELP_INSPECT_7: "팁: \"/co i\"만 사용할 수 있습니다." +HELP_INSPECT_COMMAND: "블록 검사기를 토글합니다." +HELP_LIST: "모든 명령 목록을 표시합니다." +HELP_LOOKUP_1: "명령 단축키." +HELP_LOOKUP_2: "추가 페이지를 봅니다." +HELP_LOOKUP_COMMAND: "블록 데이터를 조회합니다." +HELP_NO_INFO: "명령에 대한 정보 \"{0}\" 찾을 수 없습니다." +HELP_PARAMETER: "\"를 참조하십시오.{0}\" 자세한 매개변수 정보를 확인하세요." +HELP_PARAMS_1: "수행 {조회|롤백|복원}." +HELP_PARAMS_2: "사용자를 지정합니다. {조회|롤백|복원}." +HELP_PARAMS_3: "시간을 지정하세요. {조회|롤백|복원}." +HELP_PARAMS_4: "제한하다 {조회|롤백|복원} 반경으로." +HELP_PARAMS_5: "제한하다 {조회|롤백|복원} 행동에." +HELP_PARAMS_6: "블록/엔티티를 {조회|롤백|복원}." +HELP_PARAMS_7: "블록/사용자를 다음에서 제외합니다. {조회|롤백|복원}." +HELP_PURGE_1: "오래된 데이터를 제거하세요." +HELP_PURGE_2: "예를 들어, \"{0}\" 는 한 달이 지난 데이터를 모두 삭제하고 최근 30일간의 데이터만 보관합니다." +HELP_PURGE_COMMAND: "오래된 블록 데이터를 삭제하세요." +HELP_RADIUS_1: "반경 영역을 지정합니다." +HELP_RADIUS_2: "예: [r:10] (10블록 이내에서만 변경하세요)" +HELP_RELOAD_COMMAND: "구성 파일을 다시 로드합니다." +HELP_RESTORE_COMMAND: "블록 데이터를 복원합니다." +HELP_ROLLBACK_COMMAND: "블록 데이터를 롤백합니다." +HELP_STATUS: "플러그인 상태를 봅니다." +HELP_STATUS_COMMAND: "플러그인 상태를 표시합니다." +HELP_TELEPORT: "텔레포트." +HELP_TIME_1: "시간을 지정하세요." +HELP_TIME_2: "예: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]" +HELP_USER_1: "사용자를 지정합니다." +HELP_USER_2: "예: [u:Notch], [u:Notch,#enderman]" +INCOMPATIBLE_ACTION: "\"{0}\" 는 해당 작업과 함께 사용할 수 없습니다." +INSPECTOR_ERROR: "검사님은 이미 {활성화|비활성화}." +INSPECTOR_TOGGLED: "지금 검사관 {활성화|비활성화}." +INTEGRATION_ERROR: "할 수없는 {초기화|비활성화} {0} 벌채 반출." +INTEGRATION_SUCCESS: "{0} 성공적으로 로깅 {초기화|비활성화}." +INTEGRATION_VERSION: "유효하지 않은 {0} 버전을 찾았습니다." +INTERACTIONS_HEADER: "플레이어 상호작용" +INVALID_ACTION: "이는 유효한 조치가 아닙니다." +INVALID_BRANCH_1: "잘못된 플러그인 버전입니다(분기가 설정되지 않았습니다)." +INVALID_BRANCH_2: "계속하려면 프로젝트 분기를 \"개발\"로 설정하세요." +INVALID_BRANCH_3: "개발 코드를 실행하면 데이터가 손상될 수 있습니다." +INVALID_CONTAINER: "먼저 유효한 용기를 검사하십시오." +INVALID_DONATION_KEY: "기부 키가 잘못되었습니다." +INVALID_INCLUDE: "\"{0}\" 는 잘못된 값입니다." +INVALID_INCLUDE_COMBO: "이는 잘못된 유형 조합입니다." +INVALID_RADIUS: "유효한 반경을 입력하세요." +INVALID_SELECTION: "{0} 선택 항목을 찾을 수 없습니다." +INVALID_USERNAME: "\"{0}\" 은(는) 잘못된 사용자 이름입니다." +INVALID_WORLD: "유효한 세계를 지정하십시오." +LATEST_VERSION: "최신 버전: {0}" +LINK_DISCORD: "Discord: {0}" +LINK_DOWNLOAD: "다운로드: {0}" +LINK_PATREON: "Patreon: {0}" +LINK_WIKI_BLOCK: "블록 이름: {0}" +LINK_WIKI_ENTITY: "엔터티 이름: {0}" +LOGGING_ITEMS: "{0} 기록할 항목이 남았습니다. 기다리세요..." +LOGGING_TIME_LIMIT: "로깅 시간 제한에 도달했습니다. 데이터를 삭제하고 종료합니다." +LOOKUP_BLOCK: "{0} {배치|파손} {1}." +LOOKUP_CONTAINER: "{0} {추가|삭제됨} {1} {2}." +LOOKUP_HEADER: "{0} 결과" +LOOKUP_INTERACTION: "{0} {클릭|죽음} {1}." +LOOKUP_ITEM: "{0} {집어들었다|떨어뜨렸다} {1} {2}." +LOOKUP_LOGIN: "{0} 기록됨 {인|아웃}." +LOOKUP_PAGE: "페이지 {0}" +LOOKUP_PROJECTILE: "{0} {던졌다|총을 맞았다} {1} {2}." +LOOKUP_ROWS_FOUND: "{0} {행|행} 설립하다." +LOOKUP_SEARCHING: "조회 검색. 기다리세요..." +LOOKUP_STORAGE: "{0} {입금|출금} {1} {2}." +LOOKUP_TIME: "{0} ~ 전에" +LOOKUP_USERNAME: "{0} 다음으로 로그인됨 {1}." +MAXIMUM_RADIUS: "최대 {조회|롤백|복원} 반경은 {0}." +MISSING_ACTION_USER: "해당 작업을 사용하려면 사용자를 지정하세요." +MISSING_LOOKUP_TIME: "시간을 지정해 주세요. {조회|롤백|복원}." +MISSING_LOOKUP_USER: "사용자를 지정하거나 {블록|반경}." +MISSING_PARAMETERS: "사용 해주세요 \"{0}\"." +MISSING_ROLLBACK_RADIUS: "다음을 지정하지 않았습니다. {롤백|복원} 반지름." +MISSING_ROLLBACK_USER: "다음을 지정하지 않았습니다. {롤백|복원} 사용자." +MYSQL_UNAVAILABLE: "연결할 수 없습니다. MySQL 섬기는 사람." +NETWORK_CONNECTION: "연결 방법 {0} {성공|실패}. 사용 {1} {2}." +NETWORK_TEST: "네트워크 테스트 데이터가 성공적으로 전송되었습니다." +NO_DATA: "에서 데이터를 찾을 수 없습니다. {0}." +NO_DATA_LOCATION: "아니요 {데이터|트랜잭션|상호작용|메시지} 설립하다." +NO_PERMISSION: "귀하에게는 그렇게 할 권한이 없습니다." +NO_RESULTS: "검색 결과가 없습니다." +NO_RESULTS_PAGE: "아니요 {결과|데이터} 해당 페이지를 찾았습니다." +NO_ROLLBACK: "아니요 {보류 중|이전} 롤백/복원을 찾았습니다." +PATCH_INTERRUPTED: "업그레이드가 중단되었습니다. 다시 시작하면 다시 시도합니다." +PATCH_OUTDATED_1: "다음보다 오래된 데이터베이스는 업그레이드할 수 없습니다. {0}." +PATCH_OUTDATED_2: "지원되는 버전으로 업그레이드하세요. CoreProtect." +PATCH_PROCESSING: "새로운 데이터를 처리합니다. 기다리세요..." +PATCH_SKIP_UPDATE: "건너뛰는 중 {테이블|인덱스} {업데이트|생성|제거} ~에 {0}." +PATCH_STARTED: "실행할 수 있는 {0} 업그레이드. 기다리세요..." +PATCH_SUCCESS: "다음으로 성공적으로 업그레이드되었습니다. {0}." +PATCH_UPGRADING: "데이터베이스 업그레이드가 진행 중입니다. 기다리세요..." +PLEASE_SELECT: "선택 해주세요: \"{0}\" 또는 \"{1}\"." +PREVIEW_CANCELLED: "미리보기가 취소되었습니다." +PREVIEW_CANCELLING: "미리보기 취소 중..." +PREVIEW_IN_GAME: "게임 내에서만 롤백을 미리 볼 수 있습니다." +PREVIEW_TRANSACTION: "미리 볼 수 없습니다 {컨테이너|인벤토리} 업무." +PURGE_ABORTED: "제거에 실패했습니다. 데이터베이스가 손상되었을 수 있습니다." +PURGE_ERROR: "처리할 수 없습니다. {0} 데이터!" +PURGE_FAILED: "제거에 실패했습니다. 나중에 다시 시도 해주십시오." +PURGE_IN_PROGRESS: "퍼지가 진행 중입니다. 나중에 다시 시도 해주십시오." +PURGE_MINIMUM_TIME: "다음 날짜보다 오래된 데이터만 삭제할 수 있습니다. {0} {일|시간}." +PURGE_NOTICE_1: "이 작업에는 다소 시간이 걸릴 수 있습니다." +PURGE_NOTICE_2: "완료될 때까지 서버를 다시 시작하지 마십시오." +PURGE_OPTIMIZING: "데이터베이스 최적화. 기다리세요..." +PURGE_PROCESSING: "처리 {0} 데이터..." +PURGE_REPAIRING: "수리를 시도 중입니다. 시간이 좀 걸릴 수 있습니다..." +PURGE_ROWS: "{0} {행|행} 삭제된 데이터의 수입니다." +PURGE_STARTED: "'에 데이터 삭제가 시작되었습니다.{0}\"." +PURGE_SUCCESS: "데이터 삭제에 성공했습니다." +RELOAD_STARTED: "구성을 다시 로드하는 중입니다. 잠시 기다려 주세요." +RELOAD_SUCCESS: "구성이 성공적으로 다시 로드되었습니다." +ROLLBACK_ABORTED: "롤백 또는 복원이 중단되었습니다." +ROLLBACK_CHUNKS_FOUND: "설립하다 {0} {청크|청크} 수정합니다." +ROLLBACK_CHUNKS_MODIFIED: "수정됨 {0}/{1} {덩어리|덩어리}." +ROLLBACK_COMPLETED: "{롤백|복원|미리보기} \"에 대해 완료됨{0}\"." +ROLLBACK_EXCLUDED_USERS: "제외된 {사용자|사용자}: \"{0}\"." +ROLLBACK_INCLUDE: "{포함|제외} {블록|엔티티|대상} {유형|유형}: \"{0}\"." +ROLLBACK_IN_PROGRESS: "롤백/복원이 이미 진행 중입니다." +ROLLBACK_LENGTH: "걸린 시간: {0} {초|초}." +ROLLBACK_MODIFIED: "{수정됨|수정 중} {0}." +ROLLBACK_RADIUS: "반지름: {0} {블록|블록}." +ROLLBACK_SELECTION: "반경이 \"로 설정됨{0}\"." +ROLLBACK_STARTED: "{롤백|복원|미리보기} \"에 시작되었습니다.{0}\"." +ROLLBACK_TIME: "시간 범위: {0}." +ROLLBACK_WORLD_ACTION: "제한 {세계|액션} \"{0}\"." +SIGN_HEADER: "메시지 서명" +STATUS_CONSUMER: "소비자: {0} {아이템|아이템} 대기열에 있습니다." +STATUS_DATABASE: "데이터 베이스: 사용 {0}." +STATUS_INTEGRATION: "{0}: 완성 {활성화|비활성화}." +STATUS_LICENSE: "특허: {0}" +STATUS_VERSION: "버전: {0}" +TELEPORTED: "다음으로 순간이동됨 {0}." +TELEPORTED_SAFETY: "당신을 안전한 곳으로 순간이동시켰습니다." +TELEPORT_PLAYERS: "텔레포트 명령은 플레이어만 사용할 수 있습니다." +TIME_DAYS: "{0} {일|일}" +TIME_HOURS: "{0} {시간|시간}" +TIME_MINUTES: "{0} {분|분}" +TIME_SECONDS: "{0} {초|초}" +TIME_WEEKS: "{0} {주|주}" +UPDATE_ERROR: "업데이트를 확인하는 동안 오류가 발생했습니다." +UPDATE_HEADER: "{0} 업데이트" +UPDATE_NOTICE: "알아채다: {0} 이제 사용 가능합니다." +UPGRADE_IN_PROGRESS: "업그레이드가 진행 중입니다. 나중에 다시 시도 해주십시오." +USER_NOT_FOUND: "사용자 \"{0}\" 찾을 수 없습니다." +USER_OFFLINE: "사용자 \"{0}\" 은(는) 온라인이 아닙니다." +USING_MYSQL: "사용 MySQL 데이터 저장용." +USING_SQLITE: "사용 SQLite 데이터 저장용." +VALID_DONATION_KEY: "유효한 기부 키입니다." +VERSION_NOTICE: "버전 {0} 이제 사용 가능합니다." +VERSION_REQUIRED: "{0} {1} 이상이 필요합니다." +WORLD_NOT_FOUND: "세계 \"{0}\" 찾을 수 없습니다." \ No newline at end of file From 63074715d3f601519944fbc15c240dc3986b13d9 Mon Sep 17 00:00:00 2001 From: jd07159 <150450815+jd07159@users.noreply.github.com> Date: Tue, 9 Jul 2024 04:32:41 +0900 Subject: [PATCH 18/60] Improve Korean translation (#566) --- lang/ko.yml | 327 ++++++++++++++++++++++++++-------------------------- 1 file changed, 164 insertions(+), 163 deletions(-) diff --git a/lang/ko.yml b/lang/ko.yml index 251fbf85..c4bc2b69 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -1,202 +1,203 @@ # CoreProtect Language File (ko) -ACTION_NOT_SUPPORTED: "해당 작업은 지원되지 않습니다." +ACTION_NOT_SUPPORTED: "해당 명령어는 해당 작업을 지원하지 않습니다." AMOUNT_BLOCK: "{0} {블록|블록}" -AMOUNT_CHUNK: "{0} {덩어리|덩어리}" -AMOUNT_ENTITY: "{0} {엔터티|엔티티}" -AMOUNT_ITEM: "{0} {아이템|아이템}" -API_TEST: "API 테스트에 성공했습니다." -CACHE_ERROR: "경고: 유효성을 검사하는 중 오류가 발생했습니다. {0} 은닉처." -CACHE_RELOAD: "강제로 다시 로드 {매핑|세계} 데이터베이스에서 캐시합니다." -CHECK_CONFIG: "config.yml을 확인하세요." -COMMAND_CONSOLE: "콘솔에서 명령을 실행해 보세요." -COMMAND_NOT_FOUND: "명령 \"{0}\" 찾을 수 없습니다." -COMMAND_THROTTLED: "잠시 후에 다시 시도해 주세요." -CONSUMER_ERROR: "이미 소비자 대기열 처리 중 {일시중지됨|재개됨}." -CONSUMER_TOGGLED: "소비자 대기열 처리가 완료되었습니다. {일시중지됨|재개됨}." -CONTAINER_HEADER: "컨테이너 거래" -DATABASE_BUSY: "데이터베이스가 사용 중입니다. 나중에 다시 시도 해주십시오." +AMOUNT_CHUNK: "{0} {청크|청크}" +AMOUNT_ENTITY: "{0} {엔티티|엔티티}" +AMOUNT_ITEM: "{0} {항목|항목}" +API_TEST: "API 테스트가 성공했습니다." +CACHE_ERROR: "경고: {0} 캐시를 검증하는 중 오류가 발생했습니다." +CACHE_RELOAD: "데이터베이스에서 {매핑|월드} 캐시를 강제로 다시 로드합니다." +CHECK_CONFIG: "config.yml을 확인하세요" +COMMAND_CONSOLE: "콘솔에서 명령어를 실행하세요." +COMMAND_NOT_FOUND: "\"{0}\" 명령어를 찾을 수 없습니다." +COMMAND_THROTTLED: "잠시 기다렸다가 다시 시도하십시오." +CONSUMER_ERROR: "소비자 대기열 처리가 이미 {일시 중지|재개}되있습니다!" +CONSUMER_TOGGLED: "소비자 대기열 처리가 {일시 중지|재개}되었습니다." +CONTAINER_HEADER: "컨테이너 기록" +DATABASE_BUSY: "데이터베이스가 사용 중입니다. 나중에 다시 시도하십시오." DATABASE_INDEX_ERROR: "데이터베이스 인덱스의 유효성을 검사할 수 없습니다." -DATABASE_LOCKED_1: "데이터베이스가 잠겨 있습니다. 최대 15초 동안 대기..." -DATABASE_LOCKED_2: "데이터베이스가 이미 사용 중입니다. 다시 시도해 주세요." -DATABASE_LOCKED_3: "데이터베이스 잠금을 비활성화하려면 \"database-lock: false\"를 설정합니다." +DATABASE_LOCKED_1: "데이터베이스가 잠겼습니다. 최대 15초 대기 중..." +DATABASE_LOCKED_2: "데이터베이스가 이미 사용 중입니다. 다시 시도하십시오." +DATABASE_LOCKED_3: "데이터베이스 잠금을 비활성화하려면 \"database-lock: false\"로 설정하세요." DATABASE_LOCKED_4: "데이터베이스 잠금을 비활성화하면 데이터가 손상될 수 있습니다." DATABASE_UNREACHABLE: "데이터베이스에 연결할 수 없습니다. 데이터를 삭제하고 종료합니다." -DEVELOPMENT_BRANCH: "개발 분기가 감지되어 패치 스크립트를 건너뜁니다." -DISABLE_SUCCESS: "성공! 장애가 있는 {0}" -ENABLE_FAILED: "{0} 시작할 수 없었습니다." -ENABLE_SUCCESS: "{0} 이제 활성화되었습니다!" -ENJOY_COREPROTECT: "즐기다 {0}? 우리의 Discord!" -FINISHING_CONVERSION: "데이터 변환을 마무리합니다. 기다리세요..." -FINISHING_LOGGING: "데이터 로깅을 마무리합니다. 기다리세요..." +DEVELOPMENT_BRANCH: "개발 브랜치가 감지되어 패치 스크립트를 건너뜁니다." +DIRT_BLOCK: "당신 아래에 흙 블록을 설치했습니다." +DISABLE_SUCCESS: "성공! {0} 비활성화됨" +ENABLE_FAILED: "{0}을(를) 시작할 수 없습니다." +ENABLE_SUCCESS: "{0}이(가) 성공적으로 활성화되었습니다!" +ENJOY_COREPROTECT: "{0}을(를) 사용중이신가요? Discord 서버에 참여해보세요!" +FINISHING_CONVERSION: "데이터 변환을 완료하는 중입니다. 잠시 기다려 주세요..." +FINISHING_LOGGING: "데이터 로깅을 완료하는 중입니다. 잠시 기다려 주십시오..." FIRST_VERSION: "초기 DB: {0}" -GLOBAL_LOOKUP: "전역 조회를 수행하려면 반경을 지정하지 마세요." -GLOBAL_ROLLBACK: "사용 \"{0}\" 글로벌을 하려고 {롤백|복원}" -HELP_ACTION_1: "조회를 작업으로 제한합니다." -HELP_ACTION_2: "예: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]" -HELP_COMMAND: "추가 정보를 표시합니다." +GLOBAL_LOOKUP: "전체 조회를 수행하려면 반경을 지정하지 마세요." +GLOBAL_ROLLBACK: "전역 {롤백|복원}을 수행하려면 \"{0}\"을(를) 사용하세요." +HELP_ACTION_1: "특정 작업으로 조회를 제한합니다." +HELP_ACTION_2: "예: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a :kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]" +HELP_COMMAND: "해당 명령어에 대한 추가 정보를 표시합니다." HELP_EXCLUDE_1: "블록/사용자를 제외합니다." HELP_EXCLUDE_2: "예: [e:stone], [e:Notch], [e:stone,Notch]" -HELP_HEADER: "{0} 돕다" -HELP_INCLUDE_1: "블록/엔티티를 포함합니다." +HELP_HEADER: "{0} 도움말" +HELP_INCLUDE_1: "특정 블록/엔티티를 포함합니다." HELP_INCLUDE_2: "예: [i:stone], [i:zombie], [i:stone,wood,bedrock]" -HELP_INSPECT_1: "검사기를 활성화하면 다음을 수행할 수 있습니다." -HELP_INSPECT_2: "배치를 보려면 마우스 왼쪽 버튼을 클릭하세요." -HELP_INSPECT_3: "인접한 제거 항목을 보려면 마우스 오른쪽 버튼을 클릭하세요." -HELP_INSPECT_4: "블록을 배치하면 제거되는 모습을 볼 수 있습니다." -HELP_INSPECT_5: "배치를 확인하려면 블록을 액체에 넣으세요." -HELP_INSPECT_6: "상자 거래를 보려면 마우스 오른쪽 버튼을 클릭하세요." -HELP_INSPECT_7: "팁: \"/co i\"만 사용할 수 있습니다." -HELP_INSPECT_COMMAND: "블록 검사기를 토글합니다." -HELP_LIST: "모든 명령 목록을 표시합니다." -HELP_LOOKUP_1: "명령 단축키." -HELP_LOOKUP_2: "추가 페이지를 봅니다." -HELP_LOOKUP_COMMAND: "블록 데이터를 조회합니다." -HELP_NO_INFO: "명령에 대한 정보 \"{0}\" 찾을 수 없습니다." -HELP_PARAMETER: "\"를 참조하십시오.{0}\" 자세한 매개변수 정보를 확인하세요." -HELP_PARAMS_1: "수행 {조회|롤백|복원}." -HELP_PARAMS_2: "사용자를 지정합니다. {조회|롤백|복원}." -HELP_PARAMS_3: "시간을 지정하세요. {조회|롤백|복원}." -HELP_PARAMS_4: "제한하다 {조회|롤백|복원} 반경으로." -HELP_PARAMS_5: "제한하다 {조회|롤백|복원} 행동에." -HELP_PARAMS_6: "블록/엔티티를 {조회|롤백|복원}." -HELP_PARAMS_7: "블록/사용자를 다음에서 제외합니다. {조회|롤백|복원}." -HELP_PURGE_1: "오래된 데이터를 제거하세요." -HELP_PURGE_2: "예를 들어, \"{0}\" 는 한 달이 지난 데이터를 모두 삭제하고 최근 30일간의 데이터만 보관합니다." -HELP_PURGE_COMMAND: "오래된 블록 데이터를 삭제하세요." -HELP_RADIUS_1: "반경 영역을 지정합니다." -HELP_RADIUS_2: "예: [r:10] (10블록 이내에서만 변경하세요)" +HELP_INSPECT_1: "로그 조사가 활성화되면 다음을 수행할 수 있습니다:" +HELP_INSPECT_2: "누가 그 블록을 설치했는지 보려면 블록을 마우스 왼쪽 버튼으로 클릭하세요." +HELP_INSPECT_3: "블록을 마우스 오른쪽 버튼으로 클릭하면 인접한 블록이 깨졌는지 확인할 수 있습니다." +HELP_INSPECT_4: "블록을 배치하여 해당 위치에서 어떤 블록이 깨졌는지 확인하세요." +HELP_INSPECT_5: "누가 설치했는지 확인하려면 액체(등)에 블록을 배치하세요." +HELP_INSPECT_6: "문, 상자 등을 마우스 오른쪽 버튼으로 클릭하면 누가 마지막으로 사용했는지 확인할 수 있습니다." +HELP_INSPECT_7: "팁: 더 빠른 액세스를 위해 \"/co i\"명령어를 사용할 수 있습니다." +HELP_INSPECT_COMMAND: "블록 로그 조사를 켜거나 끕니다." +HELP_LIST: "모든 명령어 목록을 표시합니다." +HELP_LOOKUP_1: "명령어 단축키." +HELP_LOOKUP_2: "로그를 보려면 블록을 검사한 후 사용하세요." +HELP_LOOKUP_COMMAND: "고급 블록 데이터 조회." +HELP_NO_INFO: "\"{0}\" 명령어에 대한 정보를 찾을 수 없습니다." +HELP_PARAMETER: "자세한 매개변수 정보는 \"{0}\"을 참조하세요." +HELP_PARAMS_1: "{조회|롤백|복원}을(를) 수행하세요." +HELP_PARAMS_2: "{조회|롤백|복원}할 사용자를 지정하세요." +HELP_PARAMS_3: "{조회|롤백|복원}에 걸리는 시간을 지정하세요." +HELP_PARAMS_4: "{조회|롤백|복원}을(를) 제한할 반경 영역을 지정하세요." +HELP_PARAMS_5: "{조회|롤백|복원}을(를) 특정 작업으로 제한합니다." +HELP_PARAMS_6: "{조회|롤백|복원}에 특정 블록/엔티티를 포함합니다." +HELP_PARAMS_7: "{조회|롤백|복원}에서 블록/사용자를 제외합니다." +HELP_PURGE_1: "지정된 시간보다 오래된 데이터를 삭제합니다." +HELP_PURGE_2: "예를 들어 \"{0}\"은(는) 한 달이 지난 모든 데이터를 삭제하고 지난 30일 동안의 데이터만 보관합니다." +HELP_PURGE_COMMAND: "오래된 블록 데이터를 삭제합니다." +HELP_RADIUS_1: "반경 영역을 지정하세요." +HELP_RADIUS_2: "예: [r:10] (10블록 이내에서만 변경하세요.)" HELP_RELOAD_COMMAND: "구성 파일을 다시 로드합니다." HELP_RESTORE_COMMAND: "블록 데이터를 복원합니다." HELP_ROLLBACK_COMMAND: "블록 데이터를 롤백합니다." -HELP_STATUS: "플러그인 상태를 봅니다." +HELP_STATUS: "플러그인 상태 및 버전 정보를 확인하세요." HELP_STATUS_COMMAND: "플러그인 상태를 표시합니다." -HELP_TELEPORT: "텔레포트." -HELP_TIME_1: "시간을 지정하세요." +HELP_TELEPORT: "특정 위치로 순간이동합니다." +HELP_TIME_1: "조회 시간을 지정하세요." HELP_TIME_2: "예: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]" -HELP_USER_1: "사용자를 지정합니다." -HELP_USER_2: "예: [u:Notch], [u:Notch,#enderman]" -INCOMPATIBLE_ACTION: "\"{0}\" 는 해당 작업과 함께 사용할 수 없습니다." -INSPECTOR_ERROR: "검사님은 이미 {활성화|비활성화}." -INSPECTOR_TOGGLED: "지금 검사관 {활성화|비활성화}." -INTEGRATION_ERROR: "할 수없는 {초기화|비활성화} {0} 벌채 반출." -INTEGRATION_SUCCESS: "{0} 성공적으로 로깅 {초기화|비활성화}." -INTEGRATION_VERSION: "유효하지 않은 {0} 버전을 찾았습니다." +HELP_USER_1: "조회할 사용자를 지정하세요." +HELP_USER_2: "예: [u:notch], [u:notch,#enderman]" +INCOMPATIBLE_ACTION: "\"{0}\"은(는) 해당 작업과 함께 사용할 수 없습니다." +INSPECTOR_ERROR: "로그 조사가 이미 {활성화|비활성화}되있습니다!" +INSPECTOR_TOGGLED: "로그 조사가 {활성화|비활성화}되었습니다." +INTEGRATION_ERROR: "{0} 로깅을 {초기화|비활성화}할 수 없습니다." +INTEGRATION_SUCCESS: "{0} 로깅이 성공적으로 {초기화|비활성화}되었습니다." +INTEGRATION_VERSION: "잘못된 {0} 버전이 발견되었습니다." INTERACTIONS_HEADER: "플레이어 상호작용" -INVALID_ACTION: "이는 유효한 조치가 아닙니다." -INVALID_BRANCH_1: "잘못된 플러그인 버전입니다(분기가 설정되지 않았습니다)." -INVALID_BRANCH_2: "계속하려면 프로젝트 분기를 \"개발\"로 설정하세요." -INVALID_BRANCH_3: "개발 코드를 실행하면 데이터가 손상될 수 있습니다." -INVALID_CONTAINER: "먼저 유효한 용기를 검사하십시오." -INVALID_DONATION_KEY: "기부 키가 잘못되었습니다." -INVALID_INCLUDE: "\"{0}\" 는 잘못된 값입니다." -INVALID_INCLUDE_COMBO: "이는 잘못된 유형 조합입니다." +INVALID_ACTION: "유효하지 않은 작업입니다." +INVALID_BRANCH_1: "잘못된 플러그인 버전(브랜치가 설정되지 않음)." +INVALID_BRANCH_2: "계속하려면 프로젝트 브랜치를 \"development\"로 설정하세요." +INVALID_BRANCH_3: "개발 코드를 실행하면 데이터 손상이 발생할 수 있습니다." +INVALID_CONTAINER: "먼저 유효한 컨테이너를 검사하세요." +INVALID_DONATION_KEY: "잘못된 후원 키입니다." +INVALID_INCLUDE: "\"{0}\"은(는) 잘못된 블록/엔티티 이름입니다." +INVALID_INCLUDE_COMBO: "잘못된 블록/엔티티 조합입니다." INVALID_RADIUS: "유효한 반경을 입력하세요." -INVALID_SELECTION: "{0} 선택 항목을 찾을 수 없습니다." -INVALID_USERNAME: "\"{0}\" 은(는) 잘못된 사용자 이름입니다." -INVALID_WORLD: "유효한 세계를 지정하십시오." +INVALID_SELECTION: "{0} 선택을 찾을 수 없습니다." +INVALID_USERNAME: "\"{0}\"은(는) 잘못된 사용자 이름입니다." +INVALID_WORLD: "유효한 월드를 지정하세요." LATEST_VERSION: "최신 버전: {0}" LINK_DISCORD: "Discord: {0}" LINK_DOWNLOAD: "다운로드: {0}" LINK_PATREON: "Patreon: {0}" LINK_WIKI_BLOCK: "블록 이름: {0}" -LINK_WIKI_ENTITY: "엔터티 이름: {0}" -LOGGING_ITEMS: "{0} 기록할 항목이 남았습니다. 기다리세요..." -LOGGING_TIME_LIMIT: "로깅 시간 제한에 도달했습니다. 데이터를 삭제하고 종료합니다." -LOOKUP_BLOCK: "{0} {배치|파손} {1}." -LOOKUP_CONTAINER: "{0} {추가|삭제됨} {1} {2}." -LOOKUP_HEADER: "{0} 결과" -LOOKUP_INTERACTION: "{0} {클릭|죽음} {1}." -LOOKUP_ITEM: "{0} {집어들었다|떨어뜨렸다} {1} {2}." -LOOKUP_LOGIN: "{0} 기록됨 {인|아웃}." +LINK_WIKI_ENTITY: "엔티티 이름: {0}" +LOGGING_ITEMS: "{0} 아이템이 남았습니다. 잠시만 기다려 주세요..." +LOGGING_TIME_LIMIT: "로깅 시간 제한에 도달했습니다. 데이터를 폐기하고 종료합니다." +LOOKUP_BLOCK: "{0}이(가) {1}을(를) {설치|파괴}했습니다." +LOOKUP_CONTAINER: "{0}이(가) {2}에서 {1}을(를) {추가|제거}했습니다." +LOOKUP_HEADER: "{0} 조회 결과" +LOOKUP_INTERACTION: "{0}이(가) {1}을(를) {클릭|처치}했습니다." +LOOKUP_ITEM: "{0}이(가) {2}에서 {1}을(를) {획득|드롭}했습니다." +LOOKUP_LOGIN: "{0}이(가) {로그인|로그아웃}했습니다." LOOKUP_PAGE: "페이지 {0}" -LOOKUP_PROJECTILE: "{0} {던졌다|총을 맞았다} {1} {2}." -LOOKUP_ROWS_FOUND: "{0} {행|행} 설립하다." -LOOKUP_SEARCHING: "조회 검색. 기다리세요..." -LOOKUP_STORAGE: "{0} {입금|출금} {1} {2}." -LOOKUP_TIME: "{0} ~ 전에" -LOOKUP_USERNAME: "{0} 다음으로 로그인됨 {1}." -MAXIMUM_RADIUS: "최대 {조회|롤백|복원} 반경은 {0}." +LOOKUP_PROJECTILE: "{0}이(가) {2}에서 {1}을(를) {던졌|발사했}습니다.." +LOOKUP_ROWS_FOUND: "{0} {열|열}이 발견되었습니다." +LOOKUP_SEARCHING: "조회 중입니다. 잠시만 기다려 주세요..." +LOOKUP_STORAGE: "{0}이(가) {2}에서 {1}을(를) {추가|제거}했습니다." +LOOKUP_TIME: "{0} 전" +LOOKUP_USERNAME: "{0}이(가) {1}으로 로그인했습니다." +MAXIMUM_RADIUS: "최대 {조회|롤백|복원} 반경은 {0}입니다." MISSING_ACTION_USER: "해당 작업을 사용하려면 사용자를 지정하세요." -MISSING_LOOKUP_TIME: "시간을 지정해 주세요. {조회|롤백|복원}." -MISSING_LOOKUP_USER: "사용자를 지정하거나 {블록|반경}." -MISSING_PARAMETERS: "사용 해주세요 \"{0}\"." -MISSING_ROLLBACK_RADIUS: "다음을 지정하지 않았습니다. {롤백|복원} 반지름." -MISSING_ROLLBACK_USER: "다음을 지정하지 않았습니다. {롤백|복원} 사용자." -MYSQL_UNAVAILABLE: "연결할 수 없습니다. MySQL 섬기는 사람." -NETWORK_CONNECTION: "연결 방법 {0} {성공|실패}. 사용 {1} {2}." +MISSING_LOOKUP_TIME: "{조회|롤백|복원}할 시간을 지정하세요." +MISSING_LOOKUP_USER: "조회할 사용자 또는 {블록|반경}을 지정하세요." +MISSING_PARAMETERS: "\"{0}\"을(를) 사용하세요." +MISSING_ROLLBACK_RADIUS: "{롤백|복원} 반경을 지정하지 않았습니다." +MISSING_ROLLBACK_USER: "{롤백|복원} 사용자를 지정하지 않았습니다." +MYSQL_UNAVAILABLE: "MySQL 서버에 연결할 수 없습니다." +NETWORK_CONNECTION: "{0} 연결 {성공|실패}. {1} {2} 사용 중." NETWORK_TEST: "네트워크 테스트 데이터가 성공적으로 전송되었습니다." -NO_DATA: "에서 데이터를 찾을 수 없습니다. {0}." -NO_DATA_LOCATION: "아니요 {데이터|트랜잭션|상호작용|메시지} 설립하다." -NO_PERMISSION: "귀하에게는 그렇게 할 권한이 없습니다." -NO_RESULTS: "검색 결과가 없습니다." -NO_RESULTS_PAGE: "아니요 {결과|데이터} 해당 페이지를 찾았습니다." -NO_ROLLBACK: "아니요 {보류 중|이전} 롤백/복원을 찾았습니다." -PATCH_INTERRUPTED: "업그레이드가 중단되었습니다. 다시 시작하면 다시 시도합니다." -PATCH_OUTDATED_1: "다음보다 오래된 데이터베이스는 업그레이드할 수 없습니다. {0}." -PATCH_OUTDATED_2: "지원되는 버전으로 업그레이드하세요. CoreProtect." -PATCH_PROCESSING: "새로운 데이터를 처리합니다. 기다리세요..." -PATCH_SKIP_UPDATE: "건너뛰는 중 {테이블|인덱스} {업데이트|생성|제거} ~에 {0}." -PATCH_STARTED: "실행할 수 있는 {0} 업그레이드. 기다리세요..." -PATCH_SUCCESS: "다음으로 성공적으로 업그레이드되었습니다. {0}." -PATCH_UPGRADING: "데이터베이스 업그레이드가 진행 중입니다. 기다리세요..." -PLEASE_SELECT: "선택 해주세요: \"{0}\" 또는 \"{1}\"." +NO_DATA: "{0}에서 데이터를 찾을 수 없습니다." +NO_DATA_LOCATION: "해당 위치에서 {데이터|거래|상호작용|메시지}(을)를 찾을 수 없습니다." +NO_PERMISSION: "해당 작업을 수행할 권한이 없습니다." +NO_RESULTS: "결과를 찾을 수 없습니다." +NO_RESULTS_PAGE: "해당 페이지에 대한 {결과|데이터}를 찾을 수 없습니다." +NO_ROLLBACK: "{보류 중인|이전} 롤백/복원을 찾을 수 없습니다." +PATCH_INTERRUPTED: "업그레이드가 중단되었습니다. 다시 시작할 때 재시도합니다." +PATCH_OUTDATED_1: "{0}보다 오래된 데이터베이스를 업그레이드할 수 없습니다." +PATCH_OUTDATED_2: "지원되는 CoreProtect 버전으로 업그레이드하세요." +PATCH_PROCESSING: "새 데이터를 처리 중입니다. 잠시 기다려 주세요..." +PATCH_SKIP_UPDATE: "{0}에서 {테이블|인덱스} {업데이트|생성|제거}를 건너뜁니다." +PATCH_STARTED: "{0} 업그레이드를 수행 중입니다. 잠시 기다려 주세요..." +PATCH_SUCCESS: "{0}으로 성공적으로 업그레이드되었습니다." +PATCH_UPGRADING: "데이터베이스 업그레이드가 진행 중입니다. 잠시 기다려 주세요..." +PLEASE_SELECT: "다음을 선택하세요: \"{0}\" 또는 \"{1}\"." PREVIEW_CANCELLED: "미리보기가 취소되었습니다." PREVIEW_CANCELLING: "미리보기 취소 중..." -PREVIEW_IN_GAME: "게임 내에서만 롤백을 미리 볼 수 있습니다." -PREVIEW_TRANSACTION: "미리 볼 수 없습니다 {컨테이너|인벤토리} 업무." -PURGE_ABORTED: "제거에 실패했습니다. 데이터베이스가 손상되었을 수 있습니다." -PURGE_ERROR: "처리할 수 없습니다. {0} 데이터!" -PURGE_FAILED: "제거에 실패했습니다. 나중에 다시 시도 해주십시오." -PURGE_IN_PROGRESS: "퍼지가 진행 중입니다. 나중에 다시 시도 해주십시오." -PURGE_MINIMUM_TIME: "다음 날짜보다 오래된 데이터만 삭제할 수 있습니다. {0} {일|시간}." -PURGE_NOTICE_1: "이 작업에는 다소 시간이 걸릴 수 있습니다." -PURGE_NOTICE_2: "완료될 때까지 서버를 다시 시작하지 마십시오." -PURGE_OPTIMIZING: "데이터베이스 최적화. 기다리세요..." -PURGE_PROCESSING: "처리 {0} 데이터..." -PURGE_REPAIRING: "수리를 시도 중입니다. 시간이 좀 걸릴 수 있습니다..." -PURGE_ROWS: "{0} {행|행} 삭제된 데이터의 수입니다." -PURGE_STARTED: "'에 데이터 삭제가 시작되었습니다.{0}\"." -PURGE_SUCCESS: "데이터 삭제에 성공했습니다." -RELOAD_STARTED: "구성을 다시 로드하는 중입니다. 잠시 기다려 주세요." -RELOAD_SUCCESS: "구성이 성공적으로 다시 로드되었습니다." +PREVIEW_IN_GAME: "롤백을 미리보려면 게임 내에서만 가능합니다." +PREVIEW_TRANSACTION: "{컨테이너|인벤토리} 기록을 미리볼 수 없습니다." +PURGE_ABORTED: "삭제 실패. 데이터베이스가 손상되었을 수 있습니다." +PURGE_ERROR: "{0} 데이터를 처리할 수 없습니다!" +PURGE_FAILED: "삭제 실패. 나중에 다시 시도하세요." +PURGE_IN_PROGRESS: "삭제가 진행 중입니다. 나중에 다시 시도하세요." +PURGE_MINIMUM_TIME: "{0} {일|시간}보다 오래된 데이터만 삭제할 수 있습니다." +PURGE_NOTICE_1: "이 작업은 시간이 걸릴 수 있습니다." +PURGE_NOTICE_2: "완료될 때까지 서버를 재시작하지 마세요." +PURGE_OPTIMIZING: "데이터베이스 최적화 중입니다. 잠시 기다려 주세요..." +PURGE_PROCESSING: "{0} 데이터를 처리 중입니다..." +PURGE_REPAIRING: "복구 시도 중입니다. 시간이 걸릴 수 있습니다..." +PURGE_ROWS: "{0} {열|열}의 데이터가 삭제되었습니다." +PURGE_STARTED: "\"{0}\"에서 데이터 삭제가 시작되었습니다." +PURGE_SUCCESS: "데이터 삭제가 성공적으로 완료되었습니다." +RELOAD_STARTED: "구성 리로드 중 - 잠시 기다려 주세요." +RELOAD_SUCCESS: "구성이 성공적으로 리로드되었습니다." ROLLBACK_ABORTED: "롤백 또는 복원이 중단되었습니다." -ROLLBACK_CHUNKS_FOUND: "설립하다 {0} {청크|청크} 수정합니다." -ROLLBACK_CHUNKS_MODIFIED: "수정됨 {0}/{1} {덩어리|덩어리}." -ROLLBACK_COMPLETED: "{롤백|복원|미리보기} \"에 대해 완료됨{0}\"." +ROLLBACK_CHUNKS_FOUND: "{0} {청크|청크}를 수정할 준비가 되었습니다." +ROLLBACK_CHUNKS_MODIFIED: "{1} 중 {0} {청크|청크}를 수정했습니다." +ROLLBACK_COMPLETED: "\"{0}\"에 대한 {롤백이|복원이|미리보기가} 완료되었습니다." ROLLBACK_EXCLUDED_USERS: "제외된 {사용자|사용자}: \"{0}\"." -ROLLBACK_INCLUDE: "{포함|제외} {블록|엔티티|대상} {유형|유형}: \"{0}\"." +ROLLBACK_INCLUDE: "{포함된|제외된} {블록|엔티티|대상} {타입|타입}: \"{0}\"." ROLLBACK_IN_PROGRESS: "롤백/복원이 이미 진행 중입니다." -ROLLBACK_LENGTH: "걸린 시간: {0} {초|초}." -ROLLBACK_MODIFIED: "{수정됨|수정 중} {0}." -ROLLBACK_RADIUS: "반지름: {0} {블록|블록}." -ROLLBACK_SELECTION: "반경이 \"로 설정됨{0}\"." -ROLLBACK_STARTED: "{롤백|복원|미리보기} \"에 시작되었습니다.{0}\"." +ROLLBACK_LENGTH: "소요 시간: {0} {초|초}." +ROLLBACK_MODIFIED: "{0}이(가) {수정됨|수정 중}." +ROLLBACK_RADIUS: "반경: {0} {블록|블록}." +ROLLBACK_SELECTION: "반경이 \"{0}\"로 설정되었습니다." +ROLLBACK_STARTED: "\"{0}\"에서 {롤백이|복원이|미리보기가} 시작되었습니다." ROLLBACK_TIME: "시간 범위: {0}." -ROLLBACK_WORLD_ACTION: "제한 {세계|액션} \"{0}\"." -SIGN_HEADER: "메시지 서명" -STATUS_CONSUMER: "소비자: {0} {아이템|아이템} 대기열에 있습니다." -STATUS_DATABASE: "데이터 베이스: 사용 {0}." -STATUS_INTEGRATION: "{0}: 완성 {활성화|비활성화}." -STATUS_LICENSE: "특허: {0}" +ROLLBACK_WORLD_ACTION: "{월드|작업} \"{0}\"으로 제한됨." +SIGN_HEADER: "표지판 메시지" +STATUS_CONSUMER: "소비자: 대기 중인 {0} {항목|항목들}." +STATUS_DATABASE: "데이터베이스: {0} 사용 중." +STATUS_INTEGRATION: "{0}: 통합 {활성화됨|비활성화됨}." +STATUS_LICENSE: "라이선스: {0}" STATUS_VERSION: "버전: {0}" -TELEPORTED: "다음으로 순간이동됨 {0}." -TELEPORTED_SAFETY: "당신을 안전한 곳으로 순간이동시켰습니다." -TELEPORT_PLAYERS: "텔레포트 명령은 플레이어만 사용할 수 있습니다." +TELEPORTED: "{0}(으)로 텔레포트되었습니다." +TELEPORTED_SAFETY: "안전하게 텔레포트되었습니다." +TELEPORT_PLAYERS: "텔레포트 명령어는 플레이어만 사용할 수 있습니다." TIME_DAYS: "{0} {일|일}" TIME_HOURS: "{0} {시간|시간}" TIME_MINUTES: "{0} {분|분}" TIME_SECONDS: "{0} {초|초}" TIME_WEEKS: "{0} {주|주}" -UPDATE_ERROR: "업데이트를 확인하는 동안 오류가 발생했습니다." +UPDATE_ERROR: "업데이트 확인 중 오류가 발생했습니다." UPDATE_HEADER: "{0} 업데이트" -UPDATE_NOTICE: "알아채다: {0} 이제 사용 가능합니다." -UPGRADE_IN_PROGRESS: "업그레이드가 진행 중입니다. 나중에 다시 시도 해주십시오." -USER_NOT_FOUND: "사용자 \"{0}\" 찾을 수 없습니다." -USER_OFFLINE: "사용자 \"{0}\" 은(는) 온라인이 아닙니다." -USING_MYSQL: "사용 MySQL 데이터 저장용." -USING_SQLITE: "사용 SQLite 데이터 저장용." -VALID_DONATION_KEY: "유효한 기부 키입니다." -VERSION_NOTICE: "버전 {0} 이제 사용 가능합니다." +UPDATE_NOTICE: "알림: {0}이(가) 이제 사용할 수 있습니다." +UPGRADE_IN_PROGRESS: "업그레이드가 진행 중입니다. 나중에 다시 시도하세요." +USER_NOT_FOUND: "사용자 \"{0}\"을(를) 찾을 수 없습니다." +USER_OFFLINE: "사용자 \"{0}\"이(가) 온라인 상태가 아닙니다." +USING_MYSQL: "데이터 저장에 MySQL을 사용 중입니다." +USING_SQLITE: "데이터 저장에 SQLite를 사용 중입니다." +VALID_DONATION_KEY: "유효한 후원 키입니다." +VERSION_NOTICE: "버전 {0}(를) 이제 사용할 수 있습니다." VERSION_REQUIRED: "{0} {1} 이상이 필요합니다." -WORLD_NOT_FOUND: "세계 \"{0}\" 찾을 수 없습니다." \ No newline at end of file +WORLD_NOT_FOUND: " \"{0}\"을(를) 찾을 수 없습니다." \ No newline at end of file From e093970992cccd565d29e661d25c76e63198726c Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 8 Jul 2024 19:53:53 -0600 Subject: [PATCH 19/60] Fixed inventory sorting mods generating unnecessary threads --- .../player/InventoryChangeListener.java | 10 +++++++ .../java/net/coreprotect/utility/Util.java | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java index 2cbdf35b..27612343 100644 --- a/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java +++ b/src/main/java/net/coreprotect/listener/player/InventoryChangeListener.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import org.bukkit.Location; @@ -38,6 +39,7 @@ public final class InventoryChangeListener extends Queue implements Listener { protected static AtomicLong tasksStarted = new AtomicLong(); protected static AtomicLong tasksCompleted = new AtomicLong(); + private static ConcurrentHashMap inventoryProcessing = new ConcurrentHashMap<>(); protected static void checkTasks(long taskStarted) { try { @@ -225,11 +227,19 @@ static void onInventoryInteractAsync(Player player, Inventory inventory, boolean Location inventoryLocation = location; ItemStack[] containerState = Util.getContainerState(inventory.getContents()); + String loggingChestId = player.getName() + "." + location.getBlockX() + "." + location.getBlockY() + "." + location.getBlockZ(); + Boolean lastTransaction = inventoryProcessing.get(loggingChestId); + if (lastTransaction != null) { + return; + } + inventoryProcessing.put(loggingChestId, true); + final long taskStarted = InventoryChangeListener.tasksStarted.incrementAndGet(); Scheduler.runTaskAsynchronously(CoreProtect.getInstance(), () -> { try { Material containerType = (enderChest != true ? null : Material.ENDER_CHEST); InventoryChangeListener.checkTasks(taskStarted); + inventoryProcessing.remove(loggingChestId); onInventoryInteract(player.getName(), inventory, containerState, containerType, inventoryLocation, true); } catch (Exception e) { diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index fc3f5c31..72306510 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -11,6 +11,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -641,6 +642,33 @@ public static ItemStack[] getContainerState(ItemStack[] array) { return result; } + public static ItemStack[] sortContainerState(ItemStack[] array) { + if (array == null) { + return null; + } + + ItemStack[] sorted = new ItemStack[array.length]; + Map map = new HashMap<>(); + for (ItemStack itemStack : array) { + if (itemStack == null) { + continue; + } + + map.put(itemStack.toString(), itemStack); + } + + ArrayList sortedKeys = new ArrayList<>(map.keySet()); + Collections.sort(sortedKeys); + + int i = 0; + for (String key : sortedKeys) { + sorted[i] = map.get(key); + i++; + } + + return sorted; + } + /* return true if ItemStack[] contents are identical */ public static boolean compareContainers(ItemStack[] oldContainer, ItemStack[] newContainer) { if (oldContainer.length != newContainer.length) { From dbd8723752306a4ebaff829b3cda8b5de4191f2b Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 9 Jul 2024 18:02:49 -0600 Subject: [PATCH 20/60] Added CPU & RAM information to /co status --- lang/en.yml | 5 ++- pom.xml | 12 ++++++ .../coreprotect/command/StatusCommand.java | 37 ++++++++++++++++++- .../net/coreprotect/config/ConfigHandler.java | 2 + .../net/coreprotect/language/Language.java | 3 ++ .../java/net/coreprotect/language/Phrase.java | 3 ++ .../java/net/coreprotect/utility/Util.java | 17 +++++++++ 7 files changed, 77 insertions(+), 2 deletions(-) diff --git a/lang/en.yml b/lang/en.yml index d2fcd5df..28aecf9f 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -15,6 +15,7 @@ COMMAND_THROTTLED: "Please wait a moment and try again." CONSUMER_ERROR: "Consumer queue processing already {paused|resumed}." CONSUMER_TOGGLED: "Consumer queue processing has been {paused|resumed}." CONTAINER_HEADER: "Container Transactions" +CPU_CORES: "CPU cores." DATABASE_BUSY: "Database busy. Please try again later." DATABASE_INDEX_ERROR: "Unable to validate database indexes." DATABASE_LOCKED_1: "Database locked. Waiting up to 15 seconds..." @@ -23,7 +24,7 @@ DATABASE_LOCKED_3: "To disable database locking, set \"database-lock: false\"." DATABASE_LOCKED_4: "Disabling database locking can result in data corruption." DATABASE_UNREACHABLE: "Database is unreachable. Discarding data and shutting down." DEVELOPMENT_BRANCH: "Development branch detected, skipping patch scripts." -DIRT_BLOCK: "Placed a dirt block under you." +DIRT_BLOCK: "Placed a temporary safety block under you." DISABLE_SUCCESS: "Success! Disabled {0}" ENABLE_FAILED: "{0} was unable to start." ENABLE_SUCCESS: "{0} has been successfully enabled!" @@ -159,6 +160,7 @@ PURGE_REPAIRING: "Attempting to repair. This may take some time..." PURGE_ROWS: "{0} {row|rows} of data deleted." PURGE_STARTED: "Data purge started on \"{0}\"." PURGE_SUCCESS: "Data purge successful." +RAM_STATS: "{0}GB / {1}GB RAM" RELOAD_STARTED: "Reloading configuration - please wait." RELOAD_SUCCESS: "Configuration successfully reloaded." ROLLBACK_ABORTED: "Rollback or restore aborted." @@ -180,6 +182,7 @@ STATUS_CONSUMER: "Consumer: {0} {item|items} in queue." STATUS_DATABASE: "Database: Using {0}." STATUS_INTEGRATION: "{0}: Integration {enabled|disabled}." STATUS_LICENSE: "License: {0}" +STATUS_SYSTEM: "System: {0}" STATUS_VERSION: "Version: {0}" TELEPORTED: "Teleported to {0}." TELEPORTED_SAFETY: "Teleported you to safety." diff --git a/pom.xml b/pom.xml index 966b88ee..7dfab636 100755 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,8 @@ org.intellij:* org.jetbrains:* org.slf4j:* + org.apache.logging.log4j:* + net.java.dev.jna:* @@ -152,5 +154,15 @@ HikariCP 5.0.1 + + org.jhardware + jHardware + 0.8.6 + + + org.apache.logging.log4j + log4j-core + 2.23.1 + \ No newline at end of file diff --git a/src/main/java/net/coreprotect/command/StatusCommand.java b/src/main/java/net/coreprotect/command/StatusCommand.java index 2d806fc2..b6d1e497 100755 --- a/src/main/java/net/coreprotect/command/StatusCommand.java +++ b/src/main/java/net/coreprotect/command/StatusCommand.java @@ -54,7 +54,6 @@ public void run() { } /* - CoreProtect show RAM usage Items processed (since server start) Items processed (last 60 minutes) */ @@ -102,6 +101,42 @@ else if (instance.getServer().getPluginManager().getPlugin("WorldEdit") != null) e.printStackTrace(); } + try { + String cpuInfo = ""; + if (ConfigHandler.processorInfo != null) { + String modelName = ConfigHandler.processorInfo.getModelName(); + if (modelName.contains(" CPU")) { + String[] split = ConfigHandler.processorInfo.getModelName().split(" CPU")[0].split(" "); + modelName = split[split.length - 1]; + } + else if (modelName.contains(" Processor")) { + String[] split = ConfigHandler.processorInfo.getModelName().split(" Processor")[0].split(" "); + modelName = split[split.length - 1]; + } + + String cpuSpeed = ConfigHandler.processorInfo.getMhz(); + cpuSpeed = String.format("%.2f", Double.valueOf(cpuSpeed) / 1000.0); + cpuInfo = modelName + " " + Runtime.getRuntime().availableProcessors() + " x " + cpuSpeed + "GHz."; + } + else { + cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + Phrase.build(Phrase.CPU_CORES); + } + + int mb = 1024 * 1024; + Runtime runtime = Runtime.getRuntime(); + String usedRAM = String.format("%.2f", Double.valueOf((runtime.totalMemory() - runtime.freeMemory()) / mb) / 1000.0); + String totalRAM = String.format("%.2f", Double.valueOf(runtime.maxMemory() / mb) / 1000.0); + String systemInformation = Phrase.build(Phrase.RAM_STATS, usedRAM, totalRAM); + if (cpuInfo.length() > 0) { + systemInformation = cpuInfo + " (" + systemInformation + ")"; + } + + Chat.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.STATUS_SYSTEM, Color.WHITE, systemInformation)); + } + catch (Exception e) { + e.printStackTrace(); + } + // Functions.sendMessage(player, Color.DARK_AQUA + "Website: " + Color.WHITE + "www.coreprotect.net/updates/"); // Functions.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DISCORD, Color.WHITE + "www.coreprotect.net/discord/").replaceFirst(":", ":" + Color.WHITE)); diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 36a35602..06be249b 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -19,6 +19,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.jutils.jhardware.model.ProcessorInfo; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @@ -55,6 +56,7 @@ public class ConfigHandler extends Queue { public static int maximumPoolSize = 10; public static HikariDataSource hikariDataSource = null; + public static final ProcessorInfo processorInfo = Util.getProcessorInfo(); public static final boolean isSpigot = Util.isSpigot(); public static final boolean isPaper = Util.isPaper(); public static final boolean isFolia = Util.isFolia(); diff --git a/src/main/java/net/coreprotect/language/Language.java b/src/main/java/net/coreprotect/language/Language.java index d390701e..918da473 100644 --- a/src/main/java/net/coreprotect/language/Language.java +++ b/src/main/java/net/coreprotect/language/Language.java @@ -44,6 +44,7 @@ public static void loadPhrases() { phrases.put(Phrase.CONSUMER_ERROR, "Consumer queue processing already {paused|resumed}."); phrases.put(Phrase.CONSUMER_TOGGLED, "Consumer queue processing has been {paused|resumed}."); phrases.put(Phrase.CONTAINER_HEADER, "Container Transactions"); + phrases.put(Phrase.CPU_CORES, "CPU cores."); phrases.put(Phrase.DATABASE_BUSY, "Database busy. Please try again later."); phrases.put(Phrase.DATABASE_INDEX_ERROR, "Unable to validate database indexes."); phrases.put(Phrase.DATABASE_LOCKED_1, "Database locked. Waiting up to 15 seconds..."); @@ -188,6 +189,7 @@ public static void loadPhrases() { phrases.put(Phrase.PURGE_ROWS, "{0} {row|rows} of data deleted."); phrases.put(Phrase.PURGE_STARTED, "Data purge started on \"{0}\"."); phrases.put(Phrase.PURGE_SUCCESS, "Data purge successful."); + phrases.put(Phrase.RAM_STATS, "{0}GB / {1}GB RAM"); phrases.put(Phrase.RELOAD_STARTED, "Reloading configuration - please wait."); phrases.put(Phrase.RELOAD_SUCCESS, "Configuration successfully reloaded."); phrases.put(Phrase.ROLLBACK_ABORTED, "Rollback or restore aborted."); @@ -209,6 +211,7 @@ public static void loadPhrases() { phrases.put(Phrase.STATUS_DATABASE, "Database: Using {0}."); phrases.put(Phrase.STATUS_INTEGRATION, "{0}: Integration {enabled|disabled}."); phrases.put(Phrase.STATUS_LICENSE, "License: {0}"); + phrases.put(Phrase.STATUS_SYSTEM, "System: {0}"); phrases.put(Phrase.STATUS_VERSION, "Version: {0}"); phrases.put(Phrase.TELEPORTED, "Teleported to {0}."); phrases.put(Phrase.TELEPORTED_SAFETY, "Teleported you to safety."); diff --git a/src/main/java/net/coreprotect/language/Phrase.java b/src/main/java/net/coreprotect/language/Phrase.java index b976e238..fc26ee7b 100644 --- a/src/main/java/net/coreprotect/language/Phrase.java +++ b/src/main/java/net/coreprotect/language/Phrase.java @@ -27,6 +27,7 @@ public enum Phrase { CONSUMER_ERROR, CONSUMER_TOGGLED, CONTAINER_HEADER, + CPU_CORES, DATABASE_BUSY, DATABASE_INDEX_ERROR, DATABASE_LOCKED_1, @@ -171,6 +172,7 @@ public enum Phrase { PURGE_ROWS, PURGE_STARTED, PURGE_SUCCESS, + RAM_STATS, RELOAD_STARTED, RELOAD_SUCCESS, ROLLBACK_ABORTED, @@ -192,6 +194,7 @@ public enum Phrase { STATUS_DATABASE, STATUS_INTEGRATION, STATUS_LICENSE, + STATUS_SYSTEM, STATUS_VERSION, TELEPORTED, TELEPORTED_SAFETY, diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 72306510..055096cb 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -21,6 +21,8 @@ import java.util.SortedSet; import java.util.TreeSet; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.core.config.Configurator; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -51,6 +53,8 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; import org.bukkit.util.io.BukkitObjectOutputStream; +import org.jutils.jhardware.HardwareInfo; +import org.jutils.jhardware.model.ProcessorInfo; import net.coreprotect.CoreProtect; import net.coreprotect.bukkit.BukkitAdapter; @@ -112,6 +116,19 @@ public static String getPluginName() { return name; } + public static ProcessorInfo getProcessorInfo() { + ProcessorInfo result = null; + try { + Configurator.setLevel("com.profesorfalken.jsensors.manager.unix.UnixSensorsManager", Level.WARN); + result = HardwareInfo.getProcessorInfo(); + } + catch (Exception e) { + // unable to read processor information + } + + return result; + } + public static int getBlockId(Material material) { if (material == null) { material = Material.AIR; From 4bf4f4eb92c55faac70b9d7f6f7dfa693b531695 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 9 Jul 2024 18:51:46 -0600 Subject: [PATCH 21/60] Prepped logging for skull skin textures on Paper servers --- .../consumer/process/SkullUpdateProcess.java | 2 +- .../database/logger/SkullBreakLogger.java | 4 +- .../database/logger/SkullPlaceLogger.java | 4 +- .../database/statement/SkullStatement.java | 2 +- .../net/coreprotect/paper/PaperAdapter.java | 10 +++++ .../net/coreprotect/paper/PaperInterface.java | 4 ++ .../net/coreprotect/paper/Paper_v1_20.java | 23 ++++++++++ .../coreprotect/patch/script/__2_23_1.java | 44 +++++++++++++++++++ 8 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/coreprotect/patch/script/__2_23_1.java diff --git a/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java b/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java index d9a5277e..75073bf4 100644 --- a/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java +++ b/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java @@ -4,9 +4,9 @@ import org.bukkit.block.BlockState; +import net.coreprotect.config.ConfigHandler; import net.coreprotect.database.statement.SkullStatement; import net.coreprotect.utility.Util; -import net.coreprotect.config.ConfigHandler; class SkullUpdateProcess { diff --git a/src/main/java/net/coreprotect/database/logger/SkullBreakLogger.java b/src/main/java/net/coreprotect/database/logger/SkullBreakLogger.java index 9589a37b..51f7668e 100644 --- a/src/main/java/net/coreprotect/database/logger/SkullBreakLogger.java +++ b/src/main/java/net/coreprotect/database/logger/SkullBreakLogger.java @@ -28,10 +28,12 @@ public static void log(PreparedStatement preparedStmt, PreparedStatement prepare int type = Util.getBlockId(block.getType().name(), true); Skull skull = (Skull) block; String skullOwner = ""; + String skullSkin = null; int skullKey = 0; if (skull.hasOwner()) { skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull); - ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner); + skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull); + ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin); if (Database.hasReturningKeys()) { resultSet.next(); skullKey = resultSet.getInt(1); diff --git a/src/main/java/net/coreprotect/database/logger/SkullPlaceLogger.java b/src/main/java/net/coreprotect/database/logger/SkullPlaceLogger.java index 09b951d0..2e538625 100644 --- a/src/main/java/net/coreprotect/database/logger/SkullPlaceLogger.java +++ b/src/main/java/net/coreprotect/database/logger/SkullPlaceLogger.java @@ -31,9 +31,11 @@ public static void log(PreparedStatement preparedStmt, PreparedStatement prepare if (block instanceof Skull) { Skull skull = (Skull) block; String skullOwner = ""; + String skullSkin = null; if (skull.hasOwner()) { skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull); - ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner); + skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull); + ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin); if (Database.hasReturningKeys()) { resultSet.next(); skullKey = resultSet.getInt(1); diff --git a/src/main/java/net/coreprotect/database/statement/SkullStatement.java b/src/main/java/net/coreprotect/database/statement/SkullStatement.java index 7ff453d6..bcf45bd6 100644 --- a/src/main/java/net/coreprotect/database/statement/SkullStatement.java +++ b/src/main/java/net/coreprotect/database/statement/SkullStatement.java @@ -18,7 +18,7 @@ private SkullStatement() { throw new IllegalStateException("Database class"); } - public static ResultSet insert(PreparedStatement preparedStmt, int time, String owner) { + public static ResultSet insert(PreparedStatement preparedStmt, int time, String owner, String skin) { try { preparedStmt.setInt(1, time); preparedStmt.setString(2, owner); diff --git a/src/main/java/net/coreprotect/paper/PaperAdapter.java b/src/main/java/net/coreprotect/paper/PaperAdapter.java index e510aea2..8a8b77dd 100644 --- a/src/main/java/net/coreprotect/paper/PaperAdapter.java +++ b/src/main/java/net/coreprotect/paper/PaperAdapter.java @@ -86,4 +86,14 @@ public void setSkullOwner(Skull skull, String owner) { return; } + @Override + public String getSkullSkin(Skull skull) { + return null; + } + + @Override + public void setSkullSkin(Skull skull, String skin) { + return; + } + } diff --git a/src/main/java/net/coreprotect/paper/PaperInterface.java b/src/main/java/net/coreprotect/paper/PaperInterface.java index f4ad0b54..0549ad83 100644 --- a/src/main/java/net/coreprotect/paper/PaperInterface.java +++ b/src/main/java/net/coreprotect/paper/PaperInterface.java @@ -20,6 +20,10 @@ public interface PaperInterface { public String getSkullOwner(Skull skull); + public String getSkullSkin(Skull skull); + public void setSkullOwner(Skull skull, String owner); + public void setSkullSkin(Skull skull, String skin); + } diff --git a/src/main/java/net/coreprotect/paper/Paper_v1_20.java b/src/main/java/net/coreprotect/paper/Paper_v1_20.java index 3f077ac8..6785c33a 100644 --- a/src/main/java/net/coreprotect/paper/Paper_v1_20.java +++ b/src/main/java/net/coreprotect/paper/Paper_v1_20.java @@ -1,5 +1,8 @@ package net.coreprotect.paper; +import java.net.URI; +import java.net.URL; + import org.bukkit.Bukkit; import org.bukkit.block.Sign; import org.bukkit.block.Skull; @@ -41,4 +44,24 @@ public void setSkullOwner(Skull skull, String owner) { skull.setPlayerProfile(Bukkit.createProfile(owner)); } + @Override + public String getSkullSkin(Skull skull) { + URL skin = skull.getPlayerProfile().getTextures().getSkin(); + if (skin == null) { + return null; + } + + return skin.toString(); + } + + @Override + public void setSkullSkin(Skull skull, String skin) { + try { + skull.getPlayerProfile().getTextures().setSkin(URI.create(skin).toURL()); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/net/coreprotect/patch/script/__2_23_1.java b/src/main/java/net/coreprotect/patch/script/__2_23_1.java new file mode 100644 index 00000000..209570ae --- /dev/null +++ b/src/main/java/net/coreprotect/patch/script/__2_23_1.java @@ -0,0 +1,44 @@ +package net.coreprotect.patch.script; + +import java.sql.Statement; + +import net.coreprotect.config.Config; +import net.coreprotect.config.ConfigHandler; +import net.coreprotect.language.Phrase; +import net.coreprotect.language.Selector; +import net.coreprotect.patch.Patch; +import net.coreprotect.utility.Chat; + +public class __2_23_1 { + + protected static boolean patch(Statement statement) { + try { + if (Config.getGlobal().MYSQL) { + try { + statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "skull ADD COLUMN skin VARCHAR(255);"); + } + catch (Exception e) { + Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "skull", Selector.FIRST, Selector.FIRST)); + } + } + else { + try { + statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "skull ADD COLUMN skin TEXT;"); + } + catch (Exception e) { + Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "skull", Selector.FIRST, Selector.FIRST)); + } + + if (!Patch.continuePatch()) { + return false; + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + + return true; + } + +} From da227afe33eb16104ba10cdbfebba4b5b91e53c5 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 9 Jul 2024 18:59:16 -0600 Subject: [PATCH 22/60] Added primary thread error when running a rollback via API (implements #456) --- src/main/java/net/coreprotect/CoreProtectAPI.java | 3 +++ src/main/java/net/coreprotect/language/Language.java | 1 + src/main/java/net/coreprotect/language/Phrase.java | 1 + 3 files changed, 5 insertions(+) diff --git a/src/main/java/net/coreprotect/CoreProtectAPI.java b/src/main/java/net/coreprotect/CoreProtectAPI.java index 2235f72b..74f9f939 100755 --- a/src/main/java/net/coreprotect/CoreProtectAPI.java +++ b/src/main/java/net/coreprotect/CoreProtectAPI.java @@ -546,6 +546,9 @@ else if (argBlock instanceof EntityType && !addedEntity) { boolean verbose = false; result = Rollback.performRollbackRestore(statement, null, uuids, restrictUsers, null, restrictBlocks, excludeBlocks, excludeUsers, actionList, location, argRadius, startTime, endTime, restrictWorld, false, verbose, action, 0); } + else { + Chat.console(Phrase.build(Phrase.PRIMARY_THREAD_ERROR)); + } } statement.close(); diff --git a/src/main/java/net/coreprotect/language/Language.java b/src/main/java/net/coreprotect/language/Language.java index 918da473..a19004da 100644 --- a/src/main/java/net/coreprotect/language/Language.java +++ b/src/main/java/net/coreprotect/language/Language.java @@ -176,6 +176,7 @@ public static void loadPhrases() { phrases.put(Phrase.PREVIEW_CANCELLING, "Cancelling preview..."); phrases.put(Phrase.PREVIEW_IN_GAME, "You can only preview rollbacks in-game."); phrases.put(Phrase.PREVIEW_TRANSACTION, "You can't preview {container|inventory} transactions."); + phrases.put(Phrase.PRIMARY_THREAD_ERROR, "That API method can't be used on the primary thread."); phrases.put(Phrase.PURGE_ABORTED, "Purge failed. Database may be corrupt."); phrases.put(Phrase.PURGE_ERROR, "Unable to process {0} data!"); phrases.put(Phrase.PURGE_FAILED, "Purge failed. Please try again later."); diff --git a/src/main/java/net/coreprotect/language/Phrase.java b/src/main/java/net/coreprotect/language/Phrase.java index fc26ee7b..89e487f2 100644 --- a/src/main/java/net/coreprotect/language/Phrase.java +++ b/src/main/java/net/coreprotect/language/Phrase.java @@ -159,6 +159,7 @@ public enum Phrase { PREVIEW_CANCELLING, PREVIEW_IN_GAME, PREVIEW_TRANSACTION, + PRIMARY_THREAD_ERROR, PURGE_ABORTED, PURGE_ERROR, PURGE_FAILED, From ac0792b9ef2e70a2635a3a00d61a256c9ee29514 Mon Sep 17 00:00:00 2001 From: DasPotata <155301726+DasPotata@users.noreply.github.com> Date: Tue, 23 Jul 2024 21:05:05 +0200 Subject: [PATCH 23/60] Update de.yml (#518) * Update de.yml some changes for the lang file * Improve /co help inspect translations Co-authored-by: Daniel Scherf <35780068+dlsf@users.noreply.github.com> * Formatting fixes Co-authored-by: Daniel Scherf <35780068+dlsf@users.noreply.github.com> * Update lang/de.yml Co-authored-by: Daniel Scherf <35780068+dlsf@users.noreply.github.com> * Update lang/de.yml Co-authored-by: Daniel Scherf <35780068+dlsf@users.noreply.github.com> --------- Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com> Co-authored-by: Daniel Scherf <35780068+dlsf@users.noreply.github.com> --- lang/de.yml | 72 ++++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lang/de.yml b/lang/de.yml index 64f3eac7..7d17fc4f 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -1,14 +1,14 @@ # CoreProtect Language File (de) ACTION_NOT_SUPPORTED: "Diese Aktion wird nicht unterstützt." -AMOUNT_BLOCK: "{0} {block|blöcke}" -AMOUNT_CHUNK: "{0} {Brocken|Brocken}" +AMOUNT_BLOCK: "{0} {Block|Blöcke}" +AMOUNT_CHUNK: "{0} {Chunk|Chunks}" AMOUNT_ENTITY: "{0} {Entität|Entitäten}" -AMOUNT_ITEM: "{0} {Artikel|Artikel}" +AMOUNT_ITEM: "{0} {Item|Items}" API_TEST: "API-Test erfolgreich." CACHE_ERROR: "WARNUNG: Fehler beim Validieren {0} Zwischenspeicher." CACHE_RELOAD: "Erzwingen des Nachladens von {kartierung|welt} Caches aus der Datenbank." -CHECK_CONFIG: "Bitte überprüfen Sie config.yml" +CHECK_CONFIG: "Bitte überprüfe die config.yml" COMMAND_CONSOLE: "Bitte führen Sie den Befehl von der Konsole aus." COMMAND_NOT_FOUND: "Befehl \"{0}\" nicht gefunden." COMMAND_THROTTLED: "Bitte warten Sie einen Moment und versuchen Sie es erneut." @@ -18,7 +18,7 @@ CONTAINER_HEADER: "Containertransaktionen" DATABASE_BUSY: "Datenbank beschäftigt. Bitte versuchen Sie es später erneut." DATABASE_INDEX_ERROR: "Datenbankindizes können nicht validiert werden." DATABASE_LOCKED_1: "Datenbank gesperrt. Warte bis zu 15 Sekunden..." -DATABASE_LOCKED_2: "Datenbank wird bereits verwendet. Bitte versuche es erneut." +DATABASE_LOCKED_2: "Datenbank wird bereits verwendet. Bitte versuche es später erneut." DATABASE_LOCKED_3: "Um die Datenbanksperre zu deaktivieren, setzen Sie \"database-lock: false\"." DATABASE_LOCKED_4: "Das Deaktivieren der Datenbanksperre kann zu Datenbeschädigungen führen." DATABASE_UNREACHABLE: "Datenbank ist nicht erreichbar. Daten verwerfen und herunterfahren." @@ -27,12 +27,12 @@ DIRT_BLOCK: "Platziere einen Schmutzblock unter dir." DISABLE_SUCCESS: "Erfolg! Deaktiviert {0}" ENABLE_FAILED: "{0} war nicht in der Lage zu starten." ENABLE_SUCCESS: "{0} ist jetzt aktiviert!" -ENJOY_COREPROTECT: "Genießen {0}? Tritt unser... bei Discord!" -FINISHING_CONVERSION: "Abschluss der Datenkonvertierung. Warten Sie mal..." -FINISHING_LOGGING: "Abschluss der Datenprotokollierung. Warten Sie mal..." +ENJOY_COREPROTECT: "Dir gefällt {0}? Tritt unserem Discord bei!" +FINISHING_CONVERSION: "Abschluss der Datenkonvertierung. Bitte warten..." +FINISHING_LOGGING: "Abschluss der Datenprotokollierung. Bitte warten..." FIRST_VERSION: "Anfangs-DB: {0}" GLOBAL_LOOKUP: "Geben Sie keinen Radius an, um eine globale Suche durchzuführen." -GLOBAL_ROLLBACK: "Benutzen \"{0}\" um eine globale {Rollback|Wiederherstellung}" +GLOBAL_ROLLBACK: "Benutze \"{0}\" um einen globalen {Rollback|Restore}" HELP_ACTION_1: "Beschränken Sie die Suche auf eine Aktion." HELP_ACTION_2: "Beispiele: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]" HELP_COMMAND: "Zusätzliche Informationen anzeigen." @@ -41,13 +41,13 @@ HELP_EXCLUDE_2: "Beispiele: [e:stone], [e:Notch], [e:stone,Notch]" HELP_HEADER: "{0} Hilfe" HELP_INCLUDE_1: "Fügen Sie Blöcke/Entitäten ein." HELP_INCLUDE_2: "Beispiele: [i:stone], [i:zombie], [i:stone,wood,bedrock]" -HELP_INSPECT_1: "Wenn der Inspektor aktiviert ist, können Sie:" -HELP_INSPECT_2: "Klicken Sie mit der linken Maustaste, um die Platzierung anzuzeigen." -HELP_INSPECT_3: "Klicken Sie mit der rechten Maustaste, um benachbarte Entfernungen anzuzeigen." -HELP_INSPECT_4: "Platzieren Sie einen Block, um die Entfernung zu sehen." -HELP_INSPECT_5: "Legen Sie einen Block in Flüssigkeit, um die Platzierung zu sehen." -HELP_INSPECT_6: "Klicken Sie mit der rechten Maustaste, um Truhentransaktionen anzuzeigen." -HELP_INSPECT_7: "Tipp: Sie können einfach \"/co i\" verwenden." +HELP_INSPECT_1: "Mit dem Inspector kannst du Folgendes tun:" +HELP_INSPECT_2: "Linksklicke einen Block, um zu sehen, wer ihn platziert hat" +HELP_INSPECT_3: "Rechtsklick auf einen Block zeigt Änderungen an Nachbarn an" +HELP_INSPECT_4: "Platziere einen Block, um Änderungen an seinem Ort zu sehen" +HELP_INSPECT_5: "So kann man auch Änderungen an Flüssigkeiten etc. sehen" +HELP_INSPECT_6: "Rechtsklicke Türen, Truhen, etc., um Zugriffe zu sehen" +HELP_INSPECT_7: "Tipp: Benutze \"/co i\" für schnelleren Zugriff" HELP_INSPECT_COMMAND: "Schaltet den Blockinspektor um." HELP_LIST: "Zeigt eine Liste aller Befehle an." HELP_LOOKUP_1: "Befehlsverknüpfung." @@ -55,13 +55,13 @@ HELP_LOOKUP_2: "Weitere Seiten anzeigen." HELP_LOOKUP_COMMAND: "Blockdaten nachschlagen." HELP_NO_INFO: "Informationen zum Befehl \"{0}\" nicht gefunden." HELP_PARAMETER: "Bitte sehen Sie \"{0}\" für detaillierte Parameterinformationen." -HELP_PARAMS_1: "Führen Sie die {Nachschlagen|Rollback|Wiederherstellen}." -HELP_PARAMS_2: "Geben Sie die Benutzer an {Nachschlagen|Rollback|Wiederherstellen}." -HELP_PARAMS_3: "Geben Sie die Zeit an, um {Nachschlagen|Rollback|Wiederherstellen}." -HELP_PARAMS_4: "Beschränken Sie die {Nachschlagen|Rollback|Wiederherstellen} zu einem Radius." -HELP_PARAMS_5: "Beschränken Sie die {Nachschlagen|Rollback|Wiederherstellen} zu einer Aktion." -HELP_PARAMS_6: "Einschließen von Blöcken/Entitäten in die {Nachschlagen|Rollback|Wiederherstellen}." -HELP_PARAMS_7: "Sperren/Benutzer von der ausschließen {Nachschlagen|Rollback|Wiederherstellen}." +HELP_PARAMS_1: "Führe einen {Lookup|Rollback|Restore} durch." +HELP_PARAMS_2: "Spieler, für die der {Lookup|Rollback|Restore} gemacht werden soll." +HELP_PARAMS_3: "Zeitspanne, für die der {Lookup|Rollback|Restore} gemacht werden soll." +HELP_PARAMS_4: "Radius, in dem der {Lookup|Rollback|Restore} gemacht werden soll." +HELP_PARAMS_5: "Aktion, für die der {Lookup|Rollback|Restore} gemacht werden soll." +HELP_PARAMS_6: "Schließe Blöcke/Entitäten in den {Lookup|Rollback|Restore} ein." +HELP_PARAMS_7: "Schließe Blöcke/Benutzer von dem {Lookup|Rollback|Restore} aus." HELP_PURGE_1: "Alte Daten entfernen." HELP_PURGE_2: "Beispielsweise, \"{0}\" löscht alle Daten, die älter als einen Monat sind, und behält nur die Daten der letzten 30 Tage." HELP_PURGE_COMMAND: "Alte Blockdaten löschen." @@ -78,7 +78,7 @@ HELP_TIME_2: "Beispiele: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]" HELP_USER_1: "Geben Sie die Benutzer an." HELP_USER_2: "Beispiele: [u:Notch], [u:Notch,#enderman]" INCOMPATIBLE_ACTION: "\"{0}\" kann mit dieser Aktion nicht verwendet werden." -INSPECTOR_ERROR: "Inspektor schon {aktiviert|deaktiviert}." +INSPECTOR_ERROR: "Inspektor bereits {aktiviert|deaktiviert}." INSPECTOR_TOGGLED: "Inspektor jetzt {aktiviert|deaktiviert}." INTEGRATION_ERROR: "Unfähig zu {initialisieren|deaktivieren} {0} Protokollierung." INTEGRATION_SUCCESS: "{0} erfolgreich anmelden {initialisiert|deaktiviert}." @@ -108,14 +108,14 @@ LOOKUP_BLOCK: "{0} {platziert|entfernt} {1}." LOOKUP_CONTAINER: "{0} {hinzugefügt|entfernt} {1} {2}." LOOKUP_HEADER: "{0} Ergebnisse" LOOKUP_INTERACTION: "{0} {angeklickt|getötet} {1}." -LOOKUP_ITEM: "{0} {abgeholt|abgeworfen} {1} {2}." -LOOKUP_LOGIN: "{0} eingeloggt {rein|raus}." +LOOKUP_ITEM: "{0} {aufgehoben|weggeworfen} {1} {2}." +LOOKUP_LOGIN: "{0} {ein|aus}geloggt." LOOKUP_PAGE: "Seite {0}" LOOKUP_PROJECTILE: "{0} {geworfen|geschossen} {1} {2}." LOOKUP_ROWS_FOUND: "{0} {Reihe|Reihen} gefunden." LOOKUP_SEARCHING: "Suche nachschlagen. Warten Sie mal..." LOOKUP_STORAGE: "{0} {hinterlegt|abgehoben} {1} {2}." -LOOKUP_TIME: "{0} vor" +LOOKUP_TIME: "vor {0}" LOOKUP_USERNAME: "{0} Eingeloggt als {1}." MAXIMUM_RADIUS: "Das Maximum {Nachschlagen|Rollback|Wiederherstellen} Radius ist {0}." MISSING_ACTION_USER: "Um diese Aktion zu verwenden, geben Sie bitte einen Benutzer an." @@ -126,10 +126,10 @@ MISSING_ROLLBACK_RADIUS: "Sie haben nicht angegeben a {Zurücksetzen|Wiederherst MISSING_ROLLBACK_USER: "Sie haben nicht angegeben a {Zurücksetzen|Wiederherstellen} Benutzer." MYSQL_UNAVAILABLE: "Verbindung zu nicht möglich MySQL Server." NO_DATA: "Keine Daten gefunden bei {0}." -NO_DATA_LOCATION: "Nein {Daten|Transaktionen|Interaktionen|Nachrichten} gefunden." +NO_DATA_LOCATION: "Keine {Daten|Transaktionen|Interaktionen|Nachrichten} gefunden." NO_PERMISSION: "Du hast keine Erlaubnis das zu tun." NO_RESULTS: "Keine Ergebnisse gefunden." -NO_RESULTS_PAGE: "Nein {Ergebnisse|Daten} für diese Seite gefunden." +NO_RESULTS_PAGE: "Keine {Ergebnisse|Daten} für diese Seite gefunden." NO_ROLLBACK: "Nein {ausstehend|zurück} Rollback/Wiederherstellung gefunden." PATCH_INTERRUPTED: "Upgrade unterbrochen. Werde es beim Neustart nochmal versuchen." PATCH_OUTDATED_1: "Datenbanken, die älter als sind, können nicht aktualisiert werden {0}." @@ -160,22 +160,22 @@ PURGE_SUCCESS: "Datenbereinigung erfolgreich." RELOAD_STARTED: "Konfiguration wird neu geladen - bitte warten." RELOAD_SUCCESS: "Konfiguration erfolgreich neu geladen." ROLLBACK_ABORTED: "Rollback oder Wiederherstellung abgebrochen." -ROLLBACK_CHUNKS_FOUND: "Gefunden {0} {Brocken|Brocken} ändern." -ROLLBACK_CHUNKS_MODIFIED: "Geändert {0}/{1} {Brocken|Brocken}." +ROLLBACK_CHUNKS_FOUND: "{0} {bearbeiteter|bearbeitete} {Chunk|Chunks} gefunden." +ROLLBACK_CHUNKS_MODIFIED: "{0}/{1} {Chunk|Chunks} bearbeitet." ROLLBACK_COMPLETED: "{Rollback|Wiederherstellen|Vorschau} abgeschlossen für \"{0}\"." ROLLBACK_EXCLUDED_USERS: "Ausgeschlossen {Benutzer|Benutzer}: \"{0}\"." ROLLBACK_INCLUDE: "{Eingeschlossen|Ausgeschlossen} {Block|Entität|Ziel} {Typ|Typen}: \"{0}\"." ROLLBACK_IN_PROGRESS: "Ein Rollback/Restore ist bereits im Gange." -ROLLBACK_LENGTH: "Zeit genommen: {0} {Sekunde|Sekunden}." +ROLLBACK_LENGTH: "Zeit beansprucht: {0} {Sekunde|Sekunden}." ROLLBACK_MODIFIED: "{Modifiziert|Modifiziert} {0}." -ROLLBACK_RADIUS: "Radius: {0} {block|blöcke}." +ROLLBACK_RADIUS: "Radius: {0} {Block|Blöcke}." ROLLBACK_SELECTION: "Radius eingestellt auf \"{0}\"." -ROLLBACK_STARTED: "{Rollback|Wiederherstellen|Vorschau} begann am \"{0}\"." +ROLLBACK_STARTED: "{Rollback|Restore|Vorschau} gestartet für \"{0}\"." ROLLBACK_TIME: "Zeitspanne: {0}." ROLLBACK_WORLD_ACTION: "Beschränkt auf {Welt|Aktion} \"{0}\"." SIGN_HEADER: "Nachrichten signieren" -STATUS_CONSUMER: "Verbraucher: {0} {Artikel|Artikel} in der Warteschleife." -STATUS_DATABASE: "Datenbank: Verwenden {0}." +STATUS_CONSUMER: "Warteschleife: {0} {Datensatz|Datensätze}" +STATUS_DATABASE: "Datenbank: {0}." STATUS_INTEGRATION: "{0}: Integration {aktiviert|deaktiviert}." STATUS_LICENSE: "Lizenz: {0}" STATUS_VERSION: "Version: {0}" From 77a4a9476ac331d705ced4d84eb934aa5b4d4655 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 23 Jul 2024 13:21:35 -0600 Subject: [PATCH 24/60] Hide all errors regarding CPU info (fixes #591) --- src/main/java/net/coreprotect/utility/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 055096cb..d14877e4 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -119,7 +119,7 @@ public static String getPluginName() { public static ProcessorInfo getProcessorInfo() { ProcessorInfo result = null; try { - Configurator.setLevel("com.profesorfalken.jsensors.manager.unix.UnixSensorsManager", Level.WARN); + Configurator.setLevel("com.profesorfalken.jsensors.manager.unix.UnixSensorsManager", Level.OFF); result = HardwareInfo.getProcessorInfo(); } catch (Exception e) { From a93bf2f047e0fb3e10ea5ba5e6dea4ce2292062a Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 23 Jul 2024 20:06:18 -0600 Subject: [PATCH 25/60] Fixed NotSerializableException when killing certain entities (fixes #589) --- .../net/coreprotect/bukkit/Bukkit_v1_19.java | 8 +++++++- .../listener/entity/EntityDeathListener.java | 8 ++++---- .../coreprotect/utility/entity/EntityUtil.java | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java index 151f6bf8..f84f902b 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java @@ -4,7 +4,9 @@ import java.util.HashSet; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Frog; import org.bukkit.entity.Goat; @@ -31,7 +33,7 @@ public Bukkit_v1_19() { public boolean getEntityMeta(LivingEntity entity, List info) { if (entity instanceof Frog) { Frog frog = (Frog) entity; - info.add(frog.getVariant()); + info.add(frog.getVariant().getKey().asString()); } else if (entity instanceof Tadpole) { Tadpole tadpole = (Tadpole) entity; @@ -58,6 +60,10 @@ public boolean setEntityMeta(Entity entity, Object value, int count) { if (entity instanceof Frog) { Frog frog = (Frog) entity; if (count == 0) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Frog.Variant.class).get(namespacedKey); + } Frog.Variant set = (Frog.Variant) value; frog.setVariant(set); } diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index 8a83f060..ed58ab1b 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -322,7 +322,7 @@ else if (entity instanceof IronGolem) { } else if (entity instanceof Cat) { Cat cat = (Cat) entity; - info.add(cat.getCatType()); + info.add(cat.getCatType().getKey().asString()); info.add(cat.getCollarColor()); } else if (entity instanceof Fox) { @@ -404,8 +404,8 @@ else if (entity instanceof AbstractVillager) { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; - info.add(villager.getProfession()); - info.add(villager.getVillagerType()); + info.add(villager.getProfession().getKey().asString()); + info.add(villager.getVillagerType().getKey().asString()); info.add(recipes); info.add(villager.getVillagerLevel()); info.add(villager.getVillagerExperience()); @@ -433,7 +433,7 @@ else if (entity instanceof Wolf) { else if (entity instanceof ZombieVillager) { ZombieVillager zombieVillager = (ZombieVillager) entity; info.add(zombieVillager.isBaby()); - info.add(zombieVillager.getVillagerProfession()); + info.add(zombieVillager.getVillagerProfession().getKey().asString()); } else if (entity instanceof Zombie) { Zombie zombie = (Zombie) entity; diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index ed619658..44dbfb3e 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -7,6 +7,7 @@ import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; @@ -231,6 +232,11 @@ else if (entity instanceof IronGolem) { else if (entity instanceof Cat) { Cat cat = (Cat) entity; if (count == 0) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Cat.Type.class).get(namespacedKey); + // value = RegistryAccess.registryAccess().getRegistry(RegistryKey.CAT_VARIANT).get((NamespacedKey)value); + } Cat.Type set = (Cat.Type) value; cat.setCatType(set); } @@ -327,6 +333,10 @@ else if (entity instanceof AbstractVillager) { if (count == 0) { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + } Profession set = (Profession) value; villager.setProfession(set); } @@ -334,6 +344,10 @@ else if (entity instanceof AbstractVillager) { else if (count == 1) { if (abstractVillager instanceof Villager && value instanceof Villager.Type) { Villager villager = (Villager) abstractVillager; + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Villager.Type.class).get(namespacedKey); + } Villager.Type set = (Villager.Type) value; villager.setVillagerType(set); } @@ -427,6 +441,10 @@ else if (entity instanceof ZombieVillager) { zombieVillager.setBaby(set); } else if (count == 1) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + } Profession set = (Profession) value; zombieVillager.setVillagerProfession(set); } From 06208a69b02054366272b3117803e169675f7702 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 23 Jul 2024 20:09:05 -0600 Subject: [PATCH 26/60] Added logging for skull skin textures on Paper servers --- .../coreprotect/consumer/process/SkullUpdateProcess.java | 2 +- src/main/java/net/coreprotect/database/Database.java | 6 +++--- .../net/coreprotect/database/statement/SkullStatement.java | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java b/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java index 75073bf4..975dc262 100644 --- a/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java +++ b/src/main/java/net/coreprotect/consumer/process/SkullUpdateProcess.java @@ -18,7 +18,7 @@ static void process(Statement statement, Object object, int rowId) { */ if (object instanceof BlockState) { BlockState block = (BlockState) object; - String query = "SELECT owner FROM " + ConfigHandler.prefix + "skull WHERE rowid='" + rowId + "' LIMIT 0, 1"; + String query = "SELECT owner, skin FROM " + ConfigHandler.prefix + "skull WHERE rowid='" + rowId + "' LIMIT 0, 1"; SkullStatement.getData(statement, block, query); Util.updateBlock(block); } diff --git a/src/main/java/net/coreprotect/database/Database.java b/src/main/java/net/coreprotect/database/Database.java index 9137c356..8b7798f3 100755 --- a/src/main/java/net/coreprotect/database/Database.java +++ b/src/main/java/net/coreprotect/database/Database.java @@ -221,7 +221,7 @@ public static PreparedStatement prepareStatement(Connection connection, int type try { String signInsert = "INSERT INTO " + ConfigHandler.prefix + "sign (time, user, wid, x, y, z, action, color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; String blockInsert = "INSERT INTO " + ConfigHandler.prefix + "block (time, user, wid, x, y, z, type, data, meta, blockdata, action, rolled_back) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - String skullInsert = "INSERT INTO " + ConfigHandler.prefix + "skull (time, owner) VALUES (?, ?)"; + String skullInsert = "INSERT INTO " + ConfigHandler.prefix + "skull (time, owner, skin) VALUES (?, ?, ?)"; String containerInsert = "INSERT INTO " + ConfigHandler.prefix + "container (time, user, wid, x, y, z, type, data, amount, metadata, action, rolled_back) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; String itemInsert = "INSERT INTO " + ConfigHandler.prefix + "item (time, user, wid, x, y, z, type, data, amount, action, rolled_back) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; String worldInsert = "INSERT INTO " + ConfigHandler.prefix + "world (id, world) VALUES (?, ?)"; @@ -372,7 +372,7 @@ public static void createDatabaseTables(String prefix, boolean purge) { statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "session(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int (3), z int, action tinyint" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); index = ", INDEX(wid,x,z,time), INDEX(user,time), INDEX(time)"; statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int, z int, action tinyint, color int, color_secondary int, data tinyint, waxed tinyint, face tinyint, line_1 varchar(100), line_2 varchar(100), line_3 varchar(100), line_4 varchar(100), line_5 varchar(100), line_6 varchar(100), line_7 varchar(100), line_8 varchar(100)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); - statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(255)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); + statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(255), skin varchar(255)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); index = ", INDEX(user), INDEX(uuid)"; statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "user(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int,user varchar(100),uuid varchar(64)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); index = ", INDEX(uuid,user)"; @@ -462,7 +462,7 @@ else if (type.equalsIgnoreCase("index")) { statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER, color INTEGER, color_secondary INTEGER, data INTEGER, waxed INTEGER, face INTEGER, line_1 TEXT, line_2 TEXT, line_3 TEXT, line_4 TEXT, line_5 TEXT, line_6 TEXT, line_7 TEXT, line_8 TEXT);"); } if (!tableData.contains(prefix + "skull")) { - statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull (id INTEGER PRIMARY KEY ASC, time INTEGER, owner TEXT);"); + statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull (id INTEGER PRIMARY KEY ASC, time INTEGER, owner TEXT, skin TEXT);"); } if (!tableData.contains(prefix + "user")) { statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "user (id INTEGER PRIMARY KEY ASC, time INTEGER, user TEXT, uuid TEXT);"); diff --git a/src/main/java/net/coreprotect/database/statement/SkullStatement.java b/src/main/java/net/coreprotect/database/statement/SkullStatement.java index bcf45bd6..44beae8a 100644 --- a/src/main/java/net/coreprotect/database/statement/SkullStatement.java +++ b/src/main/java/net/coreprotect/database/statement/SkullStatement.java @@ -22,6 +22,7 @@ public static ResultSet insert(PreparedStatement preparedStmt, int time, String try { preparedStmt.setInt(1, time); preparedStmt.setString(2, owner); + preparedStmt.setString(3, skin); if (Database.hasReturningKeys()) { return preparedStmt.executeQuery(); } @@ -53,6 +54,11 @@ public static void getData(Statement statement, BlockState block, String query) else if (owner != null && owner.length() > 1) { PaperAdapter.ADAPTER.setSkullOwner(skull, owner); } + + String skin = resultSet.getString("skin"); + if (owner != null && skin != null && skin.length() > 0) { + PaperAdapter.ADAPTER.setSkullSkin(skull, skin); + } } resultSet.close(); From 9aea18749dbf62453439582e89e3802d78f53136 Mon Sep 17 00:00:00 2001 From: Intelli Date: Wed, 24 Jul 2024 14:04:46 -0600 Subject: [PATCH 27/60] Fixed backwards compatibility with entity serialization --- .../net/coreprotect/bukkit/BukkitAdapter.java | 10 ++++++++++ .../net/coreprotect/bukkit/BukkitInterface.java | 4 ++++ .../net/coreprotect/bukkit/Bukkit_v1_19.java | 7 ++----- .../net/coreprotect/bukkit/Bukkit_v1_21.java | 16 ++++++++++++++++ .../listener/entity/EntityDeathListener.java | 8 ++++---- .../coreprotect/utility/entity/EntityUtil.java | 14 ++++---------- 6 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index db618d5f..8aac8499 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -298,4 +298,14 @@ public EntityType getEntityType(Material material) { } } + @Override + public Object getRegistryKey(Object value) { + return value; + } + + @Override + public Object getRegistryValue(String key, Object tClass) { + return null; + } + } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index f8dbffab..d65a2b02 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -89,4 +89,8 @@ public interface BukkitInterface { public EntityType getEntityType(Material material); + public Object getRegistryKey(Object value); + + public Object getRegistryValue(String key, Object tClass); + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java index f84f902b..32a21088 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java @@ -4,9 +4,7 @@ import java.util.HashSet; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Frog; import org.bukkit.entity.Goat; @@ -33,7 +31,7 @@ public Bukkit_v1_19() { public boolean getEntityMeta(LivingEntity entity, List info) { if (entity instanceof Frog) { Frog frog = (Frog) entity; - info.add(frog.getVariant().getKey().asString()); + info.add(BukkitAdapter.ADAPTER.getRegistryKey(frog.getVariant())); } else if (entity instanceof Tadpole) { Tadpole tadpole = (Tadpole) entity; @@ -61,8 +59,7 @@ public boolean setEntityMeta(Entity entity, Object value, int count) { Frog frog = (Frog) entity; if (count == 0) { if (value instanceof String) { - NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); - value = Bukkit.getRegistry(Frog.Variant.class).get(namespacedKey); + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Frog.Variant.class); } Frog.Variant set = (Frog.Variant) value; frog.setVariant(set); diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index 2815f7a3..866d4a92 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -3,7 +3,10 @@ import java.util.Arrays; import java.util.HashSet; +import org.bukkit.Bukkit; +import org.bukkit.Keyed; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.Tag; import org.bukkit.entity.EntityType; @@ -40,4 +43,17 @@ public EntityType getEntityType(Material material) { } } + @Override + public Object getRegistryKey(Object value) { + return ((Keyed) value).getKey().asString(); + } + + @Override + public Object getRegistryValue(String key, Object tClass) { + NamespacedKey namespacedKey = NamespacedKey.fromString(key); + // return RegistryAccess.registryAccess().getRegistry(RegistryKey.CAT_VARIANT).get((NamespacedKey)value); + return Bukkit.getRegistry((Class) tClass).get(namespacedKey); + + } + } diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index ed58ab1b..8a9ac74c 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -322,7 +322,7 @@ else if (entity instanceof IronGolem) { } else if (entity instanceof Cat) { Cat cat = (Cat) entity; - info.add(cat.getCatType().getKey().asString()); + info.add(BukkitAdapter.ADAPTER.getRegistryKey(cat.getCatType())); info.add(cat.getCollarColor()); } else if (entity instanceof Fox) { @@ -404,8 +404,8 @@ else if (entity instanceof AbstractVillager) { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; - info.add(villager.getProfession().getKey().asString()); - info.add(villager.getVillagerType().getKey().asString()); + info.add(BukkitAdapter.ADAPTER.getRegistryKey(villager.getProfession())); + info.add(BukkitAdapter.ADAPTER.getRegistryKey(villager.getVillagerType())); info.add(recipes); info.add(villager.getVillagerLevel()); info.add(villager.getVillagerExperience()); @@ -433,7 +433,7 @@ else if (entity instanceof Wolf) { else if (entity instanceof ZombieVillager) { ZombieVillager zombieVillager = (ZombieVillager) entity; info.add(zombieVillager.isBaby()); - info.add(zombieVillager.getVillagerProfession().getKey().asString()); + info.add(BukkitAdapter.ADAPTER.getRegistryKey(zombieVillager.getVillagerProfession())); } else if (entity instanceof Zombie) { Zombie zombie = (Zombie) entity; diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index 44dbfb3e..dcf43b85 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -7,7 +7,6 @@ import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; -import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; @@ -233,9 +232,7 @@ else if (entity instanceof Cat) { Cat cat = (Cat) entity; if (count == 0) { if (value instanceof String) { - NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); - value = Bukkit.getRegistry(Cat.Type.class).get(namespacedKey); - // value = RegistryAccess.registryAccess().getRegistry(RegistryKey.CAT_VARIANT).get((NamespacedKey)value); + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Cat.Type.class); } Cat.Type set = (Cat.Type) value; cat.setCatType(set); @@ -334,8 +331,7 @@ else if (entity instanceof AbstractVillager) { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; if (value instanceof String) { - NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); - value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Profession.class); } Profession set = (Profession) value; villager.setProfession(set); @@ -345,8 +341,7 @@ else if (count == 1) { if (abstractVillager instanceof Villager && value instanceof Villager.Type) { Villager villager = (Villager) abstractVillager; if (value instanceof String) { - NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); - value = Bukkit.getRegistry(Villager.Type.class).get(namespacedKey); + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Villager.Type.class); } Villager.Type set = (Villager.Type) value; villager.setVillagerType(set); @@ -442,8 +437,7 @@ else if (entity instanceof ZombieVillager) { } else if (count == 1) { if (value instanceof String) { - NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); - value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Profession.class); } Profession set = (Profession) value; zombieVillager.setVillagerProfession(set); From fda87e2f6ae4eaa1205fcb520a7e68be0cb553ac Mon Sep 17 00:00:00 2001 From: Intelli Date: Wed, 24 Jul 2024 14:27:49 -0600 Subject: [PATCH 28/60] Updated language file --- lang/en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lang/en.yml b/lang/en.yml index 28aecf9f..bb9763f7 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -147,6 +147,7 @@ PREVIEW_CANCELLED: "Preview cancelled." PREVIEW_CANCELLING: "Cancelling preview..." PREVIEW_IN_GAME: "You can only preview rollbacks in-game." PREVIEW_TRANSACTION: "You can't preview {container|inventory} transactions." +PRIMARY_THREAD_ERROR: "That API method can't be used on the primary thread." PURGE_ABORTED: "Purge failed. Database may be corrupt." PURGE_ERROR: "Unable to process {0} data!" PURGE_FAILED: "Purge failed. Please try again later." From 888df067f9693893593d40605ee536513dc00005 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 25 Jul 2024 16:40:36 -0600 Subject: [PATCH 29/60] Fixed Villager type not being rolled back correctly in MC 1.21+ --- src/main/java/net/coreprotect/utility/entity/EntityUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index dcf43b85..98f8fe7a 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -338,7 +338,7 @@ else if (entity instanceof AbstractVillager) { } } else if (count == 1) { - if (abstractVillager instanceof Villager && value instanceof Villager.Type) { + if (abstractVillager instanceof Villager && (value instanceof Villager.Type || value instanceof String)) { Villager villager = (Villager) abstractVillager; if (value instanceof String) { value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Villager.Type.class); From 3194c35bb9b1818b900692c7a95c4123cf58e95f Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 13 Aug 2024 20:11:16 -0600 Subject: [PATCH 30/60] Fixed purge include parameter not functioning correctly for SQLite databases --- .../java/net/coreprotect/command/PurgeCommand.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/coreprotect/command/PurgeCommand.java b/src/main/java/net/coreprotect/command/PurgeCommand.java index 230b92e4..e6f2dd2d 100755 --- a/src/main/java/net/coreprotect/command/PurgeCommand.java +++ b/src/main/java/net/coreprotect/command/PurgeCommand.java @@ -285,18 +285,22 @@ public void run() { boolean error = false; if (!excludeTables.contains(table)) { try { + boolean purge = true; String timeLimit = ""; if (purgeTables.contains(table)) { - String blockRestriction = ""; + String blockRestriction = "("; if (hasBlockRestriction && restrictTables.contains(table)) { - blockRestriction = "type IN(" + includeBlockFinal + ") AND "; + blockRestriction = "type NOT IN(" + includeBlockFinal + ") OR (type IN(" + includeBlockFinal + ") AND "; + } + else if (hasBlockRestriction) { + purge = false; } if (argWid > 0 && worldTables.contains(table)) { - timeLimit = " WHERE (" + blockRestriction + "wid = '" + argWid + "' AND (time >= '" + timeEnd + "' OR time < '" + timeStart + "')) OR (" + blockRestriction + "wid != '" + argWid + "')"; + timeLimit = " WHERE (" + blockRestriction + "wid = '" + argWid + "' AND (time >= '" + timeEnd + "' OR time < '" + timeStart + "'))) OR (wid != '" + argWid + "')"; } - else if (argWid == 0) { - timeLimit = " WHERE " + blockRestriction + "(time >= '" + timeEnd + "' OR time < '" + timeStart + "')"; + else if (argWid == 0 && purge) { + timeLimit = " WHERE " + blockRestriction + "(time >= '" + timeEnd + "' OR time < '" + timeStart + "'))"; } } query = "INSERT INTO " + purgePrefix + table + " SELECT " + columns + " FROM " + ConfigHandler.prefix + table + timeLimit; From 8ab582d6d1b96bf7707ebbd093fdf764adf3bd81 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 17:51:03 -0600 Subject: [PATCH 31/60] Fixed old turtle scute item data displaying as air --- src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java index 0bc0b546..1684b280 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java @@ -108,6 +108,9 @@ public String parseLegacyName(String name) { case "GRASS": name = "SHORT_GRASS"; break; + case "SCUTE": + name = "TURTLE_SCUTE"; + break; default: break; } From 64eedb0aa36a80688a0edb743bbbe8c79a8dc170 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 18:28:02 -0600 Subject: [PATCH 32/60] Added "include" parameter to purge tab completion --- src/main/java/net/coreprotect/command/TabHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coreprotect/command/TabHandler.java b/src/main/java/net/coreprotect/command/TabHandler.java index e7e0370d..b0c6508c 100755 --- a/src/main/java/net/coreprotect/command/TabHandler.java +++ b/src/main/java/net/coreprotect/command/TabHandler.java @@ -338,7 +338,7 @@ else if (args.length == 2) { return StringUtil.copyPartialMatches(argument1, completions, new ArrayList<>(completions.size())); } else if (argument0.equals("purge") && sender.hasPermission("coreprotect.purge")) { - List completions = new ArrayList<>(Arrays.asList("t:", "r:")); + List completions = new ArrayList<>(Arrays.asList("t:", "r:", "i:")); return StringUtil.copyPartialMatches(argument1, completions, new ArrayList<>(completions.size())); } else if ((sender.hasPermission("coreprotect.lookup") && (argument0.equals("l") || argument0.equals("lookup"))) || (sender.hasPermission("coreprotect.rollback") && (argument0.equals("rollback") || argument0.equals("rb") || argument0.equals("ro"))) || (sender.hasPermission("coreprotect.restore") && (argument0.equals("restore") || argument0.equals("rs") || argument0.equals("re")))) { @@ -349,10 +349,10 @@ else if ((sender.hasPermission("coreprotect.lookup") && (argument0.equals("l") | } else if (args.length == 3 && argument0.equals("purge") && sender.hasPermission("coreprotect.purge")) { if (argument1.startsWith("t:")) { - List completions = new ArrayList<>(Arrays.asList("r:")); + List completions = new ArrayList<>(Arrays.asList("r:", "i:")); return StringUtil.copyPartialMatches(args[2].toLowerCase(Locale.ROOT), completions, new ArrayList<>(completions.size())); } - else if (argument1.startsWith("r:")) { + else if (argument1.startsWith("r:") || argument1.startsWith("i:")) { List completions = new ArrayList<>(Arrays.asList("t:")); return StringUtil.copyPartialMatches(args[2].toLowerCase(Locale.ROOT), completions, new ArrayList<>(completions.size())); } From d2bffb2103eafea281745a6b462e3755e6a61874 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 19:04:31 -0600 Subject: [PATCH 33/60] Fixed errors pertaining the CPU lib on startup on some systems (fixes #591) --- pom.xml | 6 +++--- .../java/net/coreprotect/command/StatusCommand.java | 10 +++++----- .../java/net/coreprotect/config/ConfigHandler.java | 4 ++-- src/main/java/net/coreprotect/utility/Util.java | 13 +++++++------ 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 7dfab636..66ffd9e3 100755 --- a/pom.xml +++ b/pom.xml @@ -155,9 +155,9 @@ 5.0.1 - org.jhardware - jHardware - 0.8.6 + com.github.oshi + oshi-core + 6.6.2 org.apache.logging.log4j diff --git a/src/main/java/net/coreprotect/command/StatusCommand.java b/src/main/java/net/coreprotect/command/StatusCommand.java index b6d1e497..c60031a4 100755 --- a/src/main/java/net/coreprotect/command/StatusCommand.java +++ b/src/main/java/net/coreprotect/command/StatusCommand.java @@ -104,18 +104,18 @@ else if (instance.getServer().getPluginManager().getPlugin("WorldEdit") != null) try { String cpuInfo = ""; if (ConfigHandler.processorInfo != null) { - String modelName = ConfigHandler.processorInfo.getModelName(); + String modelName = ConfigHandler.processorInfo.getProcessorIdentifier().getName(); if (modelName.contains(" CPU")) { - String[] split = ConfigHandler.processorInfo.getModelName().split(" CPU")[0].split(" "); + String[] split = modelName.split(" CPU")[0].split(" "); modelName = split[split.length - 1]; } else if (modelName.contains(" Processor")) { - String[] split = ConfigHandler.processorInfo.getModelName().split(" Processor")[0].split(" "); + String[] split = modelName.split(" Processor")[0].split(" "); modelName = split[split.length - 1]; } - String cpuSpeed = ConfigHandler.processorInfo.getMhz(); - cpuSpeed = String.format("%.2f", Double.valueOf(cpuSpeed) / 1000.0); + String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq()); + cpuSpeed = String.format("%.2f", Long.valueOf(cpuSpeed) / 1000000000.0); cpuInfo = modelName + " " + Runtime.getRuntime().availableProcessors() + " x " + cpuSpeed + "GHz."; } else { diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 06be249b..09dcf716 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -19,7 +19,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; -import org.jutils.jhardware.model.ProcessorInfo; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @@ -37,6 +36,7 @@ import net.coreprotect.utility.Chat; import net.coreprotect.utility.Color; import net.coreprotect.utility.Util; +import oshi.hardware.CentralProcessor; public class ConfigHandler extends Queue { public static int SERVER_VERSION = 0; @@ -56,7 +56,7 @@ public class ConfigHandler extends Queue { public static int maximumPoolSize = 10; public static HikariDataSource hikariDataSource = null; - public static final ProcessorInfo processorInfo = Util.getProcessorInfo(); + public static final CentralProcessor processorInfo = Util.getProcessorInfo(); public static final boolean isSpigot = Util.isSpigot(); public static final boolean isPaper = Util.isPaper(); public static final boolean isFolia = Util.isFolia(); diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index d14877e4..114a8f86 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -53,8 +53,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; import org.bukkit.util.io.BukkitObjectOutputStream; -import org.jutils.jhardware.HardwareInfo; -import org.jutils.jhardware.model.ProcessorInfo; import net.coreprotect.CoreProtect; import net.coreprotect.bukkit.BukkitAdapter; @@ -68,6 +66,8 @@ import net.coreprotect.thread.Scheduler; import net.coreprotect.utility.serialize.ItemMetaHandler; import net.coreprotect.worldedit.CoreProtectEditSessionEvent; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; public class Util extends Queue { @@ -116,11 +116,12 @@ public static String getPluginName() { return name; } - public static ProcessorInfo getProcessorInfo() { - ProcessorInfo result = null; + public static CentralProcessor getProcessorInfo() { + CentralProcessor result = null; try { - Configurator.setLevel("com.profesorfalken.jsensors.manager.unix.UnixSensorsManager", Level.OFF); - result = HardwareInfo.getProcessorInfo(); + Configurator.setLevel("oshi.hardware.common.AbstractCentralProcessor", Level.OFF); + SystemInfo systemInfo = new SystemInfo(); + result = systemInfo.getHardware().getProcessor(); } catch (Exception e) { // unable to read processor information From 1cf940e201b172491447286d0905f1a4791c9a32 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 19:23:39 -0600 Subject: [PATCH 34/60] Improved MySQL index handling on radius lookups (fixes #599) --- src/main/java/net/coreprotect/database/Lookup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/database/Lookup.java b/src/main/java/net/coreprotect/database/Lookup.java index 1668464a..4d976149 100755 --- a/src/main/java/net/coreprotect/database/Lookup.java +++ b/src/main/java/net/coreprotect/database/Lookup.java @@ -705,7 +705,7 @@ else if (actionList.contains(11)) { index = "USE INDEX(wid) IGNORE INDEX(type,user) "; } if ((restrictWorld && (users.length() > 0 || includeBlock.length() > 0 || includeEntity.length() > 0))) { - index = ""; + index = "IGNORE INDEX(PRIMARY) "; } } From c6f8be9043ab4b5875fd832ed8de64c7c030c6c7 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 19:55:21 -0600 Subject: [PATCH 35/60] Fixed NoClassDefFoundError if JNA is missing on system --- src/main/java/net/coreprotect/utility/Util.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 114a8f86..8e859b3a 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -119,6 +119,7 @@ public static String getPluginName() { public static CentralProcessor getProcessorInfo() { CentralProcessor result = null; try { + Class.forName("com.sun.jna.Platform"); Configurator.setLevel("oshi.hardware.common.AbstractCentralProcessor", Level.OFF); SystemInfo systemInfo = new SystemInfo(); result = systemInfo.getHardware().getProcessor(); From cae29f257d407fc2ec87f2fe24c98ca4a9e0efe9 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 20:48:21 -0600 Subject: [PATCH 36/60] Fixed NullPointerException when attempting to roll back skulls with texture data --- .../database/statement/SkullStatement.java | 7 +---- .../net/coreprotect/paper/PaperAdapter.java | 7 ++++- .../net/coreprotect/paper/Paper_v1_20.java | 29 +++++++++++++------ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/coreprotect/database/statement/SkullStatement.java b/src/main/java/net/coreprotect/database/statement/SkullStatement.java index 44beae8a..6dd005aa 100644 --- a/src/main/java/net/coreprotect/database/statement/SkullStatement.java +++ b/src/main/java/net/coreprotect/database/statement/SkullStatement.java @@ -3,9 +3,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; -import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.block.BlockState; import org.bukkit.block.Skull; @@ -48,10 +46,7 @@ public static void getData(Statement statement, BlockState block, String query) while (resultSet.next()) { String owner = resultSet.getString("owner"); - if (owner != null && owner.length() >= 32 && owner.contains("-")) { - skull.setOwningPlayer(Bukkit.getOfflinePlayer(UUID.fromString(owner))); - } - else if (owner != null && owner.length() > 1) { + if (owner != null && owner.length() > 1) { PaperAdapter.ADAPTER.setSkullOwner(skull, owner); } diff --git a/src/main/java/net/coreprotect/paper/PaperAdapter.java b/src/main/java/net/coreprotect/paper/PaperAdapter.java index 8a8b77dd..935a8e7f 100644 --- a/src/main/java/net/coreprotect/paper/PaperAdapter.java +++ b/src/main/java/net/coreprotect/paper/PaperAdapter.java @@ -1,5 +1,8 @@ package net.coreprotect.paper; +import java.util.UUID; + +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.block.Sign; @@ -83,7 +86,9 @@ public String getSkullOwner(Skull skull) { @Override public void setSkullOwner(Skull skull, String owner) { - return; + if (owner != null && owner.length() >= 32 && owner.contains("-")) { + skull.setOwningPlayer(Bukkit.getOfflinePlayer(UUID.fromString(owner))); + } } @Override diff --git a/src/main/java/net/coreprotect/paper/Paper_v1_20.java b/src/main/java/net/coreprotect/paper/Paper_v1_20.java index 6785c33a..048c96a9 100644 --- a/src/main/java/net/coreprotect/paper/Paper_v1_20.java +++ b/src/main/java/net/coreprotect/paper/Paper_v1_20.java @@ -2,11 +2,15 @@ import java.net.URI; import java.net.URL; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.block.Sign; import org.bukkit.block.Skull; import org.bukkit.block.sign.Side; +import org.bukkit.profile.PlayerTextures; + +import com.destroystokyo.paper.profile.PlayerProfile; import net.coreprotect.config.Config; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -27,13 +31,11 @@ public String getLine(Sign sign, int line) { @Override public String getSkullOwner(Skull skull) { String owner = skull.getPlayerProfile().getName(); - if (Config.getGlobal().MYSQL) { - if (owner.length() > 255 && skull.getPlayerProfile().getId() != null) { - return skull.getPlayerProfile().getId().toString(); - } - else if (owner.length() > 255) { - return owner.substring(0, 255); - } + if (skull.getPlayerProfile().getId() != null) { + owner = skull.getPlayerProfile().getId().toString(); + } + else if (Config.getGlobal().MYSQL && owner.length() > 255) { + return owner.substring(0, 255); } return owner; @@ -41,7 +43,12 @@ else if (owner.length() > 255) { @Override public void setSkullOwner(Skull skull, String owner) { - skull.setPlayerProfile(Bukkit.createProfile(owner)); + if (owner != null && owner.length() >= 32 && owner.contains("-")) { + skull.setPlayerProfile(Bukkit.createProfile(UUID.fromString(owner))); + } + else { + skull.setPlayerProfile(Bukkit.createProfile(owner)); + } } @Override @@ -57,7 +64,11 @@ public String getSkullSkin(Skull skull) { @Override public void setSkullSkin(Skull skull, String skin) { try { - skull.getPlayerProfile().getTextures().setSkin(URI.create(skin).toURL()); + PlayerProfile playerProfile = skull.getPlayerProfile(); + PlayerTextures textures = playerProfile.getTextures(); + textures.setSkin(URI.create(skin).toURL()); + playerProfile.setTextures(textures); + skull.setPlayerProfile(playerProfile); } catch (Exception e) { e.printStackTrace(); From 7ab0704002b60e3345bad1887d87adb0cd2b18da Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 15 Aug 2024 20:48:42 -0600 Subject: [PATCH 37/60] Improved how CPU information is displayed under /co status --- src/main/java/net/coreprotect/command/StatusCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/command/StatusCommand.java b/src/main/java/net/coreprotect/command/StatusCommand.java index c60031a4..4c20e844 100755 --- a/src/main/java/net/coreprotect/command/StatusCommand.java +++ b/src/main/java/net/coreprotect/command/StatusCommand.java @@ -116,7 +116,7 @@ else if (modelName.contains(" Processor")) { String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq()); cpuSpeed = String.format("%.2f", Long.valueOf(cpuSpeed) / 1000000000.0); - cpuInfo = modelName + " " + Runtime.getRuntime().availableProcessors() + " x " + cpuSpeed + "GHz."; + cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz " + modelName + "."; } else { cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + Phrase.build(Phrase.CPU_CORES); From cff6be6d90fb9a9c55873cc73f30cab8d1244376 Mon Sep 17 00:00:00 2001 From: Wang Siu Kao <94590267+HansHans135@users.noreply.github.com> Date: Tue, 20 Aug 2024 06:17:23 +0800 Subject: [PATCH 38/60] Update Traditional Chinese translation (#618) --- lang/zh-tw.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index 7c4e6265..17560476 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -1,5 +1,5 @@ # CoreProtect Language File (zh-TW) -# Translators: whitebear13579, flandretw, ianiiaannn +# Translators: whitebear13579, flandretw, ianiiaannn, hanshans135 ACTION_NOT_SUPPORTED: "此指令不支援該行為。" AMOUNT_BLOCK: "{0} 格{方塊|方塊}" @@ -16,6 +16,7 @@ COMMAND_THROTTLED: "請稍後再試。" CONSUMER_ERROR: "消費者隊列處理已經{暫停|繼續}." CONSUMER_TOGGLED: "消費者隊列處理已{暫停|繼續}." CONTAINER_HEADER: "儲存容器變更紀錄。" +CPU_CORES: "CPU核心." DATABASE_BUSY: "資料庫繁忙,請稍後再試。" DATABASE_INDEX_ERROR: "無法驗證資料庫索引。" DATABASE_LOCKED_1: "資料庫已被鎖定,請稍後 15 秒後再試……" @@ -126,6 +127,8 @@ MISSING_PARAMETERS: "請使用「{0}」。" MISSING_ROLLBACK_RADIUS: "你沒有指定{回滾|恢復}的範圍。" MISSING_ROLLBACK_USER: "你沒有指定{回滾|恢復}的玩家。" MYSQL_UNAVAILABLE: "無法連線到 MySQL 伺服器。" +NETWORK_CONNECTION: "連接到 {0} {成功|失敗}. 使用 {1} {2}." +NETWORK_TEST: "網絡測試數據已成功發送。" NO_DATA: "未找到 {0} §f的資料。" NO_DATA_LOCATION: "未找到此位置的{資料|交易|互動|訊息}。" NO_PERMISSION: "你沒有使用該操作的權限。" @@ -145,6 +148,7 @@ PREVIEW_CANCELLED: "預覽已取消。" PREVIEW_CANCELLING: "正在取消預覽……" PREVIEW_IN_GAME: "你只能在遊戲中預覽回滾。" PREVIEW_TRANSACTION: "您無法預覽{集裝箱|庫存}交易。" +PRIMARY_THREAD_ERROR: "該API方法不能在主線程上使用。" PURGE_ABORTED: "清除失敗,你的資料可能已損毀。" PURGE_ERROR: "無法處理 {0} 筆資料!" PURGE_FAILED: "清除失敗,請稍後再試。" @@ -158,6 +162,7 @@ PURGE_REPAIRING: "正在嘗試修復問題,這可能需要一些時間。" PURGE_ROWS: "已清除 {0} {筆|筆}資料。" PURGE_STARTED: "資料清除開始於「{0}」。" PURGE_SUCCESS: "成功清除資料。" +RAM_STATS: "{0}GB / {1}GB 記憶體" RELOAD_STARTED: "正在重新載入設定檔——請稍候……" RELOAD_SUCCESS: "成功重新載入設定檔。" ROLLBACK_ABORTED: "已中斷回滾/恢復。" @@ -179,6 +184,7 @@ STATUS_CONSUMER: "消費者隊列: {0} 筆{資料|資料}在隊列中。" STATUS_DATABASE: "資料庫: 使用 {0}。" STATUS_INTEGRATION: "{0}: 整合{啟用|停用}。" STATUS_LICENSE: "憑證: {0}" +STATUS_SYSTEM: "系統: {0}" STATUS_VERSION: "版本: {0}" TELEPORTED: "傳送到 {0}。" TELEPORTED_SAFETY: "已將你傳送到安全的區域。" From c493a0dece5780aa975ac5bf19899e3c369ebc9b Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 19 Aug 2024 20:55:35 -0600 Subject: [PATCH 39/60] Added support for Community Edition builds --- .../net/coreprotect/command/CommandHandler.java | 2 +- .../net/coreprotect/command/StatusCommand.java | 3 ++- .../net/coreprotect/config/ConfigHandler.java | 1 + src/main/java/net/coreprotect/utility/Util.java | 16 ++++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index 081e5bdb..aaf5050e 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -1290,7 +1290,7 @@ class updateAlert implements Runnable { public void run() { try { Thread.sleep(5000); - Chat.sendMessage(user, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_HEADER, "CoreProtect") + Color.WHITE + " -----"); + Chat.sendMessage(user, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_HEADER, "CoreProtect" + (Util.isCommunityEdition() ? " " + ConfigHandler.COMMUNITY_EDITION : "")) + Color.WHITE + " -----"); Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, Color.WHITE, "CoreProtect v" + latestVersion)); Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, Color.WHITE, "www.coreprotect.net/download/")); } diff --git a/src/main/java/net/coreprotect/command/StatusCommand.java b/src/main/java/net/coreprotect/command/StatusCommand.java index 4c20e844..c46a42d4 100755 --- a/src/main/java/net/coreprotect/command/StatusCommand.java +++ b/src/main/java/net/coreprotect/command/StatusCommand.java @@ -17,6 +17,7 @@ import net.coreprotect.thread.NetworkHandler; import net.coreprotect.utility.Chat; import net.coreprotect.utility.Color; +import net.coreprotect.utility.Util; public class StatusCommand { private static ConcurrentHashMap alert = new ConcurrentHashMap<>(); @@ -42,7 +43,7 @@ public void run() { } } - Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "-----"); + Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + "CoreProtect" + (Util.isCommunityEdition() ? " " + ConfigHandler.COMMUNITY_EDITION : "") + Color.WHITE + " -----"); Chat.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.STATUS_VERSION, Color.WHITE, ConfigHandler.EDITION_NAME + " v" + pdfFile.getVersion() + ".") + versionCheck); String donationKey = NetworkHandler.donationKey(); diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 09dcf716..ab13b92a 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -43,6 +43,7 @@ public class ConfigHandler extends Queue { public static final int EDITION_VERSION = 2; public static final String EDITION_BRANCH = Util.getBranch(); public static final String EDITION_NAME = Util.getPluginName(); + public static final String COMMUNITY_EDITION = "Community Edition"; public static final String JAVA_VERSION = "11.0"; public static final String SPIGOT_VERSION = "1.15"; public static String path = "plugins/CoreProtect/"; diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 8e859b3a..19b3e570 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -63,6 +63,7 @@ import net.coreprotect.language.Phrase; import net.coreprotect.model.BlockGroup; import net.coreprotect.thread.CacheHandler; +import net.coreprotect.thread.NetworkHandler; import net.coreprotect.thread.Scheduler; import net.coreprotect.utility.serialize.ItemMetaHandler; import net.coreprotect.worldedit.CoreProtectEditSessionEvent; @@ -112,6 +113,9 @@ public static String getPluginName() { if (branch.startsWith("-edge")) { name = name + " " + branch.substring(1, 2).toUpperCase() + branch.substring(2, 5); } + else if (isCommunityEdition()) { + name = name + " " + ConfigHandler.COMMUNITY_EDITION; + } return name; } @@ -1385,6 +1389,18 @@ public static boolean isFolia() { return true; } + public static boolean isCommunityEdition() { + return !isBranch("edge") && !isBranch("coreprotect") && !validDonationKey(); + } + + public static boolean isBranch(String branch) { + return ConfigHandler.EDITION_BRANCH.contains("-" + branch); + } + + public static boolean validDonationKey() { + return NetworkHandler.donationKey() != null; + } + public static String getBranch() { String branch = ""; try { From ea1b86c0347f5c1990060212dd9f1e1ffb0d7beb Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 20 Aug 2024 14:13:44 -0600 Subject: [PATCH 40/60] Only start CoreProtect on supported Minecraft versions --- src/main/java/net/coreprotect/CoreProtect.java | 8 ++++++-- src/main/java/net/coreprotect/command/PurgeCommand.java | 5 +++++ src/main/java/net/coreprotect/config/ConfigHandler.java | 3 ++- src/main/java/net/coreprotect/language/Language.java | 2 ++ src/main/java/net/coreprotect/language/Phrase.java | 2 ++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coreprotect/CoreProtect.java b/src/main/java/net/coreprotect/CoreProtect.java index 7530af16..9bc8a2f5 100755 --- a/src/main/java/net/coreprotect/CoreProtect.java +++ b/src/main/java/net/coreprotect/CoreProtect.java @@ -137,8 +137,12 @@ public void onDisable() { private static boolean performVersionChecks() { try { String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]"); - if (Util.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.SPIGOT_VERSION)) { - Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Spigot", ConfigHandler.SPIGOT_VERSION)); + if (Util.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) { + Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION)); + return false; + } + if (Util.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1]) && Util.isBranch("master")) { + Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1])); return false; } String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0").split("\\."); diff --git a/src/main/java/net/coreprotect/command/PurgeCommand.java b/src/main/java/net/coreprotect/command/PurgeCommand.java index e6f2dd2d..73f48976 100755 --- a/src/main/java/net/coreprotect/command/PurgeCommand.java +++ b/src/main/java/net/coreprotect/command/PurgeCommand.java @@ -104,6 +104,11 @@ else if (endTime < 86400) { int restrictCount = 0; if (argBlocks.size() > 0) { + if (!Util.validDonationKey()) { + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); + return; + } + StringBuilder includeListMaterial = new StringBuilder(); StringBuilder includeListEntity = new StringBuilder(); diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index ab13b92a..50a4ec1e 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -45,7 +45,8 @@ public class ConfigHandler extends Queue { public static final String EDITION_NAME = Util.getPluginName(); public static final String COMMUNITY_EDITION = "Community Edition"; public static final String JAVA_VERSION = "11.0"; - public static final String SPIGOT_VERSION = "1.15"; + public static final String MINECRAFT_VERSION = "1.15"; + public static final String LATEST_VERSION = "1.21"; public static String path = "plugins/CoreProtect/"; public static String sqlite = "database.db"; public static String host = "127.0.0.1"; diff --git a/src/main/java/net/coreprotect/language/Language.java b/src/main/java/net/coreprotect/language/Language.java index a19004da..91f703bc 100644 --- a/src/main/java/net/coreprotect/language/Language.java +++ b/src/main/java/net/coreprotect/language/Language.java @@ -55,6 +55,7 @@ public static void loadPhrases() { phrases.put(Phrase.DEVELOPMENT_BRANCH, "Development branch detected, skipping patch scripts."); phrases.put(Phrase.DIRT_BLOCK, "Placed a temporary safety block under you."); phrases.put(Phrase.DISABLE_SUCCESS, "Success! Disabled {0}"); + phrases.put(Phrase.DONATION_KEY_REQUIRED, "A valid donation key is required for that command."); phrases.put(Phrase.ENABLE_FAILED, "{0} was unable to start."); phrases.put(Phrase.ENABLE_SUCCESS, "{0} has been successfully enabled!"); phrases.put(Phrase.ENJOY_COREPROTECT, "Enjoy {0}? Join our Discord!"); @@ -232,6 +233,7 @@ public static void loadPhrases() { phrases.put(Phrase.USING_SQLITE, "Using SQLite for data storage."); phrases.put(Phrase.VALID_DONATION_KEY, "Valid donation key."); phrases.put(Phrase.VERSION_NOTICE, "Version {0} is now available."); + phrases.put(Phrase.VERSION_INCOMPATIBLE, "{0} {1} is not supported."); phrases.put(Phrase.VERSION_REQUIRED, "{0} {1} or higher is required."); phrases.put(Phrase.WORLD_NOT_FOUND, "World \"{0}\" not found."); diff --git a/src/main/java/net/coreprotect/language/Phrase.java b/src/main/java/net/coreprotect/language/Phrase.java index 89e487f2..d99c4c31 100644 --- a/src/main/java/net/coreprotect/language/Phrase.java +++ b/src/main/java/net/coreprotect/language/Phrase.java @@ -38,6 +38,7 @@ public enum Phrase { DEVELOPMENT_BRANCH, DIRT_BLOCK, DISABLE_SUCCESS, + DONATION_KEY_REQUIRED, ENABLE_FAILED, ENABLE_SUCCESS, ENJOY_COREPROTECT, @@ -215,6 +216,7 @@ public enum Phrase { USING_SQLITE, VALID_DONATION_KEY, VERSION_NOTICE, + VERSION_INCOMPATIBLE, VERSION_REQUIRED, WORLD_NOT_FOUND; From edadebf8c24360cd88689ddbc2e56f1bb3533d53 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 20 Aug 2024 14:16:27 -0600 Subject: [PATCH 41/60] Run v23.1 patch script on v23.0 builds --- src/main/java/net/coreprotect/patch/script/__2_23_0.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/coreprotect/patch/script/__2_23_0.java b/src/main/java/net/coreprotect/patch/script/__2_23_0.java index cdf47c06..73f142d9 100644 --- a/src/main/java/net/coreprotect/patch/script/__2_23_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_23_0.java @@ -19,6 +19,8 @@ protected static boolean patch(Statement statement) { catch (Exception e) { Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "skull", Selector.FIRST, Selector.FIRST)); } + + __2_23_1.patch(statement); } } catch (Exception e) { From fc0c8ff9ac59024952085a86e0e7363845f1e3e5 Mon Sep 17 00:00:00 2001 From: DarkSnakeX <52959327+DarkSnakeX@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:55:47 +0200 Subject: [PATCH 42/60] Update es.yml (#633) Added new lines that were not covered on the old translation file. --- lang/es.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lang/es.yml b/lang/es.yml index 6b3d522f..5a006ddb 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -15,6 +15,7 @@ COMMAND_THROTTLED: "Espere un momento e intente nuevamente." CONSUMER_ERROR: "La espera en el procesamiento del consumidor ha sido {pausada|continuada}." CONSUMER_TOGGLED: "Consumer queue processing has been {pausado|continuado}." CONTAINER_HEADER: "Transacciones del contenedor" +CPU_CORES: "CPU cores." DATABASE_BUSY: "Base de datos ocupada. Intente más tarde." DATABASE_INDEX_ERROR: "Imposible validar los indices de la base de datos." DATABASE_LOCKED_1: "Base de datos bloqueada. Espere en los siguientes 15 segundos..." @@ -125,6 +126,8 @@ MISSING_PARAMETERS: "Usa \"{0}\"." MISSING_ROLLBACK_RADIUS: "No especificaste un radio para {retornar|resturar}." MISSING_ROLLBACK_USER: "No especificaste a un usuario para {retornar|restaurar}." MYSQL_UNAVAILABLE: "No se pudo conectar con el servidor de MySQL." +NETWORK_CONNECTION: "Conexión por {0} {exitosa|fallida}. Usando {1} {2}." +NETWORK_TEST: "Los datos de la prueba de red se han enviado con éxito." NO_DATA: "Sin datos para {0}." NO_DATA_LOCATION: "Sin {datos|transacciones|interacciones|mensajes} encontrados acá." NO_PERMISSION: "No tienes permisos para hacer esto." @@ -144,6 +147,7 @@ PREVIEW_CANCELLED: "Muestra cancelada." PREVIEW_CANCELLING: "Cancelando muestra..." PREVIEW_IN_GAME: "Solo puedes mostrar respaldos en el juego." PREVIEW_TRANSACTION: "No puedes mostrar transacciones de {contenedor|inventario}." +PRIMARY_THREAD_ERROR: "Ese método de API no se puede usar en el hilo principal." PURGE_ABORTED: "Purga fallida. La base de datos debe estar corrupta." PURGE_ERROR: "¡No se pudo procesar {0} datos!" PURGE_FAILED: "Purga fallida. Intente nuevamente." @@ -157,6 +161,7 @@ PURGE_REPAIRING: "Intentando reparar. Esto tomará algo de tiempo..." PURGE_ROWS: "{0} {fila|filas} de datos limpiados." PURGE_STARTED: "Purga de datos iniciada en \"{0}\"." PURGE_SUCCESS: "Purga de datos exitosa." +RAM_STATS: "{0}GB / {1}GB RAM" RELOAD_STARTED: "Recargando configuración - espere." RELOAD_SUCCESS: "Configuración exitosamente recargada." ROLLBACK_ABORTED: "Retorno o restauración abortado." @@ -178,6 +183,7 @@ STATUS_CONSUMER: "Consumidor: {0} {objeto|objetos} en espera." STATUS_DATABASE: "Base de datos: Usando {0}." STATUS_INTEGRATION: "{0}: Integración {activada|desactivada}." STATUS_LICENSE: "Licencia: {0}" +STATUS_SYSTEM: "Sistema: {0}" STATUS_VERSION: "Versión: {0}" TELEPORTED: "Teletransportado a {0}." TELEPORTED_SAFETY: "Te he teletransportado a un lugar seguro." From de978fce2ccf773ea2faa832ce022001e29a7407 Mon Sep 17 00:00:00 2001 From: Intelli Date: Sun, 29 Sep 2024 18:35:27 -0600 Subject: [PATCH 43/60] Added base changes for database migration command (unfinished) --- .gitignore | 5 +- lang/en.yml | 2 + .../java/net/coreprotect/CoreProtect.java | 3 + .../coreprotect/command/CommandHandler.java | 15 ++++ .../net/coreprotect/command/PurgeCommand.java | 9 +- .../net/coreprotect/config/ConfigHandler.java | 5 +- .../net/coreprotect/consumer/Consumer.java | 2 +- .../coreprotect/consumer/process/Process.java | 13 +-- .../net/coreprotect/database/Database.java | 90 +++++++++---------- .../coreprotect/patch/script/__2_15_0.java | 4 +- .../coreprotect/patch/script/__2_16_0.java | 8 +- .../coreprotect/patch/script/__2_18_0.java | 4 +- .../coreprotect/patch/script/__2_19_0.java | 4 +- .../coreprotect/patch/script/__2_20_0.java | 4 +- 14 files changed, 95 insertions(+), 73 deletions(-) diff --git a/.gitignore b/.gitignore index 09fed1e8..17cea1a8 100644 --- a/.gitignore +++ b/.gitignore @@ -195,4 +195,7 @@ Desktop.ini hs_err_pid* # Documentation dev folder -docs/dev/ \ No newline at end of file +docs/dev/ + +# Extensions +extensions/ \ No newline at end of file diff --git a/lang/en.yml b/lang/en.yml index bb9763f7..a6c211bb 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -26,6 +26,7 @@ DATABASE_UNREACHABLE: "Database is unreachable. Discarding data and shutting dow DEVELOPMENT_BRANCH: "Development branch detected, skipping patch scripts." DIRT_BLOCK: "Placed a temporary safety block under you." DISABLE_SUCCESS: "Success! Disabled {0}" +DONATION_KEY_REQUIRED: "A valid donation key is required for that command." ENABLE_FAILED: "{0} was unable to start." ENABLE_SUCCESS: "{0} has been successfully enabled!" ENJOY_COREPROTECT: "Enjoy {0}? Join our Discord!" @@ -202,6 +203,7 @@ USER_OFFLINE: "The user \"{0}\" is not online." USING_MYSQL: "Using MySQL for data storage." USING_SQLITE: "Using SQLite for data storage." VALID_DONATION_KEY: "Valid donation key." +VERSION_INCOMPATIBLE: "{0} {1} is not supported." VERSION_NOTICE: "Version {0} is now available." VERSION_REQUIRED: "{0} {1} or higher is required." WORLD_NOT_FOUND: "World \"{0}\" not found." \ No newline at end of file diff --git a/src/main/java/net/coreprotect/CoreProtect.java b/src/main/java/net/coreprotect/CoreProtect.java index 9bc8a2f5..4e0b58dd 100755 --- a/src/main/java/net/coreprotect/CoreProtect.java +++ b/src/main/java/net/coreprotect/CoreProtect.java @@ -196,6 +196,9 @@ private static void safeShutdown(CoreProtect plugin) { Chat.console(Phrase.build(Phrase.FINISHING_LOGGING)); } + if (ConfigHandler.migrationRunning) { + ConfigHandler.purgeRunning = false; + } while ((Consumer.isRunning() || ConfigHandler.converterRunning) && !ConfigHandler.purgeRunning) { long time = System.currentTimeMillis(); if (time >= alertTime) { diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index aaf5050e..d3193eb6 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -1273,6 +1273,21 @@ else if (corecommand.equals("consumer")) { else if (corecommand.equals("network-debug")) { NetworkDebugCommand.runCommand(user, permission, argumentArray); } + else if (corecommand.equals("migrate-db")) { + if (!Util.validDonationKey()) { + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); + } + else { + try { + Class.forName("net.coreprotect.extensions.DatabaseMigration"); + net.coreprotect.extensions.DatabaseMigration.runCommand(user, argumentArray); + } + catch (Exception e) { + // plugin not compiled with extension + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + corecommand)); + } + } + } else { Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + corecommand)); } diff --git a/src/main/java/net/coreprotect/command/PurgeCommand.java b/src/main/java/net/coreprotect/command/PurgeCommand.java index 73f48976..332c8c9e 100755 --- a/src/main/java/net/coreprotect/command/PurgeCommand.java +++ b/src/main/java/net/coreprotect/command/PurgeCommand.java @@ -50,7 +50,7 @@ protected static void runCommand(final CommandSender player, boolean permission, return; } - if (ConfigHandler.converterRunning) { + if (ConfigHandler.converterRunning || ConfigHandler.migrationRunning) { Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.UPGRADE_IN_PROGRESS)); return; } @@ -104,11 +104,6 @@ else if (endTime < 86400) { int restrictCount = 0; if (argBlocks.size() > 0) { - if (!Util.validDonationKey()) { - Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); - return; - } - StringBuilder includeListMaterial = new StringBuilder(); StringBuilder includeListEntity = new StringBuilder(); @@ -260,7 +255,7 @@ public void run() { } } - Database.createDatabaseTables(purgePrefix, true); + Database.createDatabaseTables(purgePrefix, null, Config.getGlobal().MYSQL, true); } List purgeTables = Arrays.asList("sign", "container", "item", "skull", "session", "chat", "command", "entity", "block"); diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 50a4ec1e..77af69b5 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -55,6 +55,7 @@ public class ConfigHandler extends Queue { public static String username = "root"; public static String password = ""; public static String prefix = "co_"; + public static String prefixConfig = "co_"; public static int maximumPoolSize = 10; public static HikariDataSource hikariDataSource = null; @@ -65,6 +66,7 @@ public class ConfigHandler extends Queue { public static volatile boolean serverRunning = false; public static volatile boolean converterRunning = false; public static volatile boolean purgeRunning = false; + public static volatile boolean migrationRunning = false; public static volatile boolean pauseConsumer = false; public static volatile boolean worldeditEnabled = false; public static volatile boolean databaseReachable = true; @@ -173,6 +175,7 @@ private static void loadConfig() { // Enforce "co_" table prefix if using SQLite. if (!Config.getGlobal().MYSQL) { + ConfigHandler.prefixConfig = Config.getGlobal().PREFIX; Config.getGlobal().PREFIX = "co_"; } @@ -259,7 +262,7 @@ public static void loadDatabase() { ConfigHandler.hikariDataSource = new HikariDataSource(config); } - Database.createDatabaseTables(ConfigHandler.prefix, false); + Database.createDatabaseTables(ConfigHandler.prefix, null, Config.getGlobal().MYSQL, false); } public static void loadTypes(Statement statement) { diff --git a/src/main/java/net/coreprotect/consumer/Consumer.java b/src/main/java/net/coreprotect/consumer/Consumer.java index f5a1693a..10b78ce8 100755 --- a/src/main/java/net/coreprotect/consumer/Consumer.java +++ b/src/main/java/net/coreprotect/consumer/Consumer.java @@ -100,7 +100,7 @@ public static boolean isRunning() { private static void pauseConsumer(int process_id) { try { - while ((ConfigHandler.serverRunning || ConfigHandler.converterRunning) && (Consumer.isPaused || ConfigHandler.pauseConsumer || ConfigHandler.purgeRunning || Consumer.consumer_id.get(process_id)[1] == 1)) { + while ((ConfigHandler.serverRunning || ConfigHandler.converterRunning || ConfigHandler.migrationRunning) && (Consumer.isPaused || ConfigHandler.pauseConsumer || ConfigHandler.purgeRunning || Consumer.consumer_id.get(process_id)[1] == 1)) { pausedSuccess = true; Thread.sleep(100); } diff --git a/src/main/java/net/coreprotect/consumer/process/Process.java b/src/main/java/net/coreprotect/consumer/process/Process.java index 44bd1278..22c79321 100755 --- a/src/main/java/net/coreprotect/consumer/process/Process.java +++ b/src/main/java/net/coreprotect/consumer/process/Process.java @@ -10,6 +10,7 @@ import org.bukkit.Material; +import net.coreprotect.config.Config; import net.coreprotect.config.ConfigHandler; import net.coreprotect.consumer.Consumer; import net.coreprotect.database.Database; @@ -74,7 +75,7 @@ protected static void processConsumer(int processId, boolean lastRun) { } Statement statement = connection.createStatement(); - Database.performCheckpoint(statement); + Database.performCheckpoint(statement, Config.getGlobal().MYSQL); Consumer.isPaused = true; ArrayList consumerData = Consumer.consumer.get(processId); @@ -91,7 +92,7 @@ protected static void processConsumer(int processId, boolean lastRun) { return; } - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); // Scan through usernames, ensure everything is loaded in memory. for (Entry entry : users.entrySet()) { String[] data = entry.getValue(); @@ -104,7 +105,7 @@ protected static void processConsumer(int processId, boolean lastRun) { } } updateLockTable(statement, (lastRun ? 0 : 1)); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); // Create prepared statements PreparedStatement preparedStmtSigns = Database.prepareStatement(connection, Database.SIGN, false); @@ -123,7 +124,7 @@ protected static void processConsumer(int processId, boolean lastRun) { PreparedStatement preparedStmtBlockdata = Database.prepareStatement(connection, Database.BLOCKDATA, false); // Scan through consumer data - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); for (int i = 0; i < consumerDataSize; i++) { Object[] data = consumerData.get(i); if (data != null) { @@ -242,7 +243,7 @@ protected static void processConsumer(int processId, boolean lastRun) { if (Consumer.interrupt) { commit(statement, preparedStmtSigns, preparedStmtBlocks, preparedStmtSkulls, preparedStmtContainers, preparedStmtItems, preparedStmtWorlds, preparedStmtChat, preparedStmtCommand, preparedStmtSession, preparedStmtEntities, preparedStmtMaterials, preparedStmtArt, preparedStmtEntity, preparedStmtBlockdata); Thread.sleep(500); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); } } catch (Exception e) { @@ -302,7 +303,7 @@ private static void commit(Statement statement, PreparedStatement preparedStmtSi preparedStmtArt.executeBatch(); preparedStmtEntity.executeBatch(); preparedStmtBlockdata.executeBatch(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/database/Database.java b/src/main/java/net/coreprotect/database/Database.java index 8b7798f3..ae8f8d72 100755 --- a/src/main/java/net/coreprotect/database/Database.java +++ b/src/main/java/net/coreprotect/database/Database.java @@ -43,11 +43,11 @@ public class Database extends Queue { public static final int BLOCKDATA = 12; public static final int ITEM = 13; - public static void beginTransaction(Statement statement) { + public static void beginTransaction(Statement statement, boolean isMySQL) { Consumer.transacting = true; try { - if (Config.getGlobal().MYSQL) { + if (isMySQL) { statement.executeUpdate("START TRANSACTION"); } else { @@ -59,12 +59,12 @@ public static void beginTransaction(Statement statement) { } } - public static void commitTransaction(Statement statement) throws Exception { + public static void commitTransaction(Statement statement, boolean isMySQL) throws Exception { int count = 0; while (true) { try { - if (Config.getGlobal().MYSQL) { + if (isMySQL) { statement.executeUpdate("COMMIT"); } else { @@ -89,8 +89,8 @@ public static void commitTransaction(Statement statement) throws Exception { } } - public static void performCheckpoint(Statement statement) throws SQLException { - if (!Config.getGlobal().MYSQL) { + public static void performCheckpoint(Statement statement, boolean isMySQL) throws SQLException { + if (!isMySQL) { statement.executeUpdate("PRAGMA wal_checkpoint(TRUNCATE)"); } } @@ -338,13 +338,13 @@ private static void initializeTables(String prefix, Statement statement) { } } - public static void createDatabaseTables(String prefix, boolean purge) { + public static void createDatabaseTables(String prefix, Connection forceConnection, boolean mySQL, boolean purge) { ConfigHandler.databaseTables.clear(); ConfigHandler.databaseTables.addAll(Arrays.asList("art_map", "block", "chat", "command", "container", "item", "database_lock", "entity", "entity_map", "material_map", "blockdata_map", "session", "sign", "skull", "user", "username_log", "version", "world")); - if (Config.getGlobal().MYSQL) { + if (mySQL) { boolean success = false; - try (Connection connection = Database.getConnection(true, true, true, 0)) { + try (Connection connection = (forceConnection != null ? forceConnection : Database.getConnection(true, true, true, 0))) { if (connection != null) { String index = ""; Statement statement = connection.createStatement(); @@ -380,7 +380,7 @@ public static void createDatabaseTables(String prefix, boolean purge) { statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "version(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int,version varchar(16)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); index = ", INDEX(id)"; statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "world(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),id int,world varchar(255)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4"); - if (!purge) { + if (!purge && forceConnection == null) { initializeTables(prefix, statement); } statement.close(); @@ -390,18 +390,18 @@ public static void createDatabaseTables(String prefix, boolean purge) { catch (Exception e) { e.printStackTrace(); } - if (!success) { + if (!success && forceConnection == null) { Config.getGlobal().MYSQL = false; } } - if (!Config.getGlobal().MYSQL) { - try (Connection connection = Database.getConnection(true, 0)) { + if (!mySQL) { + try (Connection connection = (forceConnection != null ? forceConnection : Database.getConnection(true, 0))) { Statement statement = connection.createStatement(); List tableData = new ArrayList<>(); List indexData = new ArrayList<>(); String attachDatabase = ""; - if (purge) { + if (purge && forceConnection == null) { String query = "ATTACH DATABASE '" + ConfigHandler.path + ConfigHandler.sqlite + ".tmp' AS tmp_db"; PreparedStatement preparedStmt = connection.prepareStatement(query); preparedStmt.execute(); @@ -478,94 +478,94 @@ else if (type.equalsIgnoreCase("index")) { } try { if (!indexData.contains("art_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "art_map_id_index ON " + ConfigHandler.prefix + "art_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "art_map_id_index ON " + prefix + "art_map(id);"); } if (!indexData.contains("block_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_index ON " + ConfigHandler.prefix + "block(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_index ON " + prefix + "block(wid,x,z,time);"); } if (!indexData.contains("block_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_user_index ON " + ConfigHandler.prefix + "block(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_user_index ON " + prefix + "block(user,time);"); } if (!indexData.contains("block_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_type_index ON " + ConfigHandler.prefix + "block(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_type_index ON " + prefix + "block(type,time);"); } if (!indexData.contains("blockdata_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "blockdata_map_id_index ON " + ConfigHandler.prefix + "blockdata_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "blockdata_map_id_index ON " + prefix + "blockdata_map(id);"); } if (!indexData.contains("chat_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_index ON " + ConfigHandler.prefix + "chat(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_index ON " + prefix + "chat(time);"); } if (!indexData.contains("chat_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_user_index ON " + ConfigHandler.prefix + "chat(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_user_index ON " + prefix + "chat(user,time);"); } if (!indexData.contains("chat_wid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_wid_index ON " + ConfigHandler.prefix + "chat(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_wid_index ON " + prefix + "chat(wid,x,z,time);"); } if (!indexData.contains("command_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_index ON " + ConfigHandler.prefix + "command(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_index ON " + prefix + "command(time);"); } if (!indexData.contains("command_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_user_index ON " + ConfigHandler.prefix + "command(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_user_index ON " + prefix + "command(user,time);"); } if (!indexData.contains("command_wid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_wid_index ON " + ConfigHandler.prefix + "command(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_wid_index ON " + prefix + "command(wid,x,z,time);"); } if (!indexData.contains("container_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_index ON " + ConfigHandler.prefix + "container(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_index ON " + prefix + "container(wid,x,z,time);"); } if (!indexData.contains("container_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_user_index ON " + ConfigHandler.prefix + "container(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_user_index ON " + prefix + "container(user,time);"); } if (!indexData.contains("container_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_type_index ON " + ConfigHandler.prefix + "container(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_type_index ON " + prefix + "container(type,time);"); } if (!indexData.contains("item_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_index ON " + ConfigHandler.prefix + "item(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_index ON " + prefix + "item(wid,x,z,time);"); } if (!indexData.contains("item_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_user_index ON " + ConfigHandler.prefix + "item(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_user_index ON " + prefix + "item(user,time);"); } if (!indexData.contains("item_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_type_index ON " + ConfigHandler.prefix + "item(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_type_index ON " + prefix + "item(type,time);"); } if (!indexData.contains("entity_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "entity_map_id_index ON " + ConfigHandler.prefix + "entity_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "entity_map_id_index ON " + prefix + "entity_map(id);"); } if (!indexData.contains("material_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "material_map_id_index ON " + ConfigHandler.prefix + "material_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "material_map_id_index ON " + prefix + "material_map(id);"); } if (!indexData.contains("session_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_index ON " + ConfigHandler.prefix + "session(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_index ON " + prefix + "session(wid,x,z,time);"); } if (!indexData.contains("session_action_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_action_index ON " + ConfigHandler.prefix + "session(action,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_action_index ON " + prefix + "session(action,time);"); } if (!indexData.contains("session_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_user_index ON " + ConfigHandler.prefix + "session(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_user_index ON " + prefix + "session(user,time);"); } if (!indexData.contains("session_time_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_time_index ON " + ConfigHandler.prefix + "session(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_time_index ON " + prefix + "session(time);"); } if (!indexData.contains("sign_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_index ON " + ConfigHandler.prefix + "sign(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_index ON " + prefix + "sign(wid,x,z,time);"); } if (!indexData.contains("sign_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_user_index ON " + ConfigHandler.prefix + "sign(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_user_index ON " + prefix + "sign(user,time);"); } if (!indexData.contains("sign_time_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_time_index ON " + ConfigHandler.prefix + "sign(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_time_index ON " + prefix + "sign(time);"); } if (!indexData.contains("user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "user_index ON " + ConfigHandler.prefix + "user(user);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "user_index ON " + prefix + "user(user);"); } if (!indexData.contains("uuid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "uuid_index ON " + ConfigHandler.prefix + "user(uuid);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "uuid_index ON " + prefix + "user(uuid);"); } if (!indexData.contains("username_log_uuid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "username_log_uuid_index ON " + ConfigHandler.prefix + "username_log(uuid,user);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "username_log_uuid_index ON " + prefix + "username_log(uuid,user);"); } if (!indexData.contains("world_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "world_id_index ON " + ConfigHandler.prefix + "world(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "world_id_index ON " + prefix + "world(id);"); } } catch (Exception e) { @@ -574,7 +574,7 @@ else if (type.equalsIgnoreCase("index")) { e.printStackTrace(); } } - if (!purge) { + if (!purge && forceConnection == null) { initializeTables(prefix, statement); } statement.close(); diff --git a/src/main/java/net/coreprotect/patch/script/__2_15_0.java b/src/main/java/net/coreprotect/patch/script/__2_15_0.java index 03cdfdab..e1461979 100755 --- a/src/main/java/net/coreprotect/patch/script/__2_15_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_15_0.java @@ -23,7 +23,7 @@ protected static boolean patch(Statement statement) { String preparedQuery = "UPDATE " + ConfigHandler.prefix + "material_map SET material = ? WHERE rowid = ?"; PreparedStatement preparedStatement = statement.getConnection().prepareStatement(preparedQuery); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); ResultSet rs = statement.executeQuery(query); while (rs.next()) { int rowid = rs.getInt("id"); @@ -36,7 +36,7 @@ protected static boolean patch(Statement statement) { } } rs.close(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); try { if (Config.getGlobal().MYSQL) { diff --git a/src/main/java/net/coreprotect/patch/script/__2_16_0.java b/src/main/java/net/coreprotect/patch/script/__2_16_0.java index 9943b55b..b924da47 100755 --- a/src/main/java/net/coreprotect/patch/script/__2_16_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_16_0.java @@ -53,7 +53,7 @@ protected static boolean patch(Statement statement) { query = "SELECT rowid as id FROM " + ConfigHandler.prefix + "block WHERE type IN(" + idList + ") AND y='0'"; String preparedQueryDelete = "DELETE FROM " + ConfigHandler.prefix + "block WHERE rowid = ?"; PreparedStatement preparedStatementDelete = statement.getConnection().prepareStatement(preparedQueryDelete); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); resultSet = statement.executeQuery(query); while (resultSet.next()) { int rowid = resultSet.getInt("id"); @@ -61,7 +61,7 @@ protected static boolean patch(Statement statement) { preparedStatementDelete.executeUpdate(); } resultSet.close(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); } } catch (Exception e) { @@ -78,7 +78,7 @@ protected static boolean patch(Statement statement) { PreparedStatement preparedStatementSelect = statement.getConnection().prepareStatement(preparedQuerySelect); PreparedStatement preparedStatementDelete = statement.getConnection().prepareStatement(preparedQueryDelete); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { int rowid = resultSet.getInt("id"); @@ -96,7 +96,7 @@ protected static boolean patch(Statement statement) { } } resultSet.close(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/patch/script/__2_18_0.java b/src/main/java/net/coreprotect/patch/script/__2_18_0.java index 5ceb267f..6920b122 100644 --- a/src/main/java/net/coreprotect/patch/script/__2_18_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_18_0.java @@ -57,7 +57,7 @@ protected static boolean patch(Statement statement) { PreparedStatement preparedContainerStatement = statement.getConnection().prepareStatement(preparedContainerQuery); PreparedStatement preparedContainerUpdateStatement = statement.getConnection().prepareStatement(preparedContainerUpdateQuery); PreparedStatement preparedMaterialDeleteStatement = statement.getConnection().prepareStatement(preparedMaterialDeleteQuery); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); try { ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { @@ -163,7 +163,7 @@ protected static boolean patch(Statement statement) { catch (Exception e) { e.printStackTrace(); } - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); preparedBlockStatement.close(); preparedBlockUpdateStatement.close(); diff --git a/src/main/java/net/coreprotect/patch/script/__2_19_0.java b/src/main/java/net/coreprotect/patch/script/__2_19_0.java index 75300d58..ba0fc82f 100644 --- a/src/main/java/net/coreprotect/patch/script/__2_19_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_19_0.java @@ -143,7 +143,7 @@ protected static boolean patch(Statement statement) { String preparedQueryUpdate = "UPDATE " + ConfigHandler.prefix + "sign SET action = 1 WHERE rowid = ?"; PreparedStatement preparedSignStatement = statement.getConnection().prepareStatement(preparedSignQuery); PreparedStatement preparedStatementUpdate = statement.getConnection().prepareStatement(preparedQueryUpdate); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); ResultSet resultSet = statement.executeQuery(blockQuery); while (resultSet.next()) { @@ -166,7 +166,7 @@ protected static boolean patch(Statement statement) { preparedSignStatement.close(); preparedStatementUpdate.close(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/patch/script/__2_20_0.java b/src/main/java/net/coreprotect/patch/script/__2_20_0.java index 49e88cb3..bad13a12 100644 --- a/src/main/java/net/coreprotect/patch/script/__2_20_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_20_0.java @@ -61,7 +61,7 @@ protected static boolean patch(Statement statement) { String entityQuery = "SELECT rowid, data FROM " + ConfigHandler.prefix + "block WHERE type = (SELECT id FROM " + ConfigHandler.prefix + "material_map WHERE material='minecraft:spawner' LIMIT 1) ORDER BY rowid ASC"; String preparedQueryUpdate = "UPDATE " + ConfigHandler.prefix + "block SET data = ? WHERE rowid = ?"; PreparedStatement preparedStatementUpdate = statement.getConnection().prepareStatement(preparedQueryUpdate); - Database.beginTransaction(statement); + Database.beginTransaction(statement, Config.getGlobal().MYSQL); ResultSet resultSet = statement.executeQuery(entityQuery); while (resultSet.next()) { @@ -97,7 +97,7 @@ protected static boolean patch(Statement statement) { resultSet.close(); preparedStatementUpdate.close(); - Database.commitTransaction(statement); + Database.commitTransaction(statement, Config.getGlobal().MYSQL); } catch (Exception e) { e.printStackTrace(); From 0f0c89845ca549c59ff62ca43b4972b3c7d871d8 Mon Sep 17 00:00:00 2001 From: Intelli Date: Sun, 29 Sep 2024 18:40:05 -0600 Subject: [PATCH 44/60] Added separate version check for CoreProtect Edge --- .../coreprotect/command/CommandHandler.java | 13 ++++-- .../coreprotect/thread/NetworkHandler.java | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index d3193eb6..86630425 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -1298,7 +1298,8 @@ else if (corecommand.equals("migrate-db")) { if (user.isOp() && versionAlert.get(user.getName()) == null) { String latestVersion = NetworkHandler.latestVersion(); - if (latestVersion != null) { + String latestEdgeVersion = NetworkHandler.latestEdgeVersion(); + if (latestVersion != null || latestEdgeVersion != null) { versionAlert.put(user.getName(), true); class updateAlert implements Runnable { @Override @@ -1306,8 +1307,14 @@ public void run() { try { Thread.sleep(5000); Chat.sendMessage(user, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_HEADER, "CoreProtect" + (Util.isCommunityEdition() ? " " + ConfigHandler.COMMUNITY_EDITION : "")) + Color.WHITE + " -----"); - Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, Color.WHITE, "CoreProtect v" + latestVersion)); - Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, Color.WHITE, "www.coreprotect.net/download/")); + if (latestVersion != null) { + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, Color.WHITE, "CoreProtect CE v" + latestVersion)); + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, Color.WHITE, "www.coreprotect.net/download/")); + } + else { + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, Color.WHITE, "CoreProtect v" + latestEdgeVersion)); + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, Color.WHITE, "www.coreprotect.net/latest/")); + } } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/coreprotect/thread/NetworkHandler.java b/src/main/java/net/coreprotect/thread/NetworkHandler.java index c1877d27..bddca96d 100755 --- a/src/main/java/net/coreprotect/thread/NetworkHandler.java +++ b/src/main/java/net/coreprotect/thread/NetworkHandler.java @@ -42,6 +42,7 @@ public class NetworkHandler extends Language implements Runnable { private boolean background = false; private boolean translate = true; private static String latestVersion = null; + private static String latestEdgeVersion = null; private static String donationKey = null; public NetworkHandler(boolean startup, boolean background) { @@ -53,6 +54,10 @@ public static String latestVersion() { return latestVersion; } + public static String latestEdgeVersion() { + return latestEdgeVersion; + } + public static String donationKey() { return donationKey; } @@ -282,10 +287,13 @@ else if (Files.isReadable(licensePath)) { while (ConfigHandler.serverRunning) { int status = 0; + int statusEdge = 0; HttpURLConnection connection = null; + HttpURLConnection connectionEdge = null; String version = Util.getPluginVersion(); try { + // CoreProtect Community Edition URL url = new URL("http://update.coreprotect.net/version/"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); @@ -296,6 +304,18 @@ else if (Files.isReadable(licensePath)) { connection.setConnectTimeout(5000); connection.connect(); status = connection.getResponseCode(); + + // CoreProtect Edge + url = new URL("http://update.coreprotect.net/version-edge/"); + connectionEdge = (HttpURLConnection) url.openConnection(); + connectionEdge.setRequestMethod("GET"); + connectionEdge.setRequestProperty("Accept-Charset", "UTF-8"); + connectionEdge.setRequestProperty("User-Agent", "CoreProtect/v" + version + " (by Intelli)"); + connectionEdge.setDoOutput(true); + connectionEdge.setInstanceFollowRedirects(true); + connectionEdge.setConnectTimeout(5000); + connectionEdge.connect(); + statusEdge = connectionEdge.getResponseCode(); } catch (Exception e) { // Unable to connect to update.coreprotect.net @@ -333,6 +353,31 @@ else if (Files.isReadable(licensePath)) { } } + if (statusEdge == 200) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(connectionEdge.getInputStream())); + String response = reader.readLine(); + + if (response.length() > 0 && response.length() < 10) { + String remoteVersion = response.replaceAll("[^0-9.]", ""); + if (remoteVersion.contains(".")) { + boolean newVersion = Util.newVersion(version, remoteVersion); + if (newVersion) { + latestEdgeVersion = remoteVersion; + } + else { + latestEdgeVersion = null; + } + } + } + + reader.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + try { /* Stat gathering */ int port = Bukkit.getServer().getPort(); From c7406a01a767a0351c48304bcb7281cfe5b25ac6 Mon Sep 17 00:00:00 2001 From: Intelli Date: Sun, 29 Sep 2024 18:47:30 -0600 Subject: [PATCH 45/60] Fix compilation error --- .gitignore | 2 +- src/main/java/net/coreprotect/extensions/.extensions | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/java/net/coreprotect/extensions/.extensions diff --git a/.gitignore b/.gitignore index 17cea1a8..a0ba6957 100644 --- a/.gitignore +++ b/.gitignore @@ -198,4 +198,4 @@ hs_err_pid* docs/dev/ # Extensions -extensions/ \ No newline at end of file +/src/main/java/net/coreprotect/extensions/*.java \ No newline at end of file diff --git a/src/main/java/net/coreprotect/extensions/.extensions b/src/main/java/net/coreprotect/extensions/.extensions new file mode 100644 index 00000000..e69de29b From 88b19efc8963cd00792cbbc123fe906aea4905bc Mon Sep 17 00:00:00 2001 From: Intelli Date: Sun, 29 Sep 2024 18:56:07 -0600 Subject: [PATCH 46/60] Improve Extension handling --- .../java/net/coreprotect/command/CommandHandler.java | 3 ++- src/main/java/net/coreprotect/extensions/.extensions | 0 .../java/net/coreprotect/extensions/Extensions.java | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) delete mode 100644 src/main/java/net/coreprotect/extensions/.extensions create mode 100644 src/main/java/net/coreprotect/extensions/Extensions.java diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index 86630425..f047deab 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -24,6 +24,7 @@ import net.coreprotect.bukkit.BukkitAdapter; import net.coreprotect.config.Config; import net.coreprotect.config.ConfigHandler; +import net.coreprotect.extensions.Extensions; import net.coreprotect.language.Phrase; import net.coreprotect.language.Selector; import net.coreprotect.model.BlockGroup; @@ -1280,7 +1281,7 @@ else if (corecommand.equals("migrate-db")) { else { try { Class.forName("net.coreprotect.extensions.DatabaseMigration"); - net.coreprotect.extensions.DatabaseMigration.runCommand(user, argumentArray); + Extensions.runDatabaseMigration(user, argumentArray); } catch (Exception e) { // plugin not compiled with extension diff --git a/src/main/java/net/coreprotect/extensions/.extensions b/src/main/java/net/coreprotect/extensions/.extensions deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/net/coreprotect/extensions/Extensions.java b/src/main/java/net/coreprotect/extensions/Extensions.java new file mode 100644 index 00000000..b3b36f11 --- /dev/null +++ b/src/main/java/net/coreprotect/extensions/Extensions.java @@ -0,0 +1,11 @@ +package net.coreprotect.extensions; + +import org.bukkit.command.CommandSender; + +public class Extensions { + + public static void runDatabaseMigration(CommandSender user, String[] argumentArray) { + DatabaseMigration.runCommand(user, argumentArray); + } + +} From 385c11a3aa74ffb7a2aa29ae5d811890fd1a7238 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 3 Oct 2024 15:51:18 -0600 Subject: [PATCH 47/60] Finalized extension system --- .gitignore | 3 ++- .../coreprotect/command/CommandHandler.java | 9 +-------- .../net/coreprotect/extensions/Extensions.java | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a0ba6957..8db6609f 100644 --- a/.gitignore +++ b/.gitignore @@ -198,4 +198,5 @@ hs_err_pid* docs/dev/ # Extensions -/src/main/java/net/coreprotect/extensions/*.java \ No newline at end of file +/src/main/java/net/coreprotect/extensions/*.java +!/src/main/java/net/coreprotect/extensions/Extensions.java \ No newline at end of file diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index f047deab..1ca5d459 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -1279,14 +1279,7 @@ else if (corecommand.equals("migrate-db")) { Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); } else { - try { - Class.forName("net.coreprotect.extensions.DatabaseMigration"); - Extensions.runDatabaseMigration(user, argumentArray); - } - catch (Exception e) { - // plugin not compiled with extension - Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + corecommand)); - } + Extensions.runDatabaseMigration(corecommand, user, argumentArray); } } else { diff --git a/src/main/java/net/coreprotect/extensions/Extensions.java b/src/main/java/net/coreprotect/extensions/Extensions.java index b3b36f11..954d82ff 100644 --- a/src/main/java/net/coreprotect/extensions/Extensions.java +++ b/src/main/java/net/coreprotect/extensions/Extensions.java @@ -1,11 +1,25 @@ package net.coreprotect.extensions; +import java.lang.reflect.Method; + import org.bukkit.command.CommandSender; +import net.coreprotect.language.Phrase; +import net.coreprotect.utility.Chat; +import net.coreprotect.utility.Color; + public class Extensions { - public static void runDatabaseMigration(CommandSender user, String[] argumentArray) { - DatabaseMigration.runCommand(user, argumentArray); + public static void runDatabaseMigration(String command, CommandSender user, String[] argumentArray) { + try { + Class patchClass = Class.forName("net.coreprotect.extensions.DatabaseMigration"); + Method patchMethod = patchClass.getDeclaredMethod("runCommand", CommandSender.class, String[].class); + patchMethod.invoke(null, user, argumentArray); + } + catch (Exception e) { + // plugin not compiled with extension + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + command)); + } } } From 70ffeacbc0a4117ed274b3fe72e8f60dc89f50b9 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 3 Oct 2024 15:56:29 -0600 Subject: [PATCH 48/60] Fixed NoClassDefFoundError when attempting to load plugin on 32-bit Windows --- src/main/java/net/coreprotect/utility/Util.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 19b3e570..80005a2d 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -124,6 +124,9 @@ public static CentralProcessor getProcessorInfo() { CentralProcessor result = null; try { Class.forName("com.sun.jna.Platform"); + if (System.getProperty("os.name").startsWith("Windows") && !System.getProperty("sun.arch.data.model").equals("64")) { + Class.forName("com.sun.jna.platform.win32.Win32Exception"); + } Configurator.setLevel("oshi.hardware.common.AbstractCentralProcessor", Level.OFF); SystemInfo systemInfo = new SystemInfo(); result = systemInfo.getHardware().getProcessor(); From eaa8c5c5c11a17f61b43641b722571a36f917f39 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 3 Oct 2024 18:37:13 -0600 Subject: [PATCH 49/60] Fixed v23.1 patch script not triggering on v23.0 installs when using SQLite --- src/main/java/net/coreprotect/patch/script/__2_23_0.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/patch/script/__2_23_0.java b/src/main/java/net/coreprotect/patch/script/__2_23_0.java index 73f142d9..4246ce8a 100644 --- a/src/main/java/net/coreprotect/patch/script/__2_23_0.java +++ b/src/main/java/net/coreprotect/patch/script/__2_23_0.java @@ -19,9 +19,9 @@ protected static boolean patch(Statement statement) { catch (Exception e) { Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "skull", Selector.FIRST, Selector.FIRST)); } - - __2_23_1.patch(statement); } + + __2_23_1.patch(statement); } catch (Exception e) { e.printStackTrace(); From 2327dbcf78b0502b272abd3ecaa8f83617194200 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 7 Oct 2024 19:59:46 -0600 Subject: [PATCH 50/60] Fixed SQLiteException when performing purges on SQLite databases (fixes #654) --- .../net/coreprotect/database/Database.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/net/coreprotect/database/Database.java b/src/main/java/net/coreprotect/database/Database.java index ae8f8d72..a6241452 100755 --- a/src/main/java/net/coreprotect/database/Database.java +++ b/src/main/java/net/coreprotect/database/Database.java @@ -478,94 +478,94 @@ else if (type.equalsIgnoreCase("index")) { } try { if (!indexData.contains("art_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "art_map_id_index ON " + prefix + "art_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "art_map_id_index ON " + ConfigHandler.prefix + "art_map(id);"); } if (!indexData.contains("block_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_index ON " + prefix + "block(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_index ON " + ConfigHandler.prefix + "block(wid,x,z,time);"); } if (!indexData.contains("block_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_user_index ON " + prefix + "block(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_user_index ON " + ConfigHandler.prefix + "block(user,time);"); } if (!indexData.contains("block_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_type_index ON " + prefix + "block(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_type_index ON " + ConfigHandler.prefix + "block(type,time);"); } if (!indexData.contains("blockdata_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "blockdata_map_id_index ON " + prefix + "blockdata_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "blockdata_map_id_index ON " + ConfigHandler.prefix + "blockdata_map(id);"); } if (!indexData.contains("chat_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_index ON " + prefix + "chat(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_index ON " + ConfigHandler.prefix + "chat(time);"); } if (!indexData.contains("chat_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_user_index ON " + prefix + "chat(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_user_index ON " + ConfigHandler.prefix + "chat(user,time);"); } if (!indexData.contains("chat_wid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_wid_index ON " + prefix + "chat(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_wid_index ON " + ConfigHandler.prefix + "chat(wid,x,z,time);"); } if (!indexData.contains("command_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_index ON " + prefix + "command(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_index ON " + ConfigHandler.prefix + "command(time);"); } if (!indexData.contains("command_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_user_index ON " + prefix + "command(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_user_index ON " + ConfigHandler.prefix + "command(user,time);"); } if (!indexData.contains("command_wid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_wid_index ON " + prefix + "command(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_wid_index ON " + ConfigHandler.prefix + "command(wid,x,z,time);"); } if (!indexData.contains("container_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_index ON " + prefix + "container(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_index ON " + ConfigHandler.prefix + "container(wid,x,z,time);"); } if (!indexData.contains("container_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_user_index ON " + prefix + "container(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_user_index ON " + ConfigHandler.prefix + "container(user,time);"); } if (!indexData.contains("container_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_type_index ON " + prefix + "container(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_type_index ON " + ConfigHandler.prefix + "container(type,time);"); } if (!indexData.contains("item_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_index ON " + prefix + "item(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_index ON " + ConfigHandler.prefix + "item(wid,x,z,time);"); } if (!indexData.contains("item_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_user_index ON " + prefix + "item(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_user_index ON " + ConfigHandler.prefix + "item(user,time);"); } if (!indexData.contains("item_type_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_type_index ON " + prefix + "item(type,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_type_index ON " + ConfigHandler.prefix + "item(type,time);"); } if (!indexData.contains("entity_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "entity_map_id_index ON " + prefix + "entity_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "entity_map_id_index ON " + ConfigHandler.prefix + "entity_map(id);"); } if (!indexData.contains("material_map_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "material_map_id_index ON " + prefix + "material_map(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "material_map_id_index ON " + ConfigHandler.prefix + "material_map(id);"); } if (!indexData.contains("session_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_index ON " + prefix + "session(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_index ON " + ConfigHandler.prefix + "session(wid,x,z,time);"); } if (!indexData.contains("session_action_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_action_index ON " + prefix + "session(action,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_action_index ON " + ConfigHandler.prefix + "session(action,time);"); } if (!indexData.contains("session_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_user_index ON " + prefix + "session(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_user_index ON " + ConfigHandler.prefix + "session(user,time);"); } if (!indexData.contains("session_time_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_time_index ON " + prefix + "session(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_time_index ON " + ConfigHandler.prefix + "session(time);"); } if (!indexData.contains("sign_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_index ON " + prefix + "sign(wid,x,z,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_index ON " + ConfigHandler.prefix + "sign(wid,x,z,time);"); } if (!indexData.contains("sign_user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_user_index ON " + prefix + "sign(user,time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_user_index ON " + ConfigHandler.prefix + "sign(user,time);"); } if (!indexData.contains("sign_time_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_time_index ON " + prefix + "sign(time);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_time_index ON " + ConfigHandler.prefix + "sign(time);"); } if (!indexData.contains("user_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "user_index ON " + prefix + "user(user);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "user_index ON " + ConfigHandler.prefix + "user(user);"); } if (!indexData.contains("uuid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "uuid_index ON " + prefix + "user(uuid);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "uuid_index ON " + ConfigHandler.prefix + "user(uuid);"); } if (!indexData.contains("username_log_uuid_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "username_log_uuid_index ON " + prefix + "username_log(uuid,user);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "username_log_uuid_index ON " + ConfigHandler.prefix + "username_log(uuid,user);"); } if (!indexData.contains("world_id_index")) { - statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "world_id_index ON " + prefix + "world(id);"); + statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "world_id_index ON " + ConfigHandler.prefix + "world(id);"); } } catch (Exception e) { From 25cef3e5c5ea3ba75d7febe5140398bb1940f6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Shotadft=28=E6=89=BF=E5=A4=AA=E5=8A=87=E5=A0=B4=29?= <98450322+shotadft@users.noreply.github.com> Date: Tue, 29 Oct 2024 08:57:32 +0900 Subject: [PATCH 51/60] Change to Japanese (#660) * Update ja.yml * Update ja.yml * Update ja.yml --------- Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com> --- lang/ja.yml | 88 ++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/lang/ja.yml b/lang/ja.yml index bff08710..6d44a3e4 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -6,8 +6,8 @@ AMOUNT_CHUNK: "{0} {チャンク|チャンク}" AMOUNT_ENTITY: "{0} {エンティティ|エンティティ}" AMOUNT_ITEM: "{0} {item|items}" API_TEST: "APIテストが成功しました。" -CACHE_ERROR: "警告:検証中にエラーが発生しました {0} キャッシュ。" -CACHE_RELOAD: "のリロードを強制する {マッピング|世界} データベースからのキャッシュ。" +CACHE_ERROR: "警告:検証中にエラーが発生しました {0}" +CACHE_RELOAD: "{マッピング|世界} のリロードを強制する(データベースからのキャッシュ)" CHECK_CONFIG: "config.ymlを確認してください" COMMAND_CONSOLE: "コンソールからコマンドを実行してください。" COMMAND_NOT_FOUND: "指示 \"{0}\" 見つかりません。" @@ -15,7 +15,7 @@ COMMAND_THROTTLED: "しばらく待ってから、もう一度お試しくださ CONSUMER_ERROR: "すでにコンシューマキュー処理 {一時停止|再開}。" CONSUMER_TOGGLED: "消費者キューの処理は {一時停止|再開}。" CONTAINER_HEADER: "コンテナトランザクション" -DATABASE_BUSY: "データベースがビジーです。後でもう一度やり直してください。" +DATABASE_BUSY: "データベースが無効です。後でもう一度やり直してください。" DATABASE_INDEX_ERROR: "データベースインデックスを検証できません。" DATABASE_LOCKED_1: "データベースがロックされています。最大15秒待機しています..." DATABASE_LOCKED_2: "データベースはすでに使用されています。もう一度やり直してください。" @@ -25,11 +25,11 @@ DATABASE_UNREACHABLE: "データベースにアクセスできません。デー DEVELOPMENT_BRANCH: "開発ブランチが検出され、パッチスクリプトをスキップしました。" DIRT_BLOCK: "あなたの下にダートブロックを置きました。" DISABLE_SUCCESS: "成功!無効 {0}" -ENABLE_FAILED: "{0} 開始できませんでした。" -ENABLE_SUCCESS: "{0} これで有効になります!" -ENJOY_COREPROTECT: "楽しみ {0}?私たちに参加する Discord!" +ENABLE_FAILED: "{0} を開始できませんでした。" +ENABLE_SUCCESS: "これで {0} は有効になります!" +ENJOY_COREPROTECT: "{0} を楽しんでいますか?私たちのDiscordに参加しましょう!" FINISHING_CONVERSION: "データ変換を終了します。お待ちください..." -FINISHING_LOGGING: "データロギングの終了。お待ちください..." +FINISHING_LOGGING: "データの記録が終了します。お待ちください..." FIRST_VERSION: "初期DB:{0}" GLOBAL_LOOKUP: "グローバルルックアップを実行するために半径を指定しないでください。" GLOBAL_ROLLBACK: "つかいます \"{0}「グローバルに {ロールバック|復元}" @@ -47,14 +47,14 @@ HELP_INSPECT_3: "右クリックして、隣接する削除を表示します。 HELP_INSPECT_4: "ブロックを配置して、削除を確認します。" HELP_INSPECT_5: "ブロックを液体に入れて配置を確認します。" HELP_INSPECT_6: "右クリックしてチェストトランザクションを表示します。" -HELP_INSPECT_7: "ヒント:「/coi」だけを使用できます。" +HELP_INSPECT_7: "ヒント:「/co i」を使用して犯人を追跡できます" HELP_INSPECT_COMMAND: "ブロックインスペクターを切り替えます。" HELP_LIST: "すべてのコマンドのリストを表示します。" HELP_LOOKUP_1: "コマンドショートカット。" HELP_LOOKUP_2: "追加のページを表示します。" HELP_LOOKUP_COMMAND: "ルックアップブロックデータ。" HELP_NO_INFO: "コマンドの情報 \"{0}\" 見つかりません。" -HELP_PARAMETER: "見てください \"{0}詳細なパラメータ情報については、「」を参照してください。" +HELP_PARAMETER: "詳細なパラメータ情報については、「{0}」を参照してください。" HELP_PARAMS_1: "を実行します {ルックアップ|ロールバック|復元}。" HELP_PARAMS_2: "ユーザーを指定して {ルックアップ|ロールバック|復元}。" HELP_PARAMS_3: "時間を指定します {ルックアップ|ロールバック|復元}。" @@ -72,14 +72,14 @@ HELP_RESTORE_COMMAND: "ブロックデータを復元します。" HELP_ROLLBACK_COMMAND: "ブロックデータをロールバックします。" HELP_STATUS: "プラグインのステータスを表示します。" HELP_STATUS_COMMAND: "プラグインのステータスを表示します。" -HELP_TELEPORT: "テレポート。" +HELP_TELEPORT: "テレポートします。" HELP_TIME_1: "時間を指定します。" HELP_TIME_2: "例:[t:2w,5d,7h,2m,10s]、 [t:5d2h]、 [t:2.50h]" HELP_USER_1: "ユーザーを指定します。" HELP_USER_2: "例:[u:Notch]、 [u:Notch,#enderman]" -INCOMPATIBLE_ACTION: "「」{0}「そのアクションでは使用できません。" -INSPECTOR_ERROR: "すでに検査官 {有効|無効}。" -INSPECTOR_TOGGLED: "今インスペクター {有効|無効}。" +INCOMPATIBLE_ACTION: "そのアクションで「{0}」は使用できません。" +INSPECTOR_ERROR: "検査官モードが{有効|無効}です。" +INSPECTOR_TOGGLED: "検査官モードが{有効|無効}になりました。" INTEGRATION_ERROR: "できません {初期化|無効化} {0} ロギング。" INTEGRATION_SUCCESS: "{0} 正常にロギング {初期化|無効}。" INTEGRATION_VERSION: "無効 {0} バージョンが見つかりました。" @@ -88,22 +88,22 @@ INVALID_ACTION: "それは有効なアクションではありません。" INVALID_BRANCH_1: "プラグインのバージョンが無効です(ブランチが設定されていません)。" INVALID_BRANCH_2: "続行するには、プロジェクトブランチを「開発」に設定します。" INVALID_BRANCH_3: "開発コードを実行すると、データが破損する可能性があります。" -INVALID_CONTAINER: "最初に有効なコンテナを調べてください。" +INVALID_CONTAINER: "最初に有効な貨物ブロックを調べてください。" INVALID_DONATION_KEY: "寄付キーが無効です。" -INVALID_INCLUDE: "「」{0}\" は無効な値です。" +INVALID_INCLUDE: "「{0}」は無効な値です。" INVALID_INCLUDE_COMBO: "これは無効な型の組み合わせです。" INVALID_RADIUS: "有効な半径を入力してください。" INVALID_SELECTION: "{0} 選択が見つかりません。" -INVALID_USERNAME: "「」{0}\" は無効なユーザー名です。" +INVALID_USERNAME: "「{0}」は無効なユーザー名です。" INVALID_WORLD: "有効なワールドを指定してください。" LATEST_VERSION: "最新バージョン: {0}" LINK_DISCORD: "Discord: {0}" -LINK_DOWNLOAD: "ダウンロード:{0}" +LINK_DOWNLOAD: "ダウンロード: {0}" LINK_PATREON: "Patreon: {0}" -LINK_WIKI_BLOCK: "ブロック名:{0}" -LINK_WIKI_ENTITY: "エンティティ名:{0}" +LINK_WIKI_BLOCK: "ブロック名: {0}" +LINK_WIKI_ENTITY: "エンティティ名: {0}" LOGGING_ITEMS: "{0} ログに残されたアイテム。お待ちください..." -LOGGING_TIME_LIMIT: "ロギングの制限時間に達しました。データを破棄してシャットダウンします。" +LOGGING_TIME_LIMIT: "記録制限時間に達しました。データを破棄してシャットダウンします。" LOOKUP_BLOCK: "{0} {配置|壊れた} {1}。" LOOKUP_CONTAINER: "{0} {追加|削除} {1} {2}。" LOOKUP_HEADER: "{0} 結果" @@ -112,20 +112,20 @@ LOOKUP_ITEM: "{0} {拾った|落とした} {1} {2}。" LOOKUP_LOGIN: "{0} ログに記録されます {in|out}。" LOOKUP_PAGE: "ページ {0}" LOOKUP_PROJECTILE: "{0} {投げた|ショット} {1} {2}。" -LOOKUP_ROWS_FOUND: "{0} {行|行} 見つかった。" +LOOKUP_ROWS_FOUND: "{0} {行|行} 見つかりました。" LOOKUP_SEARCHING: "ルックアップ検索。お待ちください..." LOOKUP_STORAGE: "{0} {預け入れ|撤回} {1} {2}。" LOOKUP_TIME: "{0} 前に" -LOOKUP_USERNAME: "{0} としてログイン {1}。" +LOOKUP_USERNAME: "{1}が{0}としてログイン" MAXIMUM_RADIUS: "最大 {ルックアップ|ロールバック|復元} 半径は {0}。" MISSING_ACTION_USER: "そのアクションを使用するには、ユーザーを指定してください。" -MISSING_LOOKUP_TIME: "時間を指定してください {ルックアップ|ロールバック|復元}。" -MISSING_LOOKUP_USER: "ユーザーを指定するか、 {ブロック|半径}。" -MISSING_PARAMETERS: "使ってください \"{0}\" 。" +MISSING_LOOKUP_TIME: "時間を指定してください({ルックアップ|ロールバック|復元})" +MISSING_LOOKUP_USER: "ユーザーを指定するか、 {ブロック|半径}を指定してください。" +MISSING_PARAMETERS: "\"{0}\"のパラメーターは存在していません。" MISSING_ROLLBACK_RADIUS: "指定しませんでした {ロールバック|復元} 半径。" MISSING_ROLLBACK_USER: "指定しませんでした {ロールバック|復元} ユーザー。" MYSQL_UNAVAILABLE: "接続できません MySQL サーバ。" -NO_DATA: "でデータが見つかりません {0}。" +NO_DATA: "{0}でデータが見つかりません。" NO_DATA_LOCATION: "番号 {データ|トランザクション|相互作用|メッセージ} 見つかった。" NO_PERMISSION: "あなたにはそれをする許可がありません。" NO_RESULTS: "結果が見つかりません。" @@ -133,7 +133,7 @@ NO_RESULTS_PAGE: "番号 {結果|データ} そのページで見つかりまし NO_ROLLBACK: "番号 {保留中|前へ} ロールバック/復元が見つかりました。" PATCH_INTERRUPTED: "アップグレードが中断されました。再起動時に再試行します。" PATCH_OUTDATED_1: "古いデータベースをアップグレードできません {0}。" -PATCH_OUTDATED_2: "サポートされているバージョンでアップグレードしてください CoreProtect。" +PATCH_OUTDATED_2: "CoreProtectがサポートされているバージョンでアップグレードしてください。" PATCH_PROCESSING: "新しいデータを処理しています。お待ちください..." PATCH_SKIP_UPDATE: "スキップ {テーブル|インデックス} {更新|作成|削除} の上 {0}。" PATCH_STARTED: "実行する {0} アップグレード。お待ちください..." @@ -145,24 +145,24 @@ PREVIEW_CANCELLING: "プレビューをキャンセルしています..." PREVIEW_IN_GAME: "ゲーム内でのみロールバックをプレビューできます。" PREVIEW_TRANSACTION: "プレビューできません {コンテナ|在庫} トランザクション。" PURGE_ABORTED: "パージに失敗しました。データベースが破損している可能性があります。" -PURGE_ERROR: "処理できません {0} データ!" +PURGE_ERROR: "{0} のデータを処理できません" PURGE_FAILED: "パージに失敗しました。後でもう一度やり直してください。" PURGE_IN_PROGRESS: "進行中のパージ。後でもう一度やり直してください。" -PURGE_MINIMUM_TIME: "パージできるのは、より古いデータのみです。 {0} {日|時間}。" +PURGE_MINIMUM_TIME: "分離できるのは、より古いデータのみです。({0}{日|時間})" PURGE_NOTICE_1: "これには時間がかかる場合がありますのでご注意ください。" PURGE_NOTICE_2: "完了するまでサーバーを再起動しないでください。" PURGE_OPTIMIZING: "データベースの最適化。お待ちください..." -PURGE_PROCESSING: "処理 {0} データ..." +PURGE_PROCESSING: "{0} のデータを処理中..." PURGE_REPAIRING: "修復しようとしています。これには時間がかかる場合があります..." -PURGE_ROWS: "{0} {行|行} 削除されたデータの。" -PURGE_STARTED: "データの削除は \"で開始されました{0}\" 。" -PURGE_SUCCESS: "データのパージに成功しました。" +PURGE_ROWS: "{0}{行|行} のデータが削除されました。" +PURGE_STARTED: "データの削除は\"{0}\"で開始されました。" +PURGE_SUCCESS: "データの分離に成功しました。" RELOAD_STARTED: "構成の再読み込み-しばらくお待ちください。" RELOAD_SUCCESS: "構成が正常に再ロードされました。" ROLLBACK_ABORTED: "ロールバックまたは復元が中止されました。" ROLLBACK_CHUNKS_FOUND: "見つかった {0} {チャンク|チャンク} 変更します。" ROLLBACK_CHUNKS_MODIFIED: "変更 {0}/{1} {チャンク|チャンク}。" -ROLLBACK_COMPLETED: "{ロールバック|復元|プレビュー} 「のために完成{0}\" 。" +ROLLBACK_COMPLETED: "{ロールバック|復元|プレビュー} のために完成{0}\" 。" ROLLBACK_EXCLUDED_USERS: "除外 {ユーザー|ユーザー}: \"{0}\" 。" ROLLBACK_INCLUDE: "{含まれる|除外される} {ブロック|エンティティ|ターゲット} {タイプ|タイプ}: \"{0}\" 。" ROLLBACK_IN_PROGRESS: "ロールバック/復元はすでに進行中です。" @@ -172,14 +172,14 @@ ROLLBACK_RADIUS: "半径:{0} {ブロック|ブロック}。" ROLLBACK_SELECTION: "半径を「{0}\" 。" ROLLBACK_STARTED: "{ロールバック|復元|プレビュー} 「で始まった{0}\" 。" ROLLBACK_TIME: "時間範囲:{0}。" -ROLLBACK_WORLD_ACTION: "に制限 {世界|アクション} 「」{0}\" 。" +ROLLBACK_WORLD_ACTION: "{0}{世界|アクション}に制限があります。" SIGN_HEADER: "メッセージに署名する" STATUS_CONSUMER: "消費者: {0} {item|items} 順番待ち。" -STATUS_DATABASE: "データベース: 使用する {0}。" -STATUS_INTEGRATION: "{0}: 統合 {有効|無効}。" +STATUS_DATABASE: "データベース: 使用する {0}" +STATUS_INTEGRATION: "{0}: 統合 {有効|無効}" STATUS_LICENSE: "ライセンス: {0}" STATUS_VERSION: "バージョン: {0}" -TELEPORTED: "にテレポート {0}。" +TELEPORTED: "{0} にテレポート" TELEPORTED_SAFETY: "安全にテレポートしました。" TELEPORT_PLAYERS: "テレポートコマンドはプレイヤーだけが使用できます。" TIME_DAYS: "{0} {日|日}" @@ -189,13 +189,13 @@ TIME_SECONDS: "{0} {秒|秒}" TIME_WEEKS: "{0} {週|週}" UPDATE_ERROR: "更新の確認中にエラーが発生しました。" UPDATE_HEADER: "{0} アップデート" -UPDATE_NOTICE: "知らせ:{0} 現在利用できます。" +UPDATE_NOTICE: "お知らせ: {0} が現在利用できます。" UPGRADE_IN_PROGRESS: "アップグレードが進行中です。後でもう一度やり直してください。" USER_NOT_FOUND: "ユーザー \"{0}\" 見つかりません。" USER_OFFLINE: "ユーザー \"{0}\" はオンラインではありません。" -USING_MYSQL: "使用する MySQL データストレージ用。" -USING_SQLITE: "使用する SQLite データストレージ用。" -VALID_DONATION_KEY: "有効な寄付キー。" -VERSION_NOTICE: "バージョン {0} 現在利用できます。" +USING_MYSQL: "MySQL データストレージを使用します。" +USING_SQLITE: "SQLite データストレージを使用します。" +VALID_DONATION_KEY: "有効な寄付キーが必要です。" +VERSION_NOTICE: "バージョン {0} が現在利用できます。" VERSION_REQUIRED: "{0} {1} 以上が必要です。" -WORLD_NOT_FOUND: "世界 \"{0}\" 見つかりません。" \ No newline at end of file +WORLD_NOT_FOUND: "世界 \"{0}\" は見つかりませんでした。" From ad4b0ddf24addbe860ea0c593aab7da2a152cc9c Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 4 Nov 2024 13:59:04 -0700 Subject: [PATCH 52/60] Fixed NoSuchMethodError when killing entities on Spigot servers --- src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index 866d4a92..09f5cf06 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -45,7 +45,7 @@ public EntityType getEntityType(Material material) { @Override public Object getRegistryKey(Object value) { - return ((Keyed) value).getKey().asString(); + return ((Keyed) value).getKey().toString(); } @Override From 2780a9af278e0da9432600ba22c50ed9d4afdcf4 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 4 Nov 2024 14:31:00 -0700 Subject: [PATCH 53/60] Fixed NotSerializableException when sacrificing entities (fixes #666) --- .../coreprotect/listener/entity/EntityDeathListener.java | 2 +- .../java/net/coreprotect/utility/entity/EntityUtil.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index 8a9ac74c..0883812c 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -289,7 +289,7 @@ else if (entity instanceof Player) { if (attributeInstance != null) { List attributeData = new ArrayList<>(); List attributeModifiers = new ArrayList<>(); - attributeData.add(attributeInstance.getAttribute()); + attributeData.add(BukkitAdapter.ADAPTER.getRegistryKey(attributeInstance.getAttribute())); attributeData.add(attributeInstance.getBaseValue()); for (AttributeModifier modifier : attributeInstance.getModifiers()) { diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index 98f8fe7a..8d7b886a 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -166,7 +166,13 @@ else if (count == 1) { for (Object value : attributes) { @SuppressWarnings("unchecked") List attributeData = (List) value; - Attribute attribute = (Attribute) attributeData.get(0); + Attribute attribute = null; + if (attributeData.get(0) instanceof Attribute) { + attribute = (Attribute) attributeData.get(0); + } + else { + attribute = (Attribute) BukkitAdapter.ADAPTER.getRegistryValue((String) attributeData.get(0), Attribute.class); + } Double baseValue = (Double) attributeData.get(1); @SuppressWarnings("unchecked") List attributeModifiers = (List) attributeData.get(2); From 9958d372e32d270acbf90026ceb8b209dac50c0f Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 5 Nov 2024 10:17:55 -0700 Subject: [PATCH 54/60] Fixed IncompatibleClassChangeError when breaking paintings in 1.21.1 and earlier --- .../coreprotect/listener/entity/HangingBreakListener.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java b/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java index 93bf7b4c..be041a9e 100644 --- a/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java +++ b/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java @@ -72,7 +72,12 @@ else if (cause.equals(HangingBreakEvent.RemoveCause.OBSTRUCTION)) { material = Material.PAINTING; Painting painting = (Painting) entity; blockData = "FACING=" + painting.getFacing().name(); - itemData = Util.getArtId(painting.getArt().toString(), true); + try { + itemData = Util.getArtId(painting.getArt().toString(), true); + } + catch (IncompatibleClassChangeError e) { + // 1.21.2+ + } } if (!event.isCancelled() && Config.getConfig(blockEvent.getWorld()).NATURAL_BREAK) { From 011865de56125ac78e019f0f1932622ed10ef1cd Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 5 Nov 2024 10:34:13 -0700 Subject: [PATCH 55/60] Fixed IncompatibleClassChangeError on entity kills for MC 1.21.1 and earlier --- .../coreprotect/listener/entity/EntityDeathListener.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index 0883812c..a2c61fd2 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -10,6 +10,7 @@ import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Registry; import org.bukkit.World; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; @@ -64,6 +65,8 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.projectiles.ProjectileSource; +import com.google.common.collect.Lists; + import net.coreprotect.CoreProtect; import net.coreprotect.bukkit.BukkitAdapter; import net.coreprotect.config.Config; @@ -283,8 +286,7 @@ else if (entity instanceof Player) { if (entity instanceof Attributable) { Attributable attributable = entity; - - for (Attribute attribute : Attribute.values()) { + for (Attribute attribute : Lists.newArrayList(Registry.ATTRIBUTE)) { AttributeInstance attributeInstance = attributable.getAttribute(attribute); if (attributeInstance != null) { List attributeData = new ArrayList<>(); From 26545625851197215b0aa4b2ade672a8e650a4b8 Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 5 Nov 2024 11:06:33 -0700 Subject: [PATCH 56/60] Changed minimum supported MC version to 1.16 --- pom.xml | 2 +- .../net/coreprotect/bukkit/BukkitAdapter.java | 32 +++-- .../coreprotect/bukkit/BukkitInterface.java | 2 - .../net/coreprotect/bukkit/Bukkit_v1_16.java | 118 ------------------ .../net/coreprotect/bukkit/Bukkit_v1_17.java | 2 +- .../net/coreprotect/config/ConfigHandler.java | 2 +- .../listener/entity/EntityDeathListener.java | 12 +- .../net/coreprotect/model/BlockGroup.java | 30 ++--- .../net/coreprotect/paper/PaperAdapter.java | 4 +- .../net/coreprotect/paper/PaperHandler.java | 7 ++ .../net/coreprotect/paper/Paper_v1_16.java | 13 -- .../net/coreprotect/paper/Paper_v1_17.java | 2 +- .../net/coreprotect/spigot/SpigotAdapter.java | 4 +- .../net/coreprotect/spigot/SpigotHandler.java | 70 ++++++++++- .../net/coreprotect/spigot/Spigot_v1_16.java | 80 ------------ .../utility/entity/EntityUtil.java | 16 +++ 16 files changed, 145 insertions(+), 251 deletions(-) delete mode 100644 src/main/java/net/coreprotect/bukkit/Bukkit_v1_16.java delete mode 100644 src/main/java/net/coreprotect/paper/Paper_v1_16.java delete mode 100644 src/main/java/net/coreprotect/spigot/Spigot_v1_16.java diff --git a/pom.xml b/pom.xml index 66ffd9e3..d8d0b8ad 100755 --- a/pom.xml +++ b/pom.xml @@ -124,7 +124,7 @@ io.papermc.paper paper-api - 1.21-R0.1-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT provided diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index 8aac8499..33ffda12 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -13,6 +13,7 @@ import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; +import org.bukkit.block.data.FaceAttachable; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -49,10 +50,8 @@ public static void loadAdapter() { case BUKKIT_V1_13: case BUKKIT_V1_14: case BUKKIT_V1_15: - BukkitAdapter.ADAPTER = new BukkitAdapter(); - break; case BUKKIT_V1_16: - BukkitAdapter.ADAPTER = new Bukkit_v1_16(); + BukkitAdapter.ADAPTER = new BukkitAdapter(); break; case BUKKIT_V1_17: BukkitAdapter.ADAPTER = new Bukkit_v1_17(); @@ -105,18 +104,31 @@ public boolean setItemMeta(Material rowType, ItemStack itemstack, List(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT, Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH, Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS, Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN)); - BlockGroup.TRACK_BOTTOM = new HashSet<>(Arrays.asList(Material.WEEPING_VINES)); - BlockGroup.TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL, Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED, Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED, Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED, Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE, Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER, Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER, Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER, Material.SOUL_WALL_TORCH, Material.CRIMSON_WALL_SIGN, Material.WARPED_WALL_SIGN)); - BlockGroup.DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR, Material.CRIMSON_DOOR, Material.WARPED_DOOR)); - BlockGroup.BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON, Material.POLISHED_BLACKSTONE_BUTTON, Material.CRIMSON_BUTTON, Material.WARPED_BUTTON)); - BlockGroup.PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, Material.SPRUCE_PRESSURE_PLATE, Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE, Material.POLISHED_BLACKSTONE_PRESSURE_PLATE)); - BlockGroup.VINES = new HashSet<>(Arrays.asList(Material.VINE, Material.WEEPING_VINES, Material.TWISTING_VINES)); - BlockGroup.LIGHTABLES = new HashSet<>(Arrays.asList(Material.CAMPFIRE, Material.SOUL_CAMPFIRE)); - BlockGroup.FIRE = new HashSet<>(Arrays.asList(Material.FIRE, Material.SOUL_FIRE)); - BlockGroup.LANTERNS = new HashSet<>(Arrays.asList(Material.LANTERN, Material.SOUL_LANTERN)); - BlockGroup.SOUL_BLOCKS = new HashSet<>(Arrays.asList(Material.SOUL_SAND, Material.SOUL_SOIL)); - BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE, Material.LEVER, Material.REPEATER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST, Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE, Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE, Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER, Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); - BlockGroup.SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.LEVER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); - BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT, Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET)); - BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH)); - } - - @Override - public boolean getEntityMeta(LivingEntity entity, List info) { - if (entity instanceof Piglin) { - Piglin piglin = (Piglin) entity; - info.add(piglin.isBaby()); - } - else if (entity instanceof Zoglin) { - Zoglin zoglin = (Zoglin) entity; - info.add(zoglin.isBaby()); - } - else if (super.getEntityMeta(entity, info)) { - return true; - } - else { - return false; - } - - return true; - } - - @Override - public boolean setEntityMeta(Entity entity, Object value, int count) { - if (entity instanceof Piglin) { - Piglin piglin = (Piglin) entity; - if (count == 0) { - boolean set = (Boolean) value; - piglin.setBaby(set); - } - } - else if (entity instanceof Zoglin) { - Zoglin zoglin = (Zoglin) entity; - if (count == 0) { - boolean set = (Boolean) value; - zoglin.setBaby(set); - } - } - else if (super.setEntityMeta(entity, value, count)) { - return true; - } - else { - return false; - } - - return true; - } - - @Override - public boolean isAttached(Block block, Block scanBlock, BlockData blockData, int scanMin) { - if (blockData instanceof Directional && blockData instanceof FaceAttachable) { - Directional directional = (Directional) blockData; - FaceAttachable faceAttachable = (FaceAttachable) blockData; - - boolean scanButton = false; - switch (faceAttachable.getAttachedFace()) { - case WALL: - scanButton = (scanMin < 5 && scanBlock.getRelative(directional.getFacing().getOppositeFace()).getLocation().equals(block.getLocation())); - break; - case FLOOR: - scanButton = (scanMin == 5); - break; - case CEILING: - scanButton = (scanMin == 6); - break; - default: - break; - } - - return scanButton; - } - - return true; // unvalidated attachments default to true - } - - @Override - public boolean isWall(BlockData blockData) { - return (blockData instanceof Wall); - } - -} diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java index 3d3f9ea1..8dd12f4a 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java @@ -27,7 +27,7 @@ import net.coreprotect.model.BlockGroup; import net.coreprotect.utility.Util; -public class Bukkit_v1_17 extends Bukkit_v1_16 implements BukkitInterface { +public class Bukkit_v1_17 extends BukkitAdapter implements BukkitInterface { public Bukkit_v1_17() { BlockGroup.TRACK_ANY = new HashSet<>(Arrays.asList(Material.PISTON_HEAD, Material.LEVER, Material.BELL, Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER, Material.GLOW_LICHEN)); diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 77af69b5..752bf665 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -45,7 +45,7 @@ public class ConfigHandler extends Queue { public static final String EDITION_NAME = Util.getPluginName(); public static final String COMMUNITY_EDITION = "Community Edition"; public static final String JAVA_VERSION = "11.0"; - public static final String MINECRAFT_VERSION = "1.15"; + public static final String MINECRAFT_VERSION = "1.16"; public static final String LATEST_VERSION = "1.21"; public static String path = "plugins/CoreProtect/"; public static String sqlite = "database.db"; diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index a2c61fd2..e787e5e1 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -39,6 +39,7 @@ import org.bukkit.entity.Parrot; import org.bukkit.entity.Phantom; import org.bukkit.entity.Pig; +import org.bukkit.entity.Piglin; import org.bukkit.entity.Player; import org.bukkit.entity.Raider; import org.bukkit.entity.Sheep; @@ -50,6 +51,7 @@ import org.bukkit.entity.TropicalFish; import org.bukkit.entity.Villager; import org.bukkit.entity.Wolf; +import org.bukkit.entity.Zoglin; import org.bukkit.entity.Zombie; import org.bukkit.entity.ZombieVillager; import org.bukkit.event.EventHandler; @@ -509,12 +511,20 @@ else if (entity instanceof ChestedHorse) { } } } - if (entity instanceof Bee) { + else if (entity instanceof Bee) { Bee bee = (Bee) entity; info.add(bee.getAnger()); info.add(bee.hasNectar()); info.add(bee.hasStung()); } + else if (entity instanceof Piglin) { + Piglin piglin = (Piglin) entity; + info.add(piglin.isBaby()); + } + else if (entity instanceof Zoglin) { + Zoglin zoglin = (Zoglin) entity; + info.add(zoglin.isBaby()); + } else { BukkitAdapter.ADAPTER.getEntityMeta(entity, info); } diff --git a/src/main/java/net/coreprotect/model/BlockGroup.java b/src/main/java/net/coreprotect/model/BlockGroup.java index e53635b6..88056c05 100644 --- a/src/main/java/net/coreprotect/model/BlockGroup.java +++ b/src/main/java/net/coreprotect/model/BlockGroup.java @@ -11,25 +11,25 @@ public final class BlockGroup { public static Set TRACK_ANY = new HashSet<>(Arrays.asList(Material.PISTON_HEAD, Material.LEVER, Material.BELL)); public static Set TRACK_TOP_BOTTOM = new HashSet<>(Arrays.asList()); - public static Set TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT, Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP)); - public static Set TRACK_BOTTOM = new HashSet<>(Arrays.asList()); - public static Set TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL, Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED, Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED, Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED, Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE, Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER, Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER, Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER)); + public static Set TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT, Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH, Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS, Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN)); + public static Set TRACK_BOTTOM = new HashSet<>(Arrays.asList(Material.WEEPING_VINES)); + public static Set TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL, Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED, Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED, Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED, Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE, Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER, Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER, Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER, Material.SOUL_WALL_TORCH, Material.CRIMSON_WALL_SIGN, Material.WARPED_WALL_SIGN)); public static Set SHULKER_BOXES = new HashSet<>(Arrays.asList(Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX)); public static Set CONTAINERS = new HashSet<>(Arrays.asList(Material.JUKEBOX, Material.DISPENSER, Material.CHEST, Material.FURNACE, Material.BREWING_STAND, Material.TRAPPED_CHEST, Material.HOPPER, Material.DROPPER, Material.ARMOR_STAND, Material.ITEM_FRAME, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.SMOKER, Material.LECTERN)); - public static Set DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR)); - public static Set BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON)); - public static Set PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, Material.SPRUCE_PRESSURE_PLATE)); - public static Set VINES = new HashSet<>(Arrays.asList(Material.VINE)); + public static Set DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR, Material.CRIMSON_DOOR, Material.WARPED_DOOR)); + public static Set BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON, Material.POLISHED_BLACKSTONE_BUTTON, Material.CRIMSON_BUTTON, Material.WARPED_BUTTON)); + public static Set PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, Material.SPRUCE_PRESSURE_PLATE, Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE, Material.POLISHED_BLACKSTONE_PRESSURE_PLATE)); + public static Set VINES = new HashSet<>(Arrays.asList(Material.VINE, Material.WEEPING_VINES, Material.TWISTING_VINES)); public static Set AMETHYST = new HashSet<>(Arrays.asList()); - public static Set LIGHTABLES = new HashSet<>(Arrays.asList(Material.CAMPFIRE)); + public static Set LIGHTABLES = new HashSet<>(Arrays.asList(Material.CAMPFIRE, Material.SOUL_CAMPFIRE)); public static Set CANDLES = new HashSet<>(Arrays.asList()); - public static Set FIRE = new HashSet<>(Arrays.asList(Material.FIRE)); - public static Set LANTERNS = new HashSet<>(Arrays.asList(Material.LANTERN)); - public static Set SOUL_BLOCKS = new HashSet<>(Arrays.asList(Material.SOUL_SAND)); + public static Set FIRE = new HashSet<>(Arrays.asList(Material.FIRE, Material.SOUL_FIRE)); + public static Set LANTERNS = new HashSet<>(Arrays.asList(Material.LANTERN, Material.SOUL_LANTERN)); + public static Set SOUL_BLOCKS = new HashSet<>(Arrays.asList(Material.SOUL_SAND, Material.SOUL_SOIL)); public static Set DIRECTIONAL_BLOCKS = new HashSet<>(Arrays.asList(Material.STICKY_PISTON, Material.PISTON, Material.REPEATER, Material.SKELETON_SKULL, Material.SKELETON_WALL_SKULL, Material.WITHER_SKELETON_SKULL, Material.WITHER_SKELETON_WALL_SKULL, Material.ZOMBIE_HEAD, Material.ZOMBIE_WALL_HEAD, Material.PLAYER_HEAD, Material.PLAYER_WALL_HEAD, Material.CREEPER_HEAD, Material.CREEPER_WALL_HEAD, Material.DRAGON_HEAD, Material.DRAGON_WALL_HEAD, Material.COMPARATOR)); - public static Set INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE, Material.LEVER, Material.REPEATER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST, Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE, Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE, Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER)); - public static Set SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.LEVER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE)); - public static Set UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, Material.ACTIVATOR_RAIL)); + public static Set INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE, Material.LEVER, Material.REPEATER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST, Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE, Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE, Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER, Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); + public static Set SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.LEVER, Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); + public static Set UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT, Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET)); public static Set NATURAL_BLOCKS = new HashSet<>(Arrays.asList(Material.STONE, Material.GOLD_ORE, Material.IRON_ORE, Material.COAL_ORE, Material.LAPIS_ORE, Material.SANDSTONE, Material.COBWEB, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.OBSIDIAN, Material.DIAMOND_ORE, Material.WHEAT, Material.REDSTONE_ORE, Material.SNOW, Material.ICE, Material.CACTUS, Material.CLAY, Material.SUGAR_CANE, Material.PUMPKIN, Material.NETHERRACK, Material.SOUL_SAND, Material.MELON, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.MYCELIUM, Material.LILY_PAD, Material.NETHER_WART, Material.END_STONE, Material.EMERALD_ORE, Material.CARROT, Material.POTATO, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH)); public static Set SCULK = new HashSet<>(Arrays.asList()); @@ -41,7 +41,7 @@ public final class BlockGroup { // These are blocks that an item frame or painting can't be attached to. // Same as non_solid_entity_blocks? >>Perform testing<< - public static Set NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT)); + public static Set NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH)); public static void initialize() { Material shortGrass = Material.getMaterial("SHORT_GRASS"); diff --git a/src/main/java/net/coreprotect/paper/PaperAdapter.java b/src/main/java/net/coreprotect/paper/PaperAdapter.java index 935a8e7f..e9d00311 100644 --- a/src/main/java/net/coreprotect/paper/PaperAdapter.java +++ b/src/main/java/net/coreprotect/paper/PaperAdapter.java @@ -41,10 +41,8 @@ public static void loadAdapter() { case PAPER_V1_13: case PAPER_V1_14: case PAPER_V1_15: - PaperAdapter.ADAPTER = new PaperHandler(); - break; case PAPER_V1_16: - PaperAdapter.ADAPTER = new Paper_v1_16(); + PaperAdapter.ADAPTER = new PaperHandler(); break; case PAPER_V1_17: case PAPER_V1_18: diff --git a/src/main/java/net/coreprotect/paper/PaperHandler.java b/src/main/java/net/coreprotect/paper/PaperHandler.java index 28787211..4516896c 100644 --- a/src/main/java/net/coreprotect/paper/PaperHandler.java +++ b/src/main/java/net/coreprotect/paper/PaperHandler.java @@ -3,6 +3,8 @@ import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.entity.Entity; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; public class PaperHandler extends PaperAdapter implements PaperInterface { @@ -16,4 +18,9 @@ public void teleportAsync(Entity entity, Location location) { entity.teleportAsync(location); } + @Override + public InventoryHolder getHolder(Inventory holder, boolean useSnapshot) { + return holder.getHolder(useSnapshot); + } + } diff --git a/src/main/java/net/coreprotect/paper/Paper_v1_16.java b/src/main/java/net/coreprotect/paper/Paper_v1_16.java deleted file mode 100644 index 6bbeed51..00000000 --- a/src/main/java/net/coreprotect/paper/Paper_v1_16.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.coreprotect.paper; - -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; - -public class Paper_v1_16 extends PaperHandler implements PaperInterface { - - @Override - public InventoryHolder getHolder(Inventory holder, boolean useSnapshot) { - return holder.getHolder(useSnapshot); - } - -} diff --git a/src/main/java/net/coreprotect/paper/Paper_v1_17.java b/src/main/java/net/coreprotect/paper/Paper_v1_17.java index 3489dbd6..126465d5 100644 --- a/src/main/java/net/coreprotect/paper/Paper_v1_17.java +++ b/src/main/java/net/coreprotect/paper/Paper_v1_17.java @@ -4,7 +4,7 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -public class Paper_v1_17 extends Paper_v1_16 implements PaperInterface { +public class Paper_v1_17 extends PaperHandler implements PaperInterface { @Override public String getLine(Sign sign, int line) { diff --git a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java index 04602fac..669bc0b6 100644 --- a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java +++ b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java @@ -36,8 +36,6 @@ public static void loadAdapter() { case SPIGOT_V1_13: case SPIGOT_V1_14: case SPIGOT_V1_15: - SpigotAdapter.ADAPTER = new SpigotHandler(); - break; case SPIGOT_V1_16: case SPIGOT_V1_17: case SPIGOT_V1_18: @@ -45,7 +43,7 @@ public static void loadAdapter() { case SPIGOT_V1_20: case SPIGOT_V1_21: default: - SpigotAdapter.ADAPTER = new Spigot_v1_16(); + SpigotAdapter.ADAPTER = new SpigotHandler(); break; } } diff --git a/src/main/java/net/coreprotect/spigot/SpigotHandler.java b/src/main/java/net/coreprotect/spigot/SpigotHandler.java index 1ed6c039..b63661f7 100644 --- a/src/main/java/net/coreprotect/spigot/SpigotHandler.java +++ b/src/main/java/net/coreprotect/spigot/SpigotHandler.java @@ -5,19 +5,85 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; +import net.coreprotect.config.Config; import net.coreprotect.utility.Chat; +import net.coreprotect.utility.Color; import net.coreprotect.utility.Util; import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.hover.content.Text; public class SpigotHandler extends SpigotAdapter implements SpigotInterface { - public static ChatColor DARK_AQUA = ChatColor.DARK_AQUA; + public static ChatColor DARK_AQUA = ChatColor.of("#31b0e8"); + + public SpigotHandler() { + Color.DARK_AQUA = SpigotHandler.DARK_AQUA.toString(); + } @Override public void addHoverComponent(Object message, String[] data) { - ((TextComponent) message).addExtra(data[2]); + try { + if (Config.getGlobal().HOVER_EVENTS) { + String tooltipText = data[1]; // text displayed inside tooltip + TextComponent component = new TextComponent(TextComponent.fromLegacyText(data[2])); + // BaseComponent[] displayComponent = TextComponent.fromLegacyText(processComponent(tooltipText)); + + if (tooltipText.contains(Color.MAGIC)) { + tooltipText = tooltipText.replace(Color.MAGIC, ""); + + // to-do + /* + ComponentBuilder formattedComponent = new ComponentBuilder(); + StringBuilder messageTest = new StringBuilder(); + String colorChar = String.valueOf(ChatColor.COLOR_CHAR); + boolean isObfuscated = false; + + String[] tooltip = tooltipText.split(colorChar); + for (String splitText : tooltip) { + boolean setObfuscated = splitText.startsWith("k"); + splitText = setObfuscated ? splitText.substring(1) : (splitText.length() > 0 ? colorChar : "") + splitText; + if ((setObfuscated && !isObfuscated) || (!setObfuscated && isObfuscated)) { + formattedComponent.append(TextComponent.fromLegacyText(processComponent(messageTest.toString()))); + formattedComponent.obfuscated(false); // setObfuscated + formattedComponent.append(TextComponent.fromLegacyText(processComponent(splitText))); + messageTest.setLength(0); + isObfuscated = !isObfuscated; + } + else { + messageTest.append(splitText); + } + } + + if (messageTest.length() > 0) { + formattedComponent.append(TextComponent.fromLegacyText(processComponent(messageTest.toString()))); + } + + displayComponent = formattedComponent.create(); + */ + } + + BaseComponent[] displayComponent = TextComponent.fromLegacyText(processComponent(tooltipText)); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(displayComponent))); + ((TextComponent) message).addExtra(component); + } + else { + super.addHoverComponent(message, data); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void setHoverEvent(Object component, String text) { + if (Config.getGlobal().HOVER_EVENTS) { + ((TextComponent) component).setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(TextComponent.fromLegacyText(text)))); + } } @Override diff --git a/src/main/java/net/coreprotect/spigot/Spigot_v1_16.java b/src/main/java/net/coreprotect/spigot/Spigot_v1_16.java deleted file mode 100644 index d45c967d..00000000 --- a/src/main/java/net/coreprotect/spigot/Spigot_v1_16.java +++ /dev/null @@ -1,80 +0,0 @@ -package net.coreprotect.spigot; - -import net.coreprotect.config.Config; -import net.coreprotect.utility.Color; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.hover.content.Text; - -public class Spigot_v1_16 extends SpigotHandler implements SpigotInterface { - - public Spigot_v1_16() { - SpigotHandler.DARK_AQUA = ChatColor.of("#31b0e8"); - Color.DARK_AQUA = SpigotHandler.DARK_AQUA.toString(); - } - - @Override - public void addHoverComponent(Object message, String[] data) { - try { - if (Config.getGlobal().HOVER_EVENTS) { - String tooltipText = data[1]; // text displayed inside tooltip - TextComponent component = new TextComponent(TextComponent.fromLegacyText(data[2])); - // BaseComponent[] displayComponent = TextComponent.fromLegacyText(processComponent(tooltipText)); - - if (tooltipText.contains(Color.MAGIC)) { - tooltipText = tooltipText.replace(Color.MAGIC, ""); - - // to-do - /* - ComponentBuilder formattedComponent = new ComponentBuilder(); - StringBuilder messageTest = new StringBuilder(); - String colorChar = String.valueOf(ChatColor.COLOR_CHAR); - boolean isObfuscated = false; - - String[] tooltip = tooltipText.split(colorChar); - for (String splitText : tooltip) { - boolean setObfuscated = splitText.startsWith("k"); - splitText = setObfuscated ? splitText.substring(1) : (splitText.length() > 0 ? colorChar : "") + splitText; - if ((setObfuscated && !isObfuscated) || (!setObfuscated && isObfuscated)) { - formattedComponent.append(TextComponent.fromLegacyText(processComponent(messageTest.toString()))); - formattedComponent.obfuscated(false); // setObfuscated - formattedComponent.append(TextComponent.fromLegacyText(processComponent(splitText))); - messageTest.setLength(0); - isObfuscated = !isObfuscated; - } - else { - messageTest.append(splitText); - } - } - - if (messageTest.length() > 0) { - formattedComponent.append(TextComponent.fromLegacyText(processComponent(messageTest.toString()))); - } - - displayComponent = formattedComponent.create(); - */ - } - - BaseComponent[] displayComponent = TextComponent.fromLegacyText(processComponent(tooltipText)); - component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(displayComponent))); - ((TextComponent) message).addExtra(component); - } - else { - super.addHoverComponent(message, data); - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void setHoverEvent(Object component, String text) { - if (Config.getGlobal().HOVER_EVENTS) { - ((TextComponent) component).setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(TextComponent.fromLegacyText(text)))); - } - } - -} diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index 8d7b886a..644bca03 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -37,6 +37,7 @@ import org.bukkit.entity.Parrot.Variant; import org.bukkit.entity.Phantom; import org.bukkit.entity.Pig; +import org.bukkit.entity.Piglin; import org.bukkit.entity.Player; import org.bukkit.entity.Raider; import org.bukkit.entity.Sheep; @@ -48,6 +49,7 @@ import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; import org.bukkit.entity.Wolf; +import org.bukkit.entity.Zoglin; import org.bukkit.entity.Zombie; import org.bukkit.entity.ZombieVillager; import org.bukkit.inventory.ItemStack; @@ -567,6 +569,20 @@ else if (count == 2) { bee.setHasStung(set); } } + else if (entity instanceof Piglin) { + Piglin piglin = (Piglin) entity; + if (count == 0) { + boolean set = (Boolean) value; + piglin.setBaby(set); + } + } + else if (entity instanceof Zoglin) { + Zoglin zoglin = (Zoglin) entity; + if (count == 0) { + boolean set = (Boolean) value; + zoglin.setBaby(set); + } + } else { BukkitAdapter.ADAPTER.setEntityMeta(entity, value, count); } From 65705508c5265f5e1bed12ece342a15bb2af8ded Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 5 Nov 2024 11:56:57 -0700 Subject: [PATCH 57/60] Build against 1.21.1 to resolve IncompatibleClassChangeError (upstream issue) --- pom.xml | 2 +- .../coreprotect/listener/entity/HangingBreakListener.java | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index d8d0b8ad..13896ad0 100755 --- a/pom.xml +++ b/pom.xml @@ -124,7 +124,7 @@ io.papermc.paper paper-api - 1.21.3-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided diff --git a/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java b/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java index be041a9e..93bf7b4c 100644 --- a/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java +++ b/src/main/java/net/coreprotect/listener/entity/HangingBreakListener.java @@ -72,12 +72,7 @@ else if (cause.equals(HangingBreakEvent.RemoveCause.OBSTRUCTION)) { material = Material.PAINTING; Painting painting = (Painting) entity; blockData = "FACING=" + painting.getFacing().name(); - try { - itemData = Util.getArtId(painting.getArt().toString(), true); - } - catch (IncompatibleClassChangeError e) { - // 1.21.2+ - } + itemData = Util.getArtId(painting.getArt().toString(), true); } if (!event.isCancelled() && Config.getConfig(blockEvent.getWorld()).NATURAL_BREAK) { From e5ec7ede72f1c37930a24dc30a6a17da06f18145 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 28 Nov 2024 19:41:52 -0700 Subject: [PATCH 58/60] Disable processor information when running on Android --- src/main/java/net/coreprotect/utility/Util.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index 80005a2d..c6fdda66 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -127,6 +127,9 @@ public static CentralProcessor getProcessorInfo() { if (System.getProperty("os.name").startsWith("Windows") && !System.getProperty("sun.arch.data.model").equals("64")) { Class.forName("com.sun.jna.platform.win32.Win32Exception"); } + else if (System.getProperty("os.name").toLowerCase().contains("android") || System.getProperty("java.runtime.name").toLowerCase().contains("android")) { + return null; + } Configurator.setLevel("oshi.hardware.common.AbstractCentralProcessor", Level.OFF); SystemInfo systemInfo = new SystemInfo(); result = systemInfo.getHardware().getProcessor(); From f729c8a1262a1be095fc95b5865306e01041e7f3 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 5 Dec 2024 17:01:57 -0700 Subject: [PATCH 59/60] Fixed NullPointerException when breaking/placing certain skulls on Paper servers (fixes #643) --- src/main/java/net/coreprotect/paper/Paper_v1_20.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/paper/Paper_v1_20.java b/src/main/java/net/coreprotect/paper/Paper_v1_20.java index 048c96a9..703ca973 100644 --- a/src/main/java/net/coreprotect/paper/Paper_v1_20.java +++ b/src/main/java/net/coreprotect/paper/Paper_v1_20.java @@ -34,7 +34,7 @@ public String getSkullOwner(Skull skull) { if (skull.getPlayerProfile().getId() != null) { owner = skull.getPlayerProfile().getId().toString(); } - else if (Config.getGlobal().MYSQL && owner.length() > 255) { + else if (Config.getGlobal().MYSQL && owner != null && owner.length() > 255) { return owner.substring(0, 255); } From b3db65d07d129e77f13b433e4d29729d4a971651 Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 9 Dec 2024 16:37:29 -0700 Subject: [PATCH 60/60] Fixed NotSerializableException when logging items containing attribute data --- .../coreprotect/database/rollback/RollbackUtil.java | 13 ++++++++++--- .../utility/serialize/ItemMetaHandler.java | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java b/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java index 921a2164..b7ed158b 100644 --- a/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java +++ b/src/main/java/net/coreprotect/database/rollback/RollbackUtil.java @@ -346,10 +346,17 @@ else if (mapData.get("modifiers") != null) { List modifiers = (List) mapData.get("modifiers"); for (Object item : modifiers) { - Map> modifiersMap = (Map>) item; - for (Map.Entry> entry : modifiersMap.entrySet()) { + Map> modifiersMap = (Map>) item; + for (Map.Entry> entry : modifiersMap.entrySet()) { try { - Attribute attribute = entry.getKey(); + Attribute attribute = null; + if (entry.getKey() instanceof Attribute) { + attribute = (Attribute) entry.getKey(); + } + else { + attribute = (Attribute) BukkitAdapter.ADAPTER.getRegistryValue((String) entry.getKey(), Attribute.class); + } + AttributeModifier modifier = AttributeModifier.deserialize(entry.getValue()); itemMeta.addAttributeModifier(attribute, modifier); } diff --git a/src/main/java/net/coreprotect/utility/serialize/ItemMetaHandler.java b/src/main/java/net/coreprotect/utility/serialize/ItemMetaHandler.java index f3e6904f..5f7715b1 100644 --- a/src/main/java/net/coreprotect/utility/serialize/ItemMetaHandler.java +++ b/src/main/java/net/coreprotect/utility/serialize/ItemMetaHandler.java @@ -125,12 +125,12 @@ public static List>> serialize(ItemStack item, Material if (itemMeta.hasAttributeModifiers()) { for (Map.Entry entry : itemMeta.getAttributeModifiers().entries()) { - Map> attributeList = new HashMap<>(); + Map> attributeList = new HashMap<>(); Attribute attribute = entry.getKey(); AttributeModifier modifier = entry.getValue(); itemMeta.removeAttributeModifier(attribute, modifier); - attributeList.put(attribute, modifier.serialize()); + attributeList.put(BukkitAdapter.ADAPTER.getRegistryKey(attribute), modifier.serialize()); modifiers.add(attributeList); } }