9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-27 10:59:07 +00:00

Merge pull request #92 from Xiao-MoMi/dev

0.0.45.2
This commit is contained in:
XiaoMoMi
2025-04-08 03:33:32 +08:00
committed by GitHub
17 changed files with 885 additions and 77 deletions

View File

@@ -152,6 +152,19 @@ image:
chat: true
command: true
sign: true
# By intercepting packets, you are allowed to use <image:...> <shift:...> in other plugins
intercept-packets:
system-chat: true
tab-list: true
actionbar: true
title: true
bossbar: true
container: true
# TODO: toast: true
# TODO: name: true
# TODO: team: true
emoji: {}
recipe:
# Enable the plugin's recipe system

View File

@@ -323,8 +323,9 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
if (FastNMS.INSTANCE.method$CraftEntity$getHandle(shulker) instanceof CollisionEntity) {
return;
}
// not a collision entity
Byte flag = shulker.getPersistentDataContainer().get(FURNITURE_COLLISION, PersistentDataType.BYTE);
if (flag != null && flag == 1) {
if (flag == null || flag != 1) {
return;
}

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.nms.CollisionEntity;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
@@ -9,6 +8,8 @@ import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Shulker;
import org.bukkit.persistence.PersistentDataType;
import org.incendo.cloud.Command;
import java.util.Collection;
@@ -29,7 +30,7 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
try {
Collection<Entity> entities = player.getLocation().getNearbyEntities(2,2,2);
for (Entity entity : entities) {
if (FastNMS.INSTANCE.method$CraftEntity$getHandle(entity) instanceof CollisionEntity) {
if (entity instanceof Shulker) {
}
}
} catch (Exception e) {

View File

@@ -3,16 +3,24 @@ package net.momirealms.craftengine.bukkit.plugin.injector;
import com.mojang.datafixers.util.Pair;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy;
import net.bytebuddy.implementation.FieldAccessor;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.implementation.bind.annotation.This;
import net.bytebuddy.implementation.bytecode.assign.TypeCasting;
import net.bytebuddy.implementation.bytecode.member.FieldAccess;
import net.bytebuddy.implementation.bytecode.member.MethodReturn;
import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess;
import net.bytebuddy.matcher.ElementMatchers;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.BukkitBlockShape;
@@ -54,6 +62,7 @@ import java.lang.invoke.MethodType;
import java.lang.invoke.VarHandle;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -82,6 +91,8 @@ public class BukkitInjector {
private static Class<?> clazz$InjectedCacheChecker;
private static InternalFieldAccessor internalFieldAccessor;
public static void init() {
try {
// Paletted Container
@@ -149,6 +160,36 @@ public class BukkitInjector {
.getLoaded();
instance$OptimizedItemDisplayFactory = Objects.requireNonNull(ReflectionUtils.getConstructor(clazz$OptimizedItemDisplayFatory, 0)).newInstance();
// InternalFieldAccessor Interface
Class<?> internalFieldAccessorInterface = new ByteBuddy()
.makeInterface()
.name("net.momirealms.craftengine.bukkit.plugin.injector.InternalFieldAccessor")
.defineMethod("field$ClientboundMoveEntityPacket$entityId", int.class, Modifier.PUBLIC)
.withParameter(Object.class, "packet")
.withoutCode()
.make()
.load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
// Internal field accessor
FieldDescription moveEntityIdFieldDesc = new FieldDescription.ForLoadedField(Reflections.field$ClientboundMoveEntityPacket$entityId);
Class<?> clazz$InternalFieldAccessor = byteBuddy
.subclass(Object.class)
.name("net.minecraft.network.protocol.game.CraftEngineInternalFieldAccessor")
.implement(internalFieldAccessorInterface)
.method(ElementMatchers.named("field$ClientboundMoveEntityPacket$entityId"))
.intercept(new Implementation.Simple(
MethodVariableAccess.REFERENCE.loadFrom(1),
TypeCasting.to(TypeDescription.ForLoadedType.of(Reflections.clazz$ClientboundMoveEntityPacket)),
FieldAccess.forField(moveEntityIdFieldDesc).read(),
MethodReturn.INTEGER
))
.make()
.load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
internalFieldAccessor = (InternalFieldAccessor) clazz$InternalFieldAccessor.getConstructor().newInstance();
// CraftEngine Blocks
String packageWithName = BukkitInjector.class.getName();
String generatedClassName = packageWithName.substring(0, packageWithName.lastIndexOf('.')) + ".CraftEngineBlock";
DynamicType.Builder<?> builder = byteBuddy
@@ -293,6 +334,10 @@ public class BukkitInjector {
}
}
public static InternalFieldAccessor internalFieldAccessor() {
return internalFieldAccessor;
}
public static void injectCookingBlockEntity(Object entity) throws ReflectiveOperationException {
if (Reflections.clazz$AbstractFurnaceBlockEntity.isInstance(entity)) {
Object quickCheck = Reflections.field$AbstractFurnaceBlockEntity$quickCheck.get(entity);

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.injector;
public interface InternalFieldAccessor {
int field$ClientboundMoveEntityPacket$entityId(Object packet);
}

View File

@@ -46,6 +46,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
private static void registerByteBufPacketConsumer(final BiConsumer<NetWorkUser, ByteBufPacketEvent> function, int id) {
if (id == -1) return;
BYTE_BUFFER_PACKET_HANDLERS.put(id, function);
}
@@ -150,12 +151,21 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket);
registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket);
// registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket);
// registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket);
registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket());
registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket());
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(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
// registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());
// registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket());
}
public static BukkitNetworkManager instance() {

View File

@@ -14,6 +14,7 @@ import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
@@ -241,29 +242,35 @@ public class PacketConsumers {
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> OPEN_SCREEN = (user, event) -> {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> BOSS_EVENT_1_20 = (user, event) -> {
if (!Config.interceptBossBar()) return;
try {
if (VersionHelper.isVersionNewerThan1_20_3()) {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
FriendlyByteBuf buf = event.getBuffer();
UUID uuid = buf.readUUID();
int actionType = buf.readVarInt();
if (actionType == 0) {
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
Component component = AdventureHelper.jsonToComponent(json);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
float health = buf.readFloat();
int color = buf.readVarInt();
int division = buf.readVarInt();
byte flag = buf.readByte();
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} else {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
buf.writeUUID(uuid);
buf.writeVarInt(actionType);
buf.writeUtf(AdventureHelper.componentToJson(component));
buf.writeFloat(health);
buf.writeVarInt(color);
buf.writeVarInt(division);
buf.writeByte(flag);
} else if (actionType == 3) {
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
@@ -274,10 +281,348 @@ public class PacketConsumers {
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeUUID(uuid);
buf.writeVarInt(actionType);
buf.writeUtf(AdventureHelper.componentToJson(component));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> BOSS_EVENT_1_20_3 = (user, event) -> {
if (!Config.interceptBossBar()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
UUID uuid = buf.readUUID();
int actionType = buf.readVarInt();
if (actionType == 0) {
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
float health = buf.readFloat();
int color = buf.readVarInt();
int division = buf.readVarInt();
byte flag = buf.readByte();
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeUUID(uuid);
buf.writeVarInt(actionType);
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
buf.writeFloat(health);
buf.writeVarInt(color);
buf.writeVarInt(division);
buf.writeByte(flag);
} else if (actionType == 3) {
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeUUID(uuid);
buf.writeVarInt(actionType);
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SYSTEM_CHAT_1_20 = (user, event) -> {
if (!Config.interceptSystemChat()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
boolean overlay = buf.readBoolean();
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
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(AdventureHelper.componentToJson(component));
buf.writeBoolean(overlay);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SYSTEM_CHAT_1_20_3 = (user, event) -> {
if (!Config.interceptSystemChat()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
boolean overlay = buf.readBoolean();
event.setChanged(true);
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
buf.writeBoolean(overlay);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_SUBTITLE_TEXT_1_20 = (user, event) -> {
if (!Config.interceptTitle()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
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(AdventureHelper.componentToJson(component));
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_SUBTITLE_TEXT_1_20_3 = (user, event) -> {
if (!Config.interceptTitle()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_TITLE_TEXT_1_20 = (user, event) -> {
if (!Config.interceptTitle()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
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(AdventureHelper.componentToJson(component));
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_TITLE_TEXT_1_20_3 = (user, event) -> {
if (!Config.interceptTitle()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ACTIONBAR_TEXT_1_20 = (user, event) -> {
if (!Config.interceptActionBar()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
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(AdventureHelper.componentToJson(component));
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ACTIONBAR_TEXT_1_20_3 = (user, event) -> {
if (!Config.interceptActionBar()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> TAB_LIST_1_20 = (user, event) -> {
if (!Config.interceptTabList()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
String json1 = buf.readUtf();
String json2 = buf.readUtf();
Map<String, String> tokens1 = CraftEngine.instance().imageManager().matchTags(json1);
Map<String, String> tokens2 = CraftEngine.instance().imageManager().matchTags(json2);
if (tokens1.isEmpty() && tokens2.isEmpty()) return;
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
if (!tokens1.isEmpty()) {
Component component = AdventureHelper.jsonToComponent(json1);
for (Map.Entry<String, String> token : tokens1.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeUtf(AdventureHelper.componentToJson(component));
} else {
buf.writeUtf(json1);
}
if (!tokens2.isEmpty()) {
Component component = AdventureHelper.jsonToComponent(json2);
for (Map.Entry<String, String> token : tokens2.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeUtf(AdventureHelper.componentToJson(component));
} else {
buf.writeUtf(json2);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> TAB_LIST_1_20_3 = (user, event) -> {
if (!Config.interceptTabList()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
Tag nbt1 = buf.readNbt(false);
if (nbt1 == null) return;
Tag nbt2 = buf.readNbt(false);
if (nbt2 == null) return;
Map<String, String> tokens1 = CraftEngine.instance().imageManager().matchTags(nbt1.getAsString());
Map<String, String> tokens2 = CraftEngine.instance().imageManager().matchTags(nbt2.getAsString());
if (tokens1.isEmpty() && tokens2.isEmpty()) return;
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
if (!tokens1.isEmpty()) {
Component component = NBTComponentSerializer.nbt().deserialize(nbt1);
for (Map.Entry<String, String> token : tokens1.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} else {
buf.writeNbt(nbt1, false);
}
if (!tokens2.isEmpty()) {
Component component = NBTComponentSerializer.nbt().deserialize(nbt2);
for (Map.Entry<String, String> token : tokens2.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} else {
buf.writeNbt(nbt2, false);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> OPEN_SCREEN_1_20 = (user, event) -> {
if (!Config.interceptContainer()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
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.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeUtf(AdventureHelper.componentToJson(component));
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> OPEN_SCREEN_1_20_3 = (user, event) -> {
if (!Config.interceptContainer()) return;
try {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
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.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
}
@@ -655,18 +1000,55 @@ public class PacketConsumers {
Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack));
}
// TODO USE bytebuffer
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> ADD_ENTITY_BYTEBUFFER = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
int id = buf.readVarInt();
UUID uuid = buf.readUUID();
int type = buf.readVarInt();
double x = buf.readDouble();
double y = buf.readDouble();
double z = buf.readDouble();
byte xRot = buf.readByte();
byte yRot = buf.readByte();
byte yHeadRot = buf.readByte();
int data = buf.readVarInt();
int xa = buf.readShort();
int ya = buf.readShort();
int za = buf.readShort();
// Falling blocks
if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) {
int remapped = remap(data);
if (remapped != data) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(id);
buf.writeUUID(uuid);
buf.writeVarInt(type);
buf.writeDouble(x);
buf.writeDouble(y);
buf.writeDouble(z);
buf.writeByte(xRot);
buf.writeByte(yRot);
buf.writeByte(yHeadRot);
buf.writeVarInt(remapped);
buf.writeShort(xa);
buf.writeShort(ya);
buf.writeShort(za);
}
} else if (type == Reflections.instance$EntityType$BLOCK_DISPLAY$registryId) {
user.entityView().put(id, Reflections.instance$EntityType$BLOCK_DISPLAY);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> ADD_ENTITY = (user, event, packet) -> {
try {
Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet);
// Falling blocks
if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) {
int data = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$data(packet);
int remapped = remap(data);
if (remapped != data) {
Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped);
}
} else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) {
if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) {
// Furniture
int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet);
LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId);
@@ -684,9 +1066,6 @@ public class PacketConsumers {
if (furniture != null) {
event.setCancelled(true);
}
} else if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet);
user.entityView().put(entityId, entityType);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e);
@@ -694,10 +1073,9 @@ public class PacketConsumers {
};
// 1.21.3+
// TODO USE bytebuffer
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SYNC_ENTITY_POSITION = (user, event, packet) -> {
try {
int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet);
int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet);
if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) {
event.setCancelled(true);
}
@@ -706,10 +1084,9 @@ public class PacketConsumers {
}
};
// TODO USE bytebuffer
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> MOVE_ENTITY = (user, event, packet) -> {
try {
int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet);
int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet);
if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) {
event.setCancelled(true);
}
@@ -1001,6 +1378,7 @@ public class PacketConsumers {
);
user.nettyChannel().writeAndFlush(kickPacket);
user.nettyChannel().disconnect();
return;
}
user.setClientModState(true);
}
@@ -1009,38 +1387,84 @@ public class PacketConsumers {
}
};
// TODO 使用bytebuffer
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_ENTITY_DATA = (user, event, packet) -> {
// try {
// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet);
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// List<Object> packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// break;
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// TODO 需要修复
// @SuppressWarnings("unchecked")
// public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ENTITY_DATA = (user, event) -> {
// try {
// FriendlyByteBuf buf = event.getBuffer();
// int id = buf.readVarInt();
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// Object registryFriendlyByteBuf = FastNMS.INSTANCE.constructor$RegistryFriendlyByteBuf(buf, Reflections.instance$registryAccess);
// boolean isChanged = false;
// List<Object> packedItems = (List<Object>) Reflections.method$ClientboundSetEntityDataPacket$unpack.invoke(null, registryFriendlyByteBuf);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// isChanged = true;
// break;
// }
// if (isChanged) {
// System.out.println("Changed");
// event.setChanged(true);
// buf.clear();
// buf.writeVarInt(event.packetID());
// Reflections.method$ClientboundSetEntityDataPacket$pack.invoke(null, packedItems, registryFriendlyByteBuf);
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// 之前的旧东西经供参考需要改成使用bytebuffer的
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_ENTITY_DATA = (user, event, packet) -> {
// try {
// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet);
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// List<Object> packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// break;
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> OPEN_SCREEN = (user, event, packet) -> {
// try {

View File

@@ -13,4 +13,22 @@ public interface PacketIds {
int clientboundAddEntityPacket();
int clientboundOpenScreenPacket();
int clientboundSoundPacket();
int clientboundRemoveEntitiesPacket();
int clientboundSetEntityDataPacket();
int clientboundSetTitleTextPacket();
int clientboundSetSubtitleTextPacket();
int clientboundSetActionBarTextPacket();
int clientboundBossEventPacket();
int clientboundSystemChatPacket();
int clientboundTabListPacket();
}

View File

@@ -28,6 +28,6 @@ public class PacketIdFinder {
}
public static int clientboundByName(String packetName) {
return gamePacketIds.get("clientbound").get(packetName);
return gamePacketIds.get("clientbound").getOrDefault(packetName, -1);
}
}

View File

@@ -33,4 +33,49 @@ public class PacketIds1_20 implements PacketIds {
public int clientboundOpenScreenPacket() {
return 48;
}
@Override
public int clientboundSoundPacket() {
return 98;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 62;
}
@Override
public int clientboundSetEntityDataPacket() {
return 82;
}
@Override
public int clientboundSetTitleTextPacket() {
return 95;
}
@Override
public int clientboundSetSubtitleTextPacket() {
return 93;
}
@Override
public int clientboundSetActionBarTextPacket() {
return 70;
}
@Override
public int clientboundBossEventPacket() {
return 11;
}
@Override
public int clientboundSystemChatPacket() {
return 100;
}
@Override
public int clientboundTabListPacket() {
return 101;
}
}

View File

@@ -33,4 +33,49 @@ public class PacketIds1_20_2 implements PacketIds {
public int clientboundOpenScreenPacket() {
return 49;
}
@Override
public int clientboundSoundPacket() {
return 100;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 64;
}
@Override
public int clientboundSetEntityDataPacket() {
return 84;
}
@Override
public int clientboundSetTitleTextPacket() {
return 97;
}
@Override
public int clientboundSetSubtitleTextPacket() {
return 95;
}
@Override
public int clientboundSetActionBarTextPacket() {
return 72;
}
@Override
public int clientboundBossEventPacket() {
return 10;
}
@Override
public int clientboundSystemChatPacket() {
return 103;
}
@Override
public int clientboundTabListPacket() {
return 104;
}
}

View File

@@ -33,4 +33,49 @@ public class PacketIds1_20_3 implements PacketIds {
public int clientboundOpenScreenPacket() {
return 49;
}
@Override
public int clientboundSoundPacket() {
return 102;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 64;
}
@Override
public int clientboundSetEntityDataPacket() {
return 86;
}
@Override
public int clientboundSetTitleTextPacket() {
return 99;
}
@Override
public int clientboundSetSubtitleTextPacket() {
return 97;
}
@Override
public int clientboundSetActionBarTextPacket() {
return 74;
}
@Override
public int clientboundBossEventPacket() {
return 10;
}
@Override
public int clientboundSystemChatPacket() {
return 105;
}
@Override
public int clientboundTabListPacket() {
return 106;
}
}

View File

@@ -33,4 +33,49 @@ public class PacketIds1_20_5 implements PacketIds {
public int clientboundOpenScreenPacket() {
return 51;
}
@Override
public int clientboundSoundPacket() {
return 104;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 66;
}
@Override
public int clientboundSetEntityDataPacket() {
return 88;
}
@Override
public int clientboundSetTitleTextPacket() {
return 101;
}
@Override
public int clientboundSetSubtitleTextPacket() {
return 99;
}
@Override
public int clientboundSetActionBarTextPacket() {
return 76;
}
@Override
public int clientboundBossEventPacket() {
return 10;
}
@Override
public int clientboundSystemChatPacket() {
return 108;
}
@Override
public int clientboundTabListPacket() {
return 109;
}
}

View File

@@ -33,4 +33,49 @@ public class PacketIds1_21 implements PacketIds {
public int clientboundOpenScreenPacket() {
return PacketIdFinder.clientboundByName("minecraft:open_screen");
}
@Override
public int clientboundSoundPacket() {
return PacketIdFinder.clientboundByName("minecraft:sound");
}
@Override
public int clientboundRemoveEntitiesPacket() {
return PacketIdFinder.clientboundByName("minecraft:remove_entities");
}
@Override
public int clientboundSetEntityDataPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_entity_data");
}
@Override
public int clientboundSetTitleTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_title_text");
}
@Override
public int clientboundSetSubtitleTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_subtitle_text");
}
@Override
public int clientboundSetActionBarTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_action_bar_text");
}
@Override
public int clientboundBossEventPacket() {
return PacketIdFinder.clientboundByName("minecraft:boss_event");
}
@Override
public int clientboundSystemChatPacket() {
return PacketIdFinder.clientboundByName("minecraft:system_chat");
}
@Override
public int clientboundTabListPacket() {
return PacketIdFinder.clientboundByName("minecraft:tab_list");
}
}

View File

@@ -6264,4 +6264,33 @@ public class Reflections {
public static final Field field$ClientInformation$particleStatus = Optional.ofNullable(clazz$ClientInformation)
.map(it -> ReflectionUtils.getDeclaredField(it, 8))
.orElse(null);
public static final Method method$Registry$getId = requireNonNull(
ReflectionUtils.getMethod(clazz$Registry, int.class, Object.class)
);
public static final int instance$EntityType$BLOCK_DISPLAY$registryId;
public static final int instance$EntityType$FALLING_BLOCK$registryId;
static {
try {
instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$BLOCK_DISPLAY);
instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$FALLING_BLOCK);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 先注释后面再说
// public static final Method method$ClientboundSetEntityDataPacket$pack = requireNonNull(
// ReflectionUtils.getDeclaredMethod(
// clazz$ClientboundSetEntityDataPacket, void.class, List.class, clazz$RegistryFriendlyByteBuf
// )
// );
//
// public static final Method method$ClientboundSetEntityDataPacket$unpack = requireNonNull(
// ReflectionUtils.getDeclaredMethod(
// clazz$ClientboundSetEntityDataPacket, List.class, clazz$RegistryFriendlyByteBuf
// )
// );
}

View File

@@ -122,6 +122,12 @@ public class Config {
protected boolean image$illegal_characters_filter$anvil;
protected boolean image$illegal_characters_filter$sign;
protected boolean image$illegal_characters_filter$book;
protected boolean image$intercept_packets$system_chat;
protected boolean image$intercept_packets$tab_list;
protected boolean image$intercept_packets$actionbar;
protected boolean image$intercept_packets$title;
protected boolean image$intercept_packets$bossbar;
protected boolean image$intercept_packets$container;
public Config(CraftEngine plugin) {
this.plugin = plugin;
@@ -278,6 +284,12 @@ public class Config {
image$illegal_characters_filter$chat = config.getBoolean("image.illegal-characters-filter.chat", true);
image$illegal_characters_filter$command = config.getBoolean("image.illegal-characters-filter.command", true);
image$illegal_characters_filter$sign = config.getBoolean("image.illegal-characters-filter.sign", true);
image$intercept_packets$system_chat = config.getBoolean("image.intercept-packets.system-chat", true);
image$intercept_packets$tab_list = config.getBoolean("image.intercept-packets.tab-list", true);
image$intercept_packets$actionbar = config.getBoolean("image.intercept-packets.actionbar", true);
image$intercept_packets$title = config.getBoolean("image.intercept-packets.title", true);
image$intercept_packets$bossbar = config.getBoolean("image.intercept-packets.bossbar", true);
image$intercept_packets$container = config.getBoolean("image.intercept-packets.container", true);
Class<?> modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS);
if (modClazz != null) {
@@ -578,6 +590,30 @@ public class Config {
return id;
}
public static boolean interceptSystemChat() {
return instance.image$intercept_packets$system_chat;
}
public static boolean interceptTabList() {
return instance.image$intercept_packets$tab_list;
}
public static boolean interceptActionBar() {
return instance.image$intercept_packets$actionbar;
}
public static boolean interceptTitle() {
return instance.image$intercept_packets$title;
}
public static boolean interceptBossBar() {
return instance.image$intercept_packets$bossbar;
}
public static boolean interceptContainer() {
return instance.image$intercept_packets$container;
}
public YamlDocument loadOrCreateYamlData(String fileName) {
File file = new File(this.plugin.dataFolderFile(), fileName);
if (!file.exists()) {

View File

@@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx1G
# Project settings
# Rule: [major update].[feature update].[bug fix]
project_version=0.0.45
config_version=22
project_version=0.0.46
config_version=23
lang_version=4
project_group=net.momirealms
latest_supported_version=1.21.5
@@ -40,7 +40,7 @@ lz4_version=1.8.0
geantyref_version=1.3.16
zstd_version=1.5.7-2
commons_io_version=2.18.0
sparrow_nbt_version=0.4.6
sparrow_nbt_version=0.5
sparrow_util_version=0.37
fastutil_version=8.5.15
netty_version=4.1.119.Final
@@ -51,7 +51,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.13
nms_helper_version=0.43
nms_helper_version=0.45
# Ignite Dependencies
mixinextras_version=0.4.1
mixin_version=0.15.2+mixin.0.8.7