[1.7.10]Прокачка игрока

156
0
Добрый вечер, форумчане. Собственно, хочу ввести в игру прокачку. Для этого использовал данный тутор http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/1571567-forge-1-6-4-1-8-eventhandler-and. Но я столкнулся с одной неприятной проблемой. Проверить кол-во свой маны я могу только в тех функциях, в аргументах которых присутствует переменная типа EntityPlayer, а если я пытаюсь это провернуть через Minecraft.getMinecraft().thePlayer, то игра крашится и выдает NullPointerException.
 
Туториал не смотрел, но скажу, что IEEP не синхронизируются с клиентом автоматически. Пакеты в помощь.
 
Dragon2488 написал(а):
Туториал не смотрел, но скажу, что IEEP не синхронизируются с клиентом автоматически. Пакеты в помощь.
А можно ссыль на тутор или какие-нибудь другие вспомогательные ресурсы?
 
Там вроде система пакетов с утечкой памяти.
Збс будет такую юзать каждый тик :)
 
Faik-man написал(а):
Но я столкнулся с одной неприятной проблемой. Проверить кол-во свой маны я могу только в тех функциях, в аргументах которых присутствует переменная типа EntityPlayer, а если я пытаюсь это провернуть через Minecraft.getMinecraft().thePlayer, то игра крашится и выдает NullPointerException.
ЕМНИП данные из IExtendedEntityProperties не синхронизируются сами, то есть если у тебя есть некая playerMana и на сервере она равна 200, то в клиенте, скорее всего, она равна 0. Тут есть 2 выхода:
  1. Написать синхронизацию : создать сетевой пакет со всеми дополнительными параметрами игрока и высылать его от сервера к клиенту раза 2 в секунду (можно и чаще, но нужно ли, реши сам). И повесить отправку этого пакета на серверное событие типа PlayerTickEvent.
  2. Вариант похуже : использовать DataWatcher (http://www.minecraftforge.net/wiki/Datawatcher). Он сам все синхронизирует, но помни о том, что чужие моды могут тоже попытаться занять твою ячейку в Watcher'е, и тогда будет плохо.
 
Agravaine написал(а):
Не надо слать пакеты каждую секунду, ВООБЩЕ НЕ НАДО.
Синхронизировать с клиентом нужно при изменении значения маны.
Если хочешь сделать по уму - тогда согласен. Если нет желания искать все места где твои параметры меняются и отправлять пакеты в каждом - то можно обойтись и отправкой по времени.

У меня есть параметры, которые меняются каждый тик, но синхронизирую я их 4 раза за секунду, больше игроку для отображения на экране не надо.
 
TaoGunner написал(а):
Если нет желания искать все места где твои параметры меняются и отправлять пакеты в каждом - то можно обойтись и отправкой по времени.
Так не надо говнокодить, лол.
Никто не мешает написать враппер, который будет хранить нужные переменные и отсылать апдейты при их изменении.
 
Нинада тут, можно сделать универсальный враппер, который сможет хранить кучу разных типов, автоматом их сериализовать\десериализовать и писать в поток, рассылать событие об изменении переменной (например, полезно при получении информации на клиенте, можно повесить кастомные хандлеры на определенные изменения). Плюс потом всю нужную информацию можно изи собрать в один пакет и отослать разом.
Это избавляет от бойлерплейта в виде сеттера на каждую новую переменную.
 
Agravaine написал(а):
По-моему так и работает DataWatcher или нет?
Да, но он несколько ущербный в плане хранения и менеджмента переменных.
Легче написать свой, меньше возни потом.
 
Назад
Сверху