Куда смотрит игрок?

Статус
В этой теме нельзя размещать новые ответы.
7,099
324
1,510
Представим такую картину: игрок смотрит в пространство мира, по нажатию пкм надо, чтобы проверилось, проходит ли вектор взгляда игрока через возможно лежаший перед ним предмет, после выполнить некоторые действия. Как это сделать? Можно ли определить, выброшены ли предметы рядом с игроком? Заранее спасибо за помощь)
[merge_posts_bbcode]Добавлено: 08.04.2015 19:13:50[/merge_posts_bbcode]
 

timaxa007

Модератор
5,831
409
672
На что или на кого смотрит (переменная вроде клиентская):
Код:
MovingObjectPosition object = Minecraft.getMinecraft().objectMouseOver;
[Добавлено: 08.04.2015 14:20]
Дистанция на кого или на что смотрим около 4.5F.
[end]
На блок:
Код:
if (object.typeOfHit == MovingObjectType.BLOCK)
На Entity:
Код:
if (object.typeOfHit == MovingObjectType.ENTITY)
Ни на что (в воздух):
Код:
if (object.typeOfHit == MovingObjectType.MISS)
Есть одна проблема "objectMouseOver", не видит не выделяемые Entity (у которых нету коллизии). (А у EntityItem нету коллизии.)
Я вот переделал, для себя это:
Код:
net.minecraft.client.renderer.EntityRenderer
Метод "getMouseOver", но у меня работает не достаточно как надо, но вполне сойдёт на первое время.

Предметы рядом с игроком:
Код:
double pos_x = player.posX;//Позиция игрока по координаторам "x".
double pos_y = player.posY;//Позиция игрока по координаторам "y".
double pos_z = player.posZ;//Позиция игрока по координаторам "z".

double d0 = 5.0D;//Для кубического радиуса (для сферической я ещё не создовал).

AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(pos_x, pos_y, pos_z, (double)(pos_x + 1), (double)(pos_y + 1), (double)(pos_z + 1)).expand(d0, d0, d0);
List list = world.getEntitiesWithinAABB(Entity.class, axisalignedbb);
Iterator iterator = list.iterator();
Entity entity2;

while(iterator.hasNext()) {
entity2 = (Entity)iterator.next();

if (entity2 instanceof EntityItem) {

EntityItem item_entity2 = (EntityItem)entity2;
ItemStack is_entity2 = item_entity.getEntityItem();

}
}
[youtube]MPpm-luloGM[/youtube]
 
7,099
324
1,510
Супер, то что надо, пожалуй, это один из самых ценных советов, которые я тут получал) Будет здорово, если добавят в раздел учебник. timaxa007, огромное спасибо))
 
7,099
324
1,510
Опа, еще не тестировал, но подумал: если, например, предмет валяется еще и рядом, в пределах axisalignedbb, но не наведен на него взгляд, то его тоже уловит? а как определить, что игрок смотрит на один из предметов?
 
7,099
324
1,510
ну если лежит рядом другой предмет, а на него не наведен курсор...
 
7,099
324
1,510
не лучше математика: найду столкновение вектора взгляда с коордами предмета)
 

timaxa007

Модератор
5,831
409
672
hohserg,
1. Первая часть моего ответа связана на кого или на что смотрит, если при этом у него или у чего коллизия. У EntityItem нету коллизии. Затем я показал, что нужно создать свой метод используя:
timaxa007 написал(а):
net.minecraft.client.renderer.EntityRenderer

Метод "getMouseOver"...
На данный момент моя версия выглядит примерно так:
Код:
public static Minecraft mc = Minecraft.getMinecraft();

public static MovingObjectPosition getEntity(float fasc, boolean interact) {
    return getEntity(fasc, (double)mc.playerController.getBlockReachDistance(), interact);
}

public static MovingObjectPosition getEntity(float fasc, double dist, boolean interact) {
    if (mc.renderViewEntity != null && mc.theWorld != null) {

        Entity pointedEntity = null;
        double d0 = dist;
        MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, fasc);
        double d1 = d0;
        Vec3 vec3 = mc.renderViewEntity.getPosition(fasc);

        d0 = d1;

        if (objectMouseOver != null) {
            d1 = objectMouseOver.hitVec.distanceTo(vec3);
        }

        Vec3 vec31 = mc.renderViewEntity.getLook(fasc);
        Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
        pointedEntity = null;
        Vec3 vec33 = null;
        float f1 = 1.0F;
        List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, 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) {
                    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 == mc.renderViewEntity.ridingEntity && !entity.canRiderInteract()) {
                        if (d2 == 0.0D) {
                            pointedEntity = entity;
                            vec33 = movingobjectposition.hitVec;
                        }
                    } else {
                        pointedEntity = entity;
                        vec33 = movingobjectposition.hitVec;
                        d2 = d3;
                    }
                }
            }
            //}
        }

        return new MovingObjectPosition(pointedEntity, vec33);
    }
    return null;
}

Пример "getLook(0.5F, 7.0F, true)": 0.5F - не совсем понимаю за что оно отвечает. 7.0F - максимальная дистанция, true - пока-что не за что не отвечает, но будет для условия коллизии.

Она ещё не до конца переделана, но делает, то что мне надо.

[youtube]n9BBhiisDT8[/youtube]

2. Вторая часть сообщения было ответ на: "рядом лежащие предметы к игроку".
Agravaine написал(а):
У Тимахи немного не правильно метод написан.
Возможно, я не сильно задумывался о правильности написанного этого кода (так как он работал с Entity, а не с EntityPlayer).
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Как-то так:
Код:
public static Entity getMouseOver(float partialTicks, double distance, boolean canBeCollidedWith){
        Minecraft mc = Minecraft.getMinecraft();
        Entity pointedEntity = null;
        MovingObjectPosition rayTrace = null;

        if(mc.renderViewEntity != null){
            if(mc.theWorld != null){
                rayTrace = mc.renderViewEntity.rayTrace(distance, partialTicks);
                Vec3 positionVec = mc.renderViewEntity.getPosition(partialTicks);
                double distanceToVec3 = distance;

                if(rayTrace != null){
                    distanceToVec3 = rayTrace.hitVec.distanceTo(positionVec);
                }

                Vec3 lookVec = mc.renderViewEntity.getLook(partialTicks);
                Vec3 posDistVec = positionVec.addVector(lookVec.xCoord * distance, lookVec.yCoord * distance, lookVec.zCoord * distance);
                Vec3 tempVec = null;
                double boxExpand = 1.0F;
                List<Entity> entities = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity.boundingBox.addCoord(lookVec.xCoord * distance, lookVec.yCoord * distance, lookVec.zCoord * distance).expand(boxExpand, boxExpand, boxExpand));
                double vecInsideDist = distanceToVec3;

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

                    if(!canBeCollidedWith || entity.canBeCollidedWith()){
                        double borderSize = entity.getCollisionBorderSize();
                        AxisAlignedBB expEntityBox = entity.boundingBox.expand(borderSize, borderSize, borderSize);
                        MovingObjectPosition calculateInterceptPos = expEntityBox.calculateIntercept(positionVec, posDistVec);

                        if(expEntityBox.isVecInside(positionVec)){
                            if(0.0D < vecInsideDist || vecInsideDist == 0.0D){
                                pointedEntity = entity;
                                tempVec = calculateInterceptPos == null ? positionVec : calculateInterceptPos.hitVec;
                                vecInsideDist = 0.0D;
                            }
                        }else if(calculateInterceptPos != null){
                            double calcInterceptPosDist = positionVec.distanceTo(calculateInterceptPos.hitVec);

                            if(calcInterceptPosDist < vecInsideDist || vecInsideDist == 0.0D){
                                if(entity == mc.renderViewEntity.ridingEntity && !entity.canRiderInteract()){
                                    if(vecInsideDist == 0.0D){
                                        pointedEntity = entity;
                                        tempVec = calculateInterceptPos.hitVec;
                                    }
                                }else{
                                    pointedEntity = entity;
                                    tempVec = calculateInterceptPos.hitVec;
                                    vecInsideDist = calcInterceptPosDist;
                                }
                            }
                        }
                    }
                }

                if(pointedEntity != null && (vecInsideDist < distanceToVec3 || rayTrace == null)){
                    return pointedEntity;
                }
            }
        }

        return null;
    }
[merge_posts_bbcode]Добавлено: 11.04.2015 00:30:50[/merge_posts_bbcode]

А partialTicks можно ставить на 1.0F и не парится.
 
7,099
324
1,510
А как сделать, чтобы без переделывания самого EntityRenderer? Мне чтобы можно было ставить мод на обычный майн с forge(1.7.10)
 
7,099
324
1,510
эмм, то есть можно и, допустим, в onRightCkick?
 
7,099
324
1,510
ну вот предмет, у него надо по методу onRigthCkick найти лежащие предметы, но при условии, что курсор наведен на какой-либо предмет.
 
1,683
1
Пишешь этот метод отдельно(надеюсь поймешь)
Потом в клике
if(getMouseOver(1f,distance,true) instanceof EntityItem){
Если смотришь на предмет
}
 
7,099
324
1,510
ага)
 
7,099
324
1,510
а нахрен? на сервер я отправлю только пакет с запущенным процессом.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху