Изменить управление и логику движения игрока на своё

Версия Minecraft
1.7.10
67
1
3
Я делаю client only мод.

Изначально мне требовалось что-то вроде событий приобретения sprint'a, его потери, на прыжок игрока, взбирание (есть же такое слово?) по лестнице и т.п.
Сейчас мне еще нужно кардинально изменить логику движения в игре. Пример: в майнкрате при беге с прыжком, игрок перемещается быстрее, чем при обычном беге. Как можно убрать это?
Это всего лишь пример (возможно мне это не надо), - там есть много логики, которую я хотел бы изменить или убрать, а кроме того еще добавить свою логику.
Я решил полностью переписать update игрока.
Я это делаю так:

Код:
@SubscribeEvent
public void onLivingUpdate(LivingUpdateEvent event) {
    //проверяем, если событие вызвано для игрока на клиенте
    if(event.entityLiving instanceof EntityClientPlayerMP){
        event.setCanceled(true);
        //тут надо сделать всё по-своему
    }
}


ОК, теперь игрок не двигается, осталось всё написать с нуля. Однако я столкнулся с проблемами:
  1. Мне НЕ надо переделывать логику вращения игрока (я не прочь просто скопировать оригинальную, но в силу вступает вторая проблема)
  2. У меня нет доступа ко многим переменным игрока и его суперклассов, которые используются в оригинальном коде
Я попробывал просто копировать всё из оригинала, а те поля, к которым у меня нет доступа, я просто продублировал у себя и обращался к ним 
(я не нашёл, кто еще использует оригинальные поля, кроме оригинального update, который я как раз "заменил")

В конце кода оказалось очень много (искать в нем баги было бы нереально). Всё вроде работало, но было пара багов: 
  1. Игрок сам вращал головой со скоростью света (непрерывно), но только от третьего лица, - от первого ничего такого заметно не было (как если бы голова была под контролем)
  2. При повороте, если смотреть от третьего лица, видно, что тело (не голова) не вращалось вообще (можно было бегать со спринтом, когда от третьего лица игрок двигался спиной вперед).
  3. Чем дальше я отходил от начальной позиции (на которой заспавнился на сервере или в одиночке), тем сильнее дрожало небо (прям дергалось очень быстро)
как я понял, проблема где-то в работе с переменными (которые я продублировал)
(оригинальные в классе 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
Из-за указанных в иерархии моментов, анимация использования предмета происходит во много раз быстрее.
Как это исправить?
 
Player API тебе в помощь.
Дает доступ к методам из EntityPlayerMP / EntityPlayer / EntityPlayerSP

Кстати, задавать скорость движения можно по нажатии кнопки, например (а не через тики).
Отменяешь нажатие кнопки через KeyBinding#setKeyBindState(keyCode, false) - это не даст майну запустить свои процессы.
И после этого устанавливаешь свою скорость / делаешь что тебе надо.


P.S. читать много в теме, а на время не богат )
 
Назад
Сверху