Я делаю client only мод.
Изначально мне требовалось что-то вроде событий приобретения sprint'a, его потери, на прыжок игрока, взбирание (есть же такое слово?) по лестнице и т.п.
Сейчас мне еще нужно кардинально изменить логику движения в игре. Пример: в майнкрате при беге с прыжком, игрок перемещается быстрее, чем при обычном беге. Как можно убрать это?
Это всего лишь пример (возможно мне это не надо), - там есть много логики, которую я хотел бы изменить или убрать, а кроме того еще добавить свою логику.
Я решил полностью переписать update игрока.
Я это делаю так:
ОК, теперь игрок не двигается, осталось всё написать с нуля. Однако я столкнулся с проблемами:
(я не нашёл, кто еще использует оригинальные поля, кроме оригинального update, который я как раз "заменил")
В конце кода оказалось очень много (искать в нем баги было бы нереально). Всё вроде работало, но было пара багов:
(оригинальные в классе EntityLivingBase)
А также в переменных, того же класса, работу с которыми я просто убрал, т.к. не нашел, где их значение используется
(нашел только присваивание, либо использование значения одной переменной, при присвоении значения другой)
Собственно, может кто решал подобную проблему и может подсказать, или знает, где найти хороший пример.
Благодарю заранее.
Upd.:
Иерархия вызова
Из-за указанных в иерархии моментов, анимация использования предмета происходит во много раз быстрее.
Как это исправить?
Изначально мне требовалось что-то вроде событий приобретения sprint'a, его потери, на прыжок игрока, взбирание (есть же такое слово?) по лестнице и т.п.
Сейчас мне еще нужно кардинально изменить логику движения в игре. Пример: в майнкрате при беге с прыжком, игрок перемещается быстрее, чем при обычном беге. Как можно убрать это?
Это всего лишь пример (возможно мне это не надо), - там есть много логики, которую я хотел бы изменить или убрать, а кроме того еще добавить свою логику.
Я решил полностью переписать update игрока.
Я это делаю так:
Код:
@SubscribeEvent
public void onLivingUpdate(LivingUpdateEvent event) {
//проверяем, если событие вызвано для игрока на клиенте
if(event.entityLiving instanceof EntityClientPlayerMP){
event.setCanceled(true);
//тут надо сделать всё по-своему
}
}
ОК, теперь игрок не двигается, осталось всё написать с нуля. Однако я столкнулся с проблемами:
- Мне НЕ надо переделывать логику вращения игрока (я не прочь просто скопировать оригинальную, но в силу вступает вторая проблема)
- У меня нет доступа ко многим переменным игрока и его суперклассов, которые используются в оригинальном коде
(я не нашёл, кто еще использует оригинальные поля, кроме оригинального update, который я как раз "заменил")
В конце кода оказалось очень много (искать в нем баги было бы нереально). Всё вроде работало, но было пара багов:
- Игрок сам вращал головой со скоростью света (непрерывно), но только от третьего лица, - от первого ничего такого заметно не было (как если бы голова была под контролем)
- При повороте, если смотреть от третьего лица, видно, что тело (не голова) не вращалось вообще (можно было бегать со спринтом, когда от третьего лица игрок двигался спиной вперед).
- Чем дальше я отходил от начальной позиции (на которой заспавнился на сервере или в одиночке), тем сильнее дрожало небо (прям дергалось очень быстро)
(оригинальные в классе EntityLivingBase)
Код:
randomYawVelocity
newPosRotationIncrements
newPosX
newPosY
newPosZ
newRotationYaw
newRotationPitch
А также в переменных, того же класса, работу с которыми я просто убрал, т.к. не нашел, где их значение используется
(нашел только присваивание, либо использование значения одной переменной, при присвоении значения другой)
Код:
field_70768_au
field_110154_aX
field_70764_aw
Собственно, может кто решал подобную проблему и может подсказать, или знает, где найти хороший пример.
Благодарю заранее.
Upd.:
Иерархия вызова
Код:
onLivingUpdate() : void - net.minecraft.entity.EntityLivingBase
onLivingUpdate() : void - net.minecraft.entity.player.EntityPlayer
onLivingUpdate() : void - net.minecraft.client.entity.EntityPlayerSP
onUpdate() : void - net.minecraft.entity.EntityLivingBase <- я отменяю это и всё, что он вызывает (выше)
onUpdate() : void - net.minecraft.entity.player.EntityPlayer <- тут часть логики использования предмета
onUpdate() : void - net.minecraft.client.entity.EntityClientPlayerMP
Как это исправить?