PolyMc-Extra
Автоматически патчит моды, чтобы обычным игрокам не нужно было устанавливать моды для входа на ваш сервер!
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 1 тыс.
- Подписчиков на Modrinth
- 4
- версий
- 6
- Обновлён
- 23 мая 202623 мая
- Опубликован
- в 2026
Коротко о моде
Ставится только на сервер; игрокам ставить не нужно
PolyMc-Extra
Это серверная библиотека и инструмент для автоматического патчинга модов под PolyMc. Работает аналогично PolyMc, но мощнее. Позволяет автоматически патчить некоторые моды, а его функциональность патчинга можно управлять через файлы конфигурации.
Следующие записи реестра были обработаны патчем
Список: Attribute, EntityType, SoundEvent, ComponentType, EnchantmentEffectComponentType, EnchantmentLocationBaseEffectType, EnchantmentEntityEffectType, StatusEffect, Potion, ScreenHandlers, ConsumeEffectType, StatType, CustomStat, PoiType, ItemGroup, Item, Block, BlockEntityType, Profession
Жизненный цикл во время выполнения:
- Регистрация встроенного ExtraModelType
- Регистрация специальных маппингов сущностей
- Сканирование и выполнение всех точек входа "polymc-extra" модулей (PolyMcExtraEntrypoint.class)
- Перед заморозкой всех статических записей реестра: чтение файла конфигурации, перебор реестра и патчинг каждого отсутствующего элемента (только на сервере)
- Проверка целостности компонентов предметов
- Сканирование необходимых ресурсов в JAR-файлах и генерация пакетов ресурсов
Для игроков/владельцев серверов/создателей модпаков:
Может автоматически восстанавливать состояние соответствующих polymer-блоков для большинства модов, позволяя ванильным клиентам заходить на серверы с модами.
Для разработчиков модов:
Предоставляет несколько API и инструментов для разработчиков, чтобы патчить сложные моды; по остальным вопросам можно спрашивать в Discord.
Необходимые знания
Сначала вам стоит изучить, как пользоваться некоторыми библиотеками.
Среда разработки
- Создайте папку libs в директории вашего модульного проекта.
- Скачайте JAR-файл и поместите его в папку libs в директории вашего модульного проекта.
- Добавьте следующее содержимое в 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 на сервере?
Ставится только на сервер; игрокам ставить не нужно