diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index c69bf57ba..22cbd0dad 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -163,6 +163,8 @@ equipment: humanoid-leggings: minecraft:trims/entity/humanoid_leggings/chainmail block: + # This decides the amount of real blocks on serverside. Requires a restart to apply. + serverside-blocks: 2000 # Enables the sound system, which prevents the client from hearing some non-custom block sounds and improves the client experience. sound-system: enable: true diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/cache/AutoIdCache.java b/core/src/main/java/net/momirealms/craftengine/core/pack/cache/AutoIdCache.java new file mode 100644 index 000000000..1588a2d1b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/cache/AutoIdCache.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.pack.cache; + +import java.util.BitSet; +import java.util.HashMap; +import java.util.Map; + +public class AutoIdCache { + private final Map forcedIds = new HashMap<>(); + private final Map cachedIds = new HashMap<>(); + private final BitSet occupiedIds = new BitSet(); + private int currentAutoId; + + public AutoIdCache(int startIndex) { + this.currentAutoId = startIndex; + } + + public boolean setForcedId(final String name, int index) { + if (this.occupiedIds.get(index)) { + return false; + } + this.occupiedIds.set(index); + this.forcedIds.put(name, index); + return true; + } + + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 834947120..65681858e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -123,6 +123,7 @@ public class Config { protected int block$predict_breaking_interval; protected double block$extended_interaction_range; protected boolean block$chunk_relighter; + protected int block$serverside_blocks; protected boolean recipe$enable; protected boolean recipe$disable_vanilla_recipes$all; @@ -134,6 +135,7 @@ public class Config { protected boolean image$illegal_characters_filter$anvil; protected boolean image$illegal_characters_filter$sign; protected boolean image$illegal_characters_filter$book; + protected boolean network$intercept_packets$system_chat; protected boolean network$intercept_packets$tab_list; protected boolean network$intercept_packets$actionbar; @@ -392,6 +394,7 @@ public class Config { block$predict_breaking_interval = Math.max(config.getInt("block.predict-breaking.interval", 10), 1); block$extended_interaction_range = Math.max(config.getDouble("block.predict-breaking.extended-interaction-range", 0.5), 0.0); block$chunk_relighter = config.getBoolean("block.chunk-relighter", true); + block$serverside_blocks = config.getInt("block.serverside-blocks", 2000); // recipe recipe$enable = config.getBoolean("recipe.enable", true); @@ -478,6 +481,10 @@ public class Config { return instance.metrics; } + public static int serverSideBlocks() { + return instance.block$serverside_blocks; + } + public static boolean filterConfigurationPhaseDisconnect() { return instance.filterConfigurationPhaseDisconnect; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java index 86aeebfa5..bcd5041cb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java @@ -5,8 +5,6 @@ import net.momirealms.craftengine.core.plugin.context.*; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; -import net.momirealms.craftengine.core.plugin.context.text.TextProvider; -import net.momirealms.craftengine.core.plugin.context.text.TextProviders; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -16,12 +14,12 @@ import java.util.List; import java.util.Map; public class ActionBarFunction extends AbstractConditionalFunction { - private final TextProvider message; + private final String message; private final PlayerSelector selector; - public ActionBarFunction(List> predicates, @Nullable PlayerSelector selector, TextProvider messages) { + public ActionBarFunction(List> predicates, @Nullable PlayerSelector selector, String message) { super(predicates); - this.message = messages; + this.message = message; this.selector = selector; } @@ -29,12 +27,12 @@ public class ActionBarFunction extends AbstractConditionalF public void runInternal(CTX ctx) { if (this.selector == null) { ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { - it.sendActionBar(AdventureHelper.miniMessage().deserialize(this.message.get(ctx), ctx.tagResolvers())); + it.sendActionBar(AdventureHelper.miniMessage().deserialize(this.message, ctx.tagResolvers())); }); } else { for (Player viewer : this.selector.get(ctx)) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer)); - viewer.sendActionBar(AdventureHelper.miniMessage().deserialize(this.message.get(relationalContext), relationalContext.tagResolvers())); + viewer.sendActionBar(AdventureHelper.miniMessage().deserialize(this.message, relationalContext.tagResolvers())); } } } @@ -53,7 +51,7 @@ public class ActionBarFunction extends AbstractConditionalF @Override public Function create(Map arguments) { String message = ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "actionbar", "message"), "warning.config.function.actionbar.missing_actionbar"); - return new ActionBarFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), TextProviders.fromString(message)); + return new ActionBarFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), message); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java index ffedc3333..c69d3663e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java @@ -5,8 +5,6 @@ import net.momirealms.craftengine.core.plugin.context.*; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; -import net.momirealms.craftengine.core.plugin.context.text.TextProvider; -import net.momirealms.craftengine.core.plugin.context.text.TextProviders; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -17,11 +15,11 @@ import java.util.List; import java.util.Map; public class MessageFunction extends AbstractConditionalFunction { - private final List messages; + private final List messages; private final PlayerSelector selector; private final boolean overlay; - public MessageFunction(List> predicates, @Nullable PlayerSelector selector, List messages, boolean overlay) { + public MessageFunction(List> predicates, @Nullable PlayerSelector selector, List messages, boolean overlay) { super(predicates); this.messages = messages; this.selector = selector; @@ -32,15 +30,15 @@ public class MessageFunction extends AbstractConditionalFun public void runInternal(CTX ctx) { if (this.selector == null) { ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { - for (TextProvider c : this.messages) { - it.sendMessage(AdventureHelper.miniMessage().deserialize(c.get(ctx), ctx.tagResolvers()), this.overlay); + for (String c : this.messages) { + it.sendMessage(AdventureHelper.miniMessage().deserialize(c, ctx.tagResolvers()), this.overlay); } }); } else { for (Player viewer : this.selector.get(ctx)) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer)); - for (TextProvider c : this.messages) { - viewer.sendMessage(AdventureHelper.miniMessage().deserialize(c.get(relationalContext), relationalContext.tagResolvers()), this.overlay); + for (String c : this.messages) { + viewer.sendMessage(AdventureHelper.miniMessage().deserialize(c, relationalContext.tagResolvers()), this.overlay); } } } @@ -60,7 +58,7 @@ public class MessageFunction extends AbstractConditionalFun @Override public Function create(Map arguments) { Object message = ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(arguments, "messages", "message"), "warning.config.function.command.missing_message"); - List messages = MiscUtils.getAsStringList(message).stream().map(TextProviders::fromString).toList(); + List messages = MiscUtils.getAsStringList(message); boolean overlay = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("overlay", false), "overlay"); return new MessageFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), messages, overlay); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java index 3cda10b9b..bbe2fe3d0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java @@ -6,8 +6,6 @@ import net.momirealms.craftengine.core.plugin.context.*; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; -import net.momirealms.craftengine.core.plugin.context.text.TextProvider; -import net.momirealms.craftengine.core.plugin.context.text.TextProviders; import net.momirealms.craftengine.core.plugin.gui.GuiType; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.AdventureHelper; @@ -24,9 +22,9 @@ import java.util.Optional; public class OpenWindowFunction extends AbstractConditionalFunction { private final PlayerSelector selector; private final GuiType guiType; - private final TextProvider optionalTitle; + private final String optionalTitle; - public OpenWindowFunction(List> predicates, @Nullable PlayerSelector selector, GuiType guiType, TextProvider optionalTitle) { + public OpenWindowFunction(List> predicates, @Nullable PlayerSelector selector, GuiType guiType, String optionalTitle) { super(predicates); this.selector = selector; this.guiType = guiType; @@ -39,7 +37,7 @@ public class OpenWindowFunction extends AbstractConditional ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { CraftEngine.instance().guiManager().openInventory(it, this.guiType); if (this.optionalTitle != null) { - CraftEngine.instance().guiManager().updateInventoryTitle(it, AdventureHelper.miniMessage().deserialize(this.optionalTitle.get(ctx), ctx.tagResolvers())); + CraftEngine.instance().guiManager().updateInventoryTitle(it, AdventureHelper.miniMessage().deserialize(this.optionalTitle, ctx.tagResolvers())); } }); } else { @@ -47,7 +45,7 @@ public class OpenWindowFunction extends AbstractConditional CraftEngine.instance().guiManager().openInventory(viewer, this.guiType); if (this.optionalTitle != null) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer)); - CraftEngine.instance().guiManager().updateInventoryTitle(viewer, AdventureHelper.miniMessage().deserialize(this.optionalTitle.get(relationalContext), relationalContext.tagResolvers())); + CraftEngine.instance().guiManager().updateInventoryTitle(viewer, AdventureHelper.miniMessage().deserialize(this.optionalTitle, relationalContext.tagResolvers())); } } } @@ -66,7 +64,7 @@ public class OpenWindowFunction extends AbstractConditional @Override public Function create(Map arguments) { - TextProvider title = Optional.ofNullable(arguments.get("title")).map(String::valueOf).map(TextProviders::fromString).orElse(null); + String title = Optional.ofNullable(arguments.get("title")).map(String::valueOf).orElse(null); String rawType = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("gui-type"), "warning.config.function.open_window.missing_gui_type"); try { GuiType type = GuiType.valueOf(rawType.toUpperCase(Locale.ENGLISH)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java index cbae62005..97a56b443 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java @@ -7,8 +7,6 @@ import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; -import net.momirealms.craftengine.core.plugin.context.text.TextProvider; -import net.momirealms.craftengine.core.plugin.context.text.TextProviders; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.Nullable; @@ -18,14 +16,14 @@ import java.util.Map; public class TitleFunction extends AbstractConditionalFunction { private final PlayerSelector selector; - private final TextProvider main; - private final TextProvider sub; + private final String main; + private final String sub; private final NumberProvider fadeIn; private final NumberProvider stay; private final NumberProvider fadeOut; public TitleFunction(List> predicates, @Nullable PlayerSelector selector, - TextProvider main, TextProvider sub, NumberProvider fadeIn, NumberProvider stay, NumberProvider fadeOut) { + String main, String sub, NumberProvider fadeIn, NumberProvider stay, NumberProvider fadeOut) { super(predicates); this.selector = selector; this.main = main; @@ -39,16 +37,16 @@ public class TitleFunction extends AbstractConditionalFunct public void runInternal(CTX ctx) { if (this.selector == null) { ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> it.sendTitle( - AdventureHelper.miniMessage().deserialize(this.main.get(ctx), ctx.tagResolvers()), - AdventureHelper.miniMessage().deserialize(this.sub.get(ctx), ctx.tagResolvers()), + AdventureHelper.miniMessage().deserialize(this.main, ctx.tagResolvers()), + AdventureHelper.miniMessage().deserialize(this.sub, ctx.tagResolvers()), this.fadeIn.getInt(ctx), this.stay.getInt(ctx), this.fadeOut.getInt(ctx) )); } else { for (Player viewer : this.selector.get(ctx)) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer)); viewer.sendTitle( - AdventureHelper.miniMessage().deserialize(this.main.get(relationalContext), relationalContext.tagResolvers()), - AdventureHelper.miniMessage().deserialize(this.sub.get(relationalContext), relationalContext.tagResolvers()), + AdventureHelper.miniMessage().deserialize(this.main, relationalContext.tagResolvers()), + AdventureHelper.miniMessage().deserialize(this.sub, relationalContext.tagResolvers()), this.fadeIn.getInt(relationalContext), this.stay.getInt(relationalContext), this.fadeOut.getInt(relationalContext) ); } @@ -73,8 +71,7 @@ public class TitleFunction extends AbstractConditionalFunct NumberProvider fadeIn = NumberProviders.fromObject(arguments.getOrDefault("fade-in", 10)); NumberProvider stay = NumberProviders.fromObject(arguments.getOrDefault("stay", 20)); NumberProvider fadeOut = NumberProviders.fromObject(arguments.getOrDefault("fade-out", 5)); - return new TitleFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), - TextProviders.fromString(title), TextProviders.fromString(subtitle), fadeIn, stay, fadeOut); + return new TitleFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), title, subtitle, fadeIn, stay, fadeOut); } } } diff --git a/gradle.properties b/gradle.properties index e6e8440a9..1aab59f11 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.63.3 +project_version=0.0.63.4 config_version=46 lang_version=30 project_group=net.momirealms