diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java index 3b5d65284..6e609fe55 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java @@ -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 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)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Packets.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Packets.java index ac74a380c..937ab5c38 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Packets.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Packets.java @@ -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 clazz; + private final PacketInstanceCreator creator; - Clientbound(Class 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 getClazz() { - return this.clazz; + public ClientboundPacket createNewInstance() { + return this.creator.createNewInstance(); } } + + private interface PacketInstanceCreator { + ClientboundPacket createNewInstance(); + } }