Баг высокоскоростной энтити

Версия Minecraft
1.7.10
1,193
31
182
Столкнулся с занятным багом.
Проверяю в онИмпакт энтити
Java:
if (this.worldObj.getBlock(par1.blockX, par1.blockY, par1.blockZ) != myyobainvisblock){
 this.setDead();
}
Ставлю скорость полета энтити 1F - 4F - все просто замечательно.
Ставим скорость больше 50F, пуля перестает пролетать сквозь myyobainvisblock, да вообще любой короче. Но если блоков нет (блок воздуха не считаем, энтити чудным образом через него пролетает :lmao) то энтити летит и делает все что хочет с первым попавшимся.
Однако, пуля летит в егеря ((c) Конь) уже начиная со скорости 4F. Хотя на сервере дамажит мобов правильно.
Ладно, пусть пуля летит куда хочет, сделаем ем пустой рендер и она перестанет быть видимой (ох уж эти костыли).
Однако, проблема с пролетанием через блоки очень огорчает. А скорость 4F ой как огорчает и не подходит...
Печально, кто нибудь сталкивался?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Так а нафига вообще пуля тогда, если она моментально достигает любой цели? Лишь непонятная нагрузка на сервер.
Делай рейтрейс лучше для такого.
Вот если бы она летела со скорость 4-5, то можно было бы ей сделать балистику и тд. А так бессмысленно.
 
1,193
31
182
Я не допер тогда как взять энтити которая пересекается со взглядом игрока, в чем и рофл
Да и вообще, можно например взять взгляд игрока, разделить его на 10 частей и каждому задать рандомное положение
 
1,193
31
182
За чо там единственный отвечает? В EntityRenderer это partialTickTime, частота обновления чи шо?
Как я понял этот код вычисляет то что лежит на векторе взгляда? Первый аргумент d0 - дистанция, второй аргумент - аргумент из самого метода.
this.mc.objectMouseOver = this.mc.renderViewEntity.rayTrace(d0, p_78473_1_);
Не понимаю что это? Интерполированная позиция вектора? Лично так я перевел комментарий)
Vec3 vec3 = this.mc.renderViewEntity.getPosition(p_78473_1_);
И еще, что делает это? Не в первый раз сталкиваюсь, но не совсем допираю
List list = this.mc.theWorld.getEntitiesWithinAABBExcludingEntity(this.mc.renderViewEntity, this.mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand((double)f1, (double)f1, (double)f1));
 
5,018
47
783
насчет последнего - судя по всему это лист всех боксов энтитей через которых проходит вектор
 
1,193
31
182
Редко (ниразу) работал с векторами.
При создании вектора убивает ВСЕХ энтитей которых касался вектор, за один раз. Хау ту фикс ит? Надо ж только одного
Про пакеты: надо передать пакет с энтити которого коснулся мой луч и дамагнуть его на сервере. Лол как его передать в пакете?
 
1,193
31
182
Код:
public void createDamageVec(float f)
     {
         if (this.mc.renderViewEntity != null)
            {
                if (this.mc.theWorld != null)
                {
                    this.mc.pointedEntity = null;
                    double d0 = 128D;
                    this.mc.objectMouseOver = this.mc.renderViewEntity.rayTrace(d0, f);
                    double d1 = d0;
                    Vec3 vec3 = this.mc.renderViewEntity.getPosition(f);
                    if (this.mc.objectMouseOver != null)
                    {
                        d1 = this.mc.objectMouseOver.hitVec.distanceTo(vec3);
                    }

                    Vec3 vec31 = this.mc.renderViewEntity.getLook(f);
                    Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
                    this.pointedEntity = null;
                    Vec3 vec33 = null;
                    float f1 = 1.0F;
                    List list = this.mc.theWorld.getEntitiesWithinAABBExcludingEntity(this.mc.renderViewEntity, this.mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand((double)f1, (double)f1, (double)f1));
                    double d2 = d1;

                    for (int i = 0; i < list.size(); ++i)
                    {
                        Entity entity = (Entity)list.get(i);

                        if (entity.canBeCollidedWith())
                        {
                            float f2 = entity.getCollisionBorderSize();
                            AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
                            MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);

                            if (axisalignedbb.isVecInside(vec3))
                            {
                                if (0.0D < d2 || d2 == 0.0D)
                                {
                                    this.pointedEntity = entity;
                                    vec33 = movingobjectposition == null ? vec3 : movingobjectposition.hitVec;
                                    d2 = 0.0D;
                                }
                            }
                            else if (movingobjectposition != null)
                            {
                                double d3 = vec3.distanceTo(movingobjectposition.hitVec);
                                
                                if (d3 < d2 || d2 == 0.0D)
                                {
                                    if (entity == this.mc.renderViewEntity.ridingEntity && !entity.canRiderInteract())
                                    {
                                        if (d2 == 0.0D)
                                        {
                                            this.pointedEntity = entity;
                                            vec33 = movingobjectposition.hitVec;
                                            System.out.println(d0);
                                            pointedEntity.setDead();
                                        }
                                    }
                                    else
                                    {
                                        this.pointedEntity = entity;
                                        vec33 = movingobjectposition.hitVec;
                                        pointedEntity.setDead();
                                        System.out.println(d3);
                                        d2 = d3;
                                    }
                                }
                            }
                        }
                    }

                    if (this.pointedEntity != null && (d2 < d1 || this.mc.objectMouseOver == null))
                    {
                        this.mc.objectMouseOver = new MovingObjectPosition(this.pointedEntity, vec33);

                        if (this.pointedEntity instanceof EntityLivingBase || this.pointedEntity instanceof EntityItemFrame)
                        {
                            this.mc.pointedEntity = this.pointedEntity;
                        }
                    }
                }
            }
     }
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
пример
Там правда, я вот щас заметил, лист энтити берется по aabb-кубу по радиусу, чутка неоптимально, ибо можно по повороту хотя бы по октантам было брать (в 8 раз меньше объема зазватывать крч)
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Там где getLook(1.0F) можно вместо единицы давать partialTick для точности, если он у тебя есть
Хотя лучше не давать, тк он может быть только на клиенте а тебе для норм хитскана надо на сервере вычислять, нукрч вон прямо как в ссылке

И ещё вместо distanceTo вроде есть же distanceToSqr, который корень не вычисляет, и его можно сравнивать с квадратом dist, ещё эффективнее, хех

Блэт, и проверку на инвиз(хотя тебе она наверн не нужна) надо в цикле делать и скипать ту энтити.
Сколько недоработок у себя же в гитхабе нашёл, капец
 
Последнее редактирование:
1,193
31
182
А це код интересно на какую версию? :lmao
Да и блин, мне пока пуля подойдет, я ж с векторами и райтрейсом нихрена не работал и даже не знаю какой метод что делает...
Меня только интересует, почему при скорости больше именно 50, пуля отказывается дамагать энтити сквозь блок
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Потому что все компьютерные вычисления - дискретны, и дискретность майнкрафта - 20 тиков в секунду.
Пуля не двигается с такой-то скоростью, а телепортируется на такое то расстояние 20 раз в секунду.
При больших скоростях она просто пропускает твой блок.

В коде стрел вообще идёт рейтрейс между предыдущей позицией и текущей, чтобы обойти эту проблему, так что он тебе по любому нужен)

P.S. Версия 1.10.2, но блин если у тебя маппинги не совпадают, то не думаю что они совсем поубирали те методы, дратути
 
1,193
31
182
Короче дошли руки это допилить. Энтити достаю в пакете через энтити айди.
Теперь не могу понять по методам, мб кто нибудь разберет?
entity.canBeCollidedWith() шо за метод? коллизия с чем собсна?
axisalignedbb.isVecInside(vec3) чо это? не понимаю
и да кстати, renderViewEntity это тот который смотрит или это тот на которого попал луч вектора взгляда?
MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); это тоже не допираю
Как можно удалить вектор?
 

CumingSoon

Местный стендапер
1,634
12
269
Ну почитай, что такое ААББ, векторы и представь, как это выглядит.
Я не знаю, но думаю, что:
1) isVecInside - либо проверяет точку внутри аабб, либо проверяет пересечение коробки прямой, построенной на векторе. Скорее всего второе
2) canBeCollidedWith - ну это условие, да? Пользователь может установить false, тогда проверка на коллизию не будет работать.
3) calculateIntercept - выдает данные о пересечении вектора и коробки. Только не ясно, почему параметра два
Ну как-то так
 
1,193
31
182
ААББ, векторы и представь, как это выглядит
аабб это коллизия вроде, бокс у энтитей (хзхз), ну а вектор это матан, не трудно
по моим знаниям английского, первое вроде проверяет нахождение вектора внутри бокса, тип пересекает ли внутренности бокса
2 вроде у энтити настраивается, если энтити без коллизии то и дамажить его не будет
а вот с 3 я озадачен
 
Сверху