Копаю структуру пакетов в Paper 1.21.4/5. Пытаюсь реализовать передачу кастомных данных через компонент minecraft:custom_data в режиме выживания (GM 0).
Проблема:
В Paper реализована жесткая санитизация через io.papermc.paper.util.sanitizer.ItemComponentSanitizer. Когда клиент шлет пакеты ClickSlotC2SPacket или PlayerInteractBlockC2SPacket, сервер проверяет NBT/Компоненты. Если предмет (например, булыжник) не должен иметь custom_data, сервер его вырезает.
Анализ исходников показал, что санитизация в основном происходит при энкодинге (outbound), то есть когда сервер шлет инфу обратно. Но при декодинге (inbound) сервер принимает данные в память "как есть".
Вопрос:
Существует ли в Paper 1.21.x "окно доверия" или race condition в Netty Pipeline, когда данные пакета уже попали в обработку, но еще не были стерты санитизером? Может быть, есть специфические пакеты (например, carriedItem при клике в пустой слот или взаимодействие с Merchant/Lectern), где DataComponentPatch применяется к предмету в памяти сервера без немедленной валидации типа предмета?
Цель заставить сервер сохранить (или передать дальше в пайплайн) хотя бы один кастомный тег в custom_data предмета, который по дефолту NBT не имеет.
Проблема:
В Paper реализована жесткая санитизация через io.papermc.paper.util.sanitizer.ItemComponentSanitizer. Когда клиент шлет пакеты ClickSlotC2SPacket или PlayerInteractBlockC2SPacket, сервер проверяет NBT/Компоненты. Если предмет (например, булыжник) не должен иметь custom_data, сервер его вырезает.
Анализ исходников показал, что санитизация в основном происходит при энкодинге (outbound), то есть когда сервер шлет инфу обратно. Но при декодинге (inbound) сервер принимает данные в память "как есть".
Вопрос:
Существует ли в Paper 1.21.x "окно доверия" или race condition в Netty Pipeline, когда данные пакета уже попали в обработку, но еще не были стерты санитизером? Может быть, есть специфические пакеты (например, carriedItem при клике в пустой слот или взаимодействие с Merchant/Lectern), где DataComponentPatch применяется к предмету в памяти сервера без немедленной валидации типа предмета?
Цель заставить сервер сохранить (или передать дальше в пайплайн) хотя бы один кастомный тег в custom_data предмета, который по дефолту NBT не имеет.