9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-19 14:59:32 +00:00

Fix #609 & #612, add maxNbt in litematics, improve protocol invoker (#611)

* Fix #609, add maxNbt in litematics, improve protocol invoker

* Add long validator

* Go away inf check

* Fix #612
This commit is contained in:
Lumine1909
2025-07-25 07:18:45 -07:00
committed by GitHub
parent 357a03dfe5
commit 46cccfc39c
6 changed files with 97 additions and 56 deletions

View File

@@ -11,25 +11,38 @@ import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager;
import org.jetbrains.annotations.NotNull;
import org.leavesmc.leaves.bot.BotCommand;
import org.leavesmc.leaves.bot.ServerBot;
import org.leavesmc.leaves.bot.agent.Actions;
import org.leavesmc.leaves.command.LeavesCommand;
import org.leavesmc.leaves.config.ConfigValidatorImpl.BooleanConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.DoubleConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.EnumConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.IntConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.ListConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.LongConfigValidator;
import org.leavesmc.leaves.config.ConfigValidatorImpl.StringConfigValidator;
import org.leavesmc.leaves.config.GlobalConfigManager;
import org.leavesmc.leaves.config.annotations.GlobalConfig;
import org.leavesmc.leaves.config.annotations.GlobalConfigCategory;
import org.leavesmc.leaves.config.annotations.RemovedConfig;
import org.leavesmc.leaves.profile.LeavesMinecraftSessionService;
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRule;
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRules;
import org.leavesmc.leaves.protocol.PcaSyncProtocol;
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeature;
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeatureSet;
import org.leavesmc.leaves.protocol.rei.REIServerProtocol;
import org.leavesmc.leaves.protocol.servux.logger.DataLogger;
import org.leavesmc.leaves.protocol.syncmatica.SyncmaticaProtocol;
import org.leavesmc.leaves.region.IRegionFileFactory;
import org.leavesmc.leaves.region.RegionFileFormat;
import org.leavesmc.leaves.region.linear.LinearVersion;
import org.leavesmc.leaves.util.LeavesUpdateHelper;
import org.leavesmc.leaves.util.MathUtils;
import org.leavesmc.leaves.util.McTechnicalModeHelper;
import org.leavesmc.leaves.util.ServerI18nUtil;
import org.leavesmc.leaves.util.VillagerInfiniteDiscountHelper;
import java.io.File;
import java.io.IOException;
@@ -134,8 +147,8 @@ public final class LeavesConfig {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
if (value) {
registerCommand("bot", new org.leavesmc.leaves.bot.BotCommand());
org.leavesmc.leaves.bot.agent.Actions.registerAll();
registerCommand("bot", new BotCommand());
Actions.registerAll();
} else {
unregisterCommand("bot");
}
@@ -274,7 +287,7 @@ public final class LeavesConfig {
private static class VillagerInfiniteDiscountsValidator extends BooleanConfigValidator {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
org.leavesmc.leaves.util.VillagerInfiniteDiscountHelper.doVillagerInfiniteDiscount(value);
VillagerInfiniteDiscountHelper.doVillagerInfiniteDiscount(value);
}
}
@@ -509,7 +522,7 @@ public final class LeavesConfig {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
if (value) {
org.leavesmc.leaves.util.McTechnicalModeHelper.doMcTechnicalMode();
McTechnicalModeHelper.doMcTechnicalMode();
}
}
}
@@ -829,7 +842,7 @@ public final class LeavesConfig {
public static class SyncmaticaValidator extends BooleanConfigValidator {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
org.leavesmc.leaves.protocol.syncmatica.SyncmaticaProtocol.init(value);
SyncmaticaProtocol.init(value);
}
}
@@ -852,7 +865,7 @@ public final class LeavesConfig {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
if (old != null && old != value) {
org.leavesmc.leaves.protocol.PcaSyncProtocol.onConfigModify(value);
PcaSyncProtocol.onConfigModify(value);
}
}
}
@@ -904,19 +917,39 @@ public final class LeavesConfig {
@GlobalConfig("hud-metadata-protocol-share-seed")
public boolean hudMetadataShareSeed = true;
@GlobalConfig(value = "litematics-protocol", validator = LitematicsProtocolValidator.class)
public boolean litematicsProtocol = false;
public LitematicsConfig litematics = new LitematicsConfig();
public static class LitematicsProtocolValidator extends BooleanConfigValidator {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
PluginManager pluginManager = MinecraftServer.getServer().server.getPluginManager();
if (value) {
if (pluginManager.getPermission("leaves.protocol.litematics") == null) {
pluginManager.addPermission(new Permission("leaves.protocol.litematics", PermissionDefault.OP));
@GlobalConfigCategory("litematics")
public static class LitematicsConfig {
@RemovedConfig(name = "litematics-protocol", category = {"protocol", "servux"}, transform = true)
@GlobalConfig(value = "enable", validator = LitematicsProtocolValidator.class)
public boolean enable = false;
@GlobalConfig(value = "max-nbt-size", validator = MaxNbtSizeValidator.class)
public long maxNbtSize = 2097152;
public static class MaxNbtSizeValidator extends LongConfigValidator {
@Override
public void verify(Long old, Long value) throws IllegalArgumentException {
if (value <= 0) {
throw new IllegalArgumentException("Max nbt size can not be <= 0!");
}
}
}
public static class LitematicsProtocolValidator extends BooleanConfigValidator {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
PluginManager pluginManager = MinecraftServer.getServer().server.getPluginManager();
if (value) {
if (pluginManager.getPermission("leaves.protocol.litematics") == null) {
pluginManager.addPermission(new Permission("leaves.protocol.litematics", PermissionDefault.OP));
}
} else {
pluginManager.removePermission("leaves.protocol.litematics");
}
} else {
pluginManager.removePermission("leaves.protocol.litematics");
}
}
}
@@ -968,7 +1001,7 @@ public final class LeavesConfig {
@Override
public void verify(Boolean old, Boolean value) throws IllegalArgumentException {
if (old != value && value != null) {
org.leavesmc.leaves.protocol.rei.REIServerProtocol.onConfigModify(value);
REIServerProtocol.onConfigModify(value);
}
}
}
@@ -999,7 +1032,7 @@ public final class LeavesConfig {
@Override
public void runAfterLoader(Boolean value, boolean reload) {
if (!reload) {
org.leavesmc.leaves.util.LeavesUpdateHelper.init();
LeavesUpdateHelper.init();
if (value) {
LeavesLogger.LOGGER.warning("Auto-Update is not completely safe. Enabling it may cause data security problems!");
}
@@ -1052,7 +1085,7 @@ public final class LeavesConfig {
public static class ExtraYggdrasilUrlsValidator extends ListConfigValidator.STRING {
@Override
public void verify(List<String> old, List<String> value) throws IllegalArgumentException {
org.leavesmc.leaves.profile.LeavesMinecraftSessionService.initExtraYggdrasilList(value);
LeavesMinecraftSessionService.initExtraYggdrasilList(value);
}
}
}
@@ -1075,8 +1108,8 @@ public final class LeavesConfig {
@Override
public void verify(String old, String value) throws IllegalArgumentException {
if (!org.leavesmc.leaves.util.ServerI18nUtil.finishPreload ||
!org.leavesmc.leaves.util.ServerI18nUtil.tryAppendLanguages(supportLang)) {
if (!ServerI18nUtil.finishPreload ||
!ServerI18nUtil.tryAppendLanguages(supportLang)) {
return;
}
if (!supportLang.contains(value)) {
@@ -1109,12 +1142,12 @@ public final class LeavesConfig {
public static class RegionConfig {
@GlobalConfig(value = "format", lock = true, validator = RegionFormatValidator.class)
public org.leavesmc.leaves.region.RegionFileFormat format = org.leavesmc.leaves.region.RegionFileFormat.ANVIL;
public RegionFileFormat format = RegionFileFormat.ANVIL;
private static class RegionFormatValidator extends EnumConfigValidator<org.leavesmc.leaves.region.RegionFileFormat> {
private static class RegionFormatValidator extends EnumConfigValidator<RegionFileFormat> {
@Override
public void verify(RegionFileFormat old, RegionFileFormat value) throws IllegalArgumentException {
org.leavesmc.leaves.region.IRegionFileFactory.initFirstRegion(value);
IRegionFileFactory.initFirstRegion(value);
}
}
@@ -1124,7 +1157,7 @@ public final class LeavesConfig {
public static class LinearConfig {
@GlobalConfig(value = "version", lock = true)
public org.leavesmc.leaves.region.linear.LinearVersion version = org.leavesmc.leaves.region.linear.LinearVersion.V2;
public LinearVersion version = LinearVersion.V2;
@GlobalConfig(value = "flush-max-threads", lock = true)
public int flushThreads = 6;

View File

@@ -21,6 +21,9 @@ public final class AutoConfigValidator implements ConfigValidator<Object> {
BASE_VALIDATOR.put(Integer.class, ConfigValidatorImpl.IntConfigValidator::new);
BASE_VALIDATOR.put(int.class, ConfigValidatorImpl.IntConfigValidator::new);
BASE_VALIDATOR.put(Long.class, ConfigValidatorImpl.LongConfigValidator::new);
BASE_VALIDATOR.put(long.class, ConfigValidatorImpl.LongConfigValidator::new);
BASE_VALIDATOR.put(Double.class, ConfigValidatorImpl.DoubleConfigValidator::new);
BASE_VALIDATOR.put(double.class, ConfigValidatorImpl.DoubleConfigValidator::new);

View File

@@ -31,6 +31,13 @@ public abstract class ConfigValidatorImpl<E> implements ConfigValidator<E> {
}
}
public static class LongConfigValidator extends ConfigValidatorImpl<Long> {
@Override
public Long stringConvert(String value) throws IllegalArgumentException {
return Long.parseLong(value);
}
}
public static class StringConfigValidator extends ConfigValidatorImpl<String> {
@Override
public String stringConvert(String value) throws IllegalArgumentException {

View File

@@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.leavesmc.leaves.protocol.core.LeavesProtocol;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -65,6 +66,8 @@ public abstract class AbstractInvokerHolder<T> {
} else {
return invoker.invoke(owner, args);
}
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getCause());
} catch (Exception e) {
throw new RuntimeException(e);
}

View File

@@ -6,6 +6,8 @@ import net.kyori.adventure.text.format.NamedTextColor;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtAccounter;
import net.minecraft.nbt.Tag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;
@@ -118,12 +120,12 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
}
playerSession.remove(uuid);
fullPacket.readVarInt();
CompoundTag compoundTag = fullPacket.readNbt();
if (compoundTag == null) {
Tag tag = FriendlyByteBuf.readNbt(fullPacket, new NbtAccounter(LeavesConfig.protocol.servux.litematics.maxNbtSize, 512));
if (!(tag instanceof CompoundTag)) {
ServuxProtocol.LOGGER.error("cannot read nbt tag from packet");
return;
}
handleClientPasteRequest(player, compoundTag);
handleClientPasteRequest(player, (CompoundTag) tag);
}
}
}
@@ -258,7 +260,7 @@ public class ServuxLitematicsProtocol implements LeavesProtocol {
@Override
public boolean isActive() {
return LeavesConfig.protocol.servux.litematicsProtocol;
return LeavesConfig.protocol.servux.litematics.enable;
}
public enum ServuxLitematicaPayloadType {

View File

@@ -1,17 +1,12 @@
package org.leavesmc.leaves.util;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.item.component.ItemContainerContents;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.item.enchantment.ItemEnchantments;
import net.minecraft.world.level.block.ShulkerBoxBlock;
import org.jetbrains.annotations.NotNull;
@@ -113,6 +108,17 @@ public class ItemOverstackUtils {
}
private static class ShulkerBox implements ItemUtil {
public static boolean shulkerBoxCheck(@NotNull ItemStack stack1, @NotNull ItemStack stack2) {
if (LeavesConfig.modify.shulkerBox.sameNbtStackable) {
return Objects.equals(stack1.getComponents(), stack2.getComponents());
}
return shulkerBoxNoItem(stack1) && shulkerBoxNoItem(stack2) && Objects.equals(stack1.getComponents(), stack2.getComponents());
}
public static boolean shulkerBoxNoItem(@NotNull ItemStack stack) {
return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty();
}
@Override
public boolean isEnabled() {
return LeavesConfig.modify.shulkerBox.shulkerBoxStackSize > 1;
@@ -159,21 +165,17 @@ public class ItemOverstackUtils {
}
return -1;
}
public static boolean shulkerBoxCheck(@NotNull ItemStack stack1, @NotNull ItemStack stack2) {
if (LeavesConfig.modify.shulkerBox.sameNbtStackable) {
return Objects.equals(stack1.getComponents(), stack2.getComponents());
}
return shulkerBoxNoItem(stack1) && shulkerBoxNoItem(stack2) && Objects.equals(stack1.getComponents(), stack2.getComponents());
}
public static boolean shulkerBoxNoItem(@NotNull ItemStack stack) {
return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty();
}
}
public static class CurseEnchantedBook implements ItemUtil {
private static final MappedRegistry<Enchantment> registry = (MappedRegistry<Enchantment>) MinecraftServer.getServer().registryAccess().lookup(Registries.ENCHANTMENT).orElseThrow();
public static boolean isCursedEnchantedBook(ItemStack stack) {
ItemEnchantments enchantments = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY);
if (enchantments.size() != 1) {
return false;
}
return stack.getBukkitStack().getEnchantmentLevel(org.bukkit.enchantments.Enchantment.BINDING_CURSE) == 1 ||
stack.getBukkitStack().getEnchantmentLevel(org.bukkit.enchantments.Enchantment.BINDING_CURSE) == 1;
}
@Override
public boolean isEnabled() {
@@ -197,14 +199,5 @@ public class ItemOverstackUtils {
}
return -1;
}
public static boolean isCursedEnchantedBook(ItemStack stack) {
ItemEnchantments enchantments = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY);
if (enchantments.size() != 1) {
return false;
}
return enchantments.getLevel(registry.getOrThrow(Enchantments.BINDING_CURSE)) == 1 ||
enchantments.getLevel(registry.getOrThrow(Enchantments.VANISHING_CURSE)) == 1;
}
}
}