diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index e424ae61e..575bc7f4e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -196,6 +196,8 @@ public class BukkitCraftEngine extends CraftEngine { super.furnitureManager = new BukkitFurnitureManager(this); // 初始化队伍管理器 super.teamManager = new BukkitTeamManager(this); + // 初始化虚拟队伍 + super.teamManager.init(); // 注册默认的parser this.registerDefaultParsers(); // 完成加载 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 0c876b9bc..4936ef852 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 @@ -57,6 +57,7 @@ import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.plugin.user.FakeBukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; +import net.momirealms.craftengine.bukkit.world.score.BukkitTeamManager; import net.momirealms.craftengine.core.advancement.network.AdvancementHolder; import net.momirealms.craftengine.core.advancement.network.AdvancementProgress; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -530,6 +531,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { () -> {}, 1, 1); } user.sendPacket(TotemAnimationCommand.FIX_TOTEM_SOUND_PACKET, false); + user.sendPacket(BukkitTeamManager.instance().addTeamsPacket(), false); Channel channel = user.nettyChannel(); if (this.hasAntiPopup && Config.disableChatReport() && channel != null) { if (Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) { @@ -3963,6 +3965,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { return; FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture); + breakEvent.setDropItems(!serverPlayer.isCreativeMode()); if (EventUtils.fireAndCheckCancel(breakEvent)) return; @@ -3981,7 +3984,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { return; } - CraftEngineFurniture.remove(furniture, serverPlayer, !serverPlayer.isCreativeMode(), true); + CraftEngineFurniture.remove(furniture, serverPlayer, breakEvent.dropItems(), true); }; } else if (actionType == 2) { // INTERACT_AT diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java index 49fb993ad..a70f18349 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java @@ -1,23 +1,18 @@ package net.momirealms.craftengine.bukkit.world.score; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections; import net.momirealms.craftengine.core.util.LegacyChatFormatter; import net.momirealms.craftengine.core.world.score.TeamManager; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; -import org.jetbrains.annotations.Nullable; import java.util.*; public class BukkitTeamManager implements TeamManager { private static BukkitTeamManager instance; private final BukkitCraftEngine plugin; - protected Set colorsInUse = new HashSet<>(); private final Map teamByColor = new EnumMap<>(LegacyChatFormatter.class); - private boolean changed = false; + private Object addTeamsPacket; public BukkitTeamManager(BukkitCraftEngine plugin) { this.plugin = plugin; @@ -29,48 +24,26 @@ public class BukkitTeamManager implements TeamManager { } @Override - public void setColorInUse(LegacyChatFormatter color) { - this.colorsInUse.add(color); - this.changed = true; - } - - @Override - public void unload() { - this.changed = !this.colorsInUse.isEmpty(); - this.colorsInUse.clear(); - this.teamByColor.clear(); - } - - @Nullable public Object getTeamByColor(LegacyChatFormatter color) { return this.teamByColor.get(color); } - @SuppressWarnings("deprecation") @Override - public void runDelayedSyncTasks() { - if (!this.changed) { - return; - } - Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + public Object addTeamsPacket() { + return addTeamsPacket; + } + + @Override + public void init() { + Object scoreboard = FastNMS.INSTANCE.field$MinecraftServer$scoreboard(); + List packets = new ObjectArrayList<>(); for (LegacyChatFormatter color : LegacyChatFormatter.values()) { - Team team = scoreboard.getTeam(TEAM_PREFIX + color.name().toLowerCase(Locale.ROOT)); - if (this.colorsInUse.contains(color)) { - if (team == null) { - team = scoreboard.registerNewTeam(TEAM_PREFIX + color.name().toLowerCase(Locale.ROOT)); - team.setColor(ChatColor.valueOf(color.name())); - } - try { - Object nmsTeam = CraftBukkitReflections.field$CraftTeam$team.get(team); - this.teamByColor.put(color, nmsTeam); - } catch (ReflectiveOperationException e) { - this.plugin.logger().warn("Could not get nms team", e); - } - } else { - if (team != null) { - team.unregister(); - } - } + String teamName = TeamManager.createTeamName(color); + Object team = FastNMS.INSTANCE.constructor$PlayerTeam(scoreboard, teamName); + FastNMS.INSTANCE.method$PlayerTeam$setColor(team, color.name()); + this.teamByColor.put(color, team); + packets.add(FastNMS.INSTANCE.method$ClientboundSetPlayerTeamPacket$createAddOrModifyPacket(team, true)); } + addTeamsPacket = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java index cc1b2fff5..f4340ffec 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -745,11 +745,6 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem if (arguments == null) return Optional.empty(); List> blockEntityElementConfigs = ResourceConfigUtils.parseConfigAsList(arguments, BlockEntityElementConfigs::fromMap); if (blockEntityElementConfigs.isEmpty()) return Optional.empty(); - for (BlockEntityElementConfig blockEntityElementConfig : blockEntityElementConfigs) { - if (blockEntityElementConfig instanceof Glowing glowing && glowing.glowColor() != null) { - AbstractBlockManager.this.plugin.teamManager().setColorInUse(glowing.glowColor()); - } - } return Optional.of(blockEntityElementConfigs.toArray(new BlockEntityElementConfig[0])); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java index 3bf2300a1..d439e8ea3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java @@ -19,7 +19,6 @@ import net.momirealms.craftengine.core.plugin.entityculling.CullingData; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.world.Glowing; import org.incendo.cloud.suggestion.Suggestion; import org.joml.Vector3f; @@ -220,13 +219,6 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { Optional optionalLootSpawnOffset = Optional.ofNullable(variantArguments.get("loot-spawn-offset")).map(it -> ResourceConfigUtils.getAsVector3f(it, "loot-spawn-offset")); List> elements = ResourceConfigUtils.parseConfigAsList(variantArguments.get("elements"), FurnitureElementConfigs::fromMap); - // 收集颜色 - for (FurnitureElementConfig element : elements) { - if (element instanceof Glowing glowing && glowing.glowColor() != null) { - AbstractFurnitureManager.this.plugin.teamManager().setColorInUse(glowing.glowColor()); - } - } - // 外部模型 Optional externalModel; if (variantArguments.containsKey("model-engine")) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java index a3659e63d..fb28c47b0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java @@ -117,11 +117,11 @@ public abstract class Furniture implements Cullable { Seat[] seats = hitbox.seats(); for (int index = 0; index < seats.length; index++) { Map> tempMap = seatMap.get(); - Vector3f seatPos = seats[i].config().position(); + Vector3f seatPos = seats[index].config().position(); if (tempMap.containsKey(seatPos)) { - seats[i] = tempMap.get(seatPos); + seats[index] = tempMap.get(seatPos); } else { - tempMap.put(seatPos, seats[i]); + tempMap.put(seatPos, seats[index]); } } hitbox.collectVirtualEntityId(virtualEntityIds::addLast); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index e2ded82df..07de2f0be 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -193,9 +193,6 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl if (settings.destroyOnDeathChance != 0) { this.featureFlag$destroyOnDeathChance = true; } - if (settings.glowColor != null) { - this.plugin.teamManager().setColorInUse(settings.glowColor); - } } return true; } 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 7083fda91..9fbf307aa 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 @@ -176,7 +176,6 @@ public abstract class CraftEngine implements Plugin { this.projectileManager.reload(); this.seatManager.reload(); this.entityCullingManager.reload(); - this.teamManager.reload(); } private void runDelayTasks(boolean reloadRecipe) { @@ -249,8 +248,6 @@ public abstract class CraftEngine implements Plugin { if (reloadRecipe) { this.recipeManager.runDelayedSyncTasks(); } - // 同步修改队伍 - this.teamManager.runDelayedSyncTasks(); long time4 = System.currentTimeMillis(); long syncTime = time4 - time3; this.reloadEventDispatcher.accept(this); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java index e193d837b..1c62a106d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -308,9 +308,19 @@ public class TranslationManagerImpl implements TranslationManager { Map bundle = new HashMap<>(); for (Map.Entry entry : section.entrySet()) { - String key = entry.getKey(); - bundle.put(key, entry.getValue().toString()); - TranslationManagerImpl.this.translationKeys.add(key); + StringBuilder key = new StringBuilder(entry.getKey()); + Object value = entry.getValue(); + for (;;) { + if (!(value instanceof Map map)) { + value = entry.getValue(); + break; + } + Map.Entry next = map.entrySet().iterator().next(); + key.append(".").append(next.getKey()); + value = next.getValue(); + } + bundle.put(key.toString(), String.valueOf(value)); + TranslationManagerImpl.this.translationKeys.add(key.toString()); this.count++; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java index c37a5eea2..bcbf5cc92 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -94,7 +94,7 @@ public class VersionHelper { COMPONENT_RELEASE = v1_20_5; - mojmap = checkMojMap(); + mojmap = checkMojMap() || v26_1; folia = checkFolia(); paper = checkPaper(); leaves = checkLeaves(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/score/TeamManager.java b/core/src/main/java/net/momirealms/craftengine/core/world/score/TeamManager.java index af772e294..357ddca95 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/score/TeamManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/score/TeamManager.java @@ -3,8 +3,15 @@ package net.momirealms.craftengine.core.world.score; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.util.LegacyChatFormatter; -public interface TeamManager extends Manageable { - String TEAM_PREFIX = "ce_"; +import java.util.Locale; - void setColorInUse(LegacyChatFormatter color); +public interface TeamManager extends Manageable { + + Object getTeamByColor(LegacyChatFormatter color); + + Object addTeamsPacket(); + + static String createTeamName(LegacyChatFormatter color) { + return "\ufeffce_" + color.name().toLowerCase(Locale.ROOT) + "\ufeff"; + } } diff --git a/gradle.properties b/gradle.properties index 7be710339..1f768e93f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ byte_buddy_version=1.18.1 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.5 -nms_helper_version=1.0.150 +nms_helper_version=1.0.151 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.38.7