mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-26 18:39:20 +00:00
字符替换重构第一步
This commit is contained in:
@@ -6,11 +6,11 @@ import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.item.Item;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext;
|
||||
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
|
||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||
import net.momirealms.sparrow.nbt.Tag;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@@ -51,6 +51,16 @@ public class AdvancementDisplay {
|
||||
|
||||
public void applyClientboundData(Player player) {
|
||||
this.icon = CraftEngine.instance().itemManager().s2c(this.icon, player);
|
||||
if (Config.interceptAdvancement()) {
|
||||
Map<String, ComponentProvider> tokens1 = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(this.title));
|
||||
if (!tokens1.isEmpty()) {
|
||||
this.title = AdventureHelper.replaceText(this.title, tokens1, NetworkTextReplaceContext.of(player));
|
||||
}
|
||||
Map<String, ComponentProvider> tokens2 = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(this.description));
|
||||
if (!tokens2.isEmpty()) {
|
||||
this.description = AdventureHelper.replaceText(this.description, tokens2, NetworkTextReplaceContext.of(player));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void write(FriendlyByteBuf buf) {
|
||||
@@ -75,8 +85,8 @@ public class AdvancementDisplay {
|
||||
}
|
||||
|
||||
public static AdvancementDisplay read(FriendlyByteBuf buf) {
|
||||
Component title = readComponent(buf);
|
||||
Component description = readComponent(buf);
|
||||
Component title = buf.readComponent();
|
||||
Component description = buf.readComponent();
|
||||
Item<Object> icon = CraftEngine.instance().itemManager().decode(buf);
|
||||
AdvancementType type = AdvancementType.byId(buf.readVarInt());
|
||||
int flags = buf.readInt();
|
||||
@@ -88,28 +98,4 @@ public class AdvancementDisplay {
|
||||
float y = buf.readFloat();
|
||||
return new AdvancementDisplay(title, description, icon, background, type, showToast, hidden, x, y);
|
||||
}
|
||||
|
||||
private static Component readComponent(FriendlyByteBuf buf) {
|
||||
if (Config.interceptAdvancement()) {
|
||||
if (VersionHelper.isOrAbove1_20_3()) {
|
||||
Tag nbt = buf.readNbt(false);
|
||||
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString());
|
||||
Component component = AdventureHelper.nbtToComponent(nbt);
|
||||
if (!tokens.isEmpty()) {
|
||||
component = AdventureHelper.replaceText(component, tokens);
|
||||
}
|
||||
return component;
|
||||
} else {
|
||||
String json = buf.readUtf();
|
||||
Component component = AdventureHelper.jsonToComponent(json);
|
||||
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(json);
|
||||
if (!tokens.isEmpty()) {
|
||||
component = AdventureHelper.replaceText(component, tokens);
|
||||
}
|
||||
return component;
|
||||
}
|
||||
} else {
|
||||
return buf.readComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.plugin.config.ConfigParser;
|
||||
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
|
||||
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
|
||||
import net.momirealms.craftengine.core.util.*;
|
||||
import org.ahocorasick.trie.Token;
|
||||
import org.ahocorasick.trie.Trie;
|
||||
@@ -41,7 +42,7 @@ public abstract class AbstractFontManager implements FontManager {
|
||||
|
||||
protected Trie imageTagTrie;
|
||||
protected Trie emojiKeywordTrie;
|
||||
protected Map<String, Component> tagMapper;
|
||||
protected Map<String, ComponentProvider> tagMapper;
|
||||
protected Map<String, Emoji> emojiMapper;
|
||||
protected List<Emoji> emojiList;
|
||||
protected List<String> allEmojiSuggestions;
|
||||
@@ -89,11 +90,11 @@ public abstract class AbstractFontManager implements FontManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Component> matchTags(String json) {
|
||||
public Map<String, ComponentProvider> matchTags(String json) {
|
||||
if (this.imageTagTrie == null) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Map<String, Component> tags = new HashMap<>();
|
||||
Map<String, ComponentProvider> tags = new HashMap<>();
|
||||
for (Token token : this.imageTagTrie.tokenize(json)) {
|
||||
if (token.isMatch()) {
|
||||
tags.put(token.getFragment(), this.tagMapper.get(token.getFragment()));
|
||||
@@ -218,9 +219,9 @@ public abstract class AbstractFontManager implements FontManager {
|
||||
public IllegalCharacterProcessResult processIllegalCharacters(String raw, char replacement) {
|
||||
boolean hasIllegal = false;
|
||||
// replace illegal image usage
|
||||
Map<String, Component> tokens = matchTags(raw);
|
||||
Map<String, ComponentProvider> tokens = matchTags(raw);
|
||||
if (!tokens.isEmpty()) {
|
||||
for (Map.Entry<String, Component> entry : tokens.entrySet()) {
|
||||
for (Map.Entry<String, ComponentProvider> entry : tokens.entrySet()) {
|
||||
raw = raw.replace(entry.getKey(), String.valueOf(replacement));
|
||||
hasIllegal = true;
|
||||
}
|
||||
@@ -269,21 +270,21 @@ public abstract class AbstractFontManager implements FontManager {
|
||||
for (BitmapImage image : this.images.values()) {
|
||||
String id = image.id().toString();
|
||||
String simpleImageTag = imageTag(id);
|
||||
this.tagMapper.put(simpleImageTag, image.componentAt(0, 0));
|
||||
this.tagMapper.put("\\" + simpleImageTag, Component.text(simpleImageTag));
|
||||
this.tagMapper.put(simpleImageTag, ComponentProvider.constant(image.componentAt(0, 0)));
|
||||
this.tagMapper.put("\\" + simpleImageTag, ComponentProvider.constant(Component.text(simpleImageTag)));
|
||||
for (int i = 0; i < image.rows(); i++) {
|
||||
for (int j = 0; j < image.columns(); j++) {
|
||||
String imageArgs = id + ":" + i + ":" + j;
|
||||
String imageTag = imageTag(imageArgs);
|
||||
this.tagMapper.put(imageTag, image.componentAt(i, j));
|
||||
this.tagMapper.put("\\" + imageTag, Component.text(imageTag));
|
||||
this.tagMapper.put(imageTag, ComponentProvider.constant(image.componentAt(i, j)));
|
||||
this.tagMapper.put("\\" + imageTag, ComponentProvider.constant(Component.text(imageTag)));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = -256; i <= 256; i++) {
|
||||
String shiftTag = "<shift:" + i + ">";
|
||||
this.tagMapper.put(shiftTag, this.offsetFont.createOffset(i));
|
||||
this.tagMapper.put("\\" + shiftTag, Component.text(shiftTag));
|
||||
this.tagMapper.put(shiftTag, ComponentProvider.constant(this.offsetFont.createOffset(i)));
|
||||
this.tagMapper.put("\\" + shiftTag, ComponentProvider.constant(Component.text(shiftTag)));
|
||||
}
|
||||
this.imageTagTrie = Trie.builder()
|
||||
.ignoreOverlaps()
|
||||
|
||||
@@ -5,6 +5,7 @@ import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.Manageable;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
|
||||
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
|
||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||
import net.momirealms.craftengine.core.util.CharacterUtils;
|
||||
import net.momirealms.craftengine.core.util.FormatUtils;
|
||||
@@ -103,7 +104,7 @@ public interface FontManager extends Manageable {
|
||||
return createOffsets(offset, (raw, font) -> raw);
|
||||
}
|
||||
|
||||
Map<String, Component> matchTags(String json);
|
||||
Map<String, ComponentProvider> matchTags(String json);
|
||||
|
||||
void refreshEmojiSuggestions(UUID uuid);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
|
||||
import net.momirealms.craftengine.core.plugin.context.number.NumberProvider;
|
||||
import net.momirealms.craftengine.core.plugin.context.number.NumberProviders;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class MaxDamageModifier<I> implements SimpleNetworkItemDataModifier<I> {
|
||||
|
||||
@@ -5,4 +5,8 @@ public class ResourcePackGenerationException extends RuntimeException {
|
||||
public ResourcePackGenerationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public ResourcePackGenerationException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package net.momirealms.craftengine.core.plugin.context;
|
||||
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
||||
import net.momirealms.craftengine.core.plugin.text.minimessage.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public final class NetworkTextReplaceContext extends AbstractChainParameterContext {
|
||||
private final Player player;
|
||||
|
||||
public NetworkTextReplaceContext(Player player) {
|
||||
super(new ContextHolder(Map.of(DirectContextParameters.PLAYER, () -> player)));
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public static NetworkTextReplaceContext of(Player player) {
|
||||
return new NetworkTextReplaceContext(player);
|
||||
}
|
||||
|
||||
public Player player() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TagResolver[] tagResolvers() {
|
||||
if (this.tagResolvers == null) {
|
||||
this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this), new I18NTag(this),
|
||||
new NamedArgumentTag(this), new ExpressionTag(this), new GlobalVariableTag(this)};
|
||||
}
|
||||
return this.tagResolvers;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package net.momirealms.craftengine.core.plugin.network;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
|
||||
public interface EntityPacketHandler {
|
||||
|
||||
@@ -8,7 +9,7 @@ public interface EntityPacketHandler {
|
||||
return false;
|
||||
}
|
||||
|
||||
default void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) {
|
||||
default void handleSetEntityData(Player user, ByteBufPacketEvent event) {
|
||||
}
|
||||
|
||||
default void handleSyncEntityPosition(NetWorkUser user, NMSPacketEvent event, Object packet) {
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package net.momirealms.craftengine.core.plugin.text.component;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import static net.momirealms.craftengine.core.plugin.text.minimessage.FormattedLine.CUSTOM_RESOLVERS;
|
||||
|
||||
public sealed interface ComponentProvider extends Function<Context, Component>
|
||||
permits ComponentProvider.Constant, ComponentProvider.MiniMessage {
|
||||
|
||||
static ComponentProvider constant(Component component) {
|
||||
return new Constant(component);
|
||||
}
|
||||
|
||||
static ComponentProvider miniMessageOrConstant(String line) {
|
||||
if (line.equals(AdventureHelper.customMiniMessage().stripTags(line, CUSTOM_RESOLVERS))) {
|
||||
return constant(AdventureHelper.miniMessage().deserialize(line));
|
||||
} else {
|
||||
return new MiniMessage(line);
|
||||
}
|
||||
}
|
||||
|
||||
non-sealed class Constant implements ComponentProvider {
|
||||
private final Component value;
|
||||
|
||||
public Constant(final Component value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component apply(Context context) {
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
|
||||
non-sealed class MiniMessage implements ComponentProvider {
|
||||
private final String value;
|
||||
|
||||
public MiniMessage(final String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component apply(Context context) {
|
||||
return AdventureHelper.miniMessage().deserialize(this.value, context.tagResolvers());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,8 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.kyori.adventure.text.serializer.json.JSONOptions;
|
||||
import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer;
|
||||
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
|
||||
import net.momirealms.sparrow.nbt.Tag;
|
||||
import net.momirealms.sparrow.nbt.adventure.NBTComponentSerializer;
|
||||
import net.momirealms.sparrow.nbt.adventure.NBTSerializerOptions;
|
||||
@@ -356,12 +358,13 @@ public class AdventureHelper {
|
||||
return AdventureHelper.plainTextContent(resultComponent);
|
||||
}
|
||||
|
||||
public static Component replaceText(Component text, Map<String, Component> replacements) {
|
||||
public static Component replaceText(Component text, Map<String, ComponentProvider> replacements, Context context) {
|
||||
String patternString = replacements.keySet().stream()
|
||||
.map(Pattern::quote)
|
||||
.collect(Collectors.joining("|"));
|
||||
return text.replaceText(builder ->
|
||||
builder.match(Pattern.compile(patternString))
|
||||
.replacement((result, b) -> replacements.get(result.group())));
|
||||
.replacement((result, b) ->
|
||||
replacements.get(result.group()).apply(context)));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user