mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-31 04:46:37 +00:00
优化tags更新
This commit is contained in:
@@ -150,7 +150,7 @@ public final class BukkitBlockManager extends AbstractBlockManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void resendTags() {
|
||||
protected void updateTags() {
|
||||
// if there's no change
|
||||
if (this.clientBoundTags.equals(this.previousClientBoundTags)) return;
|
||||
List<TagUtils.TagEntry> list = new ArrayList<>();
|
||||
@@ -158,10 +158,6 @@ public final class BukkitBlockManager extends AbstractBlockManager {
|
||||
list.add(new TagUtils.TagEntry(entry.getKey(), entry.getValue()));
|
||||
}
|
||||
this.cachedUpdateTags = list;
|
||||
Object packet = TagUtils.createUpdateTagsPacket(Map.of(MRegistries.BLOCK, list));
|
||||
for (BukkitServerPlayer player : this.plugin.networkManager().onlineUsers()) {
|
||||
player.sendPacket(packet, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -241,6 +241,19 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
|
||||
this.c2sGamePacketListeners[id] = new ByteBufferPacketListenerHolder(name, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delayedLoad() {
|
||||
this.resendTags();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void resendTags() {
|
||||
Object packet = TagUtils.createUpdateTagsPacket(Map.of(MRegistries.BLOCK, BukkitBlockManager.instance().cachedUpdateTags()), FastNMS.INSTANCE.method$TagNetworkSerialization$serializeTagsToNetwork());
|
||||
for (BukkitServerPlayer player : onlineUsers()) {
|
||||
player.sendPacket(packet, false);
|
||||
}
|
||||
}
|
||||
|
||||
public void addFakePlayer(Player player) {
|
||||
FakeBukkitServerPlayer fakePlayer = new FakeBukkitServerPlayer(this.plugin);
|
||||
fakePlayer.setPlayer(player);
|
||||
@@ -1862,13 +1875,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
|
||||
public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) {
|
||||
List<TagUtils.TagEntry> cachedUpdateTags = BukkitBlockManager.instance().cachedUpdateTags();
|
||||
if (cachedUpdateTags.isEmpty()) return;
|
||||
Map<Object, Object> tags;
|
||||
try {
|
||||
tags = (Map<Object, Object>) NetworkReflections.field$ClientboundUpdateTagsPacket$tags.get(packet);
|
||||
} catch (Throwable e) {
|
||||
CraftEngine.instance().logger().warn("Failed to get tags from ClientboundUpdateTagsPacket", e);
|
||||
return;
|
||||
}
|
||||
Map<Object, Object> tags = FastNMS.INSTANCE.field$ClientboundUpdateTagsPacket$tags(packet);
|
||||
// 已经替换过了
|
||||
if (tags instanceof MarkedHashMap<Object, Object>) return;
|
||||
// 需要虚假的block
|
||||
if (tags.get(MRegistries.BLOCK) == null) return;
|
||||
event.replacePacket(TagUtils.createUpdateTagsPacket(Map.of(MRegistries.BLOCK, cachedUpdateTags), tags));
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
||||
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
|
||||
import net.momirealms.craftengine.core.util.MarkedHashMap;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -15,6 +16,9 @@ public final class TagUtils {
|
||||
|
||||
private TagUtils() {}
|
||||
|
||||
public record TagEntry(int id, List<String> tags) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建模拟标签更新数据包(用于向客户端添加虚拟标签)
|
||||
*
|
||||
@@ -39,57 +43,8 @@ public final class TagUtils {
|
||||
*
|
||||
* @return 可发送给客户端的 ClientboundUpdateTagsPacket 数据包对象
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Object createUpdateTagsPacket(Map<Object, List<TagEntry>> tags) {
|
||||
Map<Object, Object> registriesNetworkPayload = (Map<Object, Object>) FastNMS.INSTANCE.method$TagNetworkSerialization$serializeTagsToNetwork();
|
||||
Map<Object, Object> modified = new HashMap<>();
|
||||
for (Map.Entry<Object, Object> payload : registriesNetworkPayload.entrySet()) {
|
||||
List<TagEntry> overrides = tags.get(payload.getKey());
|
||||
if (overrides == null || overrides.isEmpty()) {
|
||||
modified.put(payload.getKey(), payload.getValue());
|
||||
continue;
|
||||
}
|
||||
FriendlyByteBuf deserializeBuf = new FriendlyByteBuf(Unpooled.buffer());
|
||||
FastNMS.INSTANCE.method$TagNetworkSerialization$NetworkPayload$write(payload.getValue(), deserializeBuf);
|
||||
Map<String, IntList> originalTags = deserializeBuf.readMap(
|
||||
FriendlyByteBuf::readUtf,
|
||||
FriendlyByteBuf::readIntIdList
|
||||
);
|
||||
Map<Integer, List<String>> reversedTags = new HashMap<>();
|
||||
for (Map.Entry<String, IntList> tagEntry : originalTags.entrySet()) {
|
||||
for (int id : tagEntry.getValue()) {
|
||||
reversedTags.computeIfAbsent(id, k -> new ArrayList<>()).add(tagEntry.getKey());
|
||||
}
|
||||
}
|
||||
for (TagEntry tagEntry : overrides) {
|
||||
reversedTags.remove(tagEntry.id);
|
||||
for (String tag : tagEntry.tags) {
|
||||
reversedTags.computeIfAbsent(tagEntry.id, k -> new ArrayList<>()).add(tag);
|
||||
}
|
||||
}
|
||||
Map<String, IntList> processedTags = new HashMap<>();
|
||||
for (Map.Entry<Integer, List<String>> tagEntry : reversedTags.entrySet()) {
|
||||
for (String tag : tagEntry.getValue()) {
|
||||
processedTags.computeIfAbsent(tag, k -> new IntArrayList()).addLast(tagEntry.getKey());
|
||||
}
|
||||
}
|
||||
FriendlyByteBuf serializeBuf = new FriendlyByteBuf(Unpooled.buffer());
|
||||
serializeBuf.writeMap(processedTags,
|
||||
FriendlyByteBuf::writeUtf,
|
||||
FriendlyByteBuf::writeIntIdList
|
||||
);
|
||||
Object mergedPayload = FastNMS.INSTANCE.method$TagNetworkSerialization$NetworkPayload$read(serializeBuf);
|
||||
modified.put(payload.getKey(), mergedPayload);
|
||||
}
|
||||
return FastNMS.INSTANCE.constructor$ClientboundUpdateTagsPacket(modified);
|
||||
}
|
||||
|
||||
public record TagEntry(int id, List<String> tags) {
|
||||
}
|
||||
|
||||
|
||||
public static Object createUpdateTagsPacket(Map<Object, List<TagEntry>> tags, Map<Object, Object> existingTags) {
|
||||
Map<Object, Object> modified = new HashMap<>();
|
||||
Map<Object, Object> modified = new MarkedHashMap<>();
|
||||
for (Map.Entry<Object, Object> payload : existingTags.entrySet()) {
|
||||
List<TagEntry> overrides = tags.get(payload.getKey());
|
||||
if (overrides == null || overrides.isEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user