improve packet mapping

This commit is contained in:
Bixilon 2021-01-19 21:16:04 +01:00
parent e1bbdb435a
commit 36bd58d1d3
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 125 additions and 115 deletions

View File

@ -70,12 +70,18 @@ public abstract class Network {
if (packetType == null) {
throw new UnknownPacketException(String.format("Server sent us an unknown packet (id=0x%x, length=%d, data=%s)", data.getCommand(), bytes.length, data.getBase64()));
}
Class<? extends ClientboundPacket> clazz = packetType.getClazz();
if (clazz == null) {
ClientboundPacket packet;
try {
packet = packetType.createNewInstance();
} catch (NullPointerException exception) {
throw new PacketNotImplementedException(data, packetType, this.connection);
}
ClientboundPacket packet = clazz.getConstructor().newInstance();
if (packet == null) {
throw new PacketNotImplementedException(data, packetType, this.connection);
}
boolean success = packet.read(data);
if (data.getBytesLeft() > 0 || !success) {
throw new PacketParseException(String.format("Could not parse packet %s (used=%d, available=%d, total=%d, success=%s)", packetType, data.getPosition(), data.getBytesLeft(), data.getLength(), success));

View File

@ -81,7 +81,7 @@ public class Packets {
PLAY_VEHICLE_MOVEMENT,
PLAY_QUERY_ENTITY_NBT;
private final ConnectionStates state;
private final ConnectionStates state;
Serverbound() {
this.state = ConnectionStates.valueOf(name().split("_")[0]);
@ -93,128 +93,132 @@ public class Packets {
}
public enum Clientbound {
STATUS_RESPONSE(PacketStatusResponse.class),
STATUS_PONG(PacketStatusPong.class),
LOGIN_DISCONNECT(PacketLoginDisconnect.class),
LOGIN_ENCRYPTION_REQUEST(PacketEncryptionRequest.class),
LOGIN_LOGIN_SUCCESS(PacketLoginSuccess.class),
LOGIN_SET_COMPRESSION(PacketLoginSetCompression.class),
LOGIN_PLUGIN_REQUEST(PacketLoginPluginRequest.class),
PLAY_SPAWN_MOB(PacketSpawnMob.class),
PLAY_SPAWN_EXPERIENCE_ORB(PacketSpawnExperienceOrb.class),
PLAY_SPAWN_WEATHER_ENTITY(PacketSpawnWeatherEntity.class),
PLAY_SPAWN_PAINTING(PacketSpawnPainting.class),
PLAY_SPAWN_PLAYER(PacketSpawnPlayer.class),
PLAY_ENTITY_ANIMATION(PacketEntityAnimation.class),
PLAY_STATS_RESPONSE(PacketStatistics.class),
PLAY_ACKNOWLEDGE_PLAYER_DIGGING(PacketAcknowledgePlayerDigging.class),
PLAY_BLOCK_BREAK_ANIMATION(PacketBlockBreakAnimation.class),
PLAY_BLOCK_ENTITY_DATA(PacketBlockEntityMetadata.class),
PLAY_BLOCK_ACTION(PacketBlockAction.class),
PLAY_BLOCK_CHANGE(PacketBlockChange.class),
PLAY_BOSS_BAR(PacketBossBar.class),
PLAY_SERVER_DIFFICULTY(PacketServerDifficulty.class),
PLAY_CHAT_MESSAGE(PacketChatMessageReceiving.class),
PLAY_MULTIBLOCK_CHANGE(PacketMultiBlockChange.class),
PLAY_TAB_COMPLETE(PacketTabCompleteReceiving.class),
PLAY_DECLARE_COMMANDS(PacketDeclareCommands.class),
PLAY_WINDOW_CONFIRMATION(PacketConfirmTransactionReceiving.class),
PLAY_CLOSE_WINDOW(PacketCloseWindowReceiving.class),
PLAY_WINDOW_ITEMS(PacketWindowItems.class),
PLAY_WINDOW_PROPERTY(PacketWindowProperty.class),
PLAY_SET_SLOT(PacketSetSlot.class),
PLAY_SET_COOLDOWN(PacketSetCooldown.class),
PLAY_PLUGIN_MESSAGE(PacketPluginMessageReceiving.class),
PLAY_NAMED_SOUND_EFFECT(PacketNamedSoundEffect.class),
PLAY_DISCONNECT(PacketDisconnect.class),
PLAY_ENTITY_EVENT(PacketEntityEvent.class),
PLAY_EXPLOSION(PacketExplosion.class),
PLAY_UNLOAD_CHUNK(PacketUnloadChunk.class),
PLAY_CHANGE_GAME_STATE(PacketChangeGameState.class),
PLAY_OPEN_HORSE_WINDOW(PacketOpenHorseWindow.class),
PLAY_KEEP_ALIVE(PacketKeepAlive.class),
PLAY_CHUNK_DATA(PacketChunkData.class),
PLAY_EFFECT(PacketEffect.class),
PLAY_PARTICLE(PacketParticle.class),
PLAY_UPDATE_LIGHT(PacketUpdateLight.class),
PLAY_JOIN_GAME(PacketJoinGame.class),
PLAY_MAP_DATA(PacketMapData.class),
PLAY_TRADE_LIST(PacketTradeList.class),
PLAY_ENTITY_MOVEMENT_AND_ROTATION(PacketEntityMovementAndRotation.class),
PLAY_ENTITY_ROTATION(PacketEntityRotation.class),
PLAY_ENTITY_MOVEMENT(PacketEntityMovement.class),
PLAY_VEHICLE_MOVEMENT(PacketVehicleMovement.class),
PLAY_OPEN_BOOK(PacketOpenBook.class),
PLAY_OPEN_WINDOW(PacketOpenWindow.class),
PLAY_OPEN_SIGN_EDITOR(PacketOpenSignEditor.class),
PLAY_CRAFT_RECIPE_RESPONSE(PacketCraftRecipeResponse.class),
PLAY_PLAYER_ABILITIES(PacketPlayerAbilitiesReceiving.class),
PLAY_COMBAT_EVENT(PacketCombatEvent.class),
PLAY_PLAYER_LIST_ITEM(PacketPlayerListItem.class),
PLAY_FACE_PLAYER(PacketFacePlayer.class),
PLAY_PLAYER_POSITION_AND_ROTATION(PacketPlayerPositionAndRotation.class),
PLAY_UNLOCK_RECIPES(PacketUnlockRecipes.class),
PLAY_DESTROY_ENTITIES(PacketDestroyEntity.class),
PLAY_REMOVE_ENTITY_EFFECT(PacketRemoveEntityEffect.class),
PLAY_RESOURCE_PACK_SEND(PacketResourcePackSend.class),
PLAY_RESPAWN(PacketRespawn.class),
PLAY_ENTITY_HEAD_ROTATION(PacketEntityHeadRotation.class),
PLAY_SELECT_ADVANCEMENT_TAB(PacketSelectAdvancementTab.class),
PLAY_WORLD_BORDER(PacketWorldBorder.class),
PLAY_CAMERA(PacketCamera.class),
PLAY_HELD_ITEM_CHANGE(PacketHeldItemChangeReceiving.class),
PLAY_UPDATE_VIEW_POSITION(PacketUpdateViewPosition.class),
PLAY_DISPLAY_SCOREBOARD(PacketScoreboardDisplayScoreboard.class),
PLAY_ENTITY_METADATA(PacketEntityMetadata.class),
PLAY_ATTACH_ENTITY(PacketAttachEntity.class),
PLAY_ENTITY_VELOCITY(PacketEntityVelocity.class),
PLAY_ENTITY_EQUIPMENT(PacketEntityEquipment.class),
PLAY_SET_EXPERIENCE(PacketSetExperience.class),
PLAY_UPDATE_HEALTH(PacketUpdateHealth.class),
PLAY_SCOREBOARD_OBJECTIVE(PacketScoreboardObjective.class),
PLAY_SET_PASSENGERS(PacketSetPassenger.class),
PLAY_TEAMS(PacketTeams.class),
PLAY_UPDATE_SCORE(PacketScoreboardUpdateScore.class),
PLAY_SPAWN_POSITION(PacketSpawnLocation.class),
PLAY_TIME_UPDATE(PacketTimeUpdate.class),
PLAY_ENTITY_SOUND_EFFECT(PacketEntitySoundEffect.class),
PLAY_SOUND_EFFECT(PacketSoundEffect.class),
PLAY_STOP_SOUND(PacketStopSound.class),
PLAY_PLAYER_LIST_HEADER_AND_FOOTER(PacketTabHeaderAndFooter.class),
PLAY_NBT_QUERY_RESPONSE(PacketNBTQueryResponse.class),
PLAY_COLLECT_ITEM(PacketCollectItem.class),
PLAY_ENTITY_TELEPORT(PacketEntityTeleport.class),
PLAY_ADVANCEMENTS(PacketAdvancements.class),
PLAY_ENTITY_PROPERTIES(PacketEntityProperties.class),
PLAY_ENTITY_EFFECT(PacketEntityEffect.class),
PLAY_DECLARE_RECIPES(PacketDeclareRecipes.class),
PLAY_TAGS(PacketTags.class),
PLAY_USE_BED(PacketUseBed.class),
PLAY_UPDATE_VIEW_DISTANCE(PacketUpdateViewDistance.class),
PLAY_CHUNK_BULK(PacketChunkBulk.class),
PLAY_UPDATE_SIGN(PacketUpdateSignReceiving.class),
PLAY_STATISTICS(PacketStatistics.class),
PLAY_SPAWN_ENTITY(PacketSpawnObject.class),
PLAY_TITLE(PacketTitle.class),
PLAY_ENTITY_INITIALISATION(PacketEntityInitialisation.class),
PLAY_SET_COMPRESSION(PacketSetCompression.class),
STATUS_RESPONSE(PacketStatusResponse::new),
STATUS_PONG(PacketStatusPong::new),
LOGIN_DISCONNECT(PacketLoginDisconnect::new),
LOGIN_ENCRYPTION_REQUEST(PacketEncryptionRequest::new),
LOGIN_LOGIN_SUCCESS(PacketLoginSuccess::new),
LOGIN_SET_COMPRESSION(PacketLoginSetCompression::new),
LOGIN_PLUGIN_REQUEST(PacketLoginPluginRequest::new),
PLAY_SPAWN_MOB(PacketSpawnMob::new),
PLAY_SPAWN_EXPERIENCE_ORB(PacketSpawnExperienceOrb::new),
PLAY_SPAWN_WEATHER_ENTITY(PacketSpawnWeatherEntity::new),
PLAY_SPAWN_PAINTING(PacketSpawnPainting::new),
PLAY_SPAWN_PLAYER(PacketSpawnPlayer::new),
PLAY_ENTITY_ANIMATION(PacketEntityAnimation::new),
PLAY_STATS_RESPONSE(PacketStatistics::new),
PLAY_ACKNOWLEDGE_PLAYER_DIGGING(PacketAcknowledgePlayerDigging::new),
PLAY_BLOCK_BREAK_ANIMATION(PacketBlockBreakAnimation::new),
PLAY_BLOCK_ENTITY_DATA(PacketBlockEntityMetadata::new),
PLAY_BLOCK_ACTION(PacketBlockAction::new),
PLAY_BLOCK_CHANGE(PacketBlockChange::new),
PLAY_BOSS_BAR(PacketBossBar::new),
PLAY_SERVER_DIFFICULTY(PacketServerDifficulty::new),
PLAY_CHAT_MESSAGE(PacketChatMessageReceiving::new),
PLAY_MULTIBLOCK_CHANGE(PacketMultiBlockChange::new),
PLAY_TAB_COMPLETE(PacketTabCompleteReceiving::new),
PLAY_DECLARE_COMMANDS(PacketDeclareCommands::new),
PLAY_WINDOW_CONFIRMATION(PacketConfirmTransactionReceiving::new),
PLAY_CLOSE_WINDOW(PacketCloseWindowReceiving::new),
PLAY_WINDOW_ITEMS(PacketWindowItems::new),
PLAY_WINDOW_PROPERTY(PacketWindowProperty::new),
PLAY_SET_SLOT(PacketSetSlot::new),
PLAY_SET_COOLDOWN(PacketSetCooldown::new),
PLAY_PLUGIN_MESSAGE(PacketPluginMessageReceiving::new),
PLAY_NAMED_SOUND_EFFECT(PacketNamedSoundEffect::new),
PLAY_DISCONNECT(PacketDisconnect::new),
PLAY_ENTITY_EVENT(PacketEntityEvent::new),
PLAY_EXPLOSION(PacketExplosion::new),
PLAY_UNLOAD_CHUNK(PacketUnloadChunk::new),
PLAY_CHANGE_GAME_STATE(PacketChangeGameState::new),
PLAY_OPEN_HORSE_WINDOW(PacketOpenHorseWindow::new),
PLAY_KEEP_ALIVE(PacketKeepAlive::new),
PLAY_CHUNK_DATA(PacketChunkData::new),
PLAY_EFFECT(PacketEffect::new),
PLAY_PARTICLE(PacketParticle::new),
PLAY_UPDATE_LIGHT(PacketUpdateLight::new),
PLAY_JOIN_GAME(PacketJoinGame::new),
PLAY_MAP_DATA(PacketMapData::new),
PLAY_TRADE_LIST(PacketTradeList::new),
PLAY_ENTITY_MOVEMENT_AND_ROTATION(PacketEntityMovementAndRotation::new),
PLAY_ENTITY_ROTATION(PacketEntityRotation::new),
PLAY_ENTITY_MOVEMENT(PacketEntityMovement::new),
PLAY_VEHICLE_MOVEMENT(PacketVehicleMovement::new),
PLAY_OPEN_BOOK(PacketOpenBook::new),
PLAY_OPEN_WINDOW(PacketOpenWindow::new),
PLAY_OPEN_SIGN_EDITOR(PacketOpenSignEditor::new),
PLAY_CRAFT_RECIPE_RESPONSE(PacketCraftRecipeResponse::new),
PLAY_PLAYER_ABILITIES(PacketPlayerAbilitiesReceiving::new),
PLAY_COMBAT_EVENT(PacketCombatEvent::new),
PLAY_PLAYER_LIST_ITEM(PacketPlayerListItem::new),
PLAY_FACE_PLAYER(PacketFacePlayer::new),
PLAY_PLAYER_POSITION_AND_ROTATION(PacketPlayerPositionAndRotation::new),
PLAY_UNLOCK_RECIPES(PacketUnlockRecipes::new),
PLAY_DESTROY_ENTITIES(PacketDestroyEntity::new),
PLAY_REMOVE_ENTITY_EFFECT(PacketRemoveEntityEffect::new),
PLAY_RESOURCE_PACK_SEND(PacketResourcePackSend::new),
PLAY_RESPAWN(PacketRespawn::new),
PLAY_ENTITY_HEAD_ROTATION(PacketEntityHeadRotation::new),
PLAY_SELECT_ADVANCEMENT_TAB(PacketSelectAdvancementTab::new),
PLAY_WORLD_BORDER(PacketWorldBorder::new),
PLAY_CAMERA(PacketCamera::new),
PLAY_HELD_ITEM_CHANGE(PacketHeldItemChangeReceiving::new),
PLAY_UPDATE_VIEW_POSITION(PacketUpdateViewPosition::new),
PLAY_DISPLAY_SCOREBOARD(PacketScoreboardDisplayScoreboard::new),
PLAY_ENTITY_METADATA(PacketEntityMetadata::new),
PLAY_ATTACH_ENTITY(PacketAttachEntity::new),
PLAY_ENTITY_VELOCITY(PacketEntityVelocity::new),
PLAY_ENTITY_EQUIPMENT(PacketEntityEquipment::new),
PLAY_SET_EXPERIENCE(PacketSetExperience::new),
PLAY_UPDATE_HEALTH(PacketUpdateHealth::new),
PLAY_SCOREBOARD_OBJECTIVE(PacketScoreboardObjective::new),
PLAY_SET_PASSENGERS(PacketSetPassenger::new),
PLAY_TEAMS(PacketTeams::new),
PLAY_UPDATE_SCORE(PacketScoreboardUpdateScore::new),
PLAY_SPAWN_POSITION(PacketSpawnLocation::new),
PLAY_TIME_UPDATE(PacketTimeUpdate::new),
PLAY_ENTITY_SOUND_EFFECT(PacketEntitySoundEffect::new),
PLAY_SOUND_EFFECT(PacketSoundEffect::new),
PLAY_STOP_SOUND(PacketStopSound::new),
PLAY_PLAYER_LIST_HEADER_AND_FOOTER(PacketTabHeaderAndFooter::new),
PLAY_NBT_QUERY_RESPONSE(PacketNBTQueryResponse::new),
PLAY_COLLECT_ITEM(PacketCollectItem::new),
PLAY_ENTITY_TELEPORT(PacketEntityTeleport::new),
PLAY_ADVANCEMENTS(PacketAdvancements::new),
PLAY_ENTITY_PROPERTIES(PacketEntityProperties::new),
PLAY_ENTITY_EFFECT(PacketEntityEffect::new),
PLAY_DECLARE_RECIPES(PacketDeclareRecipes::new),
PLAY_TAGS(PacketTags::new),
PLAY_USE_BED(PacketUseBed::new),
PLAY_UPDATE_VIEW_DISTANCE(PacketUpdateViewDistance::new),
PLAY_CHUNK_BULK(PacketChunkBulk::new),
PLAY_UPDATE_SIGN(PacketUpdateSignReceiving::new),
PLAY_STATISTICS(PacketStatistics::new),
PLAY_SPAWN_ENTITY(PacketSpawnObject::new),
PLAY_TITLE(PacketTitle::new),
PLAY_ENTITY_INITIALISATION(PacketEntityInitialisation::new),
PLAY_SET_COMPRESSION(PacketSetCompression::new),
PLAY_ADVANCEMENT_PROGRESS(null),
PLAY_SCULK_VIBRATION_SIGNAL(PacketSculkVibrationSignal.class);
PLAY_SCULK_VIBRATION_SIGNAL(PacketSculkVibrationSignal::new);
private final ConnectionStates state;
private final Class<? extends ClientboundPacket> clazz;
private final PacketInstanceCreator creator;
Clientbound(Class<? extends ClientboundPacket> clazz) {
Clientbound(PacketInstanceCreator creator) {
this.state = ConnectionStates.valueOf(name().split("_")[0]);
this.clazz = clazz;
this.creator = creator;
}
public ConnectionStates getState() {
return this.state;
}
public Class<? extends ClientboundPacket> getClazz() {
return this.clazz;
public ClientboundPacket createNewInstance() {
return this.creator.createNewInstance();
}
}
private interface PacketInstanceCreator {
ClientboundPacket createNewInstance();
}
}