File Details
toolsplus-fabric-1.0.2.1-b3+26.1.2.jar
- B
- Jun 7, 2026
- 38.22 KB
- 0
- 26.1.2
- Fabric
File Name
tools-mod-1.0.2.1-b3.jar
Supported Versions
- 26.1.2
Curse Maven Snippet
🇷🇺 Russian Version / Русская версия
📋 Ченджлог (Changelog) — v1.0.2.1-b3
Версия Fabric: 26.1.2 (Minecraft)
Добавлено [+]
-
HeldEffectListener.java— Новый слушатель событий. Срабатывает каждые 10 тиков, динамически накладывает или снимает эффекты в зависимости от удерживаемого предмета. -
HeadCommand.java— Новая команда/tools head <ник>для получения кастомных голов игроков. -
Новый синтаксис: Для команды
/tools headдобавлен необязательный аргумент количества предметов:/tools head <ник> [количество].
Изменено [*]
-
EffectCommand.java— Логика изменена: теперь данные об эффекте записываются напрямую вCustomDataпредмета (без указания фиксированной длительности). -
ToolsMod.java— Добавлена регистрация нового слушателяHeldEffectListener.
Удалено [-]
-
Удалены устаревшие и неиспользуемые компоненты:
PlayerFunction,FunctionCommand, а также связанные с ними миксины (Mixin).
📝 Дневник разработки (Dev Blog)
Переход на Fabric API 26.1.2 и борьба с ломающими изменениями
В процессе адаптации мода под новую бету Fabric (версия 26.1.2) мы столкнулись с рядом серьезных изменений в API игры, которые привели к ошибкам компиляции. Ниже описано, как именно решались эти проблемы.
1. Ограничение создания ItemStack до загрузки мира
В версии 26.1 объект ItemStack больше нельзя инициализировать до полной загрузки игрового мира.
-
Решение: Проблема решилась сама собой, так как наши команды выполняются внутри контекста уже запущенного мира, где все реестры и фабрики доступны.
2. Обновление NBT-контейнеров (CompoundTag)
Методы CompoundTag.getString() и CompoundTag.getInt() в текущем API больше не возвращают сырые значения напрямую — теперь они возвращают обёртки Optional.
-
Решение: Код
HeldEffectListenerбыл обновлен. Везде добавлены безопасные дефолтные значения через.orElse("")и.orElse(1).
3. Абстракция класса ResolvableProfile
Класс ResolvableProfile стал полностью абстрактным. Прямое создание инстанса через new теперь заблокировано, а публичный API для безопасной генерации профилей без ковыряния в исходниках игры отсутствует.
-
Решение: Вместо того чтобы городить хрупкие костыли через рефлексию, команда
/tools headбыла переписана на использование ванильной команды генерации сущностей через сервер:"give player minecraft:player_head[profile={name:\"Notch\"}] 1".Это стопроцентно надежный метод, который не сломается при последующих апдейтах Mojang. В качестве бонуса это позволило легко внедрить аргумент количества выдаваемых голов.
4. Миграция системы разрешений (PermissionSet)
При попытке повысить уровень прав источника команды через .withPermission(4) сборщик Gradle выдал ошибку: incompatible types: int cannot be converted to PermissionSet. В версии 26.1.2 старая целочисленная (int) система уровней оператора была заменена на объекты PermissionSet.
-
Решение: Тщательный аудит кода показал, что вызов
.withPermission()здесь был избыточен. Игрок уже проходит валидацию на этапе инициализации через.requires(source -> source.permissions().hasPermission(Permissions.COMMANDS_MODERATOR)). Этого уровня модератора (эквивалент OP 2) уже достаточно для выполнения внутренней команды/give. Вызов повышения прав до 4-го уровня был просто удален, что исправило ошибку компиляции.
🇺🇸 English Version / Английская версия
📋 Changelog — v1.0.2.1-b3
Fabric Version: 26.1.2 (Minecraft)
Added [+]
-
HeldEffectListener.java— New event listener. Ticks every 10 ticks to dynamically apply or remove status effects based on the currently held item. -
HeadCommand.java— New command/tools head <nickname>to obtain custom player heads. -
New Syntax: Added an optional item count argument to the head command:
/tools head <nickname> [amount].
Changed [*]
-
EffectCommand.java— Refactored to write effect data directly into the item'sCustomData, eliminating the need for a fixed duration value. -
ToolsMod.java— Added registration for the newHeldEffectListener.
Removed [-]
-
Removed deprecated and obsolete components:
PlayerFunction,FunctionCommand, and their associatedMixins.
📝 Developer Diary (Dev Blog)
Adapting to Fabric API 26.1.2 & Fighting Breaking Changes
While updating our mod to support the latest Fabric Beta (26.1.2), we encountered several breaking changes in the vanilla/Fabric API that caused compilation failures. Here is a breakdown of what broke and how we fixed it.
1. ItemStack Instantiation Restrictions
In version 26.1, ItemStack cannot be instantiated prior to world loading.
-
Resolution: This didn't cause actual issues for us, since our command execution context ensures the world is already loaded and registries are fully accessible.
2. NBT CompoundTag Updates
The CompoundTag.getString() and CompoundTag.getInt() methods in 26.1.2 now return an Optional instead of direct primitive values.
-
Resolution: Updated the code in
HeldEffectListenerto safely handle these values using.orElse("")and.orElse(1).
3. ResolvableProfile Abstractization
The ResolvableProfile class has been made abstract, meaning direct instantiation via new is now forbidden. Additionally, the public API for creating it without reading internal vanilla sources is missing.
-
Resolution: To prevent building fragile workarounds via reflection, we refactored
HeadCommandto execute a reliable native vanilla command through the server instead:"give player minecraft:player_head[profile={name:\"Notch\"}] 1".This approach is 100% stable and future-proof. As a bonus, it made it incredibly simple to implement the optional
[amount]argument.
4. Permission System Migration (PermissionSet)
When attempting to raise the command source permission level via .withPermission(4), the Gradle build failed with: incompatible types: int cannot be converted to PermissionSet. In 26.1.2, the old integer-based permission system has been replaced with PermissionSet objects.
-
Resolution: Upon reviewing the code, we realized that elevating permissions to level 4 was completely redundant. The player is already validated earlier via
.requires(source -> source.permissions().hasPermission(Permissions.COMMANDS_MODERATOR)). This moderator level (equivalent to OP level 2) provides sufficient privileges to execute/give. The explicit.withPermission()call was safely removed, resolving the compilation error.