Перейти к содержимому

PolyMc-Extra

Автоматически патчит моды, чтобы обычным игрокам не нужно было устанавливать моды для входа на ваш сервер!

Fabric
Загрузчики
Fabric
Скачиваний на Modrinth
1 тыс.
Подписчиков на Modrinth
4
версий
6
Обновлён
23 мая 202623 мая
Опубликован
в 2026
Это библиотека — она нужна другим модам и сама ничего не добавляет в игру

Коротко о моде

Библиотека — нужна другим модам
Работает на Fabric
Для Minecraft 1.21.6–1.21.8, 1.21.10–26.1.2
Ставится только на сервер; игрокам ставить не нужно
Последняя версия — BETA+26.1.2+1.0.5 от 23 мая 2026
Нужен Polymer
Где нужен
В игрене нуженНа сервереобязателен

Ставится только на сервер; игрокам ставить не нужно

Версии игры1.21.6–1.21.8, 1.21.10–26.1.2
Описание переведено автоматическиПоказать оригинал (EN)

PolyMc-Extra

Это серверная библиотека и инструмент для автоматического патчинга модов под PolyMc. Работает аналогично PolyMc, но мощнее. Позволяет автоматически патчить некоторые моды, а его функциональность патчинга можно управлять через файлы конфигурации.

Следующие записи реестра были обработаны патчем

Список: Attribute, EntityType, SoundEvent, ComponentType, EnchantmentEffectComponentType, EnchantmentLocationBaseEffectType, EnchantmentEntityEffectType, StatusEffect, Potion, ScreenHandlers, ConsumeEffectType, StatType, CustomStat, PoiType, ItemGroup, Item, Block, BlockEntityType, Profession

Жизненный цикл во время выполнения:

  1. Регистрация встроенного ExtraModelType
  2. Регистрация специальных маппингов сущностей
  3. Сканирование и выполнение всех точек входа "polymc-extra" модулей (PolyMcExtraEntrypoint.class)
  4. Перед заморозкой всех статических записей реестра: чтение файла конфигурации, перебор реестра и патчинг каждого отсутствующего элемента (только на сервере)
  5. Проверка целостности компонентов предметов
  6. Сканирование необходимых ресурсов в JAR-файлах и генерация пакетов ресурсов

Для игроков/владельцев серверов/создателей модпаков:

Может автоматически восстанавливать состояние соответствующих polymer-блоков для большинства модов, позволяя ванильным клиентам заходить на серверы с модами.

Для разработчиков модов:

Предоставляет несколько API и инструментов для разработчиков, чтобы патчить сложные моды; по остальным вопросам можно спрашивать в Discord.

Необходимые знания

Сначала вам стоит изучить, как пользоваться некоторыми библиотеками.

Среда разработки

  1. Создайте папку libs в директории вашего модульного проекта.
  2. Скачайте JAR-файл и поместите его в папку libs в директории вашего модульного проекта.
  3. Добавьте следующее содержимое в build.gradle:
repositories {
    maven { url "https://maven.nucleoid.xyz" }
    maven { url "https://maven.tomalbrc.de" }
    maven { url "https://api.modrinth.com/maven" }
    maven { url "https://maven.architectury.dev/" }
    maven {
        url "https://maven.theepicblock.nl"
        content { includeGroup("nl.theepicblock") }
    }
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    modImplementation("eu.pb4:polymer-core:[${polymer_version}]")
    modImplementation("eu.pb4:polymer-blocks:[${polymer_version}]")
    modImplementation("eu.pb4:polymer-resource-pack:[${polymer_version}]")
    modImplementation("eu.pb4:polymer-resource-pack-extras:[${polymer_version}]")
    modImplementation("eu.pb4:polymer-virtual-entity:[${polymer_version}]")
    modImplementation("eu.pb4:polymer-autohost:${polymer_version}")
    modImplementation("eu.pb4:polymer-networking:[${polymer_version}]")
    modImplementation("nl.theepicblock:resource-locator-api:${project.resource_locator_version}")
    modImplementation("eu.pb4:factorytools:[${factorytools_version}]")
    modImplementation("eu.pb4:sgui:[${sgui_version}]")
    modImplementation("xyz.nucleoid:server-translations-api:${server_translation_api_version}")
    
    modImplementation files('libs/PolyMc-Extra-XXXXXXX.jar')
    modCompileOnly 'maven.modrinth:polydex:XXXXXX'
}

Пример кода патча

public class PolymerifyRegistry implements PolyMcExtraEntrypoint {

    @Override
    public void onInitialize() {
        PolymerifyRegistry.initialize();
        PolyMcExtraPacks.NAMESPACES.add(getNamespace());
    }
    
    public static void initialize() {
        registerPolymerBlock(BlockRegistry.XXX, XXXPolymerBlock.INSTANCE);
        registerPolymerItem(BlockRegistry.XXX, new PolymerItemImpl(BlockRegistry.XXX.asItem()));
    }

    public static void registerPolymerBlock(Block block, PolymerBlock polymerBlock) {
        ResourceLocation key = BuiltInRegistries.BLOCK.getKey(block);
        PolymerBlock.registerOverlay(block, polymerBlock);
        if (polymerBlock instanceof BlockWithElementHolder elementHolder) {
            BlockWithElementHolder.registerOverlay(block, elementHolder);
        }
        PolyMcExtra.LATE_INIT.add(new Runnable() {
            @Override
            public void run() {
                if (PolymerBlockHelper.testJsonExist(block)) {
                    BlockStateModelManager.addBlock(key, block);
                }
            }
        });
    }

    public static void registerPolymerItem(ItemLike item, PolymerItem polymerItem) {
        PolymerItem.registerOverlay(item.asItem(), polymerItem);
    }
    
    @Override
    public String getNamespace() {
        return MOD_ID;
    }
}

public class XXXPolymerBlock {
    public static final BlockState OVERLAY_0 = PolymerBlockResourceUtils.requestEmpty(BlockModelType.ACTIVE_PRESSURE_PLATE);
    public static final BlockState OVERLAY_1 = PolymerBlockResourceUtils.requestEmpty(BlockModelType.KELP_BLOCK);
    public static final BaseFactoryBlock INSTANCE = new BaseFactoryBlock(OVERLAY_0, false, BlockStateModel::midRange) {
        @Override
        public BlockState getPolymerBlockState(BlockState state, PacketContext context) {
            if (state.hasProperty(BlockStateProperties.WATERLOGGED) && state.getValue(BlockStateProperties.WATERLOGGED)) {
                return OVERLAY_1;
            }
            return super.getPolymerBlockState(state, context);
        }
    };
}

## Пример конфига:
Файл конфигурации находится по пути `/config/polymc-extra.json`

{ "DisabledOpaqueBlocks": [], "CustomBlockModelTypeMappings": { "citymod:stone_table": "BLOCK_DISPLAY_ENTITY", "citymod:road_block": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_yellow": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_yellow_connect": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_white_connect": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_yellow_double": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_zebra_crossing": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:roadblock_oblique": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:roadblock_yellow_oblique": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:roadblock_double_oblique": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:zebracrossing_oblique": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_straight": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "citymod:road_diamond": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:modern_light": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:computer_mouse": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:black_mirror": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:laptop": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:modern_clock": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:led_floor_lamp": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:shower": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:portable_laptop_stand": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:laptop_closed_portable_laptop_stand": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:cooktop": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:keyboard": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:monitor_setup": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:shower": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:socket": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:modern_chair": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "js_furniture_mod:wood_chair": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "^js_furniture_mod:midi_.+$": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "^js_furniture_mod:.": "BLOCK_DISPLAY_ENTITY", "^skniro_furniture:.(drawer|cabinet|fridge|kitchen_sink|oven|tv_stand)$": "BLOCK_DISPLAY_ENTITY", "^skniro_furniture:.*(bed|cushion|sofa|window(?:style.*)?|plate|chair(?:.)?|lamp)$": "BLOCK_DISPLAY_ENTITY_NO_COLLISION", "^skniro_furniture:.window(.)?$": "CLOSEABLE_BLOCK", "^skniro_furniture:._(door)$": "CLOSEABLE_BLOCK", "^skniro_furniture:._glass_table": "BLOCK_DISPLAY_ENTITY", "terrestria:cattail": "WATER_PLANT", "terrestria:andisol_grass_block": "POLYMER:BIOME_TRANSPARENT_BLOCK", "^storagedelight:.$": "BLOCK_DISPLAY_ENTITY", "^terrestria:.*_log$": "BLOCK_DISPLAY_ENTITY" }, "CustomEntityModelMappings": { "js_furniture_mod:chair_entity": "polymc-extra:chair", "js_furniture_mod:sofa_entity": "polymc-extra:chair", "skniro_furniture:chair_entity": "polymc-extra:chair", "skniro_furniture:sofa_entity": "polymc-extra:chair", "skniro_furniture:cushion_entity": "polymc-extra:chair", "citymod:explode_bow_projectile": "minecraft:arrow", "citymod:rifle_legacy_projectile": "minecraft:arrow" }, "CustomModelExpansionMappings": { "js_furniture_mod:sofa": 0.0, "js_furniture_mod:wood_light_table": 0.0, "js_furniture_mod:led_floor_lamp_rgb_off": 0.0, "js_furniture_mod:led_floor_lamp_rgb_off_2": 0.0, "js_furniture_mod:studio_light": 0.0, "citymod:road_block": 0.0, "citymod:road_yellow": 0.0, "citymod:road_yellow_connect": 0.0, "citymod:road_white_connect": 0.0, "citymod:road_yellow_double": 0.0, "citymod:road_zebra_crossing": 0.0 } }

Команды

  • /polymc-extra:

    • export-extra-block-models-mappings: Экспортирует обработанную PolyMc карту блоков в ExtraBlockMapping.txt
    • get-all-model-types: Показывает все типы маппинга блоков
    • get-client-state: Показывает истинный маппинг и маппинг оверлея квадрата, на который указывает прицел.
    • get-item-info: Показывает настоящий ID предмета в руке и информацию о его компонентах.

Что эта библиотека/мод не делает

Она не поддерживает клиентский рендеринг.

Если модуль использует ASM для изменения определённых enum'ов или заменяет записи реестра Vanilla, это вызовет некоторые аномальные ошибки.

Лицензия

Этот мод частично основан на коде из enderscape-patch и PolyMc, которые лицензированы под GNU Lesser General Public License v3.0 и GNU Lesser General Public License 3.0

Частые вопросы

Как установить PolyMc-Extra?

Установите Fabric под свою версию Minecraft, скачайте PolyMc-Extra под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.

Для каких версий Minecraft есть PolyMc-Extra?

У PolyMc-Extra есть сборки для Minecraft 1.21.6–1.21.8, 1.21.10–26.1.2.

Нужен ли PolyMc-Extra на сервере?

Ставится только на сервер; игрокам ставить не нужно

Лицензия и источник
GNU General Public License v3.0 onlyможно использовать и распространять; изменённые версии — под той же лицензией и с исходным кодом
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее