Передвижение падающего блока

Версия Minecraft
1.7.10
API
Forge
52
1
2
Захотел я сделать такую штуку: что-то типа амулета, рядом с которым все падающие блоки начинают не падать, а взлетать (ну или что-то около того).
Я реализовал это вот таким способом:

Java:
public class ItemAntigravityCharm extends ItemMod {

    public ItemAntigravityCharm(String name) {
        super(name);
        this.setMaxStackSize(1);
    }

    @Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean inHand) {
        final List<Entity> targets = world.getEntitiesWithinAABB((Class) EntityFallingBlock.class,
                AxisAlignedBB
                        .getBoundingBox(entity.posX, entity.posY, entity.posZ, entity.posX, entity.posY, entity.posZ)
                        .expand(3, 3, 3));
        for (Entity target : targets) {
            EntityFallingBlock e = (EntityFallingBlock) target;
            if (e.motionY < 0.3499999940395355) {
                final Entity entity2 = e;
                entity2.motionY += 0.10000000149011612;
            }
            e.fallDistance = 0.0f;
        }
    }
}

Но движение немного дерганное.


Из-за чего происходит такое и как можно исправить?
 
Решение
Окей, объясню по-другому.
На сервере происходит спавн сущности, ей задается motion. Летит пакет на клиент, на клиенте спавнится сущность и ей задается motion. Далее сервер считает позицию сущности сам, а клиент сам. Раз в n тиков сервер посылается пакет клиенту с своими значениями и позицией, чтобы не было большого расхождения клиента с сервером. Из-за того что данные немного разные, когда прилетает пакет с сервера, у тебя дергается на клиенте из-за применения данных сервера.

Выкинь любой предмет на землю и последи за ним. Он лежит и не двигается, но раз в некоторое время можно увидеть рывок - это как раз момент синхронизации.
Хм... Ладно... Предположим решение тут уже есть, но нельзя ли это сделать без хуков? Не могли бы еще подсказать, из-за чего же все таки проблема. Ясно, что причина в синхронизации, но из-за чего она может возникать?
 
хукнуться в энтити и менять моушен, не давай действовать гравитации.
У меня тоже была похожая идея, как у ТС. Я хуком пытался заставить падающие блоки остановиться - в итоге не смог. Проблема таже, что и у ТС. Нельзя даже поставить motion на 0 или замедлить падение, все равно дергается. Падающие блоки это вообще тема отдельного разговора...
 
Чтобы не было рывков, нужно чтобы и на клиенте и на сервере был одинаковый motion. Тогда движения будут одинаковые и там и там. Сущности не интерполируются как игроки, поэтому и видны рывки.
 
"Падающие блоки это вообще тема отдельного разговора..."

Скорее проблема не в падающих блоках, а классе Entity. Он рендерится как-то криво. В какой-то момент при выводе значения motion в консоль начинаются дикие расходы в значениях между клиентом и сервером. Но раз в какой-то промежуток времени происходит какая-то жалкая попытка синхронизации motion. И эта синхронизация достаточно редкая, чтобы отчетливо увидеть рывки. Похожую проблему можно наблюдать у орбов в тауме, которые с мобов падают. Интересно, что у того же шарика опыта вообще все прекрасно...

"Чтобы не было рывков, нужно чтобы и на клиенте и на сервере был одинаковый motion. Тогда движения будут одинаковые и там и там. Сущности не интерполируются как игроки, поэтому и видны рывки."

Как это можно исправить? Или где посмотреть, как работает интерполяция? Я смотрел класс EntityLivingBase, так никаких новшеств, но работает, вроде, все просто чудесно.
 
Окей, объясню по-другому.
На сервере происходит спавн сущности, ей задается motion. Летит пакет на клиент, на клиенте спавнится сущность и ей задается motion. Далее сервер считает позицию сущности сам, а клиент сам. Раз в n тиков сервер посылается пакет клиенту с своими значениями и позицией, чтобы не было большого расхождения клиента с сервером. Из-за того что данные немного разные, когда прилетает пакет с сервера, у тебя дергается на клиенте из-за применения данных сервера.

Выкинь любой предмет на землю и последи за ним. Он лежит и не двигается, но раз в некоторое время можно увидеть рывок - это как раз момент синхронизации.
 
Хорошо. Благодаря ответам я порыскал что-то в исходниках майна и нашел, что с теми же шариками опыта майн отправляет пакеты клиентам при отображении частицы. Сделаю что-то похожее. Спасибо. Тему можно закрывать.
 
Назад
Сверху