Привет! На днях я сделал обзорчик на мод Fragile Glass and Thin Ice. Этот тот, где добавлено сахарное стекло, которое можно разбить собой, стрелой и все в этом роде. Еще лёд и бутафорский камень, но не суть.
Сразу же я увидел ссылку на исходный код этого мода. И предупреждаю! Воровать плохо. Код воровать тоже плохо. Но чужой код может быть источником новых знаний, новых идей или даже поможет вам самим перейти на качественно новый уровень коддинга. В эпоху opensource было бы глупо упускать все это. Единственное, если таки решили взять чей-то код прям куском, то желательно оставлять ссылку на автора, можно даже комментом в коде =) Будем уважать чужую работу!
Итак, приветствие…
Первым делом я открыл файлик FragileGlassBase.java, который является главным файлом данного мода. И размышляя, что же интересного по этому поводу написать я снова запустил мод и увидел сообщение об успешной загрузке мода, которое вывелось тогда, когда я вошел в мир. Идея! Почему бы не сделать урок о приветствии?
Вот, кстати, об этом я и говорил. Не воровство, идея! Ну да ладно…
Думаю вы уже не раз видели моды, которые что-то сообщали при загрузке в мир. Это может быть новая версия, приветствие или какая-либо полезная информация. Вот и мы сделаем подобное.
Переходим к коду
Поехали. Урок без номера, но я буду продолжать с проектом из уже существующих уроков, а потому не буду повторять то, что уже встречалось тут.
Когда игрок заходит в мир (сингл или мультиплеер, не важно), то срабатывает событие onPlayerLogin. Именно его нам и нужно определить.
Открываем главный файл мода, у меня это TutorialGSMod. Перед классом мы писали интерфейс @Mod, который сообщал Forge, что наш этот файл — основа мода. Теперь нам нужно дополнить былой код регистратором событий
1 |
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.<em>MOD</em>) |
И теперь мод должен выглядеть приблизительно так:
Далее нам нужно в конструкторе класса зарегистрировать наш класс для обработки событий.
Теперь переходим непосредственно к самому обработчику события.
В любом месте внутри класса добавляем новую функцию:
1 2 3 |
@SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { } |
Тут то и будет происходить вся магия.
Сначала мы получаем из события объект игрока.
1 |
PlayerEntity pe = event.getPlayer(); |
И если вы хотите просто вывести текст, то вот ваш код.
1 2 3 4 5 6 |
@SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { PlayerEntity pe = event.getPlayer(); ITextComponent msg = new StringTextComponent("Hi!"); pe.sendMessage(msg); } |
Теперь любой игрок будет получать Hi! при входе в игру или подключении серверу с этим модом.
Но если мы хотим получать разные сообщения для сингла и мультиплеера?
Для этого из PlayerEntity получаем сервер. Для справки, одиночная игра — тоже сервер, просто доступ к нему имеете только вы.
1 |
MinecraftServer ms = pe.world.getServer(); |
И теперь делаем проверку на синглу:
1 2 3 4 5 6 7 8 |
if (minecraftServer.isSinglePlayer()) { ITextComponent sp = new StringTextComponent("[TUTORMOD] Hello, friend!"); pe.sendMessage(sp); } else { ITextComponent mp = new StringTextComponent("[TUTORMOD] Hello, friends!"); pe.sendMessage(mp); } |
Мы создаём объекты класса ITextComponent, и именно они представляют сообщения для игрока. Им можно задать не только текст, а и его стиль.
Чтобы добавить нашему сообщению какой-либо цвет, нам нужно вызвать его функцию:
1 |
sp.applyTextStyle(TextFormatting.<em>RED</em>); |
И все, текст будет красного цвета!)
И еще локализация. Я люблю английский, но если игрок хочет русский, а я могу ему его дать, то почему нет?
Для вывода русского приветствия в нашем json файлике локализации (урок 7) пишем такое:
И вместо текста в коде мы пишем такую вот ссылку на него:
1 |
I18n.<em>format</em>("hello_msg") |
Завершение и результаты
И в завершение подскажу как сделать разноцветный текст. Ведь пока мы выводи строки только одного цвета. На деле нужно сделать все то же, но вместо одной строки задать несколько разных цветов и соединить их при помощи функции appendSibling.
Например так:
1 2 3 4 5 |
ITextComponent bA = new StringTextComponent(" - by Astler") .applyTextStyle(TextFormatting.YELLOW); ITextComponent SP_MSG = new StringTextComponent(I18n.format("hello_msg")) .applyTextStyle(TextFormatting.RED).appendSibling(bA); pe.sendMessage(SP_MSG); |
Запускаем и наслаждаемся результатом!
В конечном итоге разумный выбор цветов может помочь создать реально прикольные и красивые приветствия!
Хух, на этом все. Уметь бы еще все нормально пояснять :D. Ну, все еще будет. Спасибо за внимание!