diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java index 4f527f7af..c6ac983c1 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java @@ -51,7 +51,7 @@ public class ImageExpansion extends PlaceholderExpansion { plugin.logger().warn("Invalid image namespaced key: " + param[0] + ":" + param[1]); return null; } - Optional optional = plugin.imageManager().bitmapImageByImageId(key); + Optional optional = plugin.fontManager().bitmapImageByImageId(key); if (optional.isEmpty()) { return null; } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ShiftExpansion.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ShiftExpansion.java index ea10750f9..10f165435 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ShiftExpansion.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ShiftExpansion.java @@ -40,7 +40,7 @@ public class ShiftExpansion extends PlaceholderExpansion { case "mini", "minimessage", "mm" -> { if (split.length != 2) return null; try { - return plugin.imageManager().createMiniMessageOffsets(Integer.parseInt(split[1])); + return plugin.fontManager().createMiniMessageOffsets(Integer.parseInt(split[1])); } catch (NumberFormatException e) { return null; } @@ -48,7 +48,7 @@ public class ShiftExpansion extends PlaceholderExpansion { case "md", "minedown" -> { if (split.length != 2) return null; try { - return plugin.imageManager().createMineDownOffsets(Integer.parseInt(split[1])); + return plugin.fontManager().createMineDownOffsets(Integer.parseInt(split[1])); } catch (NumberFormatException e) { return null; } @@ -56,7 +56,7 @@ public class ShiftExpansion extends PlaceholderExpansion { case "raw" -> { if (split.length != 2) return null; try { - return plugin.imageManager().createRawOffsets(Integer.parseInt(split[1])); + return plugin.fontManager().createRawOffsets(Integer.parseInt(split[1])); } catch (NumberFormatException e) { return null; } @@ -64,7 +64,7 @@ public class ShiftExpansion extends PlaceholderExpansion { default -> { if (split.length != 1) return null; try { - return plugin.imageManager().createMiniMessageOffsets(Integer.parseInt(split[0])); + return plugin.fontManager().createMiniMessageOffsets(Integer.parseInt(split[0])); } catch (NumberFormatException e) { return null; } diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 7ba3c04e5..e09b121c9 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -158,6 +158,7 @@ image: system-chat: true tab-list: true # Tab list header and footer player-info: true # User list in tab + set-score: true actionbar: true title: true bossbar: true diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/emoji.yml b/bukkit/loader/src/main/resources/resources/default/configuration/emoji.yml index 755db9585..996057731 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/emoji.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/emoji.yml @@ -1,8 +1,8 @@ templates: default:emoji/basic: - content: "'>" + content: "'>" default:emoji/addition_info: - content: "'>{text}" + content: "'>{text}" emoji: default:emoji_location: @@ -23,4 +23,131 @@ emoji: image: "default:icons:0:1" permission: emoji.time keywords: - - ":time:" \ No newline at end of file + - ":time:" + + default:emoji_smiley: + template: "default:emoji/basic" + overrides: + image: "default:emojis:0:0" + permission: emoji.smile + keywords: + - ":)" + - ":smiley:" + - ":smile:" + default:emoji_angry: + template: "default:emoji/basic" + overrides: + image: "default:emojis:0:1" + permission: emoji.angry + keywords: + - ":angry:" + default:emoji_grin: + template: "default:emoji/basic" + overrides: + image: "default:emojis:0:2" + permission: emoji.grin + keywords: + - ":grin:" + default:emoji_sob: + template: "default:emoji/basic" + overrides: + image: "default:emojis:0:3" + permission: emoji.sob + keywords: + - ":sob:" + default:emoji_sweat_smile: + template: "default:emoji/basic" + overrides: + image: "default:emojis:1:0" + permission: emoji.sweat_smile + keywords: + - ":sweat_smile:" + default:emoji_blush: + template: "default:emoji/basic" + overrides: + image: "default:emojis:1:1" + permission: emoji.blush + keywords: + - ":blush:" + default:emoji_joy: + template: "default:emoji/basic" + overrides: + image: "default:emojis:1:2" + permission: emoji.joy + keywords: + - ":joy:" + default:emoji_slight_frown: + template: "default:emoji/basic" + overrides: + image: "default:emojis:1:3" + permission: emoji.slight_frown + keywords: + - ":slight_frown:" + default:emoji_unamused: + template: "default:emoji/basic" + overrides: + image: "default:emojis:2:0" + permission: emoji.unamused + keywords: + - ":unamused:" + default:emoji_laughing: + template: "default:emoji/basic" + overrides: + image: "default:emojis:2:1" + permission: emoji.laughing + keywords: + - ":laughing:" + default:emoji_sunglasses: + template: "default:emoji/basic" + overrides: + image: "default:emojis:2:2" + permission: emoji.sunglasses + keywords: + - ":sunglasses:" + default:emoji_innocent: + template: "default:emoji/basic" + overrides: + image: "default:emojis:2:3" + permission: emoji.innocent + keywords: + - ":innocent:" + default:emoji_face_vomiting: + template: "default:emoji/basic" + overrides: + image: "default:emojis:3:0" + permission: emoji.face_vomiting + keywords: + - ":face_vomiting:" + default:emoji_rolling_eyes: + template: "default:emoji/basic" + overrides: + image: "default:emojis:3:1" + permission: emoji.rolling_eyes + keywords: + - ":rolling_eyes:" + default:emoji_yum: + template: "default:emoji/basic" + overrides: + image: "default:emojis:3:2" + permission: emoji.yum + keywords: + - ":yum:" + default:emoji_confounded: + template: "default:emoji/basic" + overrides: + image: "default:emojis:3:2" + permission: emoji.confounded + keywords: + - ":confounded:" + +images: + default:emojis: + height: 11 + ascent: 9 + font: minecraft:emoji + file: minecraft:font/image/emojis.png + chars: + - '\ub000\ub001\ub002\ub003' + - '\ub004\ub005\ub006\ub007' + - '\ub008\ub009\ub00a\ub00b' + - '\ub00c\ub00d\ub00e\ub00f' \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/emojis.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/emojis.png new file mode 100644 index 000000000..59efa8e78 Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/emojis.png differ diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index f8879f586..fda52637e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -16,6 +16,7 @@ import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; @@ -294,11 +295,17 @@ public class BlockEventListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onEntityExplode(EntityExplodeEvent event) { + if (VersionHelper.isVersionNewerThan1_21()) { + if (!ExplosionUtils.isDroppingItems(event)) return; + } handleExplodeEvent(event.blockList(), new BukkitWorld(event.getEntity().getWorld()), event.getYield()); } @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onBlockExplode(BlockExplodeEvent event) { + if (VersionHelper.isVersionNewerThan1_21()) { + if (!ExplosionUtils.isDroppingItems(event)) return; + } handleExplodeEvent(event.blockList(), new BukkitWorld(event.getBlock().getWorld()), event.getYield()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 40bd35005..d39ef7e35 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -103,14 +103,14 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { } } - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChat(AsyncChatDecorateEvent event) { if (!Config.filterChat()) return; this.processChatEvent(event); } - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChatCommand(AsyncChatCommandDecorateEvent event) { if (!Config.filterChat()) return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index f0eb1042f..5d4bd2632 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -343,6 +343,7 @@ public class RecipeEventListener implements Listener { ItemStack itemStack = event.getItem(); if (ItemUtils.isEmpty(itemStack)) return; try { + @SuppressWarnings("unchecked") Optional optionalMCRecipe = FastNMS.INSTANCE.method$RecipeManager$getRecipeFor( BukkitRecipeManager.nmsRecipeManager(), Reflections.instance$RecipeType$CAMPFIRE_COOKING, diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 0afcc7e55..02f13cf9b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -157,6 +157,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket()); + registerByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isVersionNewerThan1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1); registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 0d9f63c9a..052bab0d8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -33,6 +33,7 @@ import net.momirealms.craftengine.core.world.chunk.PalettedContainer; import net.momirealms.craftengine.core.world.chunk.packet.MCSection; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.*; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -260,9 +261,9 @@ public class PacketConsumers { Tag suffix = buf.readNbt(false); if (suffix == null) return; - Map tokens1 = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); - Map tokens2 = CraftEngine.instance().imageManager().matchTags(prefix.getAsString()); - Map tokens3 = CraftEngine.instance().imageManager().matchTags(suffix.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(prefix.getAsString()); + Map tokens3 = CraftEngine.instance().fontManager().matchTags(suffix.getAsString()); if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; event.setChanged(true); @@ -348,7 +349,7 @@ public class PacketConsumers { continue; } String json = ComponentUtils.minecraftToJson(mcComponent); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) { newEntries.add(entry); continue; @@ -386,9 +387,9 @@ public class PacketConsumers { String prefix = buf.readUtf(); String suffix = buf.readUtf(); - Map tokens1 = CraftEngine.instance().imageManager().matchTags(displayName); - Map tokens2 = CraftEngine.instance().imageManager().matchTags(prefix); - Map tokens3 = CraftEngine.instance().imageManager().matchTags(suffix); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(prefix); + Map tokens3 = CraftEngine.instance().fontManager().matchTags(suffix); if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; event.setChanged(true); @@ -455,7 +456,7 @@ public class PacketConsumers { int actionType = buf.readVarInt(); if (actionType == 0) { String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; Component component = AdventureHelper.jsonToComponent(json); for (Map.Entry token : tokens.entrySet()) { @@ -477,7 +478,7 @@ public class PacketConsumers { buf.writeByte(flag); } else if (actionType == 3) { String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(json); @@ -504,7 +505,7 @@ public class PacketConsumers { if (actionType == 0) { Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { @@ -527,7 +528,7 @@ public class PacketConsumers { } else if (actionType == 3) { Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(nbt); @@ -554,7 +555,7 @@ public class PacketConsumers { if (mode != 0 && mode != 2) return; String displayName = buf.readUtf(); int renderType = buf.readVarInt(); - Map tokens = CraftEngine.instance().imageManager().matchTags(displayName); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(displayName); @@ -586,7 +587,7 @@ public class PacketConsumers { if (optionalNumberFormat) { int format = buf.readVarInt(); if (format == 0) { - Map tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(displayName); @@ -602,7 +603,7 @@ public class PacketConsumers { buf.writeBoolean(true); buf.writeVarInt(0); } else if (format == 1) { - Map tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) return; Tag style = buf.readNbt(false); event.setChanged(true); @@ -622,8 +623,8 @@ public class PacketConsumers { } else if (format == 2) { Tag fixed = buf.readNbt(false); if (fixed == null) return; - Map tokens1 = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); - Map tokens2 = CraftEngine.instance().imageManager().matchTags(fixed.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(fixed.getAsString()); if (tokens1.isEmpty() && tokens2.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -653,7 +654,7 @@ public class PacketConsumers { } } } else { - Map tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(displayName); @@ -678,7 +679,7 @@ public class PacketConsumers { try { FriendlyByteBuf buf = event.getBuffer(); String jsonOrPlainString = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(jsonOrPlainString); + Map tokens = CraftEngine.instance().fontManager().matchTags(jsonOrPlainString); if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); @@ -701,7 +702,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); @@ -723,7 +724,7 @@ public class PacketConsumers { try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(json); @@ -744,7 +745,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(nbt); @@ -764,7 +765,7 @@ public class PacketConsumers { try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(json); @@ -785,7 +786,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(nbt); @@ -805,7 +806,7 @@ public class PacketConsumers { try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(json); @@ -826,7 +827,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.tagToComponent(nbt); @@ -847,8 +848,8 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); String json1 = buf.readUtf(); String json2 = buf.readUtf(); - Map tokens1 = CraftEngine.instance().imageManager().matchTags(json1); - Map tokens2 = CraftEngine.instance().imageManager().matchTags(json2); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(json1); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(json2); if (tokens1.isEmpty() && tokens2.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -884,8 +885,8 @@ public class PacketConsumers { if (nbt1 == null) return; Tag nbt2 = buf.readNbt(false); if (nbt2 == null) return; - Map tokens1 = CraftEngine.instance().imageManager().matchTags(nbt1.getAsString()); - Map tokens2 = CraftEngine.instance().imageManager().matchTags(nbt2.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(nbt1.getAsString()); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(nbt2.getAsString()); if (tokens1.isEmpty() && tokens2.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -920,7 +921,7 @@ public class PacketConsumers { int containerId = buf.readVarInt(); int type = buf.readVarInt(); String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (tokens.isEmpty()) return; event.setChanged(true); Component component = AdventureHelper.jsonToComponent(json); @@ -945,7 +946,7 @@ public class PacketConsumers { int type = buf.readVarInt(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { @@ -1275,7 +1276,7 @@ public class PacketConsumers { // do ray trace to get current block RayTraceResult result = bukkitPlayer.rayTraceBlocks(interactionRange, FluidCollisionMode.NEVER); if (result == null) return; - org.bukkit.block.Block hitBlock = result.getHitBlock(); + Block hitBlock = result.getHitBlock(); if (hitBlock == null) return; ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(hitBlock.getBlockData())); // not a custom block @@ -1694,7 +1695,7 @@ public class PacketConsumers { String message = (String) Reflections.field$ServerboundRenameItemPacket$name.get(packet); if (message != null && !message.isEmpty()) { // check bypass - FontManager manager = CraftEngine.instance().imageManager(); + FontManager manager = CraftEngine.instance().fontManager(); IllegalCharacterProcessResult result = manager.processIllegalCharacters(message); if (result.has()) { try { @@ -1718,7 +1719,7 @@ public class PacketConsumers { return; } String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet); - FontManager manager = CraftEngine.instance().imageManager(); + FontManager manager = CraftEngine.instance().fontManager(); if (!manager.isDefaultFontInUse()) return; for (int i = 0; i < lines.length; i++) { String line = lines[i]; @@ -1739,7 +1740,7 @@ public class PacketConsumers { public static final TriConsumer EDIT_BOOK = (user, event, packet) -> { try { if (!Config.filterBook()) return; - FontManager manager = CraftEngine.instance().imageManager(); + FontManager manager = CraftEngine.instance().fontManager(); if (!manager.isDefaultFontInUse()) return; // check bypass if (((BukkitServerPlayer) user).hasPermission(FontManager.BYPASS_BOOK)) { @@ -1881,7 +1882,7 @@ public class PacketConsumers { if (optionalTextComponent.isPresent()) { Object textComponent = optionalTextComponent.get(); String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (!tokens.isEmpty()) { Component component = AdventureHelper.jsonToComponent(json); for (Map.Entry token : tokens.entrySet()) { @@ -1914,7 +1915,7 @@ public class PacketConsumers { Object textComponent = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); if (textComponent == Reflections.instance$Component$empty) break; String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (!tokens.isEmpty()) { Component component = AdventureHelper.jsonToComponent(json); for (Map.Entry token : tokens.entrySet()) { @@ -1947,7 +1948,7 @@ public class PacketConsumers { if (optionalTextComponent.isPresent()) { Object textComponent = optionalTextComponent.get(); String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (!tokens.isEmpty()) { Component component = AdventureHelper.jsonToComponent(json); for (Map.Entry token : tokens.entrySet()) { @@ -1980,7 +1981,7 @@ public class PacketConsumers { if (optionalTextComponent.isPresent()) { Object textComponent = optionalTextComponent.get(); String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); if (!tokens.isEmpty()) { Component component = AdventureHelper.jsonToComponent(json); for (Map.Entry token : tokens.entrySet()) { @@ -2006,4 +2007,83 @@ public class PacketConsumers { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); } }; + + public static final BiConsumer SET_SCORE_1_20_3 = (user, event) -> { + try { + if (!Config.interceptSetScore()) return; + boolean isChanged = false; + FriendlyByteBuf buf = event.getBuffer(); + String owner = buf.readUtf(); + String objectiveName = buf.readUtf(); + int score = buf.readVarInt(); + boolean hasDisplay = buf.readBoolean(); + Tag displayName = null; + if (hasDisplay) { + displayName = buf.readNbt(false); + } + outside : if (displayName != null) { + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + if (tokens.isEmpty()) break outside; + Component component = AdventureHelper.tagToComponent(displayName); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + displayName = AdventureHelper.componentToTag(component); + isChanged = true; + } + boolean hasNumberFormat = buf.readBoolean(); + int format = -1; + Tag style = null; + Tag fixed = null; + if (hasNumberFormat) { + format = buf.readVarInt(); + if (format == 0) { + if (displayName == null) return; + } else if (format == 1) { + if (displayName == null) return; + style = buf.readNbt(false); + } else if (format == 2) { + fixed = buf.readNbt(false); + if (fixed == null) return; + Map tokens = CraftEngine.instance().fontManager().matchTags(fixed.getAsString()); + if (tokens.isEmpty() && !isChanged) return; + if (!tokens.isEmpty()) { + Component component = AdventureHelper.tagToComponent(fixed); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + fixed = AdventureHelper.componentToTag(component); + isChanged = true; + } + } + } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(owner); + buf.writeUtf(objectiveName); + buf.writeVarInt(score); + if (hasDisplay) { + buf.writeBoolean(true); + buf.writeNbt(displayName, false); + } else { + buf.writeBoolean(false); + } + if (hasNumberFormat) { + buf.writeBoolean(true); + buf.writeVarInt(format); + if (format == 1) { + buf.writeNbt(style, false); + } else if (format == 2) { + buf.writeNbt(fixed, false); + } + } else { + buf.writeBoolean(false); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetScorePacket", e); + } + }; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index 978507531..3ac33c779 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -39,4 +39,6 @@ public interface PacketIds { int clientboundLevelChunkWithLightPacket(); int clientboundPlayerInfoUpdatePacket(); + + int clientboundSetScorePacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index a42831d0b..a1c2c9831 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -99,4 +99,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundPlayerInfoUpdatePacket() { return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundPlayerInfoUpdatePacket); } + + @Override + public int clientboundSetScorePacket() { + return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetScorePacket); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 290f16df7..ea3437281 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java @@ -98,4 +98,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundPlayerInfoUpdatePacket() { return PacketIdFinder.clientboundByName("minecraft:player_info_update"); } + + @Override + public int clientboundSetScorePacket() { + return PacketIdFinder.clientboundByName("minecraft:set_score"); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java new file mode 100644 index 000000000..3d8de7149 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.ExplosionResult; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; + +@SuppressWarnings("UnstableApiUsage") +public class ExplosionUtils { + + public static boolean isDroppingItems(BlockExplodeEvent event) { + return event.getExplosionResult() != ExplosionResult.KEEP && event.getExplosionResult() != ExplosionResult.TRIGGER_BLOCK; + } + + public static boolean isDroppingItems(EntityExplodeEvent event) { + return event.getExplosionResult() != ExplosionResult.KEEP && event.getExplosionResult() != ExplosionResult.TRIGGER_BLOCK; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index a163b570d..43cb6780e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6425,4 +6425,11 @@ public class Reflections { throw new RuntimeException(e); } } + + public static final Class clazz$ClientboundSetScorePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetScorePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardScore") + ) + ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index a94426c90..24d1cda5a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -302,6 +302,7 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/configuration/templates.yml"); // emoji plugin.saveResource("resources/default/configuration/emoji.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/font/image/emojis.png"); // i18n plugin.saveResource("resources/default/configuration/i18n.yml"); // block_name @@ -1071,7 +1072,7 @@ public abstract class AbstractPackManager implements PackManager { private void generateFonts(Path generatedPackPath) { // generate image font json - for (Font font : plugin.imageManager().fonts()) { + for (Font font : plugin.fontManager().fonts()) { Key namespacedKey = font.key(); Path fontPath = generatedPackPath.resolve("assets") .resolve(namespacedKey.namespace()) diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 6634f8462..4c9540d7a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -344,7 +344,7 @@ public abstract class CraftEngine implements Plugin { } @Override - public FontManager imageManager() { + public FontManager fontManager() { return fontManager; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index d34729e3d..b7022151b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -57,7 +57,7 @@ public interface Plugin { NetworkManager networkManager(); - FontManager imageManager(); + FontManager fontManager(); Config config(); 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 8e976ca03..13f81cb36 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 @@ -135,6 +135,7 @@ public class Config { protected boolean image$intercept_packets$text_display; protected boolean image$intercept_packets$armor_stand; protected boolean image$intercept_packets$player_info; + protected boolean image$intercept_packets$set_score; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -304,6 +305,7 @@ public class Config { image$intercept_packets$text_display = config.getBoolean("image.intercept-packets.text-display", true); image$intercept_packets$armor_stand = config.getBoolean("image.intercept-packets.armor-stand", true); image$intercept_packets$player_info = config.getBoolean("image.intercept-packets.player-info", true); + image$intercept_packets$set_score = config.getBoolean("image.intercept-packets.set-score", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -656,6 +658,10 @@ public class Config { return instance.image$intercept_packets$player_info; } + public static boolean interceptSetScore() { + return instance.image$intercept_packets$set_score; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java index 4e726e415..a6d718aea 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java @@ -29,7 +29,7 @@ public class ImageTag implements TagResolver { } String namespace = arguments.popOr("No argument namespace provided").toString(); String id = arguments.popOr("No argument id provided").toString(); - Optional optional = CraftEngine.instance().imageManager().bitmapImageByImageId(Key.of(namespace, id)); + Optional optional = CraftEngine.instance().fontManager().bitmapImageByImageId(Key.of(namespace, id)); if (optional.isPresent()) { if (arguments.hasNext()) { int row = arguments.popOr("No argument row provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java index dc27e9ff0..e5ccf26ae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java @@ -25,7 +25,7 @@ public class ShiftTag implements TagResolver { String shiftAmount = arguments.popOr("No argument shift provided").toString(); try { int shift = Integer.parseInt(shiftAmount); - return Tag.inserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().imageManager().createMiniMessageOffsets(shift))); + return Tag.inserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().fontManager().createMiniMessageOffsets(shift))); } catch (NumberFormatException e) { throw ctx.newException("Invalid shift value", arguments); } diff --git a/gradle.properties b/gradle.properties index 617b4f248..d069cdc54 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.46.3 -config_version=24 +project_version=0.0.47.1 +config_version=25 lang_version=4 project_group=net.momirealms latest_supported_version=1.21.5