9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

添加scoreboard拦截

This commit is contained in:
XiaoMoMi
2025-04-09 00:36:37 +08:00
parent 099c5126e5
commit 00be0195aa
8 changed files with 156 additions and 0 deletions

View File

@@ -161,6 +161,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket());
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.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
// registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());

View File

@@ -498,6 +498,134 @@ public class PacketConsumers {
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_OBJECTIVE_1_20 = (user, event) -> {
if (!Config.interceptSystemChat()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String objective = buf.readUtf();
byte mode = buf.readByte();
if (mode != 0 && mode != 2) return;
String displayName = buf.readUtf();
int renderType = buf.readVarInt();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(displayName);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(displayName);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUtf(objective);
buf.writeByte(mode);
buf.writeUtf(AdventureHelper.componentToJson(component));
buf.writeVarInt(renderType);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetObjectivePacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_OBJECTIVE_1_20_3 = (user, event) -> {
if (!Config.interceptSystemChat()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String objective = buf.readUtf();
byte mode = buf.readByte();
if (mode != 0 && mode != 2) return;
Tag displayName = buf.readNbt(false);
if (displayName == null) return;
int renderType = buf.readVarInt();
boolean optionalNumberFormat = buf.readBoolean();
if (optionalNumberFormat) {
int format = buf.readVarInt();
if (format == 0) {
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.tagToComponent(displayName);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUtf(objective);
buf.writeByte(mode);
buf.writeNbt(AdventureHelper.componentToTag(component), false);
buf.writeVarInt(renderType);
buf.writeBoolean(true);
buf.writeVarInt(0);
} else if (format == 1) {
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString());
if (tokens.isEmpty()) return;
Tag style = buf.readNbt(false);
event.setChanged(true);
Component component = AdventureHelper.tagToComponent(displayName);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUtf(objective);
buf.writeByte(mode);
buf.writeNbt(AdventureHelper.componentToTag(component), false);
buf.writeVarInt(renderType);
buf.writeBoolean(true);
buf.writeVarInt(1);
buf.writeNbt(style, false);
} else if (format == 2) {
Tag fixed = buf.readNbt(false);
if (fixed == null) return;
Map<String, String> tokens1 = CraftEngine.instance().imageManager().matchTags(displayName.getAsString());
Map<String, String> tokens2 = CraftEngine.instance().imageManager().matchTags(fixed.getAsString());
if (tokens1.isEmpty() && tokens2.isEmpty()) return;
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUtf(objective);
buf.writeByte(mode);
if (!tokens1.isEmpty()) {
Component component = AdventureHelper.tagToComponent(displayName);
for (Map.Entry<String, String> token : tokens1.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeNbt(AdventureHelper.componentToTag(component), false);
} else {
buf.writeNbt(displayName, false);
}
buf.writeVarInt(renderType);
buf.writeBoolean(true);
buf.writeVarInt(2);
if (!tokens2.isEmpty()) {
Component component = AdventureHelper.tagToComponent(fixed);
for (Map.Entry<String, String> token : tokens2.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeNbt(AdventureHelper.componentToTag(component), false);
} else {
buf.writeNbt(fixed, false);
}
}
} else {
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.tagToComponent(displayName);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUtf(objective);
buf.writeByte(mode);
buf.writeNbt(AdventureHelper.componentToTag(component), false);
buf.writeVarInt(renderType);
buf.writeBoolean(false);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetObjectivePacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SYSTEM_CHAT_1_20 = (user, event) -> {
if (!Config.interceptSystemChat()) return;
try {

View File

@@ -33,4 +33,6 @@ public interface PacketIds {
int clientboundTabListPacket();
int clientboundSetPlayerTeamPacket();
int clientboundSetObjectivePacket();
}

View File

@@ -83,4 +83,9 @@ public class PacketIds1_20 implements PacketIds {
public int clientboundSetPlayerTeamPacket() {
return 90;
}
@Override
public int clientboundSetObjectivePacket() {
return 88;
}
}

View File

@@ -83,4 +83,9 @@ public class PacketIds1_20_2 implements PacketIds {
public int clientboundSetPlayerTeamPacket() {
return 92;
}
@Override
public int clientboundSetObjectivePacket() {
return 90;
}
}

View File

@@ -83,4 +83,9 @@ public class PacketIds1_20_3 implements PacketIds {
public int clientboundSetPlayerTeamPacket() {
return 94;
}
@Override
public int clientboundSetObjectivePacket() {
return 92;
}
}

View File

@@ -83,4 +83,9 @@ public class PacketIds1_20_5 implements PacketIds {
public int clientboundSetPlayerTeamPacket() {
return 96;
}
@Override
public int clientboundSetObjectivePacket() {
return 94;
}
}

View File

@@ -83,4 +83,9 @@ public class PacketIds1_21 implements PacketIds {
public int clientboundSetPlayerTeamPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_player_team");
}
@Override
public int clientboundSetObjectivePacket() {
return PacketIdFinder.clientboundByName("minecraft:set_objective");
}
}