9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

修复image解析

This commit is contained in:
Xiao-MoMi
2025-09-19 15:26:33 +08:00
parent a32e50c4b8
commit 3e15a6bbc2
8 changed files with 63 additions and 36 deletions

View File

@@ -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

View File

@@ -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<String, Integer> forcedIds = new HashMap<>();
private final Map<String, Integer> 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;
}
}

View File

@@ -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;
}

View File

@@ -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<CTX extends Context> extends AbstractConditionalFunction<CTX> {
private final TextProvider message;
private final String message;
private final PlayerSelector<CTX> selector;
public ActionBarFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, TextProvider messages) {
public ActionBarFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, String message) {
super(predicates);
this.message = messages;
this.message = message;
this.selector = selector;
}
@@ -29,12 +27,12 @@ public class ActionBarFunction<CTX extends Context> 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<CTX extends Context> extends AbstractConditionalF
@Override
public Function<CTX> create(Map<String, Object> 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);
}
}
}

View File

@@ -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<CTX extends Context> extends AbstractConditionalFunction<CTX> {
private final List<TextProvider> messages;
private final List<String> messages;
private final PlayerSelector<CTX> selector;
private final boolean overlay;
public MessageFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, List<TextProvider> messages, boolean overlay) {
public MessageFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, List<String> messages, boolean overlay) {
super(predicates);
this.messages = messages;
this.selector = selector;
@@ -32,15 +30,15 @@ public class MessageFunction<CTX extends Context> 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<CTX extends Context> extends AbstractConditionalFun
@Override
public Function<CTX> create(Map<String, Object> arguments) {
Object message = ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(arguments, "messages", "message"), "warning.config.function.command.missing_message");
List<TextProvider> messages = MiscUtils.getAsStringList(message).stream().map(TextProviders::fromString).toList();
List<String> 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);
}

View File

@@ -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<CTX extends Context> extends AbstractConditionalFunction<CTX> {
private final PlayerSelector<CTX> selector;
private final GuiType guiType;
private final TextProvider optionalTitle;
private final String optionalTitle;
public OpenWindowFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, GuiType guiType, TextProvider optionalTitle) {
public OpenWindowFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, GuiType guiType, String optionalTitle) {
super(predicates);
this.selector = selector;
this.guiType = guiType;
@@ -39,7 +37,7 @@ public class OpenWindowFunction<CTX extends Context> 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<CTX extends Context> 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<CTX extends Context> extends AbstractConditional
@Override
public Function<CTX> create(Map<String, Object> 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));

View File

@@ -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<CTX extends Context> extends AbstractConditionalFunction<CTX> {
private final PlayerSelector<CTX> 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<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> 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<CTX extends Context> 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<CTX extends Context> 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);
}
}
}

View File

@@ -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