Привет! Видели такое сообщение при входе в мир?
Такие вы могли видеть при запуске мира с модами на чистом клиенте. Так же такое может отобразить мод после обновления.
Что же это значит? Игра не смогла найти такие объекты в игре, хотя в мире они присутствуют. Как результат — множество дыр с поломанной тенью. Дело в том, что игра заменяет отсутствующие блоки на воздух, но не обновляет тени.
Почему ошибка возникает? Скорее всего вы удалили или переименовали какой-то блок. И если с удалением понятно, то с переименованием стоит уточнить. Изменилось имя блока, то, что на английском, а значит для игры это уже другой блок. Следовательно нужно подсказать ей, что все блоки с именем блок1 никуда не делись, просто теперь они названы блок2.
Именно этим сегодня и займёмся.
Обработка handleMissingMappings
И снова нам нужно регистрировать очередной слушатель событий. Если честно, то эта операция очень и очень частая. К примеру Android. Есть слушатель клика, долгого клика, прикосновения (палец опущен, поднят), для поля текста есть слушатель изменения содержимого. Есть слушатели для списков, радиокнопок, диалоговых окон и, короче, вы поняли.
Наш слушатель в этот раз имеет такой вид.
1 2 3 4 |
@SubscribeEvent public void handleMissingMappings(RegistryEvent.MissingMappings evt) { } |
Кстати, я все забывал пояснить как они вообще работают. Думаю пора исправить это упущение. Думал упомянуть хуки в WordPress, в виде аналогии, но так только сильнее запутаю некоторых.
Эти слушатели событий, понятное дело, есть у разных модов. У некоторых есть все, у некоторых один-два, а может и вовсе их не быть. Но при этом во время выполнения определенных операций в игре происходят события, которые вызывают одни и те же обработчики в разных модах, что и позволяет организовать полноценную независимую работу различных модов.
К примеру, вход игрока на сервер — событие. И мы уже писали такой обработчик. Обнаружение отсутствующих блоков в игре — тоже событие, его обработаем сегодня. И таких еще много.
Так как у нас в моде на данный момент есть только Block и Item, то нам нужно написать для них обработчики.
Вы спросите: Но зачем?
Дело в том, что в прошлых уроках я создал блок sun_glass, но теперь моя идея получила корректировки и это имя мне не подходит. Я добавил новый блок moon_dust_glass, и я хочу, чтобы имена блоков соответствовали. Поэтому я повсеместно в коде меняю sun_glass на sun_dust_glass (не забудьте поменять имя переменной, та, что была записана капсом), а так же пишу проверку на отсутствие блоков и предметов.
Сейчас будет немного кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@SubscribeEvent public void handleMissingMappings(RegistryEvent.MissingMappings evt) { String type = evt.getName().toString(); switch (type) { case "minecraft:block": for (Object mapping : evt.getAllMappings()) { RegistryEvent.MissingMappings.Mapping trueMapping = (RegistryEvent.MissingMappings.Mapping) mapping; if (trueMapping.key.getNamespace().equals(MODID)) { switch (trueMapping.key.getPath()) { case "sun_glass": trueMapping.remap(ModBlocks.SUN_DUST_GLASS); break; } } } break; case "minecraft:item": for (Object mapping : evt.getAllMappings()) { RegistryEvent.MissingMappings.Mapping trueMapping = (RegistryEvent.MissingMappings.Mapping) mapping; if (trueMapping.key.getNamespace().equals(MODID)) { switch (trueMapping.key.getPath()) { case "sun_glass": trueMapping.remap(ModItems.SUN_DUST_GLASS); break; } } } } } |
Как видите, сначала мы определяем тип удаленных записей. Это может блок, предмет, сущность и т.д. В соответствующем случае получаем все записи, и сравнивая с MODID отбираем только те, которые относятся к нашему моду. В самом конце этих всех проверок получаем имя потерянного элемента и делаем remap (своего рода замена) на наш новый (или тот же, но переименованный) блок.
Надеюсь понятно. Тем, кто знает ЯП Java должно быть все предельно ясно.
Значит так. До этих всех изменений у меня был такой вот мир:
Ну, а теперь они выглядят так:
Они выглядят так, потому, что я ленивая жопа, и изменив имя в коде не добавил _dust больше нигде. Я о ресурсах, они там все еще для забытого sun_glass. Но так даже нагляднее вышло.
Итоги
На первый взгляд это может выглядеть необязательным знанием. Но если ваш мод получит развитие, то вы даже не представляете как за один год может все измениться. Говорю из личного опыта.
Если вы все правильно укажете, измените и исправите — то игрок может даже не заметить, что вы там внутри химичили. А самое главное, будет сохранена обратная совместимость и миры с вашим модом можно будет обновлять для получения нового контента без риска потерять старый.
Кстати, информацию по большей мере почерпнул все из того же мода с сахарным стеклом.