9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

初步重构网络管理结构

This commit is contained in:
Xiao-MoMi
2025-09-18 23:50:08 +08:00
parent b8fb2d1201
commit 2f1ec1ee69
18 changed files with 3236 additions and 3041 deletions

View File

@@ -10,7 +10,7 @@ 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.injector.BlockGenerator;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks;
@@ -102,7 +102,7 @@ public final class BukkitBlockManager extends AbstractBlockManager {
}
this.stateId2ImmutableBlockStates = new ImmutableBlockState[this.customBlockCount];
Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.INSTANCE.defaultState());
this.resetPacketConsumers();
this.resetPacketListeners();
}
@Override
@@ -149,7 +149,7 @@ public final class BukkitBlockManager extends AbstractBlockManager {
@Override
public void delayedLoad() {
this.resetPacketConsumers();
this.resetPacketListeners();
super.delayedLoad();
}
@@ -263,14 +263,14 @@ public final class BukkitBlockManager extends AbstractBlockManager {
holder.bindValue(emptyBlock);
}
private void resetPacketConsumers() {
private void resetPacketListeners() {
Map<Integer, Integer> finalMapping = new HashMap<>(this.blockAppearanceMapper);
int stoneId = BlockStateUtils.blockStateToId(MBlocks.STONE$defaultState);
for (int custom : this.internalId2StateId.values()) {
finalMapping.put(custom, stoneId);
}
finalMapping.putAll(this.tempBlockAppearanceConvertor);
PacketConsumers.initBlocks(finalMapping, RegistryUtils.currentBlockRegistrySize());
BukkitNetworkManager.instance().registerBlockStatePacketListeners(finalMapping, RegistryUtils.currentBlockRegistrySize());
}
private void initVanillaRegistry() {

View File

@@ -20,12 +20,10 @@ import net.momirealms.craftengine.bukkit.plugin.command.BukkitSenderFactory;
import net.momirealms.craftengine.bukkit.plugin.gui.BukkitGuiManager;
import net.momirealms.craftengine.bukkit.plugin.injector.*;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.scheduler.BukkitSchedulerAdapter;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.sound.BukkitSoundManager;
import net.momirealms.craftengine.bukkit.util.EventUtils;
import net.momirealms.craftengine.bukkit.util.RegistryUtils;
import net.momirealms.craftengine.bukkit.world.BukkitWorldManager;
import net.momirealms.craftengine.core.item.ItemManager;
import net.momirealms.craftengine.core.plugin.CraftEngine;
@@ -146,8 +144,8 @@ public class BukkitCraftEngine extends CraftEngine {
throw new InjectionException("Error initializing ProtectedFieldVisitor", e);
}
super.onPluginLoad();
super.blockManager.init();
super.networkManager = new BukkitNetworkManager(this);
super.blockManager.init();
super.itemManager = new BukkitItemManager(this);
this.successfullyLoaded = true;
super.compatibilityManager().onLoad();
@@ -191,7 +189,6 @@ public class BukkitCraftEngine extends CraftEngine {
BukkitItemBehaviors.init();
BukkitHitBoxTypes.init();
BukkitBlockEntityElementConfigs.init();
PacketConsumers.initEntities(RegistryUtils.currentEntityTypeRegistrySize());
super.packManager = new BukkitPackManager(this);
super.senderFactory = new BukkitSenderFactory(this);
super.recipeManager = new BukkitRecipeManager(this);

View File

@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.entity.data.BaseEntityData;
import net.momirealms.craftengine.bukkit.entity.data.BlockDisplayEntityData;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.entity.player.Player;
@@ -36,12 +36,7 @@ public class BlockDisplayPacketHandler implements EntityPacketHandler {
if (entityDataId == BlockDisplayEntityData.DisplayedBlock.id()) {
Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
int stateId = BlockStateUtils.blockStateToId(blockState);
int newStateId;
if (!user.clientModEnabled()) {
newStateId = PacketConsumers.remap(stateId);
} else {
newStateId = PacketConsumers.remapMOD(stateId);
}
int newStateId= BukkitNetworkManager.instance().remapBlockState(stateId, user.clientModEnabled());
if (newStateId == stateId) continue;
Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(

View File

@@ -41,7 +41,7 @@ public class CommonItemPacketHandler implements EntityPacketHandler {
continue;
}
ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, (BukkitServerPlayer) user);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, user);
if (optional.isEmpty()) continue;
isChanged = true;
itemStack = optional.get();

View File

@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.entity.data.BaseEntityData;
import net.momirealms.craftengine.bukkit.entity.data.EnderManData;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.entity.player.Player;
@@ -38,12 +38,7 @@ public class EndermanPacketHandler implements EntityPacketHandler {
Optional<Object> blockState = (Optional<Object>) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
if (blockState.isEmpty()) continue;
int stateId = BlockStateUtils.blockStateToId(blockState.get());
int newStateId;
if (!user.clientModEnabled()) {
newStateId = PacketConsumers.remap(stateId);
} else {
newStateId = PacketConsumers.remapMOD(stateId);
}
int newStateId = BukkitNetworkManager.instance().remapBlockState(stateId, user.clientModEnabled());
if (newStateId == stateId) continue;
Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(

View File

@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.entity.data.AbstractMinecartData;
import net.momirealms.craftengine.bukkit.entity.data.BaseEntityData;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.entity.player.Player;
@@ -79,12 +79,7 @@ public class MinecartPacketHandler implements EntityPacketHandler {
Optional<Object> blockState = (Optional<Object>) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
if (blockState.isEmpty()) return null;
int stateId = BlockStateUtils.blockStateToId(blockState.get());
int newStateId;
if (!user.clientModEnabled()) {
newStateId = PacketConsumers.remap(stateId);
} else {
newStateId = PacketConsumers.remapMOD(stateId);
}
int newStateId = BukkitNetworkManager.instance().remapBlockState(stateId, user.clientModEnabled());
if (newStateId == stateId) return null;
Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
return FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
@@ -100,12 +95,7 @@ public class MinecartPacketHandler implements EntityPacketHandler {
public Object handle(NetWorkUser user, Object packedItem, int entityDataId) {
if (entityDataId != AbstractMinecartData.DisplayBlock.id()) return null;
int stateId = (int) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
int newStateId;
if (!user.clientModEnabled()) {
newStateId = PacketConsumers.remap(stateId);
} else {
newStateId = PacketConsumers.remapMOD(stateId);
}
int newStateId = BukkitNetworkManager.instance().remapBlockState(stateId, user.clientModEnabled());
if (newStateId == stateId) return null;
Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
return FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, newStateId);

View File

@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.entity.data.BaseEntityData;
import net.momirealms.craftengine.bukkit.entity.data.PrimedTntData;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.entity.player.Player;
@@ -36,12 +36,7 @@ public class PrimedTNTPacketHandler implements EntityPacketHandler {
if (entityDataId == PrimedTntData.BlockState.id()) {
Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
int stateId = BlockStateUtils.blockStateToId(blockState);
int newStateId;
if (!user.clientModEnabled()) {
newStateId = PacketConsumers.remap(stateId);
} else {
newStateId = PacketConsumers.remapMOD(stateId);
}
int newStateId = BukkitNetworkManager.instance().remapBlockState(stateId, user.clientModEnabled());
if (newStateId == stateId) continue;
Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(

View File

@@ -1,75 +0,0 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import com.google.gson.JsonElement;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.VersionHelper;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class PacketIdFinder {
private static final Map<String, Map<String, Integer>> gamePacketIdsByName = new HashMap<>();
private static final Map<String, Map<Class<?>, Integer>> gamePacketIdsByClazz = new HashMap<>();
private static final int maxC2SPacketId;
private static final int maxS2CPacketId;
static {
try {
if (VersionHelper.isOrAbove1_21()) {
Object packetReport = CoreReflections.constructor$PacketReport.newInstance((Object) null);
JsonElement jsonElement = (JsonElement) CoreReflections.method$PacketReport$serializePackets.invoke(packetReport);
JsonElement play = jsonElement.getAsJsonObject().get("play");
for (Map.Entry<String, JsonElement> entry : play.getAsJsonObject().entrySet()) {
Map<String, Integer> ids = new HashMap<>();
gamePacketIdsByName.put(entry.getKey(), ids);
for (var entry2 : entry.getValue().getAsJsonObject().entrySet()) {
ids.put(entry2.getKey(), entry2.getValue().getAsJsonObject().get("protocol_id").getAsInt());
}
}
} else if (VersionHelper.isOrAbove1_20_5()) {
gamePacketIdsByName.putAll(FastNMS.INSTANCE.gamePacketIdsByName());
} else {
gamePacketIdsByClazz.putAll(FastNMS.INSTANCE.gamePacketIdsByClazz());
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to get packets", e);
}
maxS2CPacketId = calculateMaxId("clientbound");
maxC2SPacketId = calculateMaxId("serverbound");
}
private static int calculateMaxId(String direction) {
if (VersionHelper.isOrAbove1_20_5()) {
return gamePacketIdsByName.getOrDefault(direction, Collections.emptyMap()).size();
} else {
return gamePacketIdsByClazz.getOrDefault(direction, Collections.emptyMap()).size();
}
}
public static int c2sGamePackets() {
return maxC2SPacketId;
}
public static int s2cGamePackets() {
return maxS2CPacketId;
}
public static int clientboundByName(String packetName) {
return gamePacketIdsByName.get("clientbound").getOrDefault(packetName, -1);
}
public static int clientboundByClazz(Class<?> clazz) {
return gamePacketIdsByClazz.get("clientbound").getOrDefault(clazz, -1);
}
public static int serverboundByName(String packetName) {
return gamePacketIdsByName.get("serverbound").getOrDefault(packetName, -1);
}
public static int serverboundByClazz(Class<?> clazz) {
return gamePacketIdsByClazz.get("serverbound").getOrDefault(clazz, -1);
}
}

View File

@@ -2,181 +2,183 @@ package net.momirealms.craftengine.bukkit.plugin.network.id;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.core.plugin.network.PacketFlow;
public class PacketIds1_20 implements PacketIds {
@Override
public int clientboundBlockUpdatePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundBlockUpdatePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockUpdatePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSectionBlocksUpdatePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSectionBlocksUpdatePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSectionBlocksUpdatePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelParticlesPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundLevelParticlesPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelParticlesPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelEventPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundLevelEventPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelEventPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundAddEntityPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundAddEntityPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundAddEntityPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundOpenScreenPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundOpenScreenPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundOpenScreenPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSoundPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSoundPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSoundPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundRemoveEntitiesPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundRemoveEntitiesPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRemoveEntitiesPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetEntityDataPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetEntityDataPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEntityDataPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetTitleTextPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetTitleTextPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetTitleTextPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetSubtitleTextPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetSubtitleTextPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetSubtitleTextPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetActionBarTextPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetActionBarTextPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetActionBarTextPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBossEventPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundBossEventPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBossEventPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSystemChatPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSystemChatPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSystemChatPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundTabListPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundTabListPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundTabListPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetPlayerTeamPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetPlayerTeamPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerTeamPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetObjectivePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetObjectivePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetObjectivePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelChunkWithLightPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundLevelChunkWithLightPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelChunkWithLightPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundPlayerInfoUpdatePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundPlayerInfoUpdatePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerInfoUpdatePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetScorePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetScorePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetScorePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundContainerSetContentPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundContainerSetContentPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetContentPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundContainerSetSlotPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundContainerSetSlotPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetSlotPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetCursorItemPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetCursorItemPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetCursorItemPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetEquipmentPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetEquipmentPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEquipmentPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetPlayerInventoryPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundSetPlayerInventoryPacket);
}
@Override
public int serverboundContainerClickPacket() {
return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ServerboundContainerClickPacket);
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ServerboundSetCreativeModeSlotPacket);
}
@Override
public int clientboundBlockEventPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundBlockEventPacket);
}
@Override
public int serverboundInteractPacket() {
return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ServerboundInteractPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerInventoryPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundRecipeBookAddPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundPlaceGhostRecipePacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundUpdateRecipesPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundUpdateAdvancementsPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundUpdateAdvancementsPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateAdvancementsPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundForgetLevelChunkPacket() {
return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundForgetLevelChunkPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundForgetLevelChunkPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBlockEventPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEventPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int serverboundContainerClickPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundContainerClickPacket, PacketFlow.SERVERBOUND);
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundSetCreativeModeSlotPacket, PacketFlow.SERVERBOUND);
}
@Override
public int serverboundInteractPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundInteractPacket, PacketFlow.SERVERBOUND);
}
@Override
public int serverboundCustomPayloadPacket() {
return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ServerboundCustomPayloadPacket);
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundCustomPayloadPacket, PacketFlow.SERVERBOUND);
}
}

View File

@@ -1,181 +1,182 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
import net.momirealms.craftengine.core.plugin.network.PacketFlow;
public class PacketIds1_20_5 implements PacketIds {
@Override
public int clientboundBlockUpdatePacket() {
return PacketIdFinder.clientboundByName("minecraft:block_update");
return PlayPacketIdHelper.byName("minecraft:block_update", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSectionBlocksUpdatePacket() {
return PacketIdFinder.clientboundByName("minecraft:section_blocks_update");
return PlayPacketIdHelper.byName("minecraft:section_blocks_update", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelParticlesPacket() {
return PacketIdFinder.clientboundByName("minecraft:level_particles");
return PlayPacketIdHelper.byName("minecraft:level_particles", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelEventPacket() {
return PacketIdFinder.clientboundByName("minecraft:level_event");
return PlayPacketIdHelper.byName("minecraft:level_event", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundAddEntityPacket() {
return PacketIdFinder.clientboundByName("minecraft:add_entity");
return PlayPacketIdHelper.byName("minecraft:add_entity", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundOpenScreenPacket() {
return PacketIdFinder.clientboundByName("minecraft:open_screen");
return PlayPacketIdHelper.byName("minecraft:open_screen", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSoundPacket() {
return PacketIdFinder.clientboundByName("minecraft:sound");
return PlayPacketIdHelper.byName("minecraft:sound", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundRemoveEntitiesPacket() {
return PacketIdFinder.clientboundByName("minecraft:remove_entities");
return PlayPacketIdHelper.byName("minecraft:remove_entities", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetEntityDataPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_entity_data");
return PlayPacketIdHelper.byName("minecraft:set_entity_data", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetTitleTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_title_text");
return PlayPacketIdHelper.byName("minecraft:set_title_text", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetSubtitleTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_subtitle_text");
return PlayPacketIdHelper.byName("minecraft:set_subtitle_text", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetActionBarTextPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_action_bar_text");
return PlayPacketIdHelper.byName("minecraft:set_action_bar_text", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBossEventPacket() {
return PacketIdFinder.clientboundByName("minecraft:boss_event");
return PlayPacketIdHelper.byName("minecraft:boss_event", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSystemChatPacket() {
return PacketIdFinder.clientboundByName("minecraft:system_chat");
return PlayPacketIdHelper.byName("minecraft:system_chat", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundTabListPacket() {
return PacketIdFinder.clientboundByName("minecraft:tab_list");
return PlayPacketIdHelper.byName("minecraft:tab_list", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetPlayerTeamPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_player_team");
return PlayPacketIdHelper.byName("minecraft:set_player_team", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetObjectivePacket() {
return PacketIdFinder.clientboundByName("minecraft:set_objective");
return PlayPacketIdHelper.byName("minecraft:set_objective", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundLevelChunkWithLightPacket() {
return PacketIdFinder.clientboundByName("minecraft:level_chunk_with_light");
return PlayPacketIdHelper.byName("minecraft:level_chunk_with_light", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundPlayerInfoUpdatePacket() {
return PacketIdFinder.clientboundByName("minecraft:player_info_update");
return PlayPacketIdHelper.byName("minecraft:player_info_update", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetScorePacket() {
return PacketIdFinder.clientboundByName("minecraft:set_score");
return PlayPacketIdHelper.byName("minecraft:set_score", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundContainerSetContentPacket() {
return PacketIdFinder.clientboundByName("minecraft:container_set_content");
return PlayPacketIdHelper.byName("minecraft:container_set_content", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundContainerSetSlotPacket() {
return PacketIdFinder.clientboundByName("minecraft:container_set_slot");
return PlayPacketIdHelper.byName("minecraft:container_set_slot", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetCursorItemPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_cursor_item");
return PlayPacketIdHelper.byName("minecraft:set_cursor_item", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetEquipmentPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_equipment");
return PlayPacketIdHelper.byName("minecraft:set_equipment", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundSetPlayerInventoryPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_player_inventory");
return PlayPacketIdHelper.byName("minecraft:set_player_inventory", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBlockEventPacket() {
return PacketIdFinder.clientboundByName("minecraft:block_event");
return PlayPacketIdHelper.byName("minecraft:block_event", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundRecipeBookAddPacket() {
return PacketIdFinder.clientboundByName("minecraft:recipe_book_add");
return PlayPacketIdHelper.byName("minecraft:recipe_book_add", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundPlaceGhostRecipePacket() {
return PacketIdFinder.clientboundByName("minecraft:place_ghost_recipe");
return PlayPacketIdHelper.byName("minecraft:place_ghost_recipe", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundUpdateRecipesPacket() {
return PacketIdFinder.clientboundByName("minecraft:update_recipes");
return PlayPacketIdHelper.byName("minecraft:update_recipes", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundUpdateAdvancementsPacket() {
return PacketIdFinder.clientboundByName("minecraft:update_advancements");
}
@Override
public int serverboundContainerClickPacket() {
return PacketIdFinder.serverboundByName("minecraft:container_click");
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByName("minecraft:set_creative_mode_slot");
}
@Override
public int serverboundInteractPacket() {
return PacketIdFinder.serverboundByName("minecraft:interact");
return PlayPacketIdHelper.byName("minecraft:update_advancements", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundForgetLevelChunkPacket() {
return PacketIdFinder.clientboundByName("minecraft:forget_level_chunk");
return PlayPacketIdHelper.byName("minecraft:forget_level_chunk", PacketFlow.CLIENTBOUND);
}
@Override
public int serverboundContainerClickPacket() {
return PlayPacketIdHelper.byName("minecraft:container_click", PacketFlow.SERVERBOUND);
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PlayPacketIdHelper.byName("minecraft:set_creative_mode_slot", PacketFlow.SERVERBOUND);
}
@Override
public int serverboundInteractPacket() {
return PlayPacketIdHelper.byName("minecraft:interact", PacketFlow.SERVERBOUND);
}
@Override
public int serverboundCustomPayloadPacket() {
return PacketIdFinder.serverboundByName("custom_payload");
return PlayPacketIdHelper.byName("custom_payload", PacketFlow.SERVERBOUND);
}
}

View File

@@ -0,0 +1,61 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.network.PacketFlow;
import net.momirealms.craftengine.core.util.VersionHelper;
import java.util.*;
public class PlayPacketIdHelper {
// 1.20.5-latest
private static final Map<PacketFlow, Map<String, Integer>> byName = new EnumMap<>(PacketFlow.class);
// 1.20-1.20.4
private static final Map<PacketFlow, Map<Class<?>, Integer>> byClazz = new EnumMap<>(PacketFlow.class);
static {
try {
if (VersionHelper.isOrAbove1_21()) {
Object packetReport = CoreReflections.constructor$PacketReport.newInstance((Object) null);
JsonObject packetReportData = ((JsonElement) CoreReflections.method$PacketReport$serializePackets.invoke(packetReport)).getAsJsonObject();
JsonObject playData = packetReportData.get("play").getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : playData.entrySet()) {
Map<String, Integer> ids = new HashMap<>();
byName.put(PacketFlow.valueOf(entry.getKey().toUpperCase(Locale.ROOT)), ids);
for (var entry2 : entry.getValue().getAsJsonObject().entrySet()) {
ids.put(entry2.getKey(), entry2.getValue().getAsJsonObject().get("protocol_id").getAsInt());
}
}
} else if (VersionHelper.isOrAbove1_20_5()) {
for (Map.Entry<String, Map<String, Integer>> entry : FastNMS.INSTANCE.gamePacketIdsByName().entrySet()) {
byName.put(PacketFlow.valueOf(entry.getKey().toUpperCase(Locale.ROOT)), entry.getValue());
}
} else {
for (Map.Entry<String, Map<Class<?>, Integer>> entry : FastNMS.INSTANCE.gamePacketIdsByClazz().entrySet()) {
byClazz.put(PacketFlow.valueOf(entry.getKey().toUpperCase(Locale.ROOT)), entry.getValue());
}
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to init packet registry", e);
}
}
public static int count(PacketFlow direction) {
if (VersionHelper.isOrAbove1_20_5()) {
return byName.getOrDefault(direction, Collections.emptyMap()).size();
} else {
return byClazz.getOrDefault(direction, Collections.emptyMap()).size();
}
}
public static int byName(String packetName, PacketFlow direction) {
return byName.get(direction).getOrDefault(packetName, -1);
}
public static int byClazz(Class<?> clazz, PacketFlow direction) {
return byClazz.get(direction).getOrDefault(clazz, -1);
}
}

View File

@@ -0,0 +1,13 @@
package net.momirealms.craftengine.bukkit.plugin.network.listener;
import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
public interface ByteBufferPacketListener {
default void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) {
}
default void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
}
}

View File

@@ -0,0 +1,13 @@
package net.momirealms.craftengine.bukkit.plugin.network.listener;
import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
public interface NMSPacketListener {
default void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) {
}
default void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) {
}
}

View File

@@ -22,6 +22,8 @@ public interface NetworkManager extends Manageable {
Channel getChannel(Player player);
int remapBlockState(int stateId, boolean enableMod);
Player[] onlineUsers();
default void sendPacket(@NotNull NetWorkUser player, Object packet) {

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.core.plugin.network;
public enum PacketFlow {
SERVERBOUND,
CLIENTBOUND;
}

View File

@@ -60,9 +60,9 @@ authlib_version=6.0.58
concurrent_util_version=0.0.3
# Proxy settings
#systemProp.socks.proxyHost=127.0.0.1
#systemProp.socks.proxyPort=7890
#systemProp.http.proxyHost=127.0.0.1
#systemProp.http.proxyPort=7890
#systemProp.https.proxyHost=127.0.0.1
#systemProp.https.proxyPort=7890
systemProp.socks.proxyHost=127.0.0.1
systemProp.socks.proxyPort=7890
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=7890
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=7890