Підготуйте структуру мода
Додайте залежність від infinitumcore у ваш modinfo.json. Сам журнал надає клієнтський мод infinitumcollections, але визначення колекцій читає Core на сервері.
{
"dependencies": {
"game": "1.22.7",
"infinitumcore": "1.0.0"
}
}Файл колекції має лежати саме за таким шляхом:
<ModID> замініть на asset domain вашого мода. Назва JSON-файлу довільна; усі файли в цій теці завантажуються автоматично.
Створіть базову колекцію
id має бути стабільним і унікальним: він зберігається у прогресі гравців. name — ключ локалізації, аincludes описує, які collectible-коди потраплять до списку. Приклад одразу показує локальне й глобальне виключення, тип асета та повну структуру одного фільтра.
{
"id": "<ModID>-artifacts",
"name": "<ModID>:collection-artifacts",
"includes": [
{
"pattern": "^<ModID>:artifact-",
"exclude": "-(?:creative|debug)$",
"kind": "item"
}
],
"excludes": [
"-creative$"
],
"filters": [
{
"id": "era",
"name": "<ModID>:filter-era",
"tags": true,
"options": [
{
"id": "ancient",
"name": "<ModID>:filter-era-ancient",
"pattern": "-ancient$"
},
{
"id": "modern",
"name": "<ModID>:filter-era-modern",
"pattern": "-modern$"
}
]
}
]
}Додайте використані ключі до мовних файлів мода, наприклад assets/<ModID>/lang/uk.json:
{
"<ModID>:collection-artifacts": "Артефакти",
"<ModID>:filter-era": "Епоха",
"<ModID>:filter-era-ancient": "Стародавні",
"<ModID>:filter-era-modern": "Сучасні",
}Оберіть спосіб відбору
Матчер працює з повним Code.ToShortString() без префікса item: або block:. Для власних асетів код зазвичай має вигляд <ModID>:artifact-sun-disc; перевіряйте саме фактичний collectible code.
Регулярний вираз
Поле pattern зручне для цілого сімейства кодів. Закріплюйте початок і кінець через ^ та $, коли потрібен точний збіг.
Точні коди
Поля ids або value доречні для короткого фіксованого списку без regex.
{
"id": "<ModID>-rare-artifacts",
"name": "<ModID>:collection-rare-artifacts",
"includes": [
{
"value": "<ModID>:artifact-sun-disc",
"kind": "item"
},
{
"ids": [
"<ModID>:artifact-moon-idol",
"<ModID>:artifact-star-map"
],
"exclude": "-creative$",
"kind": "item"
}
],
"excludes": [
"-debug$"
],
"groups": [],
"filters": []
}kind приймає item, block або any. Поле exclude у конкретному include та масив верхнього рівня excludes відсікають небажані коди.
Об’єднайте варіанти в один запис
Без groups кожен collectible code стає окремим записом. На прикладі вже наявної колекції броні одна група складає шолом, нагрудник і поножі в єдиний комплект. Іменована regex-група set утворює ключ комплекту, а part веде окремий прогрес його трьох частин.
{
"groups": [
{
"keyPattern": "^<ModID>:armor-(?:head|body|legs)-(?<set>.+)$",
"keyGroup": "set",
"completion": "all",
"display": {
"nameFrom": [
"^<ModID>:armor-body-",
"^<ModID>:armor-head-",
"^<ModID>:armor-legs-"
],
"iconCycle": true
},
"credit": {
"only": [
"^<ModID>:armor-(?:head|body|legs)-"
],
"exclude": [
"-(?:damaged|broken)$"
]
},
"part": {
"keyPattern": "^<ModID>:armor-(?<part>head|body|legs)-",
"keyGroup": "part",
"fallback": "other"
}
}
]
}completion: "any"— достатньо будь-якого варіанта.completion: "all"— потрібні всі члени групи.completion: "count"разом ізcount— потрібна задана кількість.display.nameFromзадає пріоритет варіанта для назви та іконки.
Додайте швидкі фільтри й теги
Кожен елемент filters додає до журналу окремий список швидкого відбору. Наприклад, рибу можна фільтрувати за водоймою та віком. pattern перевіряється проти кодів усіх членів запису, тому фільтр працює і для одиночних предметів, і для груп.
{
"filters": [
{
"id": "water",
"name": "<ModID>:filter-water",
"tags": true,
"options": [
{
"id": "freshwater",
"name": "<ModID>:filter-water-freshwater",
"pattern": "-freshwater-"
},
{
"id": "saltwater",
"name": "<ModID>:filter-water-saltwater",
"pattern": "-saltwater-"
},
{
"id": "reef",
"name": "<ModID>:filter-water-reef",
"pattern": "-reef-"
}
]
},
{
"id": "maturity",
"name": "<ModID>:filter-maturity",
"tags": false,
"options": [
{
"id": "adult",
"name": "<ModID>:filter-maturity-adult",
"pattern": "-adult$"
},
{
"id": "juvenile",
"name": "<ModID>:filter-maturity-juvenile",
"pattern": "-juvenile$"
}
]
}
]
}id— стабільний ID фільтра або його варіанта.name— ключ локалізованої назви у списку.options[].pattern— regex, за яким запис належить до варіанта.tags: trueдодатково показує збіги як клікабельні теги на картці;falseзалишає лише список фільтра.
Не додавайте option з id: "all". Collections автоматично вставляє «Усі» першим пунктом кожного фільтра. Якщо вибрані варіанти в кількох фільтрах, запис має пройти кожен із них.
Показуйте один предмет, а зараховуйте інший
display і credit вирішують різні задачі. Перше правило обирає назву та іконки запису, друге — лише коди, які можуть змінити прогрес. У вбудованій колекції риб це дозволяє показувати живу рибу з creature-fish-*, але зараховувати знахідку лише після отримання її сирого, тобто мертвого, варіанта fishraw-*.
{
"id": "<ModID>-fish",
"name": "<ModID>:collection-fish",
"includes": [
{
"pattern": "^<ModID>:(?:fishraw-|creature-fish-)",
"exclude": "-(?:creative|debug)$",
"kind": "item"
}
],
"excludes": [
"-spoiled$"
],
"groups": [
{
"keyPattern": "^<ModID>:(?:fishraw-|creature-fish-)(?<species>.+?)-(?:adult|juvenile)$",
"keyGroup": "species",
"completion": "any",
"display": {
"nameFrom": [
"^<ModID>:creature-fish-"
],
"iconCycle": true
},
"credit": {
"only": [
"^<ModID>:fishraw-"
],
"exclude": [
"-spoiled$"
]
},
"part": {
"keyPattern": "^<ModID>:fishraw-(?<stage>.+)-(?:adult|juvenile)$",
"keyGroup": "stage",
"fallback": "caught"
}
}
],
"filters": [
{
"id": "water",
"name": "<ModID>:filter-water",
"tags": true,
"options": [
{
"id": "freshwater",
"name": "<ModID>:filter-water-freshwater",
"pattern": "-freshwater-"
},
{
"id": "saltwater",
"name": "<ModID>:filter-water-saltwater",
"pattern": "-saltwater-"
},
{
"id": "reef",
"name": "<ModID>:filter-water-reef",
"pattern": "-reef-"
}
]
}
]
}includesспочатку додає до колекції і живі, і сирі варіанти.keyPatternвідкидає різницю у префіксі та складає обидва коди одного виду в один запис.display.nameFromзалишає джерелом назви й іконок лише живіcreature-fish-*.credit.onlyдозволяє зарахувати прогрес лише кодамfishraw-*;credit.excludeможе додатково відсікти зіпсовані чи службові варіанти.
Для метеликів схема така сама: об’єднайте живий і мертвий коди спільною capture group, у display.nameFrom залиште живий префікс, а в credit.only — префікс мертвого предмета. Якщо потрібна одна нерухома іконка, встановіть display.iconCycle: false.
Або розширте наявну колекцію
Щоб броня з вашого мода з’явилася у вбудованій колекції броні, вкажіть extends: "armor" замість нового id. Includes, excludes, groups і filters з такого файла додадуться до цілі.
{
"extends": "armor",
"includes": [
{
"pattern": "^<ModID>:armor-",
"exclude": "-(?:damaged|broken)$",
"kind": "item"
}
],
"excludes": [
"-creative$"
],
"groups": [
{
"keyPattern": "^<ModID>:armor-(?:head|body|legs)-(?<set>.+)$",
"keyGroup": "set",
"completion": "all",
"display": {
"nameFrom": [
"^<ModID>:armor-body-",
"^<ModID>:armor-head-",
"^<ModID>:armor-legs-"
],
"iconCycle": true
},
"credit": {
"only": [
"^<ModID>:armor-(?:head|body|legs)-"
],
"exclude": [
"-(?:damaged|broken)$"
]
},
"part": {
"keyPattern": "^<ModID>:armor-(?<part>head|body|legs)-",
"keyGroup": "part",
"fallback": "other"
}
}
],
"filters": [
{
"id": "armor-type",
"name": "<ModID>:filter-armor-type",
"tags": true,
"options": [
{
"id": "scale",
"name": "<ModID>:filter-armor-type-scale",
"pattern": "-scale-"
},
{
"id": "plate",
"name": "<ModID>:filter-armor-type-plate",
"pattern": "-plate-"
}
]
}
]
}Стороння нова колекція не може затінити вбудовану з тим самим ID. Для доповнення використовуйте extends; для окремої — унікальний ID із префіксом вашого мода.
Увімкніть і перевірте
- Запустіть світ із вашим модом, Infinitum Core та Collections.
- Адміністратор відкриває налаштування Infinitum → серверну сторінку Collections.
- Увімкніть нову колекцію окремим перемикачем або дозвольте автоматичне ввімкнення нових сторонніх колекцій.
- Перезапустіть світ після зміни JSON-асета та відкрийте журнал колекцій.
- Перевірте серверний лог за префіксом
[InfinitumCore]: там з’являються помилки JSON, regex і дублікати ID.
Нові сторонні колекції за замовчуванням вимкнені. Це серверна політика, тому сам факт наявності файла ще не робить колекцію активною.
Повний приклад і поля схеми
Нижче — цілісний приклад колекції комплектів броні з відбором, усіма трьома способами include, виключеннями, автоматичною та явно заданою групою, правилами вигляду й прогресу та двома фільтрами. Замініть усі входження <ModID> на домен свого мода.
{
"id": "<ModID>-armor",
"name": "<ModID>:collection-armor",
"includes": [
{
"pattern": "^<ModID>:armor-",
"exclude": "-(?:damaged|broken)$",
"kind": "item"
},
{
"value": "<ModID>:armor-display-royal",
"kind": "item"
},
{
"ids": [
"<ModID>:armor-ceremonial-sun",
"<ModID>:armor-ceremonial-moon"
],
"kind": "item"
}
],
"excludes": [
"-creative$"
],
"groups": [
{
"keyPattern": "^<ModID>:armor-(?:head|body|legs)-(?<set>.+)$",
"keyGroup": "set",
"completion": "count",
"count": 3,
"display": {
"nameFrom": [
"^<ModID>:armor-body-",
"^<ModID>:armor-head-",
"^<ModID>:armor-legs-"
],
"iconCycle": true
},
"credit": {
"only": [
"^<ModID>:armor-(?:head|body|legs)-"
],
"exclude": [
"-(?:damaged|broken)$"
]
},
"part": {
"keyPattern": "^<ModID>:armor-(?<part>head|body|legs)-",
"keyGroup": "part",
"fallback": "other"
}
},
{
"entries": [
{
"id": "ceremonial",
"name": "<ModID>:collection-entry-ceremonial",
"members": [
"<ModID>:armor-ceremonial-sun",
"<ModID>:armor-ceremonial-moon"
]
}
],
"completion": "any",
"display": {
"nameFrom": [
"-sun$",
"-moon$"
],
"iconCycle": false
},
"credit": {
"only": [
"^<ModID>:armor-ceremonial-"
],
"exclude": [
"-creative$"
]
},
"part": {
"keyPattern": "^<ModID>:armor-ceremonial-(?<piece>.+)$",
"keyGroup": "piece",
"fallback": "ceremonial"
}
}
],
"filters": [
{
"id": "material",
"name": "<ModID>:filter-material",
"tags": true,
"options": [
{
"id": "steel",
"name": "<ModID>:filter-material-steel",
"pattern": "-steel$"
},
{
"id": "bronze",
"name": "<ModID>:filter-material-bronze",
"pattern": "-(?:tin|bismuth|black)bronze$"
}
]
},
{
"id": "armor-type",
"name": "<ModID>:filter-armor-type",
"tags": false,
"options": [
{
"id": "scale",
"name": "<ModID>:filter-armor-type-scale",
"pattern": "-scale-"
},
{
"id": "plate",
"name": "<ModID>:filter-armor-type-plate",
"pattern": "-plate-"
},
{
"id": "ceremonial",
"name": "<ModID>:filter-armor-type-ceremonial",
"pattern": "-ceremonial-"
}
]
}
]
}| Поле | Призначення |
|---|---|
id | Стабільний унікальний ID нової колекції; не змінюйте його після релізу. |
extends | ID наявної колекції, яку потрібно доповнити. Використовується замість id і name. |
name | Lang-ключ або inline-об’єкт на кшталт { "uk": "Броня", "en": "Armor" }. |
includes[].pattern | Regex для відбору сімейства collectible-кодів. |
includes[].value | Один точний collectible code замість pattern. |
includes[].ids | Масив точних collectible-кодів; його можна поєднати з value. |
includes[].exclude | Локальне виключення лише з конкретного include. |
includes[].kind | item, block або any. |
includes[].isRegex | Застаріла сумісність: переносить value у pattern. У нових файлах одразу використовуйте pattern. |
excludes | Regex, які вилучають збіги з усієї колекції. |
groups[].keyPattern / keyGroup | Regex і capture group, що згортають коди в один запис. |
groups[].entries | Явно задані групи — альтернатива keyPattern. Кожен запис має id, необов’язковий локалізований name і members. |
groups[].completion | any, all або count. |
groups[].count | Скільки різних частин потрібно для completion: "count"; значення обмежується фактичною кількістю частин. |
display.nameFrom | Пріоритет regex-патернів для назви та іконки запису. |
display.iconCycle | Чи циклічно показувати іконки членів, які пройшли nameFrom. |
credit.only | Regex-патерни, що залишають лише коди, здатні зарахувати прогрес. |
credit.exclude | Вилучає коди з прогресу після застосування only. |
part.keyPattern / keyGroup | Виділяє ключ окремої частини, за яким рахується унікальний прогрес. |
part.fallback | Ключ частини, якщо keyPattern не збігся; без нього використовується сирий код. |
filters[].id / name | Стабільний ID і локалізована назва списку швидкого фільтра. |
filters[].tags | Додатково показує знайдені options як клікабельні теги на картках. |
filters[].options[] | id, локалізована name та regex pattern кожного варіанта. |

