From 186ad2edea21db228c0bce74a7203ff9de7566d4 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sun, 25 Jan 2026 23:08:28 +0100 Subject: [PATCH] feat: 1.21.7-1.21.11 support Its works, but block state ids are currently not mapped, meaning that when using the current default world gen the client mostly will disconnect due to a not found block state id, vanilla version compatible worlds should work --- assets/packet/1_21_7_packets.json | 1 + .../1_21_11_tracked_data.json} | 0 assets/tracked_data/1_21_7_tracked_data.json | 96 ++++++++++++++++ pumpkin-data/build/packet.rs | 102 +++++++++++++---- pumpkin-data/build/registry.rs | 1 + pumpkin-data/build/tag.rs | 2 + pumpkin-data/build/tracked_data.rs | 68 +++++++++--- pumpkin-macros/src/lib.rs | 17 +++ pumpkin-protocol/src/codec/velocity.rs | 89 ++++++++------- .../java/client/config/add_resource_pack.rs | 4 +- .../java/client/config/config_disconnect.rs | 4 +- .../src/java/client/config/cookie_request.rs | 4 +- .../src/java/client/config/finish_config.rs | 4 +- .../src/java/client/config/known_packs.rs | 4 +- .../src/java/client/config/plugin_message.rs | 4 +- .../src/java/client/config/registry_data.rs | 4 +- .../src/java/client/config/server_links.rs | 4 +- .../src/java/client/config/store_cookie.rs | 4 +- .../src/java/client/config/transfer.rs | 4 +- .../src/java/client/config/update_tags.rs | 4 +- .../src/java/client/login/cookie_request.rs | 4 +- .../java/client/login/encryption_request.rs | 4 +- .../src/java/client/login/login_disconnect.rs | 4 +- .../src/java/client/login/login_success.rs | 4 +- .../src/java/client/login/plugin_request.rs | 4 +- .../src/java/client/login/set_compression.rs | 4 +- .../src/java/client/play/acknowledge_block.rs | 4 +- .../src/java/client/play/actionbar.rs | 4 +- .../java/client/play/block_destroy_stage.rs | 4 +- .../src/java/client/play/block_entity_data.rs | 4 +- .../src/java/client/play/block_event.rs | 4 +- .../src/java/client/play/block_update.rs | 4 +- .../src/java/client/play/boss_event.rs | 4 +- .../src/java/client/play/center_chunk.rs | 4 +- .../src/java/client/play/change_difficulty.rs | 4 +- .../src/java/client/play/chunk_batch_end.rs | 4 +- .../src/java/client/play/chunk_batch_start.rs | 4 +- .../src/java/client/play/chunk_data.rs | 4 +- .../src/java/client/play/clear_title.rs | 4 +- .../src/java/client/play/close_container.rs | 4 +- .../src/java/client/play/combat_death.rs | 4 +- .../java/client/play/command_suggestions.rs | 4 +- .../src/java/client/play/commands.rs | 4 +- .../src/java/client/play/cookie_request.rs | 4 +- .../src/java/client/play/damage_event.rs | 4 +- .../src/java/client/play/disconnect.rs | 4 +- .../client/play/disguised_chat_message.rs | 4 +- .../src/java/client/play/display_objective.rs | 4 +- .../src/java/client/play/entity_animation.rs | 4 +- .../src/java/client/play/entity_metadata.rs | 44 ++++++-- .../java/client/play/entity_position_sync.rs | 4 +- .../java/client/play/entity_sound_effect.rs | 4 +- .../src/java/client/play/entity_status.rs | 4 +- .../src/java/client/play/entity_velocity.rs | 4 +- .../src/java/client/play/explode.rs | 4 +- .../src/java/client/play/game_event.rs | 4 +- .../src/java/client/play/head_rot.rs | 4 +- .../src/java/client/play/hurt_animation.rs | 4 +- .../client/play/initialize_world_border.rs | 4 +- .../src/java/client/play/keep_alive.rs | 4 +- .../src/java/client/play/level_event.rs | 4 +- .../src/java/client/play/login.rs | 4 +- .../java/client/play/multi_block_update.rs | 4 +- .../src/java/client/play/open_screen.rs | 4 +- .../src/java/client/play/open_sign_editor.rs | 4 +- .../src/java/client/play/particle.rs | 4 +- .../src/java/client/play/ping_response.rs | 4 +- .../src/java/client/play/player_abilities.rs | 4 +- .../java/client/play/player_chat_message.rs | 4 +- .../java/client/play/player_info_update.rs | 4 +- .../src/java/client/play/player_position.rs | 4 +- .../src/java/client/play/player_remove.rs | 4 +- .../java/client/play/player_spawn_position.rs | 36 +++++- .../src/java/client/play/remove_entities.rs | 4 +- .../src/java/client/play/remove_mob_effect.rs | 4 +- .../src/java/client/play/reset_score.rs | 4 +- .../src/java/client/play/respawn.rs | 4 +- .../src/java/client/play/server_links.rs | 4 +- .../src/java/client/play/set_border_center.rs | 4 +- .../java/client/play/set_border_lerp_size.rs | 4 +- .../src/java/client/play/set_border_size.rs | 4 +- .../client/play/set_border_warning_delay.rs | 4 +- .../play/set_border_warning_distance.rs | 4 +- .../java/client/play/set_container_content.rs | 4 +- .../client/play/set_container_property.rs | 4 +- .../java/client/play/set_container_slot.rs | 4 +- .../src/java/client/play/set_cursor_slot.rs | 4 +- .../src/java/client/play/set_equipment.rs | 4 +- .../src/java/client/play/set_experience.rs | 4 +- .../src/java/client/play/set_health.rs | 4 +- .../src/java/client/play/set_held_item.rs | 4 +- .../java/client/play/set_player_inventory.rs | 4 +- .../src/java/client/play/set_time.rs | 4 +- .../src/java/client/play/set_title.rs | 4 +- .../java/client/play/set_title_animation.rs | 4 +- .../src/java/client/play/sound_effect.rs | 4 +- .../src/java/client/play/spawn_entity.rs | 53 +++++++-- .../src/java/client/play/stop_sound.rs | 4 +- .../src/java/client/play/store_cookie.rs | 4 +- .../src/java/client/play/subtitle.rs | 4 +- .../java/client/play/system_chat_message.rs | 4 +- .../src/java/client/play/take_item.rs | 4 +- .../src/java/client/play/teleport_entity.rs | 4 +- .../src/java/client/play/ticking_state.rs | 4 +- .../src/java/client/play/ticking_step.rs | 4 +- .../src/java/client/play/transfer.rs | 4 +- .../src/java/client/play/unload_chunk.rs | 4 +- .../src/java/client/play/update_entity_pos.rs | 4 +- .../java/client/play/update_entity_pos_rot.rs | 4 +- .../src/java/client/play/update_entity_rot.rs | 4 +- .../src/java/client/play/update_mob_effect.rs | 4 +- .../src/java/client/play/update_objectives.rs | 4 +- .../src/java/client/play/update_score.rs | 4 +- .../src/java/client/play/worldevent.rs | 4 +- .../src/java/client/status/ping_response.rs | 4 +- .../src/java/client/status/status_response.rs | 4 +- pumpkin-protocol/src/java/packet_encoder.rs | 28 ++--- .../config/acknowledge_finish_config.rs | 4 +- .../java/server/config/client_information.rs | 4 +- .../src/java/server/config/cookie_response.rs | 4 +- .../src/java/server/config/known_packs.rs | 4 +- .../src/java/server/config/plugin_message.rs | 4 +- .../server/config/resource_pack_response.rs | 4 +- .../src/java/server/handshake/mod.rs | 4 +- .../src/java/server/login/cookie_response.rs | 4 +- .../java/server/login/encryption_response.rs | 4 +- .../src/java/server/login/login_response.rs | 4 +- .../src/java/server/login/login_start.rs | 4 +- .../src/java/server/login/plugin_response.rs | 4 +- .../src/java/server/play/change_game_mode.rs | 4 +- .../src/java/server/play/chat_command.rs | 4 +- .../src/java/server/play/chat_message.rs | 4 +- .../src/java/server/play/chunk_batch.rs | 4 +- .../src/java/server/play/click_container.rs | 4 +- .../src/java/server/play/client_command.rs | 4 +- .../java/server/play/client_information.rs | 4 +- .../src/java/server/play/client_tick_end.rs | 4 +- .../src/java/server/play/close_container.rs | 4 +- .../java/server/play/command_suggestion.rs | 4 +- .../src/java/server/play/confirm_teleport.rs | 4 +- .../src/java/server/play/cookie_response.rs | 4 +- .../src/java/server/play/custom_payload.rs | 4 +- .../src/java/server/play/interact.rs | 4 +- .../src/java/server/play/keep_alive.rs | 4 +- .../src/java/server/play/pick_item.rs | 6 +- .../src/java/server/play/ping_request.rs | 4 +- .../src/java/server/play/player_abilities.rs | 4 +- .../src/java/server/play/player_action.rs | 4 +- .../src/java/server/play/player_command.rs | 4 +- .../src/java/server/play/player_ground.rs | 4 +- .../src/java/server/play/player_input.rs | 4 +- .../src/java/server/play/player_loaded.rs | 4 +- .../src/java/server/play/player_position.rs | 4 +- .../server/play/player_position_rotation.rs | 4 +- .../src/java/server/play/player_rotation.rs | 4 +- .../src/java/server/play/player_session.rs | 4 +- .../src/java/server/play/set_command_block.rs | 4 +- .../src/java/server/play/set_creative_slot.rs | 4 +- .../src/java/server/play/set_held_item.rs | 4 +- .../src/java/server/play/swing_arm.rs | 4 +- .../src/java/server/play/update_sign.rs | 4 +- .../src/java/server/play/use_item.rs | 4 +- .../src/java/server/play/use_item_on.rs | 4 +- .../src/java/server/status/ping_request.rs | 4 +- .../src/java/server/status/status_request.rs | 4 +- pumpkin-protocol/src/lib.rs | 6 +- pumpkin-protocol/src/packet.rs | 9 +- pumpkin-protocol/src/ser/mod.rs | 7 +- pumpkin-util/src/math/position.rs | 11 +- pumpkin-world/src/chunk/palette.rs | 17 +++ pumpkin-world/src/lib.rs | 2 +- pumpkin/src/entity/mod.rs | 25 +++-- pumpkin/src/net/java/mod.rs | 105 +++++++++--------- pumpkin/src/world/mod.rs | 8 +- 174 files changed, 842 insertions(+), 495 deletions(-) create mode 100644 assets/packet/1_21_7_packets.json rename assets/{tracked_data.json => tracked_data/1_21_11_tracked_data.json} (100%) create mode 100644 assets/tracked_data/1_21_7_tracked_data.json diff --git a/assets/packet/1_21_7_packets.json b/assets/packet/1_21_7_packets.json new file mode 100644 index 000000000..5995d29cd --- /dev/null +++ b/assets/packet/1_21_7_packets.json @@ -0,0 +1 @@ +{"version":772,"serverbound":{"handshake":{"intention":0},"status":{"status_request":0,"ping_request":1},"login":{"hello":0,"key":1,"custom_query_answer":2,"login_acknowledged":3,"cookie_response":4},"config":{"client_information":0,"cookie_response":1,"custom_payload":2,"finish_configuration":3,"keep_alive":4,"pong":5,"resource_pack":6,"select_known_packs":7,"custom_click_action":8},"play":{"accept_teleportation":0,"block_entity_tag_query":1,"bundle_item_selected":2,"change_difficulty":3,"change_game_mode":4,"chat_ack":5,"chat_command":6,"chat_command_signed":7,"chat":8,"chat_session_update":9,"chunk_batch_received":10,"client_command":11,"client_tick_end":12,"client_information":13,"command_suggestion":14,"configuration_acknowledged":15,"container_button_click":16,"container_click":17,"container_close":18,"container_slot_state_changed":19,"cookie_response":20,"custom_payload":21,"debug_sample_subscription":22,"edit_book":23,"entity_tag_query":24,"interact":25,"jigsaw_generate":26,"keep_alive":27,"lock_difficulty":28,"move_player_pos":29,"move_player_pos_rot":30,"move_player_rot":31,"move_player_status_only":32,"move_vehicle":33,"paddle_boat":34,"pick_item_from_block":35,"pick_item_from_entity":36,"ping_request":37,"place_recipe":38,"player_abilities":39,"player_action":40,"player_command":41,"player_input":42,"player_loaded":43,"pong":44,"recipe_book_change_settings":45,"recipe_book_seen_recipe":46,"rename_item":47,"resource_pack":48,"seen_advancements":49,"select_trade":50,"set_beacon":51,"set_carried_item":52,"set_command_block":53,"set_command_minecart":54,"set_creative_mode_slot":55,"set_jigsaw_block":56,"set_structure_block":57,"set_test_block":58,"sign_update":59,"swing":60,"teleport_to_entity":61,"test_instance_block_action":62,"use_item_on":63,"use_item":64,"custom_click_action":65}},"clientbound":{"status":{"status_response":0,"pong_response":1},"login":{"login_disconnect":0,"hello":1,"login_finished":2,"login_compression":3,"custom_query":4,"cookie_request":5},"config":{"cookie_request":0,"custom_payload":1,"disconnect":2,"finish_configuration":3,"keep_alive":4,"ping":5,"reset_chat":6,"registry_data":7,"resource_pack_pop":8,"resource_pack_push":9,"store_cookie":10,"transfer":11,"update_enabled_features":12,"update_tags":13,"select_known_packs":14,"custom_report_details":15,"server_links":16,"clear_dialog":17,"show_dialog":18},"play":{"bundle_delimiter":0,"add_entity":1,"animate":2,"award_stats":3,"block_changed_ack":4,"block_destruction":5,"block_entity_data":6,"block_event":7,"block_update":8,"boss_event":9,"change_difficulty":10,"chunk_batch_finished":11,"chunk_batch_start":12,"chunks_biomes":13,"clear_titles":14,"command_suggestions":15,"commands":16,"container_close":17,"container_set_content":18,"container_set_data":19,"container_set_slot":20,"cookie_request":21,"cooldown":22,"custom_chat_completions":23,"custom_payload":24,"damage_event":25,"debug_sample":26,"delete_chat":27,"disconnect":28,"disguised_chat":29,"entity_event":30,"entity_position_sync":31,"explode":32,"forget_level_chunk":33,"game_event":34,"horse_screen_open":35,"hurt_animation":36,"initialize_border":37,"keep_alive":38,"level_chunk_with_light":39,"level_event":40,"level_particles":41,"light_update":42,"login":43,"map_item_data":44,"merchant_offers":45,"move_entity_pos":46,"move_entity_pos_rot":47,"move_minecart_along_track":48,"move_entity_rot":49,"move_vehicle":50,"open_book":51,"open_screen":52,"open_sign_editor":53,"ping":54,"pong_response":55,"place_ghost_recipe":56,"player_abilities":57,"player_chat":58,"player_combat_end":59,"player_combat_enter":60,"player_combat_kill":61,"player_info_remove":62,"player_info_update":63,"player_look_at":64,"player_position":65,"player_rotation":66,"recipe_book_add":67,"recipe_book_remove":68,"recipe_book_settings":69,"remove_entities":70,"remove_mob_effect":71,"reset_score":72,"resource_pack_pop":73,"resource_pack_push":74,"respawn":75,"rotate_head":76,"section_blocks_update":77,"select_advancements_tab":78,"server_data":79,"set_action_bar_text":80,"set_border_center":81,"set_border_lerp_size":82,"set_border_size":83,"set_border_warning_delay":84,"set_border_warning_distance":85,"set_camera":86,"set_chunk_cache_center":87,"set_chunk_cache_radius":88,"set_cursor_item":89,"set_default_spawn_position":90,"set_display_objective":91,"set_entity_data":92,"set_entity_link":93,"set_entity_motion":94,"set_equipment":95,"set_experience":96,"set_health":97,"set_held_slot":98,"set_objective":99,"set_passengers":100,"set_player_inventory":101,"set_player_team":102,"set_score":103,"set_simulation_distance":104,"set_subtitle_text":105,"set_time":106,"set_title_text":107,"set_titles_animation":108,"sound_entity":109,"sound":110,"start_configuration":111,"stop_sound":112,"store_cookie":113,"system_chat":114,"tab_list":115,"tag_query":116,"take_item_entity":117,"teleport_entity":118,"test_instance_block_status":119,"ticking_state":120,"ticking_step":121,"transfer":122,"update_advancements":123,"update_attributes":124,"update_mob_effect":125,"update_recipes":126,"update_tags":127,"projectile_power":128,"custom_report_details":129,"server_links":130,"waypoint":131,"clear_dialog":132,"show_dialog":133}}} diff --git a/assets/tracked_data.json b/assets/tracked_data/1_21_11_tracked_data.json similarity index 100% rename from assets/tracked_data.json rename to assets/tracked_data/1_21_11_tracked_data.json diff --git a/assets/tracked_data/1_21_7_tracked_data.json b/assets/tracked_data/1_21_7_tracked_data.json new file mode 100644 index 000000000..14d414398 --- /dev/null +++ b/assets/tracked_data/1_21_7_tracked_data.json @@ -0,0 +1,96 @@ +{ + "FLAGS": 0, + "AIR": 1, + "CUSTOM_NAME": 2, + "NAME_VISIBLE": 3, + "SILENT": 4, + "NO_GRAVITY": 5, + "POSE": 6, + "FROZEN_TICKS": 7, + "LIVING_FLAGS": 8, + "HEALTH": 9, + "POTION_SWIRLS": 10, + "POTION_SWIRLS_AMBIENT": 11, + "STUCK_ARROW_COUNT": 12, + "STINGER_COUNT": 13, + "SLEEPING_POSITION": 14, + "MOB_FLAGS": 15, + "ITEM_STACK": 8, + "ROTATION": 9, + "FUSE": 8, + "EXPLOSION_RADIUS": 9, + "FUSE_SPEED": 16, + "IGNITED": 18, + "CHARGED": 19, + "ARMOR_STAND_FLAGS": 15, + "TRACKER_HEAD_ROTATION": 16, + "TRACKER_BODY_ROTATION": 17, + "TRACKER_LEFT_ARM_ROTATION": 18, + "TRACKER_RIGHT_ARM_ROTATION": 19, + "TRACKER_LEFT_LEG_ROTATION": 20, + "TRACKER_RIGHT_LEG_ROTATION": 21, + "BLOCK_STATE": 8, + "START_INTERPOLATION": 8, + "INTERPOLATION_DURATION": 9, + "TELEPORT_DURATION": 10, + "TRANSLATION": 11, + "SCALE": 12, + "LEFT_ROTATION": 13, + "RIGHT_ROTATION": 14, + "BILLBOARD": 15, + "BRIGHTNESS": 16, + "VIEW_RANGE": 17, + "SHADOW_RADIUS": 18, + "SHADOW_STRENGTH": 19, + "WIDTH": 20, + "HEIGHT": 21, + "GLOW_COLOR_OVERRIDE": 22, + "TEXT": 23, + "LINE_WIDTH": 24, + "BACKGROUND": 25, + "TEXT_OPACITY": 26, + "TEXT_DISPLAY_FLAGS": 27, + "ITEM_DISPLAY": 24, + "PLAYER_MODE_CUSTOMIZATION_ID": 17, + "MAIN_ARM_ID": 18, + "LEFT_PADDLE_MOVING": 11, + "RIGHT_PADDLE_MOVING": 12, + "BUBBLE_WOBBLE_TICKS": 13, + "VILLAGER_DATA": 18, + "ANGER_END_TIME": 21, + "VARIANT": 20, + "BABY": 16, + "ZOMBIE_TYPE": 17, + "CONVERTING_IN_WATER": 18, + "VEX_FLAGS": 16, + "SHEARED": 16, + "PUFF_STATE": 17, + "FOX_FLAGS": 18, + "CAT_VARIANT": 19, + "COLLAR_COLOR": 20, + "TAMEABLE_FLAGS": 17, + "OWNER_UUID": 18, + "BEE_FLAGS": 17, + "ANGER": 16, + "ATTACHED_FACE": 16, + "PEEK_AMOUNT": 17, + "CONVERTING": 19, + "SNOW_GOLEM_FLAGS": 16, + "IRON_GOLEM_FLAGS": 16, + "SLIME_SIZE": 16, + "PANDA_FLAGS": 22, + "MAIN_GENE": 20, + "HIDDEN_GENE": 21, + "EATING_TICKS": 19, + "SNEEZE_PROGRESS": 18, + "STRENGTH": 19, + "HORSE_FLAGS": 17, + "CARRIED_BLOCK": 16, + "ANGRY": 17, + "PROVOKED": 18, + "SPIKES_RETRACTED": 16, + "BEAM_TARGET_ID": 17, + "PHASE_TYPE": 16, + "BEAM_TARGET": 8, + "SHOW_BOTTOM": 9 +} diff --git a/pumpkin-data/build/packet.rs b/pumpkin-data/build/packet.rs index 91e51fc5d..814dfb630 100644 --- a/pumpkin-data/build/packet.rs +++ b/pumpkin-data/build/packet.rs @@ -1,8 +1,7 @@ -use std::{collections::BTreeMap, fs}; - use proc_macro2::TokenStream; use quote::{format_ident, quote}; use serde::Deserialize; +use std::{collections::BTreeMap, fs}; #[derive(Deserialize)] pub struct Packets { @@ -12,20 +11,62 @@ pub struct Packets { } pub(crate) fn build() -> TokenStream { + // 1. Track the JSON assets for rebuilds + println!("cargo:rerun-if-changed=../assets/packet/1_21_7_packets.json"); println!("cargo:rerun-if-changed=../assets/packet/1_21_11_packets.json"); - let packets: Packets = - serde_json::from_str(&fs::read_to_string("../assets/packet/1_21_11_packets.json").unwrap()) - .expect("Failed to parse packets.json"); + // 2. Parse the protocol files + let packets_7: Packets = serde_json::from_str( + &fs::read_to_string("../assets/packet/1_21_7_packets.json").expect("1.21.7 file missing"), + ) + .unwrap(); - let version = packets.version; - let serverbound_consts = parse_packets(packets.serverbound); - let clientbound_consts = parse_packets(packets.clientbound); + let packets_11: Packets = serde_json::from_str( + &fs::read_to_string("../assets/packet/1_21_11_packets.json").expect("1.21.11 file missing"), + ) + .unwrap(); + + let latest_version = packets_11.version; + // 3. Generate mapped constants for both directions + let serverbound_consts = generate_mapped_consts(&packets_11, &packets_7, true); + let clientbound_consts = generate_mapped_consts(&packets_11, &packets_7, false); quote!( - /// The current Minecraft protocol version. - pub const CURRENT_MC_PROTOCOL: u32 = #version; + use pumpkin_util::version::MinecraftVersion; + pub const CURRENT_MC_PROTOCOL: u32 = #latest_version; + + pub struct PacketId { + pub latest_id: i32, + pub v1_21_7_id: i32, + } + + impl PacketId { + /// Converts the latest packet ID to the ID used in the requested version. + /// Returns -1 if the packet does not exist in that version. + pub fn to_id(&self, version: MinecraftVersion) -> i32 { + match version { + MinecraftVersion::V_1_21_11 => self.latest_id, + MinecraftVersion::V_1_21_7 => self.v1_21_7_id, + // Default to latest for unrecognized/unmapped versions + _ => self.latest_id, + } + } + } + + impl PartialEq for PacketId { + fn eq(&self, other: &i32) -> bool { + self.latest_id == *other + } + } + + impl PartialEq for i32 { + fn eq(&self, other: &PacketId) -> bool { + *self == other.latest_id + } + } + + // We place the constants directly into these modules pub mod serverbound { #serverbound_consts } @@ -36,22 +77,39 @@ pub(crate) fn build() -> TokenStream { ) } -pub(crate) fn parse_packets(phases: BTreeMap>) -> TokenStream { - let mut consts = TokenStream::new(); +fn generate_mapped_consts(latest: &Packets, v7: &Packets, is_serverbound: bool) -> TokenStream { + let mut output = TokenStream::new(); + let latest_phases = if is_serverbound { + &latest.serverbound + } else { + &latest.clientbound + }; + let v7_phases = if is_serverbound { + &v7.serverbound + } else { + &v7.clientbound + }; - for (phase_name, packets) in phases { - for (packet_name, packet_id) in packets { - let sanitized_name = packet_name - .replace("/", "_") - .replace("-", "_") - .to_uppercase(); + for (phase, packets) in latest_phases { + for (name, id_11) in packets { + let sanitized = name.replace("/", "_").replace("-", "_").to_uppercase(); + let const_name = format_ident!("{}_{}", phase.to_uppercase(), sanitized); - let const_name = format_ident!("{}_{}", phase_name.to_uppercase(), sanitized_name); + // Check if the packet exists in 1.21.7 to get the alternate ID + let id_7 = v7_phases + .get(phase) + .and_then(|p| p.get(name)) + .cloned() + .unwrap_or(-1); - consts.extend(quote! { - pub const #const_name: i32 = #packet_id; + // Since serverbound/clientbound are modules, we reference the PacketId in the parent scope + output.extend(quote! { + pub const #const_name: super::PacketId = super::PacketId { + latest_id: #id_11, + v1_21_7_id: #id_7, + }; }); } } - consts + output } diff --git a/pumpkin-data/build/registry.rs b/pumpkin-data/build/registry.rs index 88f445618..78040ac7c 100644 --- a/pumpkin-data/build/registry.rs +++ b/pumpkin-data/build/registry.rs @@ -86,6 +86,7 @@ pub(crate) fn build() -> TokenStream { impl Registry { pub fn get_synced(version: MinecraftVersion) -> Vec { let static_regs = match version { + MinecraftVersion::V_1_21_7 => REGISTRIES_1_21_9, MinecraftVersion::V_1_21_9 => REGISTRIES_1_21_9, _ => REGISTRIES_1_21_11, }; diff --git a/pumpkin-data/build/tag.rs b/pumpkin-data/build/tag.rs index 7bc4d599a..6bf606d48 100644 --- a/pumpkin-data/build/tag.rs +++ b/pumpkin-data/build/tag.rs @@ -205,6 +205,8 @@ pub(crate) fn build() -> TokenStream { }); match_get_map .push(quote! { MinecraftVersion::V_1_21_9 => tags_1_21_9::get_map(tag_category) }); + match_get_map + .push(quote! { MinecraftVersion::V_1_21_7 => tags_1_21_9::get_map(tag_category) }); } } diff --git a/pumpkin-data/build/tracked_data.rs b/pumpkin-data/build/tracked_data.rs index 76354b850..7a2ee9022 100644 --- a/pumpkin-data/build/tracked_data.rs +++ b/pumpkin-data/build/tracked_data.rs @@ -1,33 +1,67 @@ -use std::fs; - use proc_macro2::TokenStream; use quote::{format_ident, quote}; +use std::{collections::BTreeMap, fs}; pub(crate) fn build() -> TokenStream { - println!("cargo:rerun-if-changed=../assets/tracked_data.json"); + // 1. Track files + println!("cargo:rerun-if-changed=../assets/tracked_data/1_21_7_tracked_data.json"); + println!("cargo:rerun-if-changed=../assets/tracked_data/1_21_11_tracked_data.json"); - let mut handlers: Vec<(String, u8)> = - serde_json::from_str::>( - &fs::read_to_string("../assets/tracked_data.json").unwrap(), - ) - .expect("Failed to parse tracked_data.json") - .into_iter() - .collect(); + let data_7: BTreeMap = serde_json::from_str( + &fs::read_to_string("../assets/tracked_data/1_21_7_tracked_data.json") + .expect("1.21.7 data missing"), + ) + .unwrap(); - handlers.sort_by_key(|&(_, id)| id); + let data_11: BTreeMap = serde_json::from_str( + &fs::read_to_string("../assets/tracked_data/1_21_11_tracked_data.json") + .expect("1.21.11 data missing"), + ) + .unwrap(); - let constants = handlers.iter().map(|(name, id)| { + let mut constants = TokenStream::new(); + + for (name, id_11) in &data_11 { let ident = format_ident!("DATA_{}", name.to_uppercase()); - quote! { - pub const #ident: u8 = #id; - } - }); + + let id_7 = data_7.get(name).cloned().unwrap_or(255); // 255 as an 'Invalid' marker + + constants.extend(quote! { + pub const #ident: TrackedId = TrackedId { + latest: #id_11, + v1_21_7: #id_7, + }; + }); + } quote! { + use pumpkin_util::version::MinecraftVersion; + + #[derive(Copy, Clone, Debug)] + pub struct TrackedId { + pub latest: u8, + pub v1_21_7: u8, + } + + impl TrackedId { + pub fn get(&self, version: &MinecraftVersion) -> u8 { + match version { + MinecraftVersion::V_1_21_7 => self.v1_21_7, + _ => self.latest, + } + } + } + + impl From for u8 { + fn from(id: TrackedId) -> u8 { + id.latest + } + } + pub struct TrackedData; impl TrackedData { - #(#constants)* + #constants } } } diff --git a/pumpkin-macros/src/lib.rs b/pumpkin-macros/src/lib.rs index 6f72d3e37..0a9284bd0 100644 --- a/pumpkin-macros/src/lib.rs +++ b/pumpkin-macros/src/lib.rs @@ -167,6 +167,23 @@ pub fn packet(args: TokenStream, item: TokenStream) -> TokenStream { .into() } +#[proc_macro_attribute] +pub fn java_packet(args: TokenStream, item: TokenStream) -> TokenStream { + let packet_id_expr = parse_macro_input!(args as Expr); + let ast = parse_macro_input!(item as DeriveInput); + + let name = &ast.ident; + let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl(); + + quote! { + #ast + impl #impl_generics crate::packet::MultiVersionJavaPacket for #name #ty_generics #where_clause { + const PACKET_ID: pumpkin_data::packet::PacketId = #packet_id_expr; + } + } + .into() +} + #[proc_macro_attribute] pub fn pumpkin_block(args: TokenStream, item: TokenStream) -> TokenStream { let input_item = item.clone(); diff --git a/pumpkin-protocol/src/codec/velocity.rs b/pumpkin-protocol/src/codec/velocity.rs index c6517dcf6..8f0b209ae 100644 --- a/pumpkin-protocol/src/codec/velocity.rs +++ b/pumpkin-protocol/src/codec/velocity.rs @@ -1,11 +1,56 @@ use pumpkin_util::math::vector3::Vector3; -use crate::VarInt; +use crate::{ + VarInt, + ser::{NetworkWriteExt, WritingError}, +}; use serde::{Serialize, ser::Serializer}; #[derive(Clone, Copy)] pub struct Velocity(pub Vector3); +impl Velocity { + pub fn write(&self, writer: &mut W) -> Result<(), WritingError> { + let velocity = self.0; + let d = clamp_value(velocity.x); + let e = clamp_value(velocity.y); + let f = clamp_value(velocity.z); + let g = abs_max(d, abs_max(e, f)); + + if g < MIN_VELOCITY_MAGNITUDE { + return writer.write_slice(&[0u8]); + } + + let l = g.ceil() as i64; + let bl = l > 3; + + // The header byte: bits 0-1 are scale, bit 2 is the extension flag + let m = if bl { (l & 3) | 4 } else { l }; + + // Pack the 15-bit quantized components into a 64-bit long + // n (x): bits 3-17 | o (y): bits 18-32 | p (z): bits 33-47 + let n = to_long(d / l as f64) << 3; + let o = to_long(e / l as f64) << 18; + let p = to_long(f / l as f64) << 33; + + let packed_data: i64 = m | n | o | p; + + writer + .write_all(&(packed_data as u16).to_le_bytes()) + .unwrap(); // Write low 16 bits + writer + .write_all(&((packed_data >> 16) as i32).to_be_bytes()) + .unwrap(); // Write next 32 bits + + if bl { + let scale_tail = VarInt((l >> 2) as i32); + writer.write_var_int(&scale_tail)?; + } + + Ok(()) + } +} + const MAX_VELOCITY_CLAMP: f64 = 1.7179869183E10; const MIN_VELOCITY_MAGNITUDE: f64 = 3.051944088384301E-5; const MAX_15_BIT_VALUE: f64 = 32766.0; @@ -28,47 +73,7 @@ fn to_long(value: f64) -> i64 { impl Serialize for Velocity { fn serialize(&self, serializer: S) -> Result { let mut buf = Vec::new(); - let velocity = self.0; - let d = clamp_value(velocity.x); - let e = clamp_value(velocity.y); - let f = clamp_value(velocity.z); - let g = abs_max(d, abs_max(e, f)); - - if g < MIN_VELOCITY_MAGNITUDE { - buf.push(0u8); - return serializer.serialize_bytes(&buf); - } - - // l is the scale factor - let l = g.ceil() as i64; - // bl is true if the scale factor is > 3 and needs VarInt extension - let bl = l > 3; - - // m is the first byte of the packed data (low 3 bits of l + 4 if bl is true) - let m = if bl { l & 3 | 4 } else { l }; - - // Quantize and shift the velocity components (15 bits each) - let n: i64 = to_long(d / l as f64) << 3; // X shifted 3 - let o: i64 = to_long(e / l as f64) << 18; // Y shifted 18 - let p: i64 = to_long(f / l as f64) << 33; // Z shifted 33 - - // q is the packed 48-bit value (m + X + Y + Z) - let q: i64 = m | n | o | p; - - // 1. Write first byte (low 8 bits) - buf.push(q as u8); - - // 2. Write second byte (bits 8-15) - buf.push((q >> 8) as u8); - - // 3. Write remaining 4 bytes (bits 16-47) as a Big Endian i32 (Java's writeInt) - buf.extend_from_slice(&((q >> 16) as i32).to_be_bytes()); - - // 4. Write VarInt for scale factor tail if needed - if bl { - VarInt::encode(&VarInt((l >> 2) as i32), &mut buf).unwrap(); - } - + self.write(&mut buf).unwrap(); serializer.serialize_bytes(&buf) } } diff --git a/pumpkin-protocol/src/java/client/config/add_resource_pack.rs b/pumpkin-protocol/src/java/client/config/add_resource_pack.rs index 88bbef14c..e13e2b86a 100644 --- a/pumpkin-protocol/src/java/client/config/add_resource_pack.rs +++ b/pumpkin-protocol/src/java/client/config/add_resource_pack.rs @@ -1,12 +1,12 @@ use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use pumpkin_data::packet::clientbound::CONFIG_RESOURCE_PACK_PUSH; #[derive(Serialize)] -#[packet(CONFIG_RESOURCE_PACK_PUSH)] +#[java_packet(CONFIG_RESOURCE_PACK_PUSH)] pub struct CConfigAddResourcePack<'a> { #[serde(with = "uuid::serde::compact")] pub uuid: &'a uuid::Uuid, diff --git a/pumpkin-protocol/src/java/client/config/config_disconnect.rs b/pumpkin-protocol/src/java/client/config/config_disconnect.rs index 5b07b6ea8..643b39615 100644 --- a/pumpkin-protocol/src/java/client/config/config_disconnect.rs +++ b/pumpkin-protocol/src/java/client/config/config_disconnect.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::CONFIG_DISCONNECT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; #[derive(serde::Serialize, Deserialize)] -#[packet(CONFIG_DISCONNECT)] +#[java_packet(CONFIG_DISCONNECT)] pub struct CConfigDisconnect<'a> { pub reason: &'a str, } diff --git a/pumpkin-protocol/src/java/client/config/cookie_request.rs b/pumpkin-protocol/src/java/client/config/cookie_request.rs index 8809e0d03..0de570598 100644 --- a/pumpkin-protocol/src/java/client/config/cookie_request.rs +++ b/pumpkin-protocol/src/java/client/config/cookie_request.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::CONFIG_COOKIE_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; #[derive(serde::Serialize)] -#[packet(CONFIG_COOKIE_REQUEST)] +#[java_packet(CONFIG_COOKIE_REQUEST)] /// Requests a cookie that was previously stored. pub struct CCookieRequest<'a> { pub key: &'a ResourceLocation, diff --git a/pumpkin-protocol/src/java/client/config/finish_config.rs b/pumpkin-protocol/src/java/client/config/finish_config.rs index 74e0d7085..da2e69f01 100644 --- a/pumpkin-protocol/src/java/client/config/finish_config.rs +++ b/pumpkin-protocol/src/java/client/config/finish_config.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::CONFIG_FINISH_CONFIGURATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(CONFIG_FINISH_CONFIGURATION)] +#[java_packet(CONFIG_FINISH_CONFIGURATION)] pub struct CFinishConfig; diff --git a/pumpkin-protocol/src/java/client/config/known_packs.rs b/pumpkin-protocol/src/java/client/config/known_packs.rs index eaf20251f..07320295b 100644 --- a/pumpkin-protocol/src/java/client/config/known_packs.rs +++ b/pumpkin-protocol/src/java/client/config/known_packs.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::CONFIG_SELECT_KNOWN_PACKS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::KnownPack; #[derive(Serialize)] -#[packet(CONFIG_SELECT_KNOWN_PACKS)] +#[java_packet(CONFIG_SELECT_KNOWN_PACKS)] pub struct CKnownPacks<'a> { pub known_packs: &'a [KnownPack<'a>], } diff --git a/pumpkin-protocol/src/java/client/config/plugin_message.rs b/pumpkin-protocol/src/java/client/config/plugin_message.rs index 3d5b56bc2..9ef1ca7e1 100644 --- a/pumpkin-protocol/src/java/client/config/plugin_message.rs +++ b/pumpkin-protocol/src/java/client/config/plugin_message.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::CONFIG_CUSTOM_PAYLOAD; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::ser::network_serialize_no_prefix; #[derive(Serialize)] -#[packet(CONFIG_CUSTOM_PAYLOAD)] +#[java_packet(CONFIG_CUSTOM_PAYLOAD)] pub struct CPluginMessage<'a> { pub channel: &'a str, #[serde(serialize_with = "network_serialize_no_prefix")] diff --git a/pumpkin-protocol/src/java/client/config/registry_data.rs b/pumpkin-protocol/src/java/client/config/registry_data.rs index f4e1adbf6..e8197a9f6 100644 --- a/pumpkin-protocol/src/java/client/config/registry_data.rs +++ b/pumpkin-protocol/src/java/client/config/registry_data.rs @@ -1,11 +1,11 @@ use crate::ser::network_serialize_no_prefix; use pumpkin_data::packet::clientbound::CONFIG_REGISTRY_DATA; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use serde::Serialize; #[derive(Serialize)] -#[packet(CONFIG_REGISTRY_DATA)] +#[java_packet(CONFIG_REGISTRY_DATA)] pub struct CRegistryData<'a> { pub registry_id: &'a ResourceLocation, pub entries: &'a [RegistryEntry], diff --git a/pumpkin-protocol/src/java/client/config/server_links.rs b/pumpkin-protocol/src/java/client/config/server_links.rs index e8aa232a5..6e9dcf980 100644 --- a/pumpkin-protocol/src/java/client/config/server_links.rs +++ b/pumpkin-protocol/src/java/client/config/server_links.rs @@ -1,10 +1,10 @@ use crate::Link; use pumpkin_data::packet::clientbound::CONFIG_SERVER_LINKS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(CONFIG_SERVER_LINKS)] +#[java_packet(CONFIG_SERVER_LINKS)] pub struct CConfigServerLinks<'a> { pub links: &'a [Link<'a>], } diff --git a/pumpkin-protocol/src/java/client/config/store_cookie.rs b/pumpkin-protocol/src/java/client/config/store_cookie.rs index 906bd30a7..0e4b6af92 100644 --- a/pumpkin-protocol/src/java/client/config/store_cookie.rs +++ b/pumpkin-protocol/src/java/client/config/store_cookie.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::CONFIG_STORE_COOKIE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; #[derive(serde::Serialize)] -#[packet(CONFIG_STORE_COOKIE)] +#[java_packet(CONFIG_STORE_COOKIE)] /// Stores some arbitrary data on the client, which persists between server transfers. /// The Notchian (vanilla) client only accepts cookies of up to 5 KiB in size. pub struct CStoreCookie<'a> { diff --git a/pumpkin-protocol/src/java/client/config/transfer.rs b/pumpkin-protocol/src/java/client/config/transfer.rs index d580124ac..01c4dff6f 100644 --- a/pumpkin-protocol/src/java/client/config/transfer.rs +++ b/pumpkin-protocol/src/java/client/config/transfer.rs @@ -1,10 +1,10 @@ use crate::VarInt; use pumpkin_data::packet::clientbound::CONFIG_TRANSFER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(CONFIG_TRANSFER)] +#[java_packet(CONFIG_TRANSFER)] pub struct CTransfer<'a> { pub host: &'a str, pub port: &'a VarInt, diff --git a/pumpkin-protocol/src/java/client/config/update_tags.rs b/pumpkin-protocol/src/java/client/config/update_tags.rs index 5154f2b01..2ecff0285 100644 --- a/pumpkin-protocol/src/java/client/config/update_tags.rs +++ b/pumpkin-protocol/src/java/client/config/update_tags.rs @@ -7,11 +7,11 @@ use pumpkin_data::{ packet::clientbound::CONFIG_UPDATE_TAGS, tag::{RegistryKey, get_registry_key_tags}, }; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use pumpkin_util::version::MinecraftVersion; -#[packet(CONFIG_UPDATE_TAGS)] +#[java_packet(CONFIG_UPDATE_TAGS)] pub struct CUpdateTags<'a> { pub tags: &'a [pumpkin_data::tag::RegistryKey], } diff --git a/pumpkin-protocol/src/java/client/login/cookie_request.rs b/pumpkin-protocol/src/java/client/login/cookie_request.rs index 92ee6bfc1..da7fb6c98 100644 --- a/pumpkin-protocol/src/java/client/login/cookie_request.rs +++ b/pumpkin-protocol/src/java/client/login/cookie_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_COOKIE_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use serde::Serialize; @@ -8,7 +8,7 @@ use serde::Serialize; /// This occurs during the login phase, allowing the server to identify /// returning players or retrieve session data stored during a previous visit. #[derive(Serialize)] -#[packet(LOGIN_COOKIE_REQUEST)] +#[java_packet(LOGIN_COOKIE_REQUEST)] pub struct CLoginCookieRequest<'a> { /// The unique identifier of the cookie being requested. pub key: &'a ResourceLocation, diff --git a/pumpkin-protocol/src/java/client/login/encryption_request.rs b/pumpkin-protocol/src/java/client/login/encryption_request.rs index d81f21139..9292869c5 100644 --- a/pumpkin-protocol/src/java/client/login/encryption_request.rs +++ b/pumpkin-protocol/src/java/client/login/encryption_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_HELLO; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Sent by the server to initiate the encryption handshake. @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; /// verification token, allowing the client to generate a shared secret /// for secure communication. #[derive(Serialize, Deserialize)] -#[packet(LOGIN_HELLO)] +#[java_packet(LOGIN_HELLO)] pub struct CEncryptionRequest<'a> { /// The server's ID string. In modern Minecraft, this is usually /// an empty string unless the server is using legacy authentication. diff --git a/pumpkin-protocol/src/java/client/login/login_disconnect.rs b/pumpkin-protocol/src/java/client/login/login_disconnect.rs index 317b6c483..d6b6e9831 100644 --- a/pumpkin-protocol/src/java/client/login/login_disconnect.rs +++ b/pumpkin-protocol/src/java/client/login/login_disconnect.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_LOGIN_DISCONNECT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Sent by the server to reject a login attempt or kick a player during the login phase @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; /// This is used for reasons such as the server being full, the player being banned, /// or version mismatches. After this packet is sent, the connection is closed. #[derive(Serialize, Deserialize)] -#[packet(LOGIN_LOGIN_DISCONNECT)] +#[java_packet(LOGIN_LOGIN_DISCONNECT)] pub struct CLoginDisconnect { /// A JSON-encoded chat component explaining why the player was disconnected. pub json_reason: String, diff --git a/pumpkin-protocol/src/java/client/login/login_success.rs b/pumpkin-protocol/src/java/client/login/login_success.rs index 75e58d431..41716e07e 100644 --- a/pumpkin-protocol/src/java/client/login/login_success.rs +++ b/pumpkin-protocol/src/java/client/login/login_success.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_LOGIN_FINISHED; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::Property; @@ -9,7 +9,7 @@ use crate::Property; /// This packet provides the client with its official UUID and username as /// recognized by the server, along with any associated skin or cape properties. #[derive(Serialize)] -#[packet(LOGIN_LOGIN_FINISHED)] +#[java_packet(LOGIN_LOGIN_FINISHED)] pub struct CLoginSuccess<'a> { /// The unique identifier assigned to the player. pub uuid: &'a uuid::Uuid, diff --git a/pumpkin-protocol/src/java/client/login/plugin_request.rs b/pumpkin-protocol/src/java/client/login/plugin_request.rs index a63fa7baf..7c612861e 100644 --- a/pumpkin-protocol/src/java/client/login/plugin_request.rs +++ b/pumpkin-protocol/src/java/client/login/plugin_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_CUSTOM_QUERY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::{VarInt, ser::network_serialize_no_prefix}; @@ -9,7 +9,7 @@ use crate::{VarInt, ser::network_serialize_no_prefix}; /// This is used by server software (like proxies or anti-cheats) to request /// information from a client-side mod before the player officially joins. #[derive(Serialize)] -#[packet(LOGIN_CUSTOM_QUERY)] +#[java_packet(LOGIN_CUSTOM_QUERY)] pub struct CLoginPluginRequest<'a> { /// A unique ID for this request. The client must include this same ID /// in its response so the server can match them up. diff --git a/pumpkin-protocol/src/java/client/login/set_compression.rs b/pumpkin-protocol/src/java/client/login/set_compression.rs index d5fa3d585..0b520effd 100644 --- a/pumpkin-protocol/src/java/client/login/set_compression.rs +++ b/pumpkin-protocol/src/java/client/login/set_compression.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::LOGIN_LOGIN_COMPRESSION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; use crate::VarInt; @@ -9,7 +9,7 @@ use crate::VarInt; /// Once this packet is sent, both the server and the client must compress any /// packet with a size equal to or greater than the specified threshold. #[derive(Serialize, Deserialize)] -#[packet(LOGIN_LOGIN_COMPRESSION)] +#[java_packet(LOGIN_LOGIN_COMPRESSION)] pub struct CSetCompression { /// The packet size threshold (in bytes) at which compression is applied. /// diff --git a/pumpkin-protocol/src/java/client/play/acknowledge_block.rs b/pumpkin-protocol/src/java/client/play/acknowledge_block.rs index 85c54a387..4f09cdd25 100644 --- a/pumpkin-protocol/src/java/client/play/acknowledge_block.rs +++ b/pumpkin-protocol/src/java/client/play/acknowledge_block.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_BLOCK_CHANGED_ACK; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; use crate::VarInt; @@ -9,7 +9,7 @@ use crate::VarInt; /// This packet is critical for preventing "ghost blocks" and synchronization issues. /// It tells the client that the server has processed all actions up to a specific point. #[derive(Serialize, Deserialize)] -#[packet(PLAY_BLOCK_CHANGED_ACK)] +#[java_packet(PLAY_BLOCK_CHANGED_ACK)] pub struct CAcknowledgeBlockChange { /// The ID of the last sequence processed by the server. /// diff --git a/pumpkin-protocol/src/java/client/play/actionbar.rs b/pumpkin-protocol/src/java/client/play/actionbar.rs index 5153e76dc..537da20d4 100644 --- a/pumpkin-protocol/src/java/client/play/actionbar.rs +++ b/pumpkin-protocol/src/java/client/play/actionbar.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_SET_ACTION_BAR_TEXT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Updates the text displayed above the player's hotbar (the Action Bar). @@ -10,7 +10,7 @@ use serde::Serialize; /// non-critical status information like "Now entering: Wilderness" or /// mana/stamina counters. #[derive(Serialize)] -#[packet(PLAY_SET_ACTION_BAR_TEXT)] +#[java_packet(PLAY_SET_ACTION_BAR_TEXT)] pub struct CActionBar<'a> { /// The text component to be displayed. pub action_bar: &'a TextComponent, diff --git a/pumpkin-protocol/src/java/client/play/block_destroy_stage.rs b/pumpkin-protocol/src/java/client/play/block_destroy_stage.rs index 44198f14a..e12dfaae8 100644 --- a/pumpkin-protocol/src/java/client/play/block_destroy_stage.rs +++ b/pumpkin-protocol/src/java/client/play/block_destroy_stage.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_BLOCK_DESTRUCTION; use pumpkin_util::math::position::BlockPos; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -11,7 +11,7 @@ use crate::VarInt; /// This packet controls the overlay of cracks that appear on a block when /// it is being mined. It is often used to show other players' mining progress. #[derive(Serialize)] -#[packet(PLAY_BLOCK_DESTRUCTION)] +#[java_packet(PLAY_BLOCK_DESTRUCTION)] pub struct CSetBlockDestroyStage { /// A unique ID for this destruction instance. Usually the miner's Entity ID. /// If multiple entities mine the same block, they must use different IDs. diff --git a/pumpkin-protocol/src/java/client/play/block_entity_data.rs b/pumpkin-protocol/src/java/client/play/block_entity_data.rs index dec2b7c2c..1962cd450 100644 --- a/pumpkin-protocol/src/java/client/play/block_entity_data.rs +++ b/pumpkin-protocol/src/java/client/play/block_entity_data.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_BLOCK_ENTITY_DATA; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use serde::Serialize; @@ -10,7 +10,7 @@ use crate::{VarInt, ser::network_serialize_no_prefix}; /// This packet is sent by the server when a block entity's state changes /// (like text on a sign) or when the block entity is loaded into the client's view. #[derive(Serialize)] -#[packet(PLAY_BLOCK_ENTITY_DATA)] +#[java_packet(PLAY_BLOCK_ENTITY_DATA)] pub struct CBlockEntityData { /// The world coordinates of the block entity. pub location: BlockPos, diff --git a/pumpkin-protocol/src/java/client/play/block_event.rs b/pumpkin-protocol/src/java/client/play/block_event.rs index df69a4b47..f4293ae2f 100644 --- a/pumpkin-protocol/src/java/client/play/block_event.rs +++ b/pumpkin-protocol/src/java/client/play/block_event.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_BLOCK_EVENT; use pumpkin_util::math::position::BlockPos; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -11,7 +11,7 @@ use crate::VarInt; /// This is used for simple block interactions that don't necessarily change /// NBT data, such as chests opening/closing, pistons extending, or note blocks playing. #[derive(Serialize)] -#[packet(PLAY_BLOCK_EVENT)] +#[java_packet(PLAY_BLOCK_EVENT)] pub struct CBlockEvent { /// The coordinates where the event occurs. pub location: BlockPos, diff --git a/pumpkin-protocol/src/java/client/play/block_update.rs b/pumpkin-protocol/src/java/client/play/block_update.rs index b8ddf2278..827a3ef62 100644 --- a/pumpkin-protocol/src/java/client/play/block_update.rs +++ b/pumpkin-protocol/src/java/client/play/block_update.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_BLOCK_UPDATE; use pumpkin_util::math::position::BlockPos; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -11,7 +11,7 @@ use crate::VarInt; /// This is the most common way to sync world changes to the client, such as /// when a player places a block, a fluid flows, or a redstone component toggles. #[derive(Serialize)] -#[packet(PLAY_BLOCK_UPDATE)] +#[java_packet(PLAY_BLOCK_UPDATE)] pub struct CBlockUpdate { /// The world coordinates of the block being updated. pub location: BlockPos, diff --git a/pumpkin-protocol/src/java/client/play/boss_event.rs b/pumpkin-protocol/src/java/client/play/boss_event.rs index cb2de4572..7e787600d 100644 --- a/pumpkin-protocol/src/java/client/play/boss_event.rs +++ b/pumpkin-protocol/src/java/client/play/boss_event.rs @@ -4,14 +4,14 @@ use crate::java::client::play::BosseventAction; use crate::ser::NetworkWriteExt; use crate::{ClientPacket, WritingError}; use pumpkin_data::packet::clientbound::PLAY_BOSS_EVENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; /// Updates the "Boss Bar" displayed at the top of the player's screen. /// /// This packet is used to manage health bars for entities like the Ender Dragon /// or Wither, as well as custom progress bars for server events or raids. -#[packet(PLAY_BOSS_EVENT)] +#[java_packet(PLAY_BOSS_EVENT)] pub struct CBossEvent<'a> { /// A unique identifier for this specific boss bar instance. pub uuid: &'a uuid::Uuid, diff --git a/pumpkin-protocol/src/java/client/play/center_chunk.rs b/pumpkin-protocol/src/java/client/play/center_chunk.rs index 6aea0ad34..efff6fb65 100644 --- a/pumpkin-protocol/src/java/client/play/center_chunk.rs +++ b/pumpkin-protocol/src/java/client/play/center_chunk.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_SET_CHUNK_CACHE_CENTER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -10,7 +10,7 @@ use crate::VarInt; /// focal point for loading and unloading chunks. It is typically sent when /// a player moves across a chunk boundary. #[derive(Serialize)] -#[packet(PLAY_SET_CHUNK_CACHE_CENTER)] +#[java_packet(PLAY_SET_CHUNK_CACHE_CENTER)] pub struct CCenterChunk { /// The X coordinate of the center chunk. pub chunk_x: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/change_difficulty.rs b/pumpkin-protocol/src/java/client/play/change_difficulty.rs index 593a6a81a..c6bd9c19d 100644 --- a/pumpkin-protocol/src/java/client/play/change_difficulty.rs +++ b/pumpkin-protocol/src/java/client/play/change_difficulty.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_CHANGE_DIFFICULTY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Notifies the client of a change in the world's difficulty level or lock status. @@ -8,7 +8,7 @@ use serde::Serialize; /// and client-side behavior (though actual game logic like mob damage is /// primarily handled by the server). #[derive(Serialize)] -#[packet(PLAY_CHANGE_DIFFICULTY)] +#[java_packet(PLAY_CHANGE_DIFFICULTY)] pub struct CChangeDifficulty { /// The current difficulty level of the world. /// diff --git a/pumpkin-protocol/src/java/client/play/chunk_batch_end.rs b/pumpkin-protocol/src/java/client/play/chunk_batch_end.rs index 8ed6d449e..2dade8e44 100644 --- a/pumpkin-protocol/src/java/client/play/chunk_batch_end.rs +++ b/pumpkin-protocol/src/java/client/play/chunk_batch_end.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_CHUNK_BATCH_FINISHED; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::codec::var_int::VarInt; @@ -10,7 +10,7 @@ use crate::codec::var_int::VarInt; /// allows the client to acknowledge the receipt of a group of chunks, helping /// the server regulate the flow of data and prevent network congestion. #[derive(Serialize)] -#[packet(PLAY_CHUNK_BATCH_FINISHED)] +#[java_packet(PLAY_CHUNK_BATCH_FINISHED)] pub struct CChunkBatchEnd { /// The number of chunks sent in the batch that just finished. pub batch_size: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/chunk_batch_start.rs b/pumpkin-protocol/src/java/client/play/chunk_batch_start.rs index 20a4f3e8e..d17722675 100644 --- a/pumpkin-protocol/src/java/client/play/chunk_batch_start.rs +++ b/pumpkin-protocol/src/java/client/play/chunk_batch_start.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_CHUNK_BATCH_START; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Signals the beginning of a new batch of chunk data packets. @@ -9,5 +9,5 @@ use serde::Serialize; /// a `Start` and `End` packet to manage client-side backpressure and /// network throughput. #[derive(Serialize)] -#[packet(PLAY_CHUNK_BATCH_START)] +#[java_packet(PLAY_CHUNK_BATCH_START)] pub struct CChunkBatchStart; diff --git a/pumpkin-protocol/src/java/client/play/chunk_data.rs b/pumpkin-protocol/src/java/client/play/chunk_data.rs index d5e4276f2..ebbb3c8e0 100644 --- a/pumpkin-protocol/src/java/client/play/chunk_data.rs +++ b/pumpkin-protocol/src/java/client/play/chunk_data.rs @@ -2,7 +2,7 @@ use crate::WritingError; use crate::codec::bit_set::BitSet; use crate::{ClientPacket, VarInt, ser::NetworkWriteExt}; use pumpkin_data::packet::clientbound::PLAY_LEVEL_CHUNK_WITH_LIGHT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_nbt::END_ID; use pumpkin_util::math::position::get_local_cord; use pumpkin_util::version::MinecraftVersion; @@ -15,7 +15,7 @@ use std::io::Write; /// This includes heightmaps, the actual block and biome data (organized into sections), /// block entities (like signs or chests), and the light level information for both /// sky and block light. -#[packet(PLAY_LEVEL_CHUNK_WITH_LIGHT)] +#[java_packet(PLAY_LEVEL_CHUNK_WITH_LIGHT)] pub struct CChunkData<'a>(pub &'a ChunkData); impl ClientPacket for CChunkData<'_> { diff --git a/pumpkin-protocol/src/java/client/play/clear_title.rs b/pumpkin-protocol/src/java/client/play/clear_title.rs index e7ccbefee..25f2a060b 100644 --- a/pumpkin-protocol/src/java/client/play/clear_title.rs +++ b/pumpkin-protocol/src/java/client/play/clear_title.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_CLEAR_TITLES; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Removes any currently displayed Title or Subtitle from the player's screen. @@ -7,7 +7,7 @@ use serde::Serialize; /// This packet is used to immediately hide titles that are currently in their /// "stay" or "fade-out" phases. #[derive(Serialize)] -#[packet(PLAY_CLEAR_TITLES)] +#[java_packet(PLAY_CLEAR_TITLES)] pub struct CClearTitle { /// If true, the client also resets the title timings (fade-in, stay, fade-out) /// to their default values (10, 70, 20 ticks). diff --git a/pumpkin-protocol/src/java/client/play/close_container.rs b/pumpkin-protocol/src/java/client/play/close_container.rs index 1b43bf681..1731d7baf 100644 --- a/pumpkin-protocol/src/java/client/play/close_container.rs +++ b/pumpkin-protocol/src/java/client/play/close_container.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_CONTAINER_CLOSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -10,7 +10,7 @@ use crate::VarInt; /// if the player moves too far away from a chest or if an NPC's trade window /// is invalidated. #[derive(Serialize)] -#[packet(PLAY_CONTAINER_CLOSE)] +#[java_packet(PLAY_CONTAINER_CLOSE)] pub struct CCloseContainer { /// The ID of the container window to close. /// diff --git a/pumpkin-protocol/src/java/client/play/combat_death.rs b/pumpkin-protocol/src/java/client/play/combat_death.rs index 6c158f25a..42df278e4 100644 --- a/pumpkin-protocol/src/java/client/play/combat_death.rs +++ b/pumpkin-protocol/src/java/client/play/combat_death.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_PLAYER_COMBAT_KILL; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::text::TextComponent; use serde::Serialize; @@ -10,7 +10,7 @@ use crate::VarInt; /// This packet is responsible for triggering the death screen on the client /// and displaying the death message in the chat for the deceased player. #[derive(Serialize)] -#[packet(PLAY_PLAYER_COMBAT_KILL)] +#[java_packet(PLAY_PLAYER_COMBAT_KILL)] pub struct CCombatDeath<'a> { /// The Entity ID of the player who died. pub player_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/command_suggestions.rs b/pumpkin-protocol/src/java/client/play/command_suggestions.rs index df4e2f925..d31cc739a 100644 --- a/pumpkin-protocol/src/java/client/play/command_suggestions.rs +++ b/pumpkin-protocol/src/java/client/play/command_suggestions.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_COMMAND_SUGGESTIONS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::text::TextComponent; use serde::Serialize; @@ -11,7 +11,7 @@ use crate::VarInt; /// appearing as a scrollable list of options while the player is typing /// in the chat bar. #[derive(Serialize)] -#[packet(PLAY_COMMAND_SUGGESTIONS)] +#[java_packet(PLAY_COMMAND_SUGGESTIONS)] pub struct CCommandSuggestions { /// The unique ID of the request this response is for. /// This must match the ID sent by the client in the request packet. diff --git a/pumpkin-protocol/src/java/client/play/commands.rs b/pumpkin-protocol/src/java/client/play/commands.rs index 649764c52..8af1cd9ca 100644 --- a/pumpkin-protocol/src/java/client/play/commands.rs +++ b/pumpkin-protocol/src/java/client/play/commands.rs @@ -1,7 +1,7 @@ use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_COMMANDS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; use crate::{ClientPacket, VarInt, WritingError, ser::NetworkWriteExt}; @@ -11,7 +11,7 @@ use crate::{ClientPacket, VarInt, WritingError, ser::NetworkWriteExt}; /// Minecraft uses the "Brigadier" command system. This packet informs the client /// which commands exist, their arguments, and how they branch, allowing the /// client to highlight syntax errors in red before the command is even sent. -#[packet(PLAY_COMMANDS)] +#[java_packet(PLAY_COMMANDS)] pub struct CCommands<'a> { /// A flat list of all nodes in the command graph. /// Nodes reference each other by their index in this array. diff --git a/pumpkin-protocol/src/java/client/play/cookie_request.rs b/pumpkin-protocol/src/java/client/play/cookie_request.rs index 97befada8..914da5c85 100644 --- a/pumpkin-protocol/src/java/client/play/cookie_request.rs +++ b/pumpkin-protocol/src/java/client/play/cookie_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_COOKIE_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use serde::Serialize; @@ -9,7 +9,7 @@ use serde::Serialize; /// small amounts of persistent data on the client side that can be retrieved /// even across different server instances or sub-servers in a network. #[derive(Serialize)] -#[packet(PLAY_COOKIE_REQUEST)] +#[java_packet(PLAY_COOKIE_REQUEST)] pub struct CPlayCookieRequest<'a> { /// The unique identifier (namespace:path) of the cookie to retrieve. pub key: &'a ResourceLocation, diff --git a/pumpkin-protocol/src/java/client/play/damage_event.rs b/pumpkin-protocol/src/java/client/play/damage_event.rs index 8d1596d7d..fe9692c39 100644 --- a/pumpkin-protocol/src/java/client/play/damage_event.rs +++ b/pumpkin-protocol/src/java/client/play/damage_event.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_DAMAGE_EVENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; @@ -12,7 +12,7 @@ use crate::VarInt; /// with specific details about the damage source to ensure the visual feedback /// matches the cause. #[derive(Serialize)] -#[packet(PLAY_DAMAGE_EVENT)] +#[java_packet(PLAY_DAMAGE_EVENT)] pub struct CDamageEvent { /// The Entity ID of the entity taking damage. pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/disconnect.rs b/pumpkin-protocol/src/java/client/play/disconnect.rs index 5ada704bc..cd2877bb1 100644 --- a/pumpkin-protocol/src/java/client/play/disconnect.rs +++ b/pumpkin-protocol/src/java/client/play/disconnect.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_DISCONNECT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Forces the client to disconnect from the server while in the "Play" state. @@ -10,7 +10,7 @@ use serde::Serialize; /// disconnection screen. It is used for kicks, server shutdowns, or when /// a player is banned. #[derive(Serialize)] -#[packet(PLAY_DISCONNECT)] +#[java_packet(PLAY_DISCONNECT)] pub struct CPlayDisconnect<'a> { /// The message shown to the player explaining why they were disconnected. /// This supports full JSON formatting (colors, bold, links, etc.). diff --git a/pumpkin-protocol/src/java/client/play/disguised_chat_message.rs b/pumpkin-protocol/src/java/client/play/disguised_chat_message.rs index c35252c90..719d770fc 100644 --- a/pumpkin-protocol/src/java/client/play/disguised_chat_message.rs +++ b/pumpkin-protocol/src/java/client/play/disguised_chat_message.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_DISGUISED_CHAT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -12,7 +12,7 @@ use crate::VarInt; /// this packet bypasses the player-to-player chat signing requirements while /// still allowing the client to format the message using the standard chat registry. #[derive(Serialize)] -#[packet(PLAY_DISGUISED_CHAT)] +#[java_packet(PLAY_DISGUISED_CHAT)] pub struct CDisguisedChatMessage<'a> { /// The raw content of the message. pub message: &'a TextComponent, diff --git a/pumpkin-protocol/src/java/client/play/display_objective.rs b/pumpkin-protocol/src/java/client/play/display_objective.rs index 53ec6d3f9..48ccf736f 100644 --- a/pumpkin-protocol/src/java/client/play/display_objective.rs +++ b/pumpkin-protocol/src/java/client/play/display_objective.rs @@ -1,7 +1,7 @@ use pumpkin_data::{ packet::clientbound::PLAY_SET_DISPLAY_OBJECTIVE, scoreboard::ScoreboardDisplaySlot, }; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -12,7 +12,7 @@ use crate::VarInt; /// an objective is created and populated with scores, this packet "maps" /// that objective to a visual location like the sidebar or the player list. #[derive(Serialize)] -#[packet(PLAY_SET_DISPLAY_OBJECTIVE)] +#[java_packet(PLAY_SET_DISPLAY_OBJECTIVE)] pub struct CDisplayObjective { /// The display slot/position for the objective. pub position: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/entity_animation.rs b/pumpkin-protocol/src/java/client/play/entity_animation.rs index d1c786abc..2394463cb 100644 --- a/pumpkin-protocol/src/java/client/play/entity_animation.rs +++ b/pumpkin-protocol/src/java/client/play/entity_animation.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_ANIMATE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -9,7 +9,7 @@ use crate::VarInt; /// This is primarily used for player-driven animations like swinging an arm /// or showing damage, but it can apply to other entities as well. #[derive(Serialize)] -#[packet(PLAY_ANIMATE)] +#[java_packet(PLAY_ANIMATE)] pub struct CEntityAnimation { /// The Entity ID of the entity performing the animation. pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/entity_metadata.rs b/pumpkin-protocol/src/java/client/play/entity_metadata.rs index 2174cfc9e..9e29f7135 100644 --- a/pumpkin-protocol/src/java/client/play/entity_metadata.rs +++ b/pumpkin-protocol/src/java/client/play/entity_metadata.rs @@ -1,8 +1,14 @@ -use pumpkin_data::{meta_data_type::MetaDataType, packet::clientbound::PLAY_SET_ENTITY_DATA}; -use pumpkin_macros::packet; +use pumpkin_data::{ + meta_data_type::MetaDataType, packet::clientbound::PLAY_SET_ENTITY_DATA, + tracked_data::TrackedId, +}; +use pumpkin_macros::java_packet; use serde::Serialize; -use crate::{VarInt, ser::network_serialize_no_prefix}; +use crate::{ + VarInt, + ser::{NetworkWriteExt, WritingError, network_serialize_no_prefix, serializer}, +}; /// Updates the "Data Tracker" values for an entity. /// @@ -10,7 +16,7 @@ use crate::{VarInt, ser::network_serialize_no_prefix}; /// don't require a full packet to update, such as whether an entity is on fire, /// crouching, glowing, or the custom name displayed above its head. #[derive(Serialize)] -#[packet(PLAY_SET_ENTITY_DATA)] +#[java_packet(PLAY_SET_ENTITY_DATA)] pub struct CSetEntityMetadata { /// The Entity ID of the entity whose metadata is being updated. pub entity_id: VarInt, @@ -29,19 +35,43 @@ impl CSetEntityMetadata { } } -#[derive(Serialize, Clone)] pub struct Metadata { - index: u8, + index: TrackedId, r#type: VarInt, value: T, } impl Metadata { - pub fn new(index: u8, r#type: MetaDataType, value: T) -> Self { + pub fn new(index: TrackedId, r#type: MetaDataType, value: T) -> Self { Self { index, r#type: VarInt(r#type as i32), value, } } + + pub fn write( + &self, + mut writer: W, + version: &pumpkin_util::version::MinecraftVersion, + ) -> Result<(), WritingError> + where + T: Serialize, + { + let resolved_index = self.index.get(version); + + if resolved_index == 255 { + return Ok(()); + } + + writer.write_u8(resolved_index)?; + self.r#type.encode(&mut writer)?; + + let mut serializer = serializer::Serializer::new(&mut writer); + self.value + .serialize(&mut serializer) + .map_err(|e| WritingError::Serde(e.to_string()))?; + + Ok(()) + } } diff --git a/pumpkin-protocol/src/java/client/play/entity_position_sync.rs b/pumpkin-protocol/src/java/client/play/entity_position_sync.rs index be32a6275..80c559786 100644 --- a/pumpkin-protocol/src/java/client/play/entity_position_sync.rs +++ b/pumpkin-protocol/src/java/client/play/entity_position_sync.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_ENTITY_POSITION_SYNC; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; @@ -13,7 +13,7 @@ use crate::VarInt; /// /// Note: This packet must NOT be used for the player receiving the packet or /// any entity the player is currently riding. -#[packet(PLAY_ENTITY_POSITION_SYNC)] +#[java_packet(PLAY_ENTITY_POSITION_SYNC)] #[derive(Serialize)] pub struct CEntityPositionSync { /// The Entity ID of the entity being moved. diff --git a/pumpkin-protocol/src/java/client/play/entity_sound_effect.rs b/pumpkin-protocol/src/java/client/play/entity_sound_effect.rs index dcf9ddb30..c733782ea 100644 --- a/pumpkin-protocol/src/java/client/play/entity_sound_effect.rs +++ b/pumpkin-protocol/src/java/client/play/entity_sound_effect.rs @@ -1,5 +1,5 @@ use pumpkin_data::{packet::clientbound::PLAY_SOUND_ENTITY, sound::SoundCategory}; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::{IdOr, SoundEvent, VarInt}; @@ -10,7 +10,7 @@ use crate::{IdOr, SoundEvent, VarInt}; /// through the world. The client handles the panning and attenuation /// (volume drop-off) based on the distance between the player and the entity. #[derive(Serialize)] -#[packet(PLAY_SOUND_ENTITY)] +#[java_packet(PLAY_SOUND_ENTITY)] pub struct CEntitySoundEffect { /// The sound to play. Can be a hardcoded ID or a custom SoundEvent /// (Resource Location). diff --git a/pumpkin-protocol/src/java/client/play/entity_status.rs b/pumpkin-protocol/src/java/client/play/entity_status.rs index 7f0f890cb..eb5f6fbbc 100644 --- a/pumpkin-protocol/src/java/client/play/entity_status.rs +++ b/pumpkin-protocol/src/java/client/play/entity_status.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_ENTITY_EVENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Sends a status update for a specific entity. @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; /// and logical state triggers, such as tool breaking, totem usage, /// or sheep shearing. #[derive(Serialize, Deserialize)] -#[packet(PLAY_ENTITY_EVENT)] +#[java_packet(PLAY_ENTITY_EVENT)] pub struct CEntityStatus { /// The Entity ID of the entity affected by the status change. pub entity_id: i32, diff --git a/pumpkin-protocol/src/java/client/play/entity_velocity.rs b/pumpkin-protocol/src/java/client/play/entity_velocity.rs index f9c553f74..dfc61c160 100644 --- a/pumpkin-protocol/src/java/client/play/entity_velocity.rs +++ b/pumpkin-protocol/src/java/client/play/entity_velocity.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_SET_ENTITY_MOTION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; @@ -10,7 +10,7 @@ use crate::{VarInt, codec::velocity::Velocity}; /// This packet informs the client of a sudden change in an entity's movement, /// such as knockback from an attack, explosions, or being launched by a piston. #[derive(Serialize)] -#[packet(PLAY_SET_ENTITY_MOTION)] +#[java_packet(PLAY_SET_ENTITY_MOTION)] pub struct CEntityVelocity { /// The Entity ID of the entity whose velocity is being set pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/explode.rs b/pumpkin-protocol/src/java/client/play/explode.rs index d88c9ad58..f809c20fa 100644 --- a/pumpkin-protocol/src/java/client/play/explode.rs +++ b/pumpkin-protocol/src/java/client/play/explode.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_EXPLODE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; @@ -11,7 +11,7 @@ use crate::{IdOr, SoundEvent, codec::var_int::VarInt}; /// effects of an explosion in a single call. It triggers the explosion particles, /// plays the sound at the source, and applies knockback to the player. #[derive(Serialize)] -#[packet(PLAY_EXPLODE)] +#[java_packet(PLAY_EXPLODE)] pub struct CExplosion { /// The center coordinates of the explosion. pub center: Vector3, diff --git a/pumpkin-protocol/src/java/client/play/game_event.rs b/pumpkin-protocol/src/java/client/play/game_event.rs index f419af9c6..e11d260a7 100644 --- a/pumpkin-protocol/src/java/client/play/game_event.rs +++ b/pumpkin-protocol/src/java/client/play/game_event.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_GAME_EVENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Updates the game state or triggers specific environmental changes. @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; /// context-specific transitions, such as changing the weather, /// altering the player's gamemode, or displaying the credits. #[derive(Serialize, Deserialize)] -#[packet(PLAY_GAME_EVENT)] +#[java_packet(PLAY_GAME_EVENT)] pub struct CGameEvent { /// The ID of the event type. pub event: u8, diff --git a/pumpkin-protocol/src/java/client/play/head_rot.rs b/pumpkin-protocol/src/java/client/play/head_rot.rs index 1a154f864..f670b7e9d 100644 --- a/pumpkin-protocol/src/java/client/play/head_rot.rs +++ b/pumpkin-protocol/src/java/client/play/head_rot.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_ROTATE_HEAD; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; use crate::VarInt; @@ -11,7 +11,7 @@ use crate::VarInt; /// required to make an entity (like a player or a mob) look in a /// specific direction without necessarily turning its entire body. #[derive(Serialize, Deserialize)] -#[packet(PLAY_ROTATE_HEAD)] +#[java_packet(PLAY_ROTATE_HEAD)] pub struct CHeadRot { /// The Entity ID of the entity whose head is rotating. pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/hurt_animation.rs b/pumpkin-protocol/src/java/client/play/hurt_animation.rs index d6914bd2e..154bdd3bb 100644 --- a/pumpkin-protocol/src/java/client/play/hurt_animation.rs +++ b/pumpkin-protocol/src/java/client/play/hurt_animation.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_HURT_ANIMATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; use crate::VarInt; @@ -10,7 +10,7 @@ use crate::VarInt; /// camera shake or model tilt. It is typically sent immediately after /// an entity's health is reduced. #[derive(Serialize, Deserialize)] -#[packet(PLAY_HURT_ANIMATION)] +#[java_packet(PLAY_HURT_ANIMATION)] pub struct CHurtAnimation { /// The Entity ID of the entity that was hurt. pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/initialize_world_border.rs b/pumpkin-protocol/src/java/client/play/initialize_world_border.rs index 2c7c8d31f..9d6a562be 100644 --- a/pumpkin-protocol/src/java/client/play/initialize_world_border.rs +++ b/pumpkin-protocol/src/java/client/play/initialize_world_border.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_INITIALIZE_BORDER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::{VarInt, codec::var_long::VarLong}; @@ -10,7 +10,7 @@ use crate::{VarInt, codec::var_long::VarLong}; /// It synchronizes the current position, size, and all warning parameters /// to ensure the client-side visual barrier matches the server's authority. #[derive(Serialize)] -#[packet(PLAY_INITIALIZE_BORDER)] +#[java_packet(PLAY_INITIALIZE_BORDER)] pub struct CInitializeWorldBorder { /// The X coordinate of the center of the world border. pub x: f64, diff --git a/pumpkin-protocol/src/java/client/play/keep_alive.rs b/pumpkin-protocol/src/java/client/play/keep_alive.rs index ae9702914..e787e2d70 100644 --- a/pumpkin-protocol/src/java/client/play/keep_alive.rs +++ b/pumpkin-protocol/src/java/client/play/keep_alive.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_KEEP_ALIVE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Maintains the connection and measures latency (ping) between client and server. @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; /// a response within a timeout period (usually 30 seconds), it will disconnect /// the player with a "Timed Out" message. #[derive(Serialize, Deserialize)] -#[packet(PLAY_KEEP_ALIVE)] +#[java_packet(PLAY_KEEP_ALIVE)] pub struct CKeepAlive { /// A unique random identifier for this specific keep-alive request. /// Used to match the server's request with the client's response. diff --git a/pumpkin-protocol/src/java/client/play/level_event.rs b/pumpkin-protocol/src/java/client/play/level_event.rs index 9f72fee13..1a397f02d 100644 --- a/pumpkin-protocol/src/java/client/play/level_event.rs +++ b/pumpkin-protocol/src/java/client/play/level_event.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_LEVEL_EVENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use serde::{Deserialize, Serialize}; @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; /// block breaking particles, firework explosions, or ambient sounds /// like doors opening and portals humming. #[derive(Serialize, Deserialize)] -#[packet(PLAY_LEVEL_EVENT)] +#[java_packet(PLAY_LEVEL_EVENT)] pub struct CLevelEvent { /// The ID of the event to trigger. /// Event IDs are generally divided into Sound Events (1000s) and diff --git a/pumpkin-protocol/src/java/client/play/login.rs b/pumpkin-protocol/src/java/client/play/login.rs index 27220dc59..fe66478d6 100644 --- a/pumpkin-protocol/src/java/client/play/login.rs +++ b/pumpkin-protocol/src/java/client/play/login.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_LOGIN; use pumpkin_util::{math::position::BlockPos, resource_location::ResourceLocation}; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -13,7 +13,7 @@ use crate::VarInt; /// initializes the player's world view, dimension settings, and local game /// rules. Once received, the client begins rendering the world. #[derive(Serialize)] -#[packet(PLAY_LOGIN)] +#[java_packet(PLAY_LOGIN)] pub struct CLogin<'a> { /// The unique ID assigned to the player for the current session. pub entity_id: i32, diff --git a/pumpkin-protocol/src/java/client/play/multi_block_update.rs b/pumpkin-protocol/src/java/client/play/multi_block_update.rs index 716c7bc91..a9e9e2268 100644 --- a/pumpkin-protocol/src/java/client/play/multi_block_update.rs +++ b/pumpkin-protocol/src/java/client/play/multi_block_update.rs @@ -4,7 +4,7 @@ use pumpkin_util::math::{ vector3::{self, Vector3}, }; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Serialize, ser::SerializeTuple}; use crate::codec::{var_int::VarInt, var_long::VarLong}; @@ -14,7 +14,7 @@ use crate::codec::{var_int::VarInt, var_long::VarLong}; /// This packet is much more efficient than sending multiple individual /// `CBlockUpdate` packets when many changes occur in the same area /// (e.g., explosions, structure generation, or large-scale terraforming). -#[packet(PLAY_SECTION_BLOCKS_UPDATE)] +#[java_packet(PLAY_SECTION_BLOCKS_UPDATE)] pub struct CMultiBlockUpdate { /// The coordinates of the chunk section being updated. /// Calculated as (block_coord >> 4). diff --git a/pumpkin-protocol/src/java/client/play/open_screen.rs b/pumpkin-protocol/src/java/client/play/open_screen.rs index 752a42f16..8376ad087 100644 --- a/pumpkin-protocol/src/java/client/play/open_screen.rs +++ b/pumpkin-protocol/src/java/client/play/open_screen.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_OPEN_SCREEN; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -13,7 +13,7 @@ use crate::VarInt; /// `sync_id` which must be used in all subsequent "Set Slot" or "Click Slot" /// packets to ensure the server and client are talking about the same window. #[derive(Serialize)] -#[packet(PLAY_OPEN_SCREEN)] +#[java_packet(PLAY_OPEN_SCREEN)] pub struct COpenScreen<'a> { /// A unique identifier for the current window session. /// Typically increments by 1 for every new window opened. diff --git a/pumpkin-protocol/src/java/client/play/open_sign_editor.rs b/pumpkin-protocol/src/java/client/play/open_sign_editor.rs index 6e3617a59..c76d1a690 100644 --- a/pumpkin-protocol/src/java/client/play/open_sign_editor.rs +++ b/pumpkin-protocol/src/java/client/play/open_sign_editor.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_OPEN_SIGN_EDITOR; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use serde::Serialize; @@ -9,7 +9,7 @@ use serde::Serialize; /// sign editing interface. This usually happens immediately after a /// player places a sign or interacts with an existing one (if allowed). #[derive(Serialize)] -#[packet(PLAY_OPEN_SIGN_EDITOR)] +#[java_packet(PLAY_OPEN_SIGN_EDITOR)] pub struct COpenSignEditor { /// The world coordinates of the sign block to be edited. pub location: BlockPos, diff --git a/pumpkin-protocol/src/java/client/play/particle.rs b/pumpkin-protocol/src/java/client/play/particle.rs index 85295d002..4d7e5bd3f 100644 --- a/pumpkin-protocol/src/java/client/play/particle.rs +++ b/pumpkin-protocol/src/java/client/play/particle.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_LEVEL_PARTICLES; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; @@ -12,7 +12,7 @@ use crate::{VarInt, ser::network_serialize_no_prefix}; /// carry extra data for complex particles like redstone dust (color) or /// block/item breaking (textures). #[derive(Serialize)] -#[packet(PLAY_LEVEL_PARTICLES)] +#[java_packet(PLAY_LEVEL_PARTICLES)] pub struct CParticle<'a> { /// If true, the particle renders even if the client's "Particles" /// setting is set to "Minimal". diff --git a/pumpkin-protocol/src/java/client/play/ping_response.rs b/pumpkin-protocol/src/java/client/play/ping_response.rs index a26c87552..107ba6e89 100644 --- a/pumpkin-protocol/src/java/client/play/ping_response.rs +++ b/pumpkin-protocol/src/java/client/play/ping_response.rs @@ -1,10 +1,10 @@ use pumpkin_data::packet::clientbound::PLAY_PONG_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Responds to a client-initiated ping request to synchronize game state. #[derive(Serialize, Deserialize)] -#[packet(PLAY_PONG_RESPONSE)] +#[java_packet(PLAY_PONG_RESPONSE)] pub struct CPingResponse { /// The unique identifier sent by the client in the initial Ping packet. /// The server must return this exact value. diff --git a/pumpkin-protocol/src/java/client/play/player_abilities.rs b/pumpkin-protocol/src/java/client/play/player_abilities.rs index 8e47185de..000b8e0b1 100644 --- a/pumpkin-protocol/src/java/client/play/player_abilities.rs +++ b/pumpkin-protocol/src/java/client/play/player_abilities.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_PLAYER_ABILITIES; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Updates the player's movement and interaction abilities. @@ -8,7 +8,7 @@ use serde::Serialize; /// and sets the movement speeds. While the client applies these visuals, /// the server must still validate these states to prevent cheating. #[derive(Serialize)] -#[packet(PLAY_PLAYER_ABILITIES)] +#[java_packet(PLAY_PLAYER_ABILITIES)] pub struct CPlayerAbilities { /// A bitmask of player states. /// Bit 0 (0x01): Invulnerable (Creative mode) diff --git a/pumpkin-protocol/src/java/client/play/player_chat_message.rs b/pumpkin-protocol/src/java/client/play/player_chat_message.rs index 177cd0a06..effe072f3 100644 --- a/pumpkin-protocol/src/java/client/play/player_chat_message.rs +++ b/pumpkin-protocol/src/java/client/play/player_chat_message.rs @@ -1,7 +1,7 @@ use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_PLAYER_CHAT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::{text::TextComponent, version::MinecraftVersion}; use crate::{ @@ -14,7 +14,7 @@ use crate::{ /// /// This packet is the backbone of the modern secure chat system. It includes /// tracking indices, digital signatures, and context for reporting. -#[packet(PLAY_PLAYER_CHAT)] +#[java_packet(PLAY_PLAYER_CHAT)] pub struct CPlayerChatMessage { /// Incremental index for messages sent TO this specific client. /// Starts at 0 on login; client disconnects if the sequence is broken. diff --git a/pumpkin-protocol/src/java/client/play/player_info_update.rs b/pumpkin-protocol/src/java/client/play/player_info_update.rs index 12d1eeb61..694cb8c2e 100644 --- a/pumpkin-protocol/src/java/client/play/player_info_update.rs +++ b/pumpkin-protocol/src/java/client/play/player_info_update.rs @@ -2,7 +2,7 @@ use std::io::Write; use bitflags::bitflags; use pumpkin_data::packet::clientbound::PLAY_PLAYER_INFO_UPDATE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; use crate::{ClientPacket, Property, WritingError, ser::NetworkWriteExt}; @@ -40,7 +40,7 @@ bitflags! { /// This packet replaces the legacy "Player Info" packet with a more efficient /// bitmask-driven approach. Instead of sending full data every time, the /// server only sends the fields specified in the `actions` bitmask. -#[packet(PLAY_PLAYER_INFO_UPDATE)] +#[java_packet(PLAY_PLAYER_INFO_UPDATE)] pub struct CPlayerInfoUpdate<'a> { /// The bitmask (PlayerInfoFlags) determining which data follows. pub actions: u8, diff --git a/pumpkin-protocol/src/java/client/play/player_position.rs b/pumpkin-protocol/src/java/client/play/player_position.rs index 2e10713b6..b6a0cb22f 100644 --- a/pumpkin-protocol/src/java/client/play/player_position.rs +++ b/pumpkin-protocol/src/java/client/play/player_position.rs @@ -1,7 +1,7 @@ use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_PLAYER_POSITION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::{math::vector3::Vector3, version::MinecraftVersion}; use crate::{ @@ -14,7 +14,7 @@ use crate::{ /// Commonly known as the "Teleport Packet," this is sent by the server to /// force a change in the player's location. The client must respond with a /// `Teleport Confirm` packet matching the `teleport_id`. -#[packet(PLAY_PLAYER_POSITION)] +#[java_packet(PLAY_PLAYER_POSITION)] pub struct CPlayerPosition { /// A unique ID for this teleport. The client must echo this back /// to confirm the teleport was processed. diff --git a/pumpkin-protocol/src/java/client/play/player_remove.rs b/pumpkin-protocol/src/java/client/play/player_remove.rs index 0d5919e77..860b8f37f 100644 --- a/pumpkin-protocol/src/java/client/play/player_remove.rs +++ b/pumpkin-protocol/src/java/client/play/player_remove.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_PLAYER_INFO_REMOVE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Serialize, ser::SerializeSeq}; /// Sent by the server to remove one or more players from the client's player list (tab list). @@ -7,7 +7,7 @@ use serde::{Serialize, ser::SerializeSeq}; /// This packet is typically used when a player leaves the server or becomes invisible /// to the recipient (e.g., moving out of tracking range). #[derive(Serialize)] -#[packet(PLAY_PLAYER_INFO_REMOVE)] +#[java_packet(PLAY_PLAYER_INFO_REMOVE)] pub struct CRemovePlayerInfo<'a> { /// A list of UUIDs corresponding to the players that should be removed. /// diff --git a/pumpkin-protocol/src/java/client/play/player_spawn_position.rs b/pumpkin-protocol/src/java/client/play/player_spawn_position.rs index c3c45e4c7..99b2585c6 100644 --- a/pumpkin-protocol/src/java/client/play/player_spawn_position.rs +++ b/pumpkin-protocol/src/java/client/play/player_spawn_position.rs @@ -1,15 +1,19 @@ -use serde::Serialize; +use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_SET_DEFAULT_SPAWN_POSITION; -use pumpkin_macros::packet; -use pumpkin_util::math::position::BlockPos; +use pumpkin_macros::java_packet; +use pumpkin_util::{math::position::BlockPos, version::MinecraftVersion}; + +use crate::{ + ClientPacket, + ser::{NetworkWriteExt, WritingError}, +}; /// Sent by the server to set the client's default spawn point and compass target. /// /// This packet updates where the player will respawn upon death (if no bed or anchor is set) /// and dictates the coordinates that a compass will point toward. -#[derive(Serialize)] -#[packet(PLAY_SET_DEFAULT_SPAWN_POSITION)] +#[java_packet(PLAY_SET_DEFAULT_SPAWN_POSITION)] pub struct CPlayerSpawnPosition { /// The namespaced ID of the dimension (e.g., "minecraft:overworld"). /// Required for the client to determine if the spawn point is in their current world. @@ -32,3 +36,25 @@ impl CPlayerSpawnPosition { } } } + +impl ClientPacket for CPlayerSpawnPosition { + fn write_packet_data( + &self, + write: impl Write, + version: &MinecraftVersion, + ) -> Result<(), WritingError> { + let mut write = write; + + if *version >= MinecraftVersion::V_1_21_9 { + write.write_string(&self.dimension_name)?; + } + write.write_block_pos(&self.location)?; + write.write_f32_be(self.yaw)?; + + if *version >= MinecraftVersion::V_1_21_9 { + write.write_f32_be(self.pitch)?; + } + + Ok(()) + } +} diff --git a/pumpkin-protocol/src/java/client/play/remove_entities.rs b/pumpkin-protocol/src/java/client/play/remove_entities.rs index a238080aa..970440d9c 100644 --- a/pumpkin-protocol/src/java/client/play/remove_entities.rs +++ b/pumpkin-protocol/src/java/client/play/remove_entities.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::PLAY_REMOVE_ENTITIES; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -9,7 +9,7 @@ use crate::VarInt; /// This is typically sent when an entity leaves the player's tracking range, /// is killed, or is otherwise removed from the world. #[derive(Serialize)] -#[packet(PLAY_REMOVE_ENTITIES)] +#[java_packet(PLAY_REMOVE_ENTITIES)] pub struct CRemoveEntities<'a> { /// A list of entity IDs to be removed. pub entity_ids: &'a [VarInt], diff --git a/pumpkin-protocol/src/java/client/play/remove_mob_effect.rs b/pumpkin-protocol/src/java/client/play/remove_mob_effect.rs index 8e84c1952..c2489f041 100644 --- a/pumpkin-protocol/src/java/client/play/remove_mob_effect.rs +++ b/pumpkin-protocol/src/java/client/play/remove_mob_effect.rs @@ -1,10 +1,10 @@ use crate::codec::var_int::VarInt; use pumpkin_data::packet::clientbound::PLAY_REMOVE_MOB_EFFECT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_REMOVE_MOB_EFFECT)] +#[java_packet(PLAY_REMOVE_MOB_EFFECT)] pub struct CRemoveMobEffect { pub entity_id: VarInt, pub effect_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/reset_score.rs b/pumpkin-protocol/src/java/client/play/reset_score.rs index 07ccf528a..7a0b04ae7 100644 --- a/pumpkin-protocol/src/java/client/play/reset_score.rs +++ b/pumpkin-protocol/src/java/client/play/reset_score.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_RESET_SCORE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_RESET_SCORE)] +#[java_packet(PLAY_RESET_SCORE)] pub struct CResetScore { pub entity_name: String, pub objective_name: Option, diff --git a/pumpkin-protocol/src/java/client/play/respawn.rs b/pumpkin-protocol/src/java/client/play/respawn.rs index 7298b4c96..d02b5124f 100644 --- a/pumpkin-protocol/src/java/client/play/respawn.rs +++ b/pumpkin-protocol/src/java/client/play/respawn.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::clientbound::PLAY_RESPAWN; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::{math::position::BlockPos, resource_location::ResourceLocation}; use serde::{Deserialize, Serialize}; use crate::VarInt; #[derive(Serialize, Deserialize)] -#[packet(PLAY_RESPAWN)] +#[java_packet(PLAY_RESPAWN)] pub struct CRespawn { pub dimension_type: VarInt, pub dimension_name: ResourceLocation, diff --git a/pumpkin-protocol/src/java/client/play/server_links.rs b/pumpkin-protocol/src/java/client/play/server_links.rs index b5f62ea03..7203a81dd 100644 --- a/pumpkin-protocol/src/java/client/play/server_links.rs +++ b/pumpkin-protocol/src/java/client/play/server_links.rs @@ -1,10 +1,10 @@ use crate::Link; use pumpkin_data::packet::clientbound::PLAY_SERVER_LINKS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SERVER_LINKS)] +#[java_packet(PLAY_SERVER_LINKS)] pub struct CPlayServerLinks<'a> { pub links: &'a [Link<'a>], } diff --git a/pumpkin-protocol/src/java/client/play/set_border_center.rs b/pumpkin-protocol/src/java/client/play/set_border_center.rs index 119f4df01..54d0894a6 100644 --- a/pumpkin-protocol/src/java/client/play/set_border_center.rs +++ b/pumpkin-protocol/src/java/client/play/set_border_center.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_SET_BORDER_CENTER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_BORDER_CENTER)] +#[java_packet(PLAY_SET_BORDER_CENTER)] pub struct CSetBorderCenter { pub x: f64, pub z: f64, diff --git a/pumpkin-protocol/src/java/client/play/set_border_lerp_size.rs b/pumpkin-protocol/src/java/client/play/set_border_lerp_size.rs index 1e2fa84db..d9fc05dda 100644 --- a/pumpkin-protocol/src/java/client/play/set_border_lerp_size.rs +++ b/pumpkin-protocol/src/java/client/play/set_border_lerp_size.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_BORDER_LERP_SIZE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::codec::var_long::VarLong; #[derive(Serialize)] -#[packet(PLAY_SET_BORDER_LERP_SIZE)] +#[java_packet(PLAY_SET_BORDER_LERP_SIZE)] pub struct CSetBorderLerpSize { pub old_diameter: f64, pub new_diameter: f64, diff --git a/pumpkin-protocol/src/java/client/play/set_border_size.rs b/pumpkin-protocol/src/java/client/play/set_border_size.rs index 8ef7e28ec..8d8169078 100644 --- a/pumpkin-protocol/src/java/client/play/set_border_size.rs +++ b/pumpkin-protocol/src/java/client/play/set_border_size.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_SET_BORDER_SIZE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_BORDER_SIZE)] +#[java_packet(PLAY_SET_BORDER_SIZE)] pub struct CSetBorderSize { pub diameter: f64, } diff --git a/pumpkin-protocol/src/java/client/play/set_border_warning_delay.rs b/pumpkin-protocol/src/java/client/play/set_border_warning_delay.rs index eddfebce6..0101389d7 100644 --- a/pumpkin-protocol/src/java/client/play/set_border_warning_delay.rs +++ b/pumpkin-protocol/src/java/client/play/set_border_warning_delay.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_BORDER_WARNING_DELAY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_SET_BORDER_WARNING_DELAY)] +#[java_packet(PLAY_SET_BORDER_WARNING_DELAY)] pub struct CSetBorderWarningDelay { pub warning_time: VarInt, } diff --git a/pumpkin-protocol/src/java/client/play/set_border_warning_distance.rs b/pumpkin-protocol/src/java/client/play/set_border_warning_distance.rs index 18d23e528..4c31dbb45 100644 --- a/pumpkin-protocol/src/java/client/play/set_border_warning_distance.rs +++ b/pumpkin-protocol/src/java/client/play/set_border_warning_distance.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_BORDER_WARNING_DISTANCE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_SET_BORDER_WARNING_DISTANCE)] +#[java_packet(PLAY_SET_BORDER_WARNING_DISTANCE)] pub struct CSetBorderWarningDistance { pub warning_blocks: VarInt, } diff --git a/pumpkin-protocol/src/java/client/play/set_container_content.rs b/pumpkin-protocol/src/java/client/play/set_container_content.rs index 548b36e68..4c1ec4941 100644 --- a/pumpkin-protocol/src/java/client/play/set_container_content.rs +++ b/pumpkin-protocol/src/java/client/play/set_container_content.rs @@ -2,11 +2,11 @@ use crate::VarInt; use crate::codec::item_stack_seralizer::ItemStackSerializer; use pumpkin_data::packet::clientbound::PLAY_CONTAINER_SET_CONTENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_CONTAINER_SET_CONTENT)] +#[java_packet(PLAY_CONTAINER_SET_CONTENT)] pub struct CSetContainerContent<'a> { pub window_id: VarInt, pub state_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/set_container_property.rs b/pumpkin-protocol/src/java/client/play/set_container_property.rs index eaa63b0b3..3989f0d10 100644 --- a/pumpkin-protocol/src/java/client/play/set_container_property.rs +++ b/pumpkin-protocol/src/java/client/play/set_container_property.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_CONTAINER_SET_DATA; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_CONTAINER_SET_DATA)] +#[java_packet(PLAY_CONTAINER_SET_DATA)] pub struct CSetContainerProperty { pub window_id: VarInt, pub property: i16, diff --git a/pumpkin-protocol/src/java/client/play/set_container_slot.rs b/pumpkin-protocol/src/java/client/play/set_container_slot.rs index 8bafb5c8c..2abaca5c6 100644 --- a/pumpkin-protocol/src/java/client/play/set_container_slot.rs +++ b/pumpkin-protocol/src/java/client/play/set_container_slot.rs @@ -2,11 +2,11 @@ use crate::VarInt; use crate::codec::item_stack_seralizer::ItemStackSerializer; use pumpkin_data::packet::clientbound::PLAY_CONTAINER_SET_SLOT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_CONTAINER_SET_SLOT)] +#[java_packet(PLAY_CONTAINER_SET_SLOT)] pub struct CSetContainerSlot<'a> { pub window_id: i8, pub state_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/set_cursor_slot.rs b/pumpkin-protocol/src/java/client/play/set_cursor_slot.rs index 2b954da51..1731644ea 100644 --- a/pumpkin-protocol/src/java/client/play/set_cursor_slot.rs +++ b/pumpkin-protocol/src/java/client/play/set_cursor_slot.rs @@ -1,11 +1,11 @@ use crate::codec::item_stack_seralizer::ItemStackSerializer; use pumpkin_data::packet::clientbound::PLAY_SET_CURSOR_ITEM; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_CURSOR_ITEM)] +#[java_packet(PLAY_SET_CURSOR_ITEM)] pub struct CSetCursorItem<'a> { pub stack: &'a ItemStackSerializer<'a>, } diff --git a/pumpkin-protocol/src/java/client/play/set_equipment.rs b/pumpkin-protocol/src/java/client/play/set_equipment.rs index 6a19e5ecb..112e92e1a 100644 --- a/pumpkin-protocol/src/java/client/play/set_equipment.rs +++ b/pumpkin-protocol/src/java/client/play/set_equipment.rs @@ -5,7 +5,7 @@ use crate::{ ser::{NetworkWriteExt, serializer::Serializer}, }; use pumpkin_data::packet::clientbound::PLAY_SET_EQUIPMENT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; use serde::Serialize; @@ -14,7 +14,7 @@ use crate::{ codec::{item_stack_seralizer::ItemStackSerializer, var_int::VarInt}, }; -#[packet(PLAY_SET_EQUIPMENT)] +#[java_packet(PLAY_SET_EQUIPMENT)] pub struct CSetEquipment { pub entity_id: VarInt, pub equipment: Vec<(i8, ItemStackSerializer<'static>)>, diff --git a/pumpkin-protocol/src/java/client/play/set_experience.rs b/pumpkin-protocol/src/java/client/play/set_experience.rs index 0edaaa02b..35b5d1185 100644 --- a/pumpkin-protocol/src/java/client/play/set_experience.rs +++ b/pumpkin-protocol/src/java/client/play/set_experience.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_EXPERIENCE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_SET_EXPERIENCE)] +#[java_packet(PLAY_SET_EXPERIENCE)] pub struct CSetExperience { pub progress: f32, pub total_experience: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/set_health.rs b/pumpkin-protocol/src/java/client/play/set_health.rs index 2b9e885fa..5dca5985b 100644 --- a/pumpkin-protocol/src/java/client/play/set_health.rs +++ b/pumpkin-protocol/src/java/client/play/set_health.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_HEALTH; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_SET_HEALTH)] +#[java_packet(PLAY_SET_HEALTH)] pub struct CSetHealth { pub health: f32, pub food: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/set_held_item.rs b/pumpkin-protocol/src/java/client/play/set_held_item.rs index f32e4dbd6..ee7c37c21 100644 --- a/pumpkin-protocol/src/java/client/play/set_held_item.rs +++ b/pumpkin-protocol/src/java/client/play/set_held_item.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_SET_HELD_SLOT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_HELD_SLOT)] +#[java_packet(PLAY_SET_HELD_SLOT)] pub struct CSetSelectedSlot { pub slot: i8, } diff --git a/pumpkin-protocol/src/java/client/play/set_player_inventory.rs b/pumpkin-protocol/src/java/client/play/set_player_inventory.rs index c592061bb..a7895ada6 100644 --- a/pumpkin-protocol/src/java/client/play/set_player_inventory.rs +++ b/pumpkin-protocol/src/java/client/play/set_player_inventory.rs @@ -2,11 +2,11 @@ use crate::VarInt; use crate::codec::item_stack_seralizer::ItemStackSerializer; use pumpkin_data::packet::clientbound::PLAY_SET_PLAYER_INVENTORY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_PLAYER_INVENTORY)] +#[java_packet(PLAY_SET_PLAYER_INVENTORY)] pub struct CSetPlayerInventory<'a> { pub slot: VarInt, pub item: &'a ItemStackSerializer<'a>, diff --git a/pumpkin-protocol/src/java/client/play/set_time.rs b/pumpkin-protocol/src/java/client/play/set_time.rs index 556db5aad..f43d92098 100644 --- a/pumpkin-protocol/src/java/client/play/set_time.rs +++ b/pumpkin-protocol/src/java/client/play/set_time.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_SET_TIME; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_TIME)] +#[java_packet(PLAY_SET_TIME)] pub struct CUpdateTime { pub world_age: i64, pub time_of_day: i64, diff --git a/pumpkin-protocol/src/java/client/play/set_title.rs b/pumpkin-protocol/src/java/client/play/set_title.rs index 8e049a4a6..8e67dc555 100644 --- a/pumpkin-protocol/src/java/client/play/set_title.rs +++ b/pumpkin-protocol/src/java/client/play/set_title.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_TITLE_TEXT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_TITLE_TEXT)] +#[java_packet(PLAY_SET_TITLE_TEXT)] pub struct CTitleText<'a> { pub title: &'a TextComponent, } diff --git a/pumpkin-protocol/src/java/client/play/set_title_animation.rs b/pumpkin-protocol/src/java/client/play/set_title_animation.rs index 898baeff4..eba5a8345 100644 --- a/pumpkin-protocol/src/java/client/play/set_title_animation.rs +++ b/pumpkin-protocol/src/java/client/play/set_title_animation.rs @@ -1,10 +1,10 @@ use pumpkin_data::packet::clientbound::PLAY_SET_TITLES_ANIMATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_TITLES_ANIMATION)] +#[java_packet(PLAY_SET_TITLES_ANIMATION)] pub struct CTitleAnimation { pub fade_in_ticks: i32, pub stay_ticks: i32, diff --git a/pumpkin-protocol/src/java/client/play/sound_effect.rs b/pumpkin-protocol/src/java/client/play/sound_effect.rs index 8b9947aee..742b4dd4e 100644 --- a/pumpkin-protocol/src/java/client/play/sound_effect.rs +++ b/pumpkin-protocol/src/java/client/play/sound_effect.rs @@ -1,12 +1,12 @@ use pumpkin_data::{packet::clientbound::PLAY_SOUND, sound::SoundCategory}; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; use crate::{IdOr, SoundEvent, VarInt}; #[derive(Serialize)] -#[packet(PLAY_SOUND)] +#[java_packet(PLAY_SOUND)] pub struct CSoundEffect { pub sound_event: IdOr, pub sound_category: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/spawn_entity.rs b/pumpkin-protocol/src/java/client/play/spawn_entity.rs index 9910b8eef..795755c2e 100644 --- a/pumpkin-protocol/src/java/client/play/spawn_entity.rs +++ b/pumpkin-protocol/src/java/client/play/spawn_entity.rs @@ -1,15 +1,18 @@ +use std::io::Write; + use pumpkin_data::packet::clientbound::PLAY_ADD_ENTITY; -use pumpkin_macros::packet; -use pumpkin_util::math::vector3::Vector3; -use serde::Serialize; +use pumpkin_macros::java_packet; +use pumpkin_util::{math::vector3::Vector3, version::MinecraftVersion}; -use crate::{VarInt, codec::velocity::Velocity}; +use crate::{ + ClientPacket, VarInt, + codec::velocity::Velocity, + ser::{NetworkWriteExt, WritingError}, +}; -#[derive(Serialize)] -#[packet(PLAY_ADD_ENTITY)] +#[java_packet(PLAY_ADD_ENTITY)] pub struct CSpawnEntity { pub entity_id: VarInt, - #[serde(with = "uuid::serde::compact")] pub entity_uuid: uuid::Uuid, pub r#type: VarInt, pub position: Vector3, @@ -46,3 +49,39 @@ impl CSpawnEntity { } } } + +impl ClientPacket for CSpawnEntity { + fn write_packet_data( + &self, + write: impl Write, + version: &MinecraftVersion, + ) -> Result<(), WritingError> { + let mut write = write; + + write.write_var_int(&self.entity_id)?; + write.write_uuid(&self.entity_uuid)?; + write.write_var_int(&self.r#type)?; + + write.write_f64_be(self.position.x)?; + write.write_f64_be(self.position.y)?; + write.write_f64_be(self.position.z)?; + + // Angles + if version >= &MinecraftVersion::V_1_21_9 { + self.velocity.write(&mut write)?; + } + write.write_u8(self.pitch)?; + write.write_u8(self.yaw)?; + write.write_u8(self.head_yaw)?; + + write.write_var_int(&self.data)?; + + if version <= &MinecraftVersion::V_1_21_7 { + write.write_i16_be(self.velocity.0.x as i16)?; + write.write_i16_be(self.velocity.0.y as i16)?; + write.write_i16_be(self.velocity.0.z as i16)?; + } + + Ok(()) + } +} diff --git a/pumpkin-protocol/src/java/client/play/stop_sound.rs b/pumpkin-protocol/src/java/client/play/stop_sound.rs index 2a0f514b4..193eb4aa1 100644 --- a/pumpkin-protocol/src/java/client/play/stop_sound.rs +++ b/pumpkin-protocol/src/java/client/play/stop_sound.rs @@ -4,11 +4,11 @@ use crate::codec::var_int::VarInt; use crate::ser::NetworkWriteExt; use crate::{ClientPacket, WritingError}; use pumpkin_data::{packet::clientbound::PLAY_STOP_SOUND, sound::SoundCategory}; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use pumpkin_util::version::MinecraftVersion; -#[packet(PLAY_STOP_SOUND)] +#[java_packet(PLAY_STOP_SOUND)] pub struct CStopSound { pub sound_id: Option, pub category: Option, diff --git a/pumpkin-protocol/src/java/client/play/store_cookie.rs b/pumpkin-protocol/src/java/client/play/store_cookie.rs index cdb192d37..390329e4f 100644 --- a/pumpkin-protocol/src/java/client/play/store_cookie.rs +++ b/pumpkin-protocol/src/java/client/play/store_cookie.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::clientbound::PLAY_STORE_COOKIE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use serde::Serialize; /// Stores some arbitrary data on the client, which persists between server transfers. /// The Notchian client only accepts cookies of up to 5 kiB in size. #[derive(Serialize)] -#[packet(PLAY_STORE_COOKIE)] +#[java_packet(PLAY_STORE_COOKIE)] pub struct CStoreCookie<'a> { pub key: &'a ResourceLocation, pub payload: &'a [u8], // 5120, diff --git a/pumpkin-protocol/src/java/client/play/subtitle.rs b/pumpkin-protocol/src/java/client/play/subtitle.rs index f1ebd7b97..1c375cd2f 100644 --- a/pumpkin-protocol/src/java/client/play/subtitle.rs +++ b/pumpkin-protocol/src/java/client/play/subtitle.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SET_SUBTITLE_TEXT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SET_SUBTITLE_TEXT)] +#[java_packet(PLAY_SET_SUBTITLE_TEXT)] pub struct CSubtitle<'a> { pub subtitle: &'a TextComponent, } diff --git a/pumpkin-protocol/src/java/client/play/system_chat_message.rs b/pumpkin-protocol/src/java/client/play/system_chat_message.rs index 83e9728ff..ceab5daf9 100644 --- a/pumpkin-protocol/src/java/client/play/system_chat_message.rs +++ b/pumpkin-protocol/src/java/client/play/system_chat_message.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_SYSTEM_CHAT; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_SYSTEM_CHAT)] +#[java_packet(PLAY_SYSTEM_CHAT)] pub struct CSystemChatMessage<'a> { pub content: &'a TextComponent, pub overlay: bool, diff --git a/pumpkin-protocol/src/java/client/play/take_item.rs b/pumpkin-protocol/src/java/client/play/take_item.rs index 4c727d837..5f6d2e6d0 100644 --- a/pumpkin-protocol/src/java/client/play/take_item.rs +++ b/pumpkin-protocol/src/java/client/play/take_item.rs @@ -1,10 +1,10 @@ use crate::VarInt; use pumpkin_data::packet::clientbound::PLAY_TAKE_ITEM_ENTITY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_TAKE_ITEM_ENTITY)] +#[java_packet(PLAY_TAKE_ITEM_ENTITY)] pub struct CTakeItemEntity { /// The entity id of the item entity. pub entity_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/teleport_entity.rs b/pumpkin-protocol/src/java/client/play/teleport_entity.rs index d34098dfa..cec9c0290 100644 --- a/pumpkin-protocol/src/java/client/play/teleport_entity.rs +++ b/pumpkin-protocol/src/java/client/play/teleport_entity.rs @@ -1,13 +1,13 @@ use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_TELEPORT_ENTITY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::{math::vector3::Vector3, version::MinecraftVersion}; use crate::{ClientPacket, PositionFlag, VarInt, WritingError, ser::NetworkWriteExt}; /// Only used when teleporting a player's vehicle, this packet is sent to the player. -#[packet(PLAY_TELEPORT_ENTITY)] +#[java_packet(PLAY_TELEPORT_ENTITY)] pub struct CTeleportEntity<'a> { pub entity_id: VarInt, pub position: Vector3, diff --git a/pumpkin-protocol/src/java/client/play/ticking_state.rs b/pumpkin-protocol/src/java/client/play/ticking_state.rs index 57a7eed31..188a3eeeb 100644 --- a/pumpkin-protocol/src/java/client/play/ticking_state.rs +++ b/pumpkin-protocol/src/java/client/play/ticking_state.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_TICKING_STATE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_TICKING_STATE)] +#[java_packet(PLAY_TICKING_STATE)] pub struct CTickingState { pub tick_rate: f32, pub is_frozen: bool, diff --git a/pumpkin-protocol/src/java/client/play/ticking_step.rs b/pumpkin-protocol/src/java/client/play/ticking_step.rs index 979e8d624..50d7d2e57 100644 --- a/pumpkin-protocol/src/java/client/play/ticking_step.rs +++ b/pumpkin-protocol/src/java/client/play/ticking_step.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_TICKING_STEP; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_TICKING_STEP)] +#[java_packet(PLAY_TICKING_STEP)] pub struct CTickingStep { pub tick_steps: VarInt, } diff --git a/pumpkin-protocol/src/java/client/play/transfer.rs b/pumpkin-protocol/src/java/client/play/transfer.rs index bf646a6ee..2e0ebe0ac 100644 --- a/pumpkin-protocol/src/java/client/play/transfer.rs +++ b/pumpkin-protocol/src/java/client/play/transfer.rs @@ -1,10 +1,10 @@ use crate::VarInt; use pumpkin_data::packet::clientbound::PLAY_TRANSFER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] -#[packet(PLAY_TRANSFER)] +#[java_packet(PLAY_TRANSFER)] pub struct CTransfer<'a> { pub host: &'a str, pub port: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/unload_chunk.rs b/pumpkin-protocol/src/java/client/play/unload_chunk.rs index 228342c7c..b461896c8 100644 --- a/pumpkin-protocol/src/java/client/play/unload_chunk.rs +++ b/pumpkin-protocol/src/java/client/play/unload_chunk.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::clientbound::PLAY_FORGET_LEVEL_CHUNK; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(Serialize)] -#[packet(PLAY_FORGET_LEVEL_CHUNK)] +#[java_packet(PLAY_FORGET_LEVEL_CHUNK)] pub struct CUnloadChunk { pub z: i32, pub x: i32, diff --git a/pumpkin-protocol/src/java/client/play/update_entity_pos.rs b/pumpkin-protocol/src/java/client/play/update_entity_pos.rs index 1c1ec1b7f..046185cc1 100644 --- a/pumpkin-protocol/src/java/client/play/update_entity_pos.rs +++ b/pumpkin-protocol/src/java/client/play/update_entity_pos.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::clientbound::PLAY_MOVE_ENTITY_POS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_MOVE_ENTITY_POS)] +#[java_packet(PLAY_MOVE_ENTITY_POS)] pub struct CUpdateEntityPos { pub entity_id: VarInt, pub delta: Vector3, diff --git a/pumpkin-protocol/src/java/client/play/update_entity_pos_rot.rs b/pumpkin-protocol/src/java/client/play/update_entity_pos_rot.rs index 878a29c8e..8d05f25ad 100644 --- a/pumpkin-protocol/src/java/client/play/update_entity_pos_rot.rs +++ b/pumpkin-protocol/src/java/client/play/update_entity_pos_rot.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::clientbound::PLAY_MOVE_ENTITY_POS_ROT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_MOVE_ENTITY_POS_ROT)] +#[java_packet(PLAY_MOVE_ENTITY_POS_ROT)] pub struct CUpdateEntityPosRot { pub entity_id: VarInt, pub delta: Vector3, diff --git a/pumpkin-protocol/src/java/client/play/update_entity_rot.rs b/pumpkin-protocol/src/java/client/play/update_entity_rot.rs index c343d4015..0a15c657c 100644 --- a/pumpkin-protocol/src/java/client/play/update_entity_rot.rs +++ b/pumpkin-protocol/src/java/client/play/update_entity_rot.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_MOVE_ENTITY_ROT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(Serialize)] -#[packet(PLAY_MOVE_ENTITY_ROT)] +#[java_packet(PLAY_MOVE_ENTITY_ROT)] pub struct CUpdateEntityRot { pub entity_id: VarInt, pub yaw: u8, diff --git a/pumpkin-protocol/src/java/client/play/update_mob_effect.rs b/pumpkin-protocol/src/java/client/play/update_mob_effect.rs index dc05587a5..8abc6e378 100644 --- a/pumpkin-protocol/src/java/client/play/update_mob_effect.rs +++ b/pumpkin-protocol/src/java/client/play/update_mob_effect.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::clientbound::PLAY_UPDATE_MOB_EFFECT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::codec::var_int::VarInt; #[derive(Serialize)] -#[packet(PLAY_UPDATE_MOB_EFFECT)] +#[java_packet(PLAY_UPDATE_MOB_EFFECT)] pub struct CUpdateMobEffect { pub entity_id: VarInt, pub effect_id: VarInt, diff --git a/pumpkin-protocol/src/java/client/play/update_objectives.rs b/pumpkin-protocol/src/java/client/play/update_objectives.rs index be37f6e85..cfe27ab19 100644 --- a/pumpkin-protocol/src/java/client/play/update_objectives.rs +++ b/pumpkin-protocol/src/java/client/play/update_objectives.rs @@ -1,12 +1,12 @@ use std::io::Write; use pumpkin_data::packet::clientbound::PLAY_SET_OBJECTIVE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::{text::TextComponent, version::MinecraftVersion}; use crate::{ClientPacket, NumberFormat, VarInt, WritingError, ser::NetworkWriteExt}; -#[packet(PLAY_SET_OBJECTIVE)] +#[java_packet(PLAY_SET_OBJECTIVE)] pub struct CUpdateObjectives { pub objective_name: String, pub mode: u8, diff --git a/pumpkin-protocol/src/java/client/play/update_score.rs b/pumpkin-protocol/src/java/client/play/update_score.rs index a6d84636f..f1e1b9158 100644 --- a/pumpkin-protocol/src/java/client/play/update_score.rs +++ b/pumpkin-protocol/src/java/client/play/update_score.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_SET_SCORE; use pumpkin_util::text::TextComponent; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::{NumberFormat, VarInt}; @@ -11,7 +11,7 @@ use crate::{NumberFormat, VarInt}; /// This packet is the primary way to manage scoreboard data. In the latest protocol, /// it also supports optional custom formatting for how the numeric score is displayed. #[derive(Serialize)] -#[packet(PLAY_SET_SCORE)] +#[java_packet(PLAY_SET_SCORE)] pub struct CUpdateScore { /// The name of the entity whose score is being updated (e.g., a player's username /// or a non-player entry like "Kills"). diff --git a/pumpkin-protocol/src/java/client/play/worldevent.rs b/pumpkin-protocol/src/java/client/play/worldevent.rs index 63ac51ff3..96b742b81 100644 --- a/pumpkin-protocol/src/java/client/play/worldevent.rs +++ b/pumpkin-protocol/src/java/client/play/worldevent.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::clientbound::PLAY_LEVEL_EVENT; use pumpkin_util::math::position::BlockPos; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Sent by the server to trigger a specific sound or particle effect at a world location. @@ -9,7 +9,7 @@ use serde::Serialize; /// This is used for a wide variety of effects, from breaking blocks and firework /// explosions to splashing water or record playing. #[derive(Serialize)] -#[packet(PLAY_LEVEL_EVENT)] +#[java_packet(PLAY_LEVEL_EVENT)] pub struct CWorldEvent { /// The ID of the event to trigger (e.g., 1000 for a bow shoot, 2001 for block break). /// Refer to the latest protocol registry for the full list of sound/particle IDs. diff --git a/pumpkin-protocol/src/java/client/status/ping_response.rs b/pumpkin-protocol/src/java/client/status/ping_response.rs index ad141016a..cbaee2e53 100644 --- a/pumpkin-protocol/src/java/client/status/ping_response.rs +++ b/pumpkin-protocol/src/java/client/status/ping_response.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::STATUS_PONG_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Sent by the server to complete a latency check initiated by a `SStatusPingRequest`. @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; /// This is the final packet in the Server List Ping (SLP) sequence. It allows the /// client to calculate the round-trip time (ping) to the server. #[derive(Serialize, Deserialize)] -#[packet(STATUS_PONG_RESPONSE)] +#[java_packet(STATUS_PONG_RESPONSE)] pub struct CPingResponse { /// The exact 64-bit integer received from the client's ping request. /// diff --git a/pumpkin-protocol/src/java/client/status/status_response.rs b/pumpkin-protocol/src/java/client/status/status_response.rs index fe124bc80..848ef84dc 100644 --- a/pumpkin-protocol/src/java/client/status/status_response.rs +++ b/pumpkin-protocol/src/java/client/status/status_response.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::clientbound::STATUS_STATUS_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; /// Sent by the server in response to a `SStatusRequest`. @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; /// This packet provides the client with the information required to display the /// server in the multiplayer menu, including the MOTD, player count, and icon #[derive(Serialize, Deserialize)] -#[packet(STATUS_STATUS_RESPONSE)] +#[java_packet(STATUS_STATUS_RESPONSE)] pub struct CStatusResponse { /// A JSON-encoded string containing the server's status data. /// diff --git a/pumpkin-protocol/src/java/packet_encoder.rs b/pumpkin-protocol/src/java/packet_encoder.rs index 607f6f5ff..dd5c60304 100644 --- a/pumpkin-protocol/src/java/packet_encoder.rs +++ b/pumpkin-protocol/src/java/packet_encoder.rs @@ -275,7 +275,7 @@ mod tests { use super::*; use crate::java::client::status::CStatusResponse; - use crate::packet::Packet; + use crate::packet::MultiVersionJavaPacket; use crate::ser::{NetworkReadExt, NetworkWriteExt}; use crate::{ClientPacket, ReadingError}; use aes::Aes128; @@ -283,13 +283,13 @@ mod tests { use cfb8::cipher::AsyncStreamCipher; use flate2::read::ZlibDecoder; use pumpkin_data::packet::clientbound::STATUS_STATUS_RESPONSE; - use pumpkin_macros::packet; + use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; use serde::Serialize; /// Define a custom packet for testing maximum packet size #[derive(Serialize)] - #[packet(STATUS_STATUS_RESPONSE)] + #[java_packet(STATUS_STATUS_RESPONSE)] pub struct MaxSizePacket { data: Vec, } @@ -339,7 +339,9 @@ mod tests { let mut packet_buf = Vec::new(); let writer = &mut packet_buf; - writer.write_var_int(&VarInt(T::PACKET_ID)).unwrap(); + writer + .write_var_int(&VarInt(T::PACKET_ID.latest_id)) + .unwrap(); packet .write_packet_data(writer, &MinecraftVersion::V_1_21_11) .unwrap(); @@ -372,7 +374,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload // We need to obtain the expected payload @@ -411,7 +413,7 @@ mod tests { .write_packet_data(&mut expected_payload, &MinecraftVersion::V_1_21_11) .unwrap(); let uncompressed_data_length = - VarInt(CStatusResponse::PACKET_ID).written_size() + expected_payload.len(); + VarInt(CStatusResponse::PACKET_ID.latest_id).written_size() + expected_payload.len(); assert_eq!(data_length as usize, uncompressed_data_length); // Remaining buffer is the compressed data @@ -427,7 +429,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut decompressed_buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload assert_eq!(decompressed_buffer, expected_payload); @@ -461,7 +463,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload let mut expected_payload = Vec::new(); @@ -505,7 +507,7 @@ mod tests { .write_packet_data(&mut expected_payload, &MinecraftVersion::V_1_21_11) .unwrap(); let uncompressed_data_length = - VarInt(CStatusResponse::PACKET_ID).written_size() + expected_payload.len(); + VarInt(CStatusResponse::PACKET_ID.latest_id).written_size() + expected_payload.len(); assert_eq!(data_length as usize, uncompressed_data_length); // Remaining buffer is the compressed data @@ -521,7 +523,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut decompressed_buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload assert_eq!(decompressed_buffer, expected_payload); @@ -549,7 +551,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload (empty) let mut expected_payload = Vec::new(); @@ -596,7 +598,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut buffer).expect("Failed to decode packet ID"); // Assume packet ID is 0 for CStatusResponse - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload let mut expected_payload = Vec::new(); @@ -650,7 +652,7 @@ mod tests { // Read packet ID VarInt let decoded_packet_id = decode_varint(&mut buffer).expect("Failed to decode packet ID"); - assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID); + assert_eq!(decoded_packet_id, CStatusResponse::PACKET_ID.latest_id); // Remaining buffer is the payload let mut expected_payload = Vec::new(); diff --git a/pumpkin-protocol/src/java/server/config/acknowledge_finish_config.rs b/pumpkin-protocol/src/java/server/config/acknowledge_finish_config.rs index 55a6139ec..eaa122bf8 100644 --- a/pumpkin-protocol/src/java/server/config/acknowledge_finish_config.rs +++ b/pumpkin-protocol/src/java/server/config/acknowledge_finish_config.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::CONFIG_FINISH_CONFIGURATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// This packet signals to the server that the client is ready to transition /// from the `Configuration` state to the `Play` state. #[derive(Serialize)] -#[packet(CONFIG_FINISH_CONFIGURATION)] +#[java_packet(CONFIG_FINISH_CONFIGURATION)] pub struct SAcknowledgeFinishConfig; diff --git a/pumpkin-protocol/src/java/server/config/client_information.rs b/pumpkin-protocol/src/java/server/config/client_information.rs index 707398145..b2b98d95c 100644 --- a/pumpkin-protocol/src/java/server/config/client_information.rs +++ b/pumpkin-protocol/src/java/server/config/client_information.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::serverbound::CONFIG_CLIENT_INFORMATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; /// Sent by the client to inform the server about its local settings #[derive(serde::Deserialize, Serialize)] -#[packet(CONFIG_CLIENT_INFORMATION)] +#[java_packet(CONFIG_CLIENT_INFORMATION)] pub struct SClientInformationConfig { /// The language code used by the client (e.g., "en_us") pub locale: String, diff --git a/pumpkin-protocol/src/java/server/config/cookie_response.rs b/pumpkin-protocol/src/java/server/config/cookie_response.rs index dbec272d8..6d21deee9 100644 --- a/pumpkin-protocol/src/java/server/config/cookie_response.rs +++ b/pumpkin-protocol/src/java/server/config/cookie_response.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::CONFIG_COOKIE_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use crate::{ReadingError, ServerPacket, ser::NetworkReadExt}; @@ -13,7 +13,7 @@ const MAX_COOKIE_LENGTH: usize = 5120; /// /// Cookies allow servers to store small amounts of data on the client side, /// which can be retrieved later (e.g., for session tracking or preferences) -#[packet(CONFIG_COOKIE_RESPONSE)] +#[java_packet(CONFIG_COOKIE_RESPONSE)] pub struct SConfigCookieResponse { /// The unique identifier for the cookie being returned pub key: ResourceLocation, diff --git a/pumpkin-protocol/src/java/server/config/known_packs.rs b/pumpkin-protocol/src/java/server/config/known_packs.rs index 22b165dd3..26057c3c4 100644 --- a/pumpkin-protocol/src/java/server/config/known_packs.rs +++ b/pumpkin-protocol/src/java/server/config/known_packs.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::CONFIG_SELECT_KNOWN_PACKS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(serde::Deserialize, Serialize)] -#[packet(CONFIG_SELECT_KNOWN_PACKS)] +#[java_packet(CONFIG_SELECT_KNOWN_PACKS)] pub struct SKnownPacks { pub known_pack_count: VarInt, // known_packs: &'a [KnownPack] diff --git a/pumpkin-protocol/src/java/server/config/plugin_message.rs b/pumpkin-protocol/src/java/server/config/plugin_message.rs index 57830b101..291a6e6c6 100644 --- a/pumpkin-protocol/src/java/server/config/plugin_message.rs +++ b/pumpkin-protocol/src/java/server/config/plugin_message.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::CONFIG_CUSTOM_PAYLOAD; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use crate::{ReadingError, ServerPacket, ser::NetworkReadExt}; @@ -13,7 +13,7 @@ const MAX_PAYLOAD_SIZE: usize = 1048576; /// /// This allows mods, plugins, or proxy /// software to send proprietary data over the standard Minecraft protocol. -#[packet(CONFIG_CUSTOM_PAYLOAD)] +#[java_packet(CONFIG_CUSTOM_PAYLOAD)] pub struct SPluginMessage { /// The name of the channel used to distinguish different types of messages. /// Example: `minecraft:brand` or `velocity:main`. diff --git a/pumpkin-protocol/src/java/server/config/resource_pack_response.rs b/pumpkin-protocol/src/java/server/config/resource_pack_response.rs index d5766da03..5e46f871b 100644 --- a/pumpkin-protocol/src/java/server/config/resource_pack_response.rs +++ b/pumpkin-protocol/src/java/server/config/resource_pack_response.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::CONFIG_RESOURCE_PACK; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; @@ -21,7 +21,7 @@ pub enum ResourcePackResponseResult { /// This allows the server to know if the player is using the required textures /// or if the download failed. #[derive(serde::Deserialize, Serialize)] -#[packet(CONFIG_RESOURCE_PACK)] +#[java_packet(CONFIG_RESOURCE_PACK)] pub struct SConfigResourcePack { /// The unique identifier of the resource pack this response refers to. #[serde(with = "uuid::serde::compact")] diff --git a/pumpkin-protocol/src/java/server/handshake/mod.rs b/pumpkin-protocol/src/java/server/handshake/mod.rs index 867f385e4..c671d796a 100644 --- a/pumpkin-protocol/src/java/server/handshake/mod.rs +++ b/pumpkin-protocol/src/java/server/handshake/mod.rs @@ -5,14 +5,14 @@ use crate::{ ser::NetworkWriteExt, }; use pumpkin_data::packet::serverbound::HANDSHAKE_INTENTION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; /// The very first packet sent by the client to initiate a connection /// /// It determines whether the client wants to check the server status (SLP) /// or actually login to play. -#[packet(HANDSHAKE_INTENTION)] +#[java_packet(HANDSHAKE_INTENTION)] pub struct SHandShake { /// The protocol version of the client (e.g., 767 for 1.21). pub protocol_version: VarInt, diff --git a/pumpkin-protocol/src/java/server/login/cookie_response.rs b/pumpkin-protocol/src/java/server/login/cookie_response.rs index 57bdb105e..48203aa39 100644 --- a/pumpkin-protocol/src/java/server/login/cookie_response.rs +++ b/pumpkin-protocol/src/java/server/login/cookie_response.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::LOGIN_COOKIE_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use std::io::Read; @@ -8,7 +8,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(LOGIN_COOKIE_RESPONSE)] +#[java_packet(LOGIN_COOKIE_RESPONSE)] /// Response to a `CCookieRequest` (login) from the server. /// The Notchian server only accepts responses of up to 5 kiB in size. pub struct SLoginCookieResponse { diff --git a/pumpkin-protocol/src/java/server/login/encryption_response.rs b/pumpkin-protocol/src/java/server/login/encryption_response.rs index 8a9176962..decd19657 100644 --- a/pumpkin-protocol/src/java/server/login/encryption_response.rs +++ b/pumpkin-protocol/src/java/server/login/encryption_response.rs @@ -1,11 +1,11 @@ use std::io::Read; use pumpkin_data::packet::serverbound::LOGIN_KEY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use crate::{ReadingError, ServerPacket, ser::NetworkReadExt}; -#[packet(LOGIN_KEY)] +#[java_packet(LOGIN_KEY)] pub struct SEncryptionResponse { pub shared_secret: Box<[u8]>, pub verify_token: Box<[u8]>, diff --git a/pumpkin-protocol/src/java/server/login/login_response.rs b/pumpkin-protocol/src/java/server/login/login_response.rs index f39b02a2d..cb2fda05f 100644 --- a/pumpkin-protocol/src/java/server/login/login_response.rs +++ b/pumpkin-protocol/src/java/server/login/login_response.rs @@ -1,8 +1,8 @@ use pumpkin_data::packet::serverbound::LOGIN_LOGIN_ACKNOWLEDGED; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Acknowledgement to the `CLoginSuccess` packet sent by the server. #[derive(Serialize)] -#[packet(LOGIN_LOGIN_ACKNOWLEDGED)] +#[java_packet(LOGIN_LOGIN_ACKNOWLEDGED)] pub struct SLoginAcknowledged; diff --git a/pumpkin-protocol/src/java/server/login/login_start.rs b/pumpkin-protocol/src/java/server/login/login_start.rs index faaf2593e..03c40171b 100644 --- a/pumpkin-protocol/src/java/server/login/login_start.rs +++ b/pumpkin-protocol/src/java/server/login/login_start.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::LOGIN_HELLO; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::{ @@ -9,7 +9,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(LOGIN_HELLO)] +#[java_packet(LOGIN_HELLO)] #[derive(Serialize)] pub struct SLoginStart { pub name: String, // 16 diff --git a/pumpkin-protocol/src/java/server/login/plugin_response.rs b/pumpkin-protocol/src/java/server/login/plugin_response.rs index 73ad55fe5..0043f663c 100644 --- a/pumpkin-protocol/src/java/server/login/plugin_response.rs +++ b/pumpkin-protocol/src/java/server/login/plugin_response.rs @@ -2,11 +2,11 @@ use std::io::Read; use crate::{ReadingError, ServerPacket, VarInt, ser::NetworkReadExt}; use pumpkin_data::packet::serverbound::LOGIN_CUSTOM_QUERY_ANSWER; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; const MAX_PAYLOAD_SIZE: usize = 1048576; -#[packet(LOGIN_CUSTOM_QUERY_ANSWER)] +#[java_packet(LOGIN_CUSTOM_QUERY_ANSWER)] pub struct SLoginPluginResponse { pub message_id: VarInt, pub data: Option>, diff --git a/pumpkin-protocol/src/java/server/play/change_game_mode.rs b/pumpkin-protocol/src/java/server/play/change_game_mode.rs index 518e8f157..7630221db 100644 --- a/pumpkin-protocol/src/java/server/play/change_game_mode.rs +++ b/pumpkin-protocol/src/java/server/play/change_game_mode.rs @@ -1,10 +1,10 @@ use pumpkin_data::packet::serverbound::PLAY_CHANGE_GAME_MODE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::GameMode; use serde::Serialize; #[derive(serde::Deserialize, Serialize)] -#[packet(PLAY_CHANGE_GAME_MODE)] +#[java_packet(PLAY_CHANGE_GAME_MODE)] pub struct SChangeGameMode { pub game_mode: GameMode, } diff --git a/pumpkin-protocol/src/java/server/play/chat_command.rs b/pumpkin-protocol/src/java/server/play/chat_command.rs index 510417fd8..4afd9647e 100644 --- a/pumpkin-protocol/src/java/server/play/chat_command.rs +++ b/pumpkin-protocol/src/java/server/play/chat_command.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_CHAT_COMMAND; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; #[derive(serde::Deserialize, Serialize)] -#[packet(PLAY_CHAT_COMMAND)] +#[java_packet(PLAY_CHAT_COMMAND)] pub struct SChatCommand { pub command: String, } diff --git a/pumpkin-protocol/src/java/server/play/chat_message.rs b/pumpkin-protocol/src/java/server/play/chat_message.rs index 9f38526f1..6fbafe6e5 100644 --- a/pumpkin-protocol/src/java/server/play/chat_message.rs +++ b/pumpkin-protocol/src/java/server/play/chat_message.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_CHAT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::version::MinecraftVersion; use crate::{ @@ -11,7 +11,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(PLAY_CHAT)] +#[java_packet(PLAY_CHAT)] pub struct SChatMessage { pub message: String, pub timestamp: i64, diff --git a/pumpkin-protocol/src/java/server/play/chunk_batch.rs b/pumpkin-protocol/src/java/server/play/chunk_batch.rs index e8f5b0c35..e6860c18b 100644 --- a/pumpkin-protocol/src/java/server/play/chunk_batch.rs +++ b/pumpkin-protocol/src/java/server/play/chunk_batch.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_CHUNK_BATCH_RECEIVED; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; #[derive(Deserialize)] -#[packet(PLAY_CHUNK_BATCH_RECEIVED)] +#[java_packet(PLAY_CHUNK_BATCH_RECEIVED)] pub struct SChunkBatch { pub chunks_per_tick: f32, } diff --git a/pumpkin-protocol/src/java/server/play/click_container.rs b/pumpkin-protocol/src/java/server/play/click_container.rs index ff28c1672..9ba3f5f59 100644 --- a/pumpkin-protocol/src/java/server/play/click_container.rs +++ b/pumpkin-protocol/src/java/server/play/click_container.rs @@ -1,12 +1,12 @@ use crate::VarInt; use crate::codec::item_stack_seralizer::OptionalItemStackHash; use pumpkin_data::packet::serverbound::PLAY_CONTAINER_CLICK; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::de::SeqAccess; use serde::{Deserialize, de}; #[derive(Debug)] -#[packet(PLAY_CONTAINER_CLICK)] +#[java_packet(PLAY_CONTAINER_CLICK)] pub struct SClickSlot { pub sync_id: VarInt, pub revision: VarInt, diff --git a/pumpkin-protocol/src/java/server/play/client_command.rs b/pumpkin-protocol/src/java/server/play/client_command.rs index 9e9dce972..fd95c6541 100644 --- a/pumpkin-protocol/src/java/server/play/client_command.rs +++ b/pumpkin-protocol/src/java/server/play/client_command.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_CLIENT_COMMAND; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; use crate::VarInt; #[derive(Deserialize)] -#[packet(PLAY_CLIENT_COMMAND)] +#[java_packet(PLAY_CLIENT_COMMAND)] pub struct SClientCommand { pub action_id: VarInt, } diff --git a/pumpkin-protocol/src/java/server/play/client_information.rs b/pumpkin-protocol/src/java/server/play/client_information.rs index b5eed7419..27a794247 100644 --- a/pumpkin-protocol/src/java/server/play/client_information.rs +++ b/pumpkin-protocol/src/java/server/play/client_information.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_CLIENT_INFORMATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(serde::Deserialize, Serialize)] -#[packet(PLAY_CLIENT_INFORMATION)] +#[java_packet(PLAY_CLIENT_INFORMATION)] pub struct SClientInformationPlay { pub locale: String, // 16 pub view_distance: i8, diff --git a/pumpkin-protocol/src/java/server/play/client_tick_end.rs b/pumpkin-protocol/src/java/server/play/client_tick_end.rs index 16683bb6a..6a122c2f1 100644 --- a/pumpkin-protocol/src/java/server/play/client_tick_end.rs +++ b/pumpkin-protocol/src/java/server/play/client_tick_end.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::PLAY_CLIENT_TICK_END; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; -#[packet(PLAY_CLIENT_TICK_END)] +#[java_packet(PLAY_CLIENT_TICK_END)] pub struct SClientTickEnd; diff --git a/pumpkin-protocol/src/java/server/play/close_container.rs b/pumpkin-protocol/src/java/server/play/close_container.rs index a5b092738..3dd86501a 100644 --- a/pumpkin-protocol/src/java/server/play/close_container.rs +++ b/pumpkin-protocol/src/java/server/play/close_container.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_CONTAINER_CLOSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; use crate::VarInt; #[derive(Deserialize, Serialize)] -#[packet(PLAY_CONTAINER_CLOSE)] +#[java_packet(PLAY_CONTAINER_CLOSE)] pub struct SCloseContainer { pub window_id: VarInt, } diff --git a/pumpkin-protocol/src/java/server/play/command_suggestion.rs b/pumpkin-protocol/src/java/server/play/command_suggestion.rs index 346c9f62e..3bedd70bb 100644 --- a/pumpkin-protocol/src/java/server/play/command_suggestion.rs +++ b/pumpkin-protocol/src/java/server/play/command_suggestion.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_COMMAND_SUGGESTION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; use crate::VarInt; #[derive(Deserialize)] -#[packet(PLAY_COMMAND_SUGGESTION)] +#[java_packet(PLAY_COMMAND_SUGGESTION)] pub struct SCommandSuggestion { pub id: VarInt, pub command: String, diff --git a/pumpkin-protocol/src/java/server/play/confirm_teleport.rs b/pumpkin-protocol/src/java/server/play/confirm_teleport.rs index 9f9b70077..f9effbc02 100644 --- a/pumpkin-protocol/src/java/server/play/confirm_teleport.rs +++ b/pumpkin-protocol/src/java/server/play/confirm_teleport.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_ACCEPT_TELEPORTATION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(serde::Deserialize, Serialize)] -#[packet(PLAY_ACCEPT_TELEPORTATION)] +#[java_packet(PLAY_ACCEPT_TELEPORTATION)] pub struct SConfirmTeleport { pub teleport_id: VarInt, } diff --git a/pumpkin-protocol/src/java/server/play/cookie_response.rs b/pumpkin-protocol/src/java/server/play/cookie_response.rs index b230ebf37..ad301859e 100644 --- a/pumpkin-protocol/src/java/server/play/cookie_response.rs +++ b/pumpkin-protocol/src/java/server/play/cookie_response.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_COOKIE_RESPONSE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::resource_location::ResourceLocation; use crate::{ @@ -9,7 +9,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(PLAY_COOKIE_RESPONSE)] +#[java_packet(PLAY_COOKIE_RESPONSE)] /// Response to a `CCookieRequest` (play) from the server. /// The Notchian (vanilla) server only accepts responses of up to 5 KiB in size. pub struct SCookieResponse { diff --git a/pumpkin-protocol/src/java/server/play/custom_payload.rs b/pumpkin-protocol/src/java/server/play/custom_payload.rs index 93a28cac3..3cf57d2c2 100644 --- a/pumpkin-protocol/src/java/server/play/custom_payload.rs +++ b/pumpkin-protocol/src/java/server/play/custom_payload.rs @@ -1,7 +1,7 @@ use pumpkin_data::packet::serverbound::PLAY_CUSTOM_PAYLOAD; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; -#[packet(PLAY_CUSTOM_PAYLOAD)] +#[java_packet(PLAY_CUSTOM_PAYLOAD)] pub struct SCustomPayload { // TODO } diff --git a/pumpkin-protocol/src/java/server/play/interact.rs b/pumpkin-protocol/src/java/server/play/interact.rs index aa6c38e47..c870f567f 100644 --- a/pumpkin-protocol/src/java/server/play/interact.rs +++ b/pumpkin-protocol/src/java/server/play/interact.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_INTERACT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; use crate::{ @@ -10,7 +10,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(PLAY_INTERACT)] +#[java_packet(PLAY_INTERACT)] pub struct SInteract { pub entity_id: VarInt, pub r#type: VarInt, diff --git a/pumpkin-protocol/src/java/server/play/keep_alive.rs b/pumpkin-protocol/src/java/server/play/keep_alive.rs index f5039e69e..d86c3d96d 100644 --- a/pumpkin-protocol/src/java/server/play/keep_alive.rs +++ b/pumpkin-protocol/src/java/server/play/keep_alive.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_KEEP_ALIVE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] -#[packet(PLAY_KEEP_ALIVE)] +#[java_packet(PLAY_KEEP_ALIVE)] pub struct SKeepAlive { pub keep_alive_id: i64, } diff --git a/pumpkin-protocol/src/java/server/play/pick_item.rs b/pumpkin-protocol/src/java/server/play/pick_item.rs index 5fe0477ae..0bf2d6e72 100644 --- a/pumpkin-protocol/src/java/server/play/pick_item.rs +++ b/pumpkin-protocol/src/java/server/play/pick_item.rs @@ -1,17 +1,17 @@ use pumpkin_data::packet::serverbound::{PLAY_PICK_ITEM_FROM_BLOCK, PLAY_PICK_ITEM_FROM_ENTITY}; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use serde::Deserialize; #[derive(Deserialize)] -#[packet(PLAY_PICK_ITEM_FROM_BLOCK)] +#[java_packet(PLAY_PICK_ITEM_FROM_BLOCK)] pub struct SPickItemFromBlock { pub pos: BlockPos, pub include_data: bool, } #[derive(Deserialize)] -#[packet(PLAY_PICK_ITEM_FROM_ENTITY)] +#[java_packet(PLAY_PICK_ITEM_FROM_ENTITY)] pub struct SPickItemFromEntity { pub id: i32, pub include_data: bool, diff --git a/pumpkin-protocol/src/java/server/play/ping_request.rs b/pumpkin-protocol/src/java/server/play/ping_request.rs index 160d51f83..b03ef8eb2 100644 --- a/pumpkin-protocol/src/java/server/play/ping_request.rs +++ b/pumpkin-protocol/src/java/server/play/ping_request.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_PING_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] -#[packet(PLAY_PING_REQUEST)] +#[java_packet(PLAY_PING_REQUEST)] pub struct SPlayPingRequest { pub payload: i64, } diff --git a/pumpkin-protocol/src/java/server/play/player_abilities.rs b/pumpkin-protocol/src/java/server/play/player_abilities.rs index d0427c065..362ede2fa 100644 --- a/pumpkin-protocol/src/java/server/play/player_abilities.rs +++ b/pumpkin-protocol/src/java/server/play/player_abilities.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_PLAYER_ABILITIES; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; // The vanilla client sends this packet when the player starts/stops flying. Bitmask 0x02 is set when the player is flying. #[derive(Deserialize)] -#[packet(PLAY_PLAYER_ABILITIES)] +#[java_packet(PLAY_PLAYER_ABILITIES)] pub struct SPlayerAbilities { pub flags: i8, } diff --git a/pumpkin-protocol/src/java/server/play/player_action.rs b/pumpkin-protocol/src/java/server/play/player_action.rs index f848b99ed..17c871678 100644 --- a/pumpkin-protocol/src/java/server/play/player_action.rs +++ b/pumpkin-protocol/src/java/server/play/player_action.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_PLAYER_ACTION; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use crate::VarInt; #[derive(serde::Deserialize)] -#[packet(PLAY_PLAYER_ACTION)] +#[java_packet(PLAY_PLAYER_ACTION)] pub struct SPlayerAction { pub status: VarInt, pub position: BlockPos, diff --git a/pumpkin-protocol/src/java/server/play/player_command.rs b/pumpkin-protocol/src/java/server/play/player_command.rs index 7c6d1a7d6..f0a2e51ec 100644 --- a/pumpkin-protocol/src/java/server/play/player_command.rs +++ b/pumpkin-protocol/src/java/server/play/player_command.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_PLAYER_COMMAND; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use crate::{ ServerPacket, @@ -9,7 +9,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(PLAY_PLAYER_COMMAND)] +#[java_packet(PLAY_PLAYER_COMMAND)] pub struct SPlayerCommand { pub entity_id: VarInt, pub action: VarInt, diff --git a/pumpkin-protocol/src/java/server/play/player_ground.rs b/pumpkin-protocol/src/java/server/play/player_ground.rs index 4bdded1e7..c42c3d741 100644 --- a/pumpkin-protocol/src/java/server/play/player_ground.rs +++ b/pumpkin-protocol/src/java/server/play/player_ground.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_MOVE_PLAYER_STATUS_ONLY; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] -#[packet(PLAY_MOVE_PLAYER_STATUS_ONLY)] +#[java_packet(PLAY_MOVE_PLAYER_STATUS_ONLY)] pub struct SSetPlayerGround { pub on_ground: bool, } diff --git a/pumpkin-protocol/src/java/server/play/player_input.rs b/pumpkin-protocol/src/java/server/play/player_input.rs index 3c66a64bc..5281bb394 100644 --- a/pumpkin-protocol/src/java/server/play/player_input.rs +++ b/pumpkin-protocol/src/java/server/play/player_input.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_PLAYER_INPUT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] -#[packet(PLAY_PLAYER_INPUT)] +#[java_packet(PLAY_PLAYER_INPUT)] pub struct SPlayerInput { // Yep, exactly how it looks like pub input: i8, diff --git a/pumpkin-protocol/src/java/server/play/player_loaded.rs b/pumpkin-protocol/src/java/server/play/player_loaded.rs index f9e60029d..1ba7056f8 100644 --- a/pumpkin-protocol/src/java/server/play/player_loaded.rs +++ b/pumpkin-protocol/src/java/server/play/player_loaded.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::PLAY_PLAYER_LOADED; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; -#[packet(PLAY_PLAYER_LOADED)] +#[java_packet(PLAY_PLAYER_LOADED)] pub struct SPlayerLoaded; diff --git a/pumpkin-protocol/src/java/server/play/player_position.rs b/pumpkin-protocol/src/java/server/play/player_position.rs index 7ba434130..3dd90b67f 100644 --- a/pumpkin-protocol/src/java/server/play/player_position.rs +++ b/pumpkin-protocol/src/java/server/play/player_position.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_MOVE_PLAYER_POS; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; #[derive(serde::Deserialize)] -#[packet(PLAY_MOVE_PLAYER_POS)] +#[java_packet(PLAY_MOVE_PLAYER_POS)] pub struct SPlayerPosition { pub position: Vector3, /// bit 0: [FLAG_ON_GROUND], bit 1: [FLAG_IN_WALL] diff --git a/pumpkin-protocol/src/java/server/play/player_position_rotation.rs b/pumpkin-protocol/src/java/server/play/player_position_rotation.rs index e13b05f31..748f7f73f 100644 --- a/pumpkin-protocol/src/java/server/play/player_position_rotation.rs +++ b/pumpkin-protocol/src/java/server/play/player_position_rotation.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::serverbound::PLAY_MOVE_PLAYER_POS_ROT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::vector3::Vector3; pub const FLAG_ON_GROUND: u8 = 0x01; pub const FLAG_IN_WALL: u8 = 0x02; #[derive(serde::Deserialize)] -#[packet(PLAY_MOVE_PLAYER_POS_ROT)] +#[java_packet(PLAY_MOVE_PLAYER_POS_ROT)] pub struct SPlayerPositionRotation { pub position: Vector3, pub yaw: f32, diff --git a/pumpkin-protocol/src/java/server/play/player_rotation.rs b/pumpkin-protocol/src/java/server/play/player_rotation.rs index 7fabeb3cc..01c95d067 100644 --- a/pumpkin-protocol/src/java/server/play/player_rotation.rs +++ b/pumpkin-protocol/src/java/server/play/player_rotation.rs @@ -1,8 +1,8 @@ use pumpkin_data::packet::serverbound::PLAY_MOVE_PLAYER_ROT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; #[derive(serde::Deserialize)] -#[packet(PLAY_MOVE_PLAYER_ROT)] +#[java_packet(PLAY_MOVE_PLAYER_ROT)] pub struct SPlayerRotation { pub yaw: f32, pub pitch: f32, diff --git a/pumpkin-protocol/src/java/server/play/player_session.rs b/pumpkin-protocol/src/java/server/play/player_session.rs index ddbf9d24a..45881d9a4 100644 --- a/pumpkin-protocol/src/java/server/play/player_session.rs +++ b/pumpkin-protocol/src/java/server/play/player_session.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_CHAT_SESSION_UPDATE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use crate::{ ServerPacket, @@ -9,7 +9,7 @@ use crate::{ }; #[derive(Debug)] -#[packet(PLAY_CHAT_SESSION_UPDATE)] +#[java_packet(PLAY_CHAT_SESSION_UPDATE)] pub struct SPlayerSession { pub session_id: uuid::Uuid, pub expires_at: i64, diff --git a/pumpkin-protocol/src/java/server/play/set_command_block.rs b/pumpkin-protocol/src/java/server/play/set_command_block.rs index d874338d9..f5e7ff5ab 100644 --- a/pumpkin-protocol/src/java/server/play/set_command_block.rs +++ b/pumpkin-protocol/src/java/server/play/set_command_block.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::serverbound::PLAY_SET_COMMAND_BLOCK; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use serde::Deserialize; use crate::codec::var_int::VarInt; #[derive(Deserialize)] -#[packet(PLAY_SET_COMMAND_BLOCK)] +#[java_packet(PLAY_SET_COMMAND_BLOCK)] pub struct SSetCommandBlock { pub pos: BlockPos, pub command: String, diff --git a/pumpkin-protocol/src/java/server/play/set_creative_slot.rs b/pumpkin-protocol/src/java/server/play/set_creative_slot.rs index 299880db8..50c075fd9 100644 --- a/pumpkin-protocol/src/java/server/play/set_creative_slot.rs +++ b/pumpkin-protocol/src/java/server/play/set_creative_slot.rs @@ -1,10 +1,10 @@ use pumpkin_data::packet::serverbound::PLAY_SET_CREATIVE_MODE_SLOT; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use crate::codec::item_stack_seralizer::ItemStackSerializer; #[derive(serde::Deserialize)] -#[packet(PLAY_SET_CREATIVE_MODE_SLOT)] +#[java_packet(PLAY_SET_CREATIVE_MODE_SLOT)] pub struct SSetCreativeSlot { pub slot: i16, pub clicked_item: ItemStackSerializer<'static>, diff --git a/pumpkin-protocol/src/java/server/play/set_held_item.rs b/pumpkin-protocol/src/java/server/play/set_held_item.rs index 7d568116f..2e7ebe904 100644 --- a/pumpkin-protocol/src/java/server/play/set_held_item.rs +++ b/pumpkin-protocol/src/java/server/play/set_held_item.rs @@ -1,9 +1,9 @@ use pumpkin_data::packet::serverbound::PLAY_SET_CARRIED_ITEM; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] -#[packet(PLAY_SET_CARRIED_ITEM)] +#[java_packet(PLAY_SET_CARRIED_ITEM)] pub struct SSetHeldItem { pub slot: i16, } diff --git a/pumpkin-protocol/src/java/server/play/swing_arm.rs b/pumpkin-protocol/src/java/server/play/swing_arm.rs index 25a3b6324..4c6700c43 100644 --- a/pumpkin-protocol/src/java/server/play/swing_arm.rs +++ b/pumpkin-protocol/src/java/server/play/swing_arm.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_SWING; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; use crate::VarInt; #[derive(serde::Deserialize, Serialize)] -#[packet(PLAY_SWING)] +#[java_packet(PLAY_SWING)] pub struct SSwingArm { pub hand: VarInt, } diff --git a/pumpkin-protocol/src/java/server/play/update_sign.rs b/pumpkin-protocol/src/java/server/play/update_sign.rs index 5fde566ba..41009bf23 100644 --- a/pumpkin-protocol/src/java/server/play/update_sign.rs +++ b/pumpkin-protocol/src/java/server/play/update_sign.rs @@ -1,7 +1,7 @@ use std::io::Read; use pumpkin_data::packet::serverbound::PLAY_SIGN_UPDATE; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::position::BlockPos; use crate::{ @@ -9,7 +9,7 @@ use crate::{ ser::{NetworkReadExt, ReadingError}, }; -#[packet(PLAY_SIGN_UPDATE)] +#[java_packet(PLAY_SIGN_UPDATE)] pub struct SUpdateSign { pub location: BlockPos, pub is_front_text: bool, diff --git a/pumpkin-protocol/src/java/server/play/use_item.rs b/pumpkin-protocol/src/java/server/play/use_item.rs index 05e9b2d3d..8293b2b5c 100644 --- a/pumpkin-protocol/src/java/server/play/use_item.rs +++ b/pumpkin-protocol/src/java/server/play/use_item.rs @@ -1,11 +1,11 @@ use pumpkin_data::packet::serverbound::PLAY_USE_ITEM; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Deserialize; use crate::VarInt; #[derive(Deserialize)] -#[packet(PLAY_USE_ITEM)] +#[java_packet(PLAY_USE_ITEM)] pub struct SUseItem { // 0 for main hand, 1 for off hand pub hand: VarInt, diff --git a/pumpkin-protocol/src/java/server/play/use_item_on.rs b/pumpkin-protocol/src/java/server/play/use_item_on.rs index 1bc2e9fe6..14c6d7af2 100644 --- a/pumpkin-protocol/src/java/server/play/use_item_on.rs +++ b/pumpkin-protocol/src/java/server/play/use_item_on.rs @@ -1,12 +1,12 @@ use pumpkin_data::packet::serverbound::PLAY_USE_ITEM_ON; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use pumpkin_util::math::{position::BlockPos, vector3::Vector3}; use serde::Deserialize; use crate::VarInt; #[derive(Deserialize)] -#[packet(PLAY_USE_ITEM_ON)] +#[java_packet(PLAY_USE_ITEM_ON)] pub struct SUseItemOn { pub hand: VarInt, pub position: BlockPos, diff --git a/pumpkin-protocol/src/java/server/status/ping_request.rs b/pumpkin-protocol/src/java/server/status/ping_request.rs index 9725a8c4a..d2e4e822a 100644 --- a/pumpkin-protocol/src/java/server/status/ping_request.rs +++ b/pumpkin-protocol/src/java/server/status/ping_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::STATUS_PING_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Sent by the client to measure the round-trip time (latency) to the server. @@ -7,7 +7,7 @@ use serde::Serialize; /// This is the second part of the Server List Ping (SLP) process /// The server should respond with `CPingResponse`. #[derive(serde::Deserialize, Serialize)] -#[packet(STATUS_PING_REQUEST)] +#[java_packet(STATUS_PING_REQUEST)] pub struct SStatusPingRequest { pub payload: i64, } diff --git a/pumpkin-protocol/src/java/server/status/status_request.rs b/pumpkin-protocol/src/java/server/status/status_request.rs index 384960f29..27cc479cf 100644 --- a/pumpkin-protocol/src/java/server/status/status_request.rs +++ b/pumpkin-protocol/src/java/server/status/status_request.rs @@ -1,5 +1,5 @@ use pumpkin_data::packet::serverbound::STATUS_STATUS_REQUEST; -use pumpkin_macros::packet; +use pumpkin_macros::java_packet; use serde::Serialize; /// Sent by the client to request the server's current status information. @@ -7,5 +7,5 @@ use serde::Serialize; /// This is the first packet sent during the "Status" state. /// The server should respond with `CStatusResponse`. #[derive(Serialize)] -#[packet(STATUS_STATUS_REQUEST)] +#[java_packet(STATUS_STATUS_REQUEST)] pub struct SStatusRequest; diff --git a/pumpkin-protocol/src/lib.rs b/pumpkin-protocol/src/lib.rs index fcb6687bc..c352723b5 100644 --- a/pumpkin-protocol/src/lib.rs +++ b/pumpkin-protocol/src/lib.rs @@ -21,7 +21,7 @@ use serde::{ use thiserror::Error; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; -use crate::packet::Packet; +use crate::packet::{MultiVersionJavaPacket, Packet}; pub mod bedrock; pub mod codec; @@ -311,7 +311,7 @@ pub struct RawPacket { pub payload: Bytes, } -pub trait ClientPacket: Packet { +pub trait ClientPacket: MultiVersionJavaPacket { fn write_packet_data( &self, write: impl Write, @@ -319,7 +319,7 @@ pub trait ClientPacket: Packet { ) -> Result<(), WritingError>; } -pub trait ServerPacket: Packet + Sized { +pub trait ServerPacket: MultiVersionJavaPacket + Sized { fn read(read: impl Read) -> Result; } diff --git a/pumpkin-protocol/src/packet.rs b/pumpkin-protocol/src/packet.rs index ba29e9655..420c5e728 100644 --- a/pumpkin-protocol/src/packet.rs +++ b/pumpkin-protocol/src/packet.rs @@ -1,5 +1,6 @@ use std::io::{Error, Read, Write}; +use pumpkin_data::packet::PacketId; use pumpkin_util::version::MinecraftVersion; use serde::{Serialize, de::DeserializeOwned}; @@ -14,7 +15,11 @@ pub trait Packet { const PACKET_ID: VarIntType; } -impl ClientPacket for P { +pub trait MultiVersionJavaPacket { + const PACKET_ID: PacketId; +} + +impl ClientPacket for P { fn write_packet_data( &self, write: impl Write, @@ -25,7 +30,7 @@ impl ClientPacket for P { } } -impl ServerPacket for P { +impl ServerPacket for P { fn read(read: impl Read) -> Result { let mut deserializer = deserializer::Deserializer::new(read); P::deserialize(&mut deserializer) diff --git a/pumpkin-protocol/src/ser/mod.rs b/pumpkin-protocol/src/ser/mod.rs index b89e803dc..5f4550377 100644 --- a/pumpkin-protocol/src/ser/mod.rs +++ b/pumpkin-protocol/src/ser/mod.rs @@ -10,7 +10,7 @@ use crate::{ pub mod deserializer; use pumpkin_nbt::{serializer::WriteAdaptor, tag::NbtTag}; -use pumpkin_util::resource_location::ResourceLocation; +use pumpkin_util::{math::position::BlockPos, resource_location::ResourceLocation}; use thiserror::Error; pub mod serializer; @@ -246,6 +246,7 @@ pub trait NetworkWriteExt { fn write_string_bounded(&mut self, data: &str, bound: usize) -> Result<(), WritingError>; fn write_string(&mut self, data: &str) -> Result<(), WritingError>; fn write_resource_location(&mut self, data: &ResourceLocation) -> Result<(), WritingError>; + fn write_block_pos(&mut self, pos: &BlockPos) -> Result<(), WritingError>; fn write_uuid(&mut self, data: &uuid::Uuid) -> Result<(), WritingError> { let (first, second) = data.as_u64_pair(); @@ -361,6 +362,10 @@ impl NetworkWriteExt for W { self.write_string_bounded(data, i16::MAX as usize) } + fn write_block_pos(&mut self, pos: &BlockPos) -> Result<(), WritingError> { + self.write_i64_be(pos.as_long()) + } + fn write_resource_location(&mut self, data: &ResourceLocation) -> Result<(), WritingError> { self.write_string_bounded(&data.to_string(), ResourceLocation::MAX_SIZE.get()) } diff --git a/pumpkin-util/src/math/position.rs b/pumpkin-util/src/math/position.rs index b8463e236..1cc8bfa5f 100644 --- a/pumpkin-util/src/math/position.rs +++ b/pumpkin-util/src/math/position.rs @@ -366,14 +366,17 @@ impl BlockPos { pub fn squared_distance(&self, other: Self) -> i32 { self.0.squared_distance_to_vec(other.0) } + + pub fn as_long(&self) -> i64 { + ((self.0.x as i64 & 0x3FFFFFF) << 38) + | ((self.0.z as i64 & 0x3FFFFFF) << 12) + | (self.0.y as i64 & 0xFFF) + } } impl Serialize for BlockPos { fn serialize(&self, serializer: S) -> Result { - let long = ((self.0.x as i64 & 0x3FFFFFF) << 38) - | ((self.0.z as i64 & 0x3FFFFFF) << 12) - | (self.0.y as i64 & 0xFFF); - serializer.serialize_i64(long) + serializer.serialize_i64(self.as_long()) } } diff --git a/pumpkin-world/src/chunk/palette.rs b/pumpkin-world/src/chunk/palette.rs index 8524b3e34..fb29d9667 100644 --- a/pumpkin-world/src/chunk/palette.rs +++ b/pumpkin-world/src/chunk/palette.rs @@ -552,9 +552,26 @@ impl BlockPalette { } } +/// Represents the different types of data encoding used in Minecraft's bit-packed chunk sections. +/// +/// Minecraft uses a "Palette" system to compress chunk data. Instead of sending a full +/// 15-bit BlockState ID for every block, it sends a smaller index (e.g., 4 bits) that +/// points to a value in these palettes. pub enum NetworkPalette { + /// **Single Value Palette (Bits per entry: 0)** + /// + /// Used when an entire chunk section (16x16x16) consists of only one type of block or biome. + /// No data array follows this palette in the network buffer. Single(V), + /// **Indirect Palette (Bits per entry: 1-8 for blocks, 1-3 for biomes)** + /// + /// A list of unique values present in the section. The data array contains indices + /// pointing into this list. Indirect(Box<[V]>), + /// **Direct Palette (Bits per entry: 15+ for blocks, 6+ for biomes)** + /// + /// Used when the section is too complex for a small palette. The data array + /// contains global Registry IDs directly. No palette list is sent. Direct, } diff --git a/pumpkin-world/src/lib.rs b/pumpkin-world/src/lib.rs index 6379ffe6a..bf957d466 100644 --- a/pumpkin-world/src/lib.rs +++ b/pumpkin-world/src/lib.rs @@ -22,7 +22,7 @@ pub type BlockId = u16; pub type BlockStateId = u16; pub const CURRENT_MC_VERSION: &str = "1.21.11"; -pub const LOWEST_SUPPRORTED_PROTOCOL_VERSION: u32 = 773; +pub const LOWEST_SUPPRORTED_PROTOCOL_VERSION: u32 = 772; pub const CURRENT_BEDROCK_MC_VERSION: &str = "1.21.132"; pub const CURRENT_BEDROCK_MC_PROTOCOL: u32 = 898; diff --git a/pumpkin/src/entity/mod.rs b/pumpkin/src/entity/mod.rs index df7c9e433..ab31c7bcc 100644 --- a/pumpkin/src/entity/mod.rs +++ b/pumpkin/src/entity/mod.rs @@ -1,4 +1,5 @@ use crate::entity::item::ItemEntity; +use crate::net::ClientPlatform; use crate::world::World; use crate::{server::Server, world::portal::PortalManager}; use bytes::BufMut; @@ -26,7 +27,6 @@ use pumpkin_protocol::{ CEntityPositionSync, CEntityVelocity, CHeadRot, CSetEntityMetadata, CSpawnEntity, CUpdateEntityRot, Metadata, }, - ser::serializer::Serializer, }; use pumpkin_util::math::vector3::Axis; use pumpkin_util::math::{ @@ -39,6 +39,7 @@ use pumpkin_util::math::{ }; use pumpkin_util::text::TextComponent; use pumpkin_util::text::hover::HoverEvent; +use pumpkin_util::version::MinecraftVersion; use serde::Serialize; use std::collections::BTreeMap; use std::f32::consts::PI; @@ -1636,15 +1637,23 @@ impl Entity { pub async fn send_meta_data(&self, meta: &[Metadata]) { let mut buf = Vec::new(); for meta in meta { - let mut serializer_buf = Vec::new(); - let mut serializer = Serializer::new(&mut serializer_buf); - meta.serialize(&mut serializer).unwrap(); - buf.extend(serializer_buf); + meta.write(&mut buf, &MinecraftVersion::V_1_21_11).unwrap(); } buf.put_u8(255); - self.world - .broadcast_packet_all(&CSetEntityMetadata::new(self.entity_id.into(), buf.into())) - .await; + let current_players = self.world.players.read().await; + for player in current_players.values() { + if let ClientPlatform::Java(client) = &player.client { + let mut buf = Vec::new(); + for meta in meta { + meta.write(&mut buf, &client.version.load()).unwrap(); + } + buf.put_u8(255); + player + .client + .enqueue_packet(&CSetEntityMetadata::new(self.entity_id.into(), buf.into())) + .await; + } + } } pub async fn set_pose(&self, pose: EntityPose) { diff --git a/pumpkin/src/net/java/mod.rs b/pumpkin/src/net/java/mod.rs index 0d1dcfb55..9c2a781ab 100644 --- a/pumpkin/src/net/java/mod.rs +++ b/pumpkin/src/net/java/mod.rs @@ -13,6 +13,7 @@ use pumpkin_protocol::java::server::play::{ SPlayerPosition, SPlayerPositionRotation, SPlayerRotation, SPlayerSession, SSetCommandBlock, SSetCreativeSlot, SSetHeldItem, SSetPlayerGround, SSwingArm, SUpdateSign, SUseItem, SUseItemOn, }; +use pumpkin_protocol::packet::MultiVersionJavaPacket; use pumpkin_protocol::{ ClientPacket, ConnectionState, PacketDecodeError, RawPacket, ServerPacket, codec::var_int::VarInt, @@ -33,7 +34,6 @@ use pumpkin_protocol::{ status::{SStatusPingRequest, SStatusRequest}, }, }, - packet::Packet, ser::{NetworkWriteExt, ReadingError, WritingError}, }; use pumpkin_util::text::TextComponent; @@ -331,8 +331,9 @@ impl JavaClient { write: impl Write, ) -> Result<(), WritingError> { let mut write = write; - write.write_var_int(&VarInt(P::PACKET_ID))?; - packet.write_packet_data(write, &self.version.load()) + let version = self.version.load(); + write.write_var_int(&VarInt(P::PACKET_ID.to_id(version)))?; + packet.write_packet_data(write, &version) } /// Handles an incoming packet, routing it to the appropriate handler based on the current connection state. @@ -402,11 +403,11 @@ impl JavaClient { log::debug!("Handling status group"); let payload = &packet.payload[..]; match packet.id { - SStatusRequest::PACKET_ID => { + id if id == SStatusRequest::PACKET_ID => { self.handle_status_request(server).await; Ok(None) } - SStatusPingRequest::PACKET_ID => { + id if id == SStatusPingRequest::PACKET_ID => { self.handle_ping_request(SStatusPingRequest::read(payload)?) .await; Ok(None) @@ -476,22 +477,22 @@ impl JavaClient { log::debug!("Handling login group for id"); let payload = &packet.payload[..]; match packet.id { - SLoginStart::PACKET_ID => { + id if id == SLoginStart::PACKET_ID => { self.handle_login_start(server, SLoginStart::read(payload)?) .await; } - SEncryptionResponse::PACKET_ID => { + id if id == SEncryptionResponse::PACKET_ID => { self.handle_encryption_response(server, SEncryptionResponse::read(payload)?) .await; } - SLoginPluginResponse::PACKET_ID => { + id if id == SLoginPluginResponse::PACKET_ID => { self.handle_plugin_response(server, SLoginPluginResponse::read(payload)?) .await; } - SLoginAcknowledged::PACKET_ID => { + id if id == SLoginAcknowledged::PACKET_ID => { self.handle_login_acknowledged(server).await; } - SLoginCookieResponse::PACKET_ID => { + id if id == SLoginCookieResponse::PACKET_ID => { self.handle_login_cookie_response(&SLoginCookieResponse::read(payload)?); } _ => { @@ -509,27 +510,28 @@ impl JavaClient { server: &Server, packet: &RawPacket, ) -> Result, ReadingError> { - log::debug!("Handling config group"); + log::debug!("Handling config group for id {}", packet.id); let payload = &packet.payload[..]; + match packet.id { - SClientInformationConfig::PACKET_ID => { + id if id == SClientInformationConfig::PACKET_ID => { self.handle_client_information_config(SClientInformationConfig::read(payload)?) .await; } - SPluginMessage::PACKET_ID => { + id if id == SPluginMessage::PACKET_ID => { self.handle_plugin_message(SPluginMessage::read(payload)?) .await; } - SAcknowledgeFinishConfig::PACKET_ID => { + id if id == SAcknowledgeFinishConfig::PACKET_ID => { return Ok(Some(self.handle_config_acknowledged(server).await)); } - SKnownPacks::PACKET_ID => { + id if id == SKnownPacks::PACKET_ID => { self.handle_known_packs(SKnownPacks::read(payload)?).await; } - SConfigCookieResponse::PACKET_ID => { + id if id == SConfigCookieResponse::PACKET_ID => { self.handle_config_cookie_response(&SConfigCookieResponse::read(payload)?); } - SConfigResourcePack::PACKET_ID => { + id if id == SConfigResourcePack::PACKET_ID => { self.handle_resource_pack_response(server, SConfigResourcePack::read(payload)?) .await; } @@ -551,133 +553,134 @@ impl JavaClient { packet: &RawPacket, ) -> Result<(), Box> { let payload = &packet.payload[..]; + match packet.id { - SConfirmTeleport::PACKET_ID => { + id if id == SConfirmTeleport::PACKET_ID => { self.handle_confirm_teleport(player, SConfirmTeleport::read(payload)?) .await; } - SChangeGameMode::PACKET_ID => { + id if id == SChangeGameMode::PACKET_ID => { self.handle_change_game_mode(player, SChangeGameMode::read(payload)?) .await; } - SChatCommand::PACKET_ID => { + id if id == SChatCommand::PACKET_ID => { self.handle_chat_command(player, server, &(SChatCommand::read(payload)?)) .await; } - SChatMessage::PACKET_ID => { + id if id == SChatMessage::PACKET_ID => { self.handle_chat_message(server, player, SChatMessage::read(payload)?) .await; } - SClientInformationPlay::PACKET_ID => { + id if id == SClientInformationPlay::PACKET_ID => { self.handle_client_information(player, SClientInformationPlay::read(payload)?) .await; } - SClientCommand::PACKET_ID => { + id if id == SClientCommand::PACKET_ID => { self.handle_client_status(player, SClientCommand::read(payload)?) .await; } - SPlayerInput::PACKET_ID => { + id if id == SPlayerInput::PACKET_ID => { self.handle_player_input(player, SPlayerInput::read(payload)?) .await; } - SInteract::PACKET_ID => { + id if id == SInteract::PACKET_ID => { self.handle_interact(player, SInteract::read(payload)?, server) .await; } - SKeepAlive::PACKET_ID => { + id if id == SKeepAlive::PACKET_ID => { self.handle_keep_alive(player, SKeepAlive::read(payload)?) .await; } - SClientTickEnd::PACKET_ID => { + id if id == SClientTickEnd::PACKET_ID => { // TODO } - SPlayerPosition::PACKET_ID => { + id if id == SPlayerPosition::PACKET_ID => { self.handle_position(player, SPlayerPosition::read(payload)?) .await; } - SPlayerPositionRotation::PACKET_ID => { + id if id == SPlayerPositionRotation::PACKET_ID => { self.handle_position_rotation(player, SPlayerPositionRotation::read(payload)?) .await; } - SPlayerRotation::PACKET_ID => { + id if id == SPlayerRotation::PACKET_ID => { self.handle_rotation(player, SPlayerRotation::read(payload)?) .await; } - SSetPlayerGround::PACKET_ID => { + id if id == SSetPlayerGround::PACKET_ID => { self.handle_player_ground(player, &SSetPlayerGround::read(payload)?); } - SPickItemFromBlock::PACKET_ID => { + id if id == SPickItemFromBlock::PACKET_ID => { self.handle_pick_item_from_block(player, SPickItemFromBlock::read(payload)?) .await; } - SPlayerAbilities::PACKET_ID => { + id if id == SPlayerAbilities::PACKET_ID => { self.handle_player_abilities(player, SPlayerAbilities::read(payload)?) .await; } - SPlayerAction::PACKET_ID => { + id if id == SPlayerAction::PACKET_ID => { self.handle_player_action(player, SPlayerAction::read(payload)?, server) .await; } - SSetCommandBlock::PACKET_ID => { + id if id == SSetCommandBlock::PACKET_ID => { self.handle_set_command_block(player, SSetCommandBlock::read(payload)?) .await; } - SPlayerCommand::PACKET_ID => { + id if id == SPlayerCommand::PACKET_ID => { self.handle_player_command(player, SPlayerCommand::read(payload)?) .await; } - SPlayerLoaded::PACKET_ID => Self::handle_player_loaded(player), - SPlayPingRequest::PACKET_ID => { + id if id == SPlayerLoaded::PACKET_ID => Self::handle_player_loaded(player), + id if id == SPlayPingRequest::PACKET_ID => { self.handle_play_ping_request(SPlayPingRequest::read(payload)?) .await; } - SClickSlot::PACKET_ID => { + id if id == SClickSlot::PACKET_ID => { player.on_slot_click(SClickSlot::read(payload)?).await; } - SSetHeldItem::PACKET_ID => { + id if id == SSetHeldItem::PACKET_ID => { self.handle_set_held_item(player, SSetHeldItem::read(payload)?) .await; } - SSetCreativeSlot::PACKET_ID => { + id if id == SSetCreativeSlot::PACKET_ID => { self.handle_set_creative_slot(player, SSetCreativeSlot::read(payload)?) .await?; } - SSwingArm::PACKET_ID => { + id if id == SSwingArm::PACKET_ID => { self.handle_swing_arm(player, SSwingArm::read(payload)?) .await; } - SUpdateSign::PACKET_ID => { + id if id == SUpdateSign::PACKET_ID => { self.handle_sign_update(player, SUpdateSign::read(payload)?) .await; } - SUseItemOn::PACKET_ID => { + id if id == SUseItemOn::PACKET_ID => { self.handle_use_item_on(player, SUseItemOn::read(payload)?, server) .await?; } - SUseItem::PACKET_ID => { + id if id == SUseItem::PACKET_ID => { self.handle_use_item(player, &SUseItem::read(payload)?, server) .await; } - SCommandSuggestion::PACKET_ID => { + id if id == SCommandSuggestion::PACKET_ID => { self.handle_command_suggestion(player, SCommandSuggestion::read(payload)?, server) .await; } - SPCookieResponse::PACKET_ID => { + id if id == SPCookieResponse::PACKET_ID => { self.handle_cookie_response(&SPCookieResponse::read(payload)?); } - SCloseContainer::PACKET_ID => { + id if id == SCloseContainer::PACKET_ID => { self.handle_close_container(player, server, SCloseContainer::read(payload)?) .await; } - SChunkBatch::PACKET_ID => { + id if id == SChunkBatch::PACKET_ID => { self.handle_chunk_batch(player, SChunkBatch::read(payload)?) .await; } - SPlayerSession::PACKET_ID => { + id if id == SPlayerSession::PACKET_ID => { self.handle_chat_session_update(player, server, SPlayerSession::read(payload)?) .await; } - SCustomPayload::PACKET_ID => { + id if id == SCustomPayload::PACKET_ID => { // TODO: this fixes Failed to handle player packet id for now } _ => { diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 60094cb3e..bbdddb722 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -64,7 +64,6 @@ use pumpkin_protocol::bedrock::client::start_game::CStartGame; use pumpkin_protocol::bedrock::frame_set::FrameSet; use pumpkin_protocol::java::client::play::CPlayerSpawnPosition; use pumpkin_protocol::java::client::play::{CSetEntityMetadata, Metadata}; -use pumpkin_protocol::ser::serializer::Serializer; use pumpkin_protocol::{ BClientPacket, ClientPacket, IdOr, SoundEvent, bedrock::{ @@ -126,7 +125,6 @@ use pumpkin_world::{world::BlockFlags, world_info::LevelData}; use rand::seq::SliceRandom; use rand::{Rng, rng}; use scoreboard::Scoreboard; -use serde::Serialize; use time::LevelTime; use tokio::sync::Mutex; use tokio::sync::RwLock; @@ -1644,11 +1642,7 @@ impl World { MetaDataType::Byte, config.skin_parts, ); - let mut serializer_buf = Vec::new(); - - let mut serializer = Serializer::new(&mut serializer_buf); - meta.serialize(&mut serializer).unwrap(); - buf.extend(serializer_buf); + meta.write(&mut buf, &client.version.load()).unwrap(); }; drop(config); // END