Найти место, куда смотрит игрок на сервере и еще вопросик.

2,955
12
Что бы найти куда смотрит игрок есть rayTrace, но он только клиентский. Можно как то по другому достать из игрока MovingObjectPosition?
Второй Вопрос. По каким осям нужно поворачивать энтити, что бы заставить её ходить по кругу вокруг другой энтити, в определенном радиусе?
 
1,990
18
105
Насчет второго: по оси Y. (если брать нормальную трехмерную систему координат, была бы ось Z, что смотрит вверх).
 
2,955
12
Не, мне нужно чтоб энтити ходила ко гругу вокруг другой энтити, и не могла никуда дальше уходить.
 
1,990
18
105
Что не-то?

Код:
float angle = 0F;
float circularVelocity = Math.PI/45F;  //4 degrees per tick
double radii = 5D;

public void update() {
    double targetX = targetEntity.posX + Math.cos(angle)*radii;
    double targetZ = targetEntity.posZ + Math.sin(angle)*radii;
    setTargetPoint(targetX, world.getTopBlockYLowerThan(targetEntity.posY+1, targetX, targetZ), targetZ);
    angle += circularVelocity;
}
Вот тебе псевдокод, функцию getTopBlockYLowerThan (принимает 3 параметра, 2 точки X\Z, из которых достается наибольшая позиция Y (при этом она обязана быть меньше значения 1 параметра, на которой находится твердый блок)), надеюсь, написать сам сможешь.
И это надо пихать в ИИ. В общем разбирайся, формулу для нахождения нужной точки в следующий момент времени я дал.
Можно ещё сделать, чтобы ИИ не менял целевую точку каждый тик, а раз в полсекунды\секунду, например.
 
2,955
12
В ии я это не пихну, так как мой мод чисто серверный, клиент о нем ничего не знает.
 
2,955
12
Мне это нужно сделать у определенных мобов определенного типа, не у своих мобов.
 
1,990
18
105
Отправил тебе в ЛС ссылку на чат, там легче будет обсудить.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Так работает везде.
 
2,955
12
У тебя херня, это знают все.
Анти, метод то работает, но откуда я возьму AABB и чем оно должно быть?
Я бы уже давно отправлял пакет на сервер, но мой мод не имеет клиентской части.
 
2,955
12
Все ребятки, нашел нужный мне метод в тауме, хорошенько распотрошив его.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
AABB взять..
А, я понял, мой метод тебе не совсем подходит, нуок.
 
2,955
12
Поделюсь, даже двумя.Первый метод. (Достает MovingObjectPositon из игрока) 
на то что все переменные varЧтоТо, не обращай внимание. [свист]
 public static MovingObjectPosition getTargetBlock(World world, Entity entity, boolean par3)
/* 393:    */   {
/* 394:459 */     float var4 = 1.0F;
/* 395:460 */     float var5 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * var4;
/* 396:461 */     float var6 = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * var4;
/* 397:462 */     double var7 = entity.prevPosX + (entity.posX - entity.prevPosX) * var4;
/* 398:463 */     double var9 = entity.prevPosY + (entity.posY - entity.prevPosY) * var4 + 1.62D - entity.yOffset;
/* 399:464 */     double var11 = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * var4;
/* 400:465 */     Vec3 var13 = world.getWorldVec3Pool().getVecFromPool(var7, var9, var11);
/* 401:466 */     float var14 = MathHelper.cos(-var6 * 0.01745329F - 3.141593F);
/* 402:467 */     float var15 = MathHelper.sin(-var6 * 0.01745329F - 3.141593F);
/* 403:468 */     float var16 = -MathHelper.cos(-var5 * 0.01745329F);
/* 404:469 */     float var17 = MathHelper.sin(-var5 * 0.01745329F);
/* 405:470 */     float var18 = var15 * var16;
                  float var20 = var14 * var16;
                  double var21 = 10.0D;
     Vec3 var23 = var13.addVector(var18 * var21, var17 * var21, var20 * var21);
    return world.rayTraceBlocks_do_do(var13, var23, par3, !par3);
 
771
5
Эм, у меня он уже давно был, просто никак не было возможности проверить на сервере =)

Код:
public static MovingObjectPosition getPlayerLookObject(EntityPlayer player){
        float f = 1.0F;
        float f1 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * f;
        float f2 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * f;
        double d = player.prevPosX + (player.posX - player.prevPosX) * (double)f;
        double d1 = (player.prevPosY + (player.posY - player.prevPosY) * (double)f + 1.6200000000000001D) - (double)player.yOffset;
        double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)f;
        Vec3 vec3d = Vec3.createVectorHelper(d, d1, d2);
        float f3 = MathHelper.cos(-f2 * 0.01745329F - 3.141593F);
        float f4 = MathHelper.sin(-f2 * 0.01745329F - 3.141593F);
        float f5 = -MathHelper.cos(-f1 * 0.01745329F);
        float f6 = MathHelper.sin(-f1 * 0.01745329F);
        float f7 = f4 * f5;
        float f8 = f6;
        float f9 = f3 * f5;
        double d3 = 5000D;
        Vec3 vec3d1 = vec3d.addVector((double)f7 * d3, (double)f8 * d3, (double)f9 * d3);
        return player.worldObj.func_147447_a(vec3d, vec3d1, false, true, false); //rayTraceBlocks_do_do
    }

И еще вот таких два:

Код:
public static ChunkPosition getPlayerLookingAtBlock(EntityPlayerMP player, float reach){
        Vec3 vec3d = Vec3.createVectorHelper(player.posX, (player.posY + 1.6200000000000001D) - player.yOffset, player.posZ);
        Vec3 vec3d1 = player.getLookVec();
        Vec3 vec3d2 = vec3d.addVector(vec3d1.xCoord * reach, vec3d1.yCoord * reach, vec3d1.zCoord * reach);
        MovingObjectPosition hit = player.worldObj.rayTraceBlocks(vec3d, vec3d2);
        if(hit == null || hit.typeOfHit != MovingObjectType.BLOCK){
            return null;
        }
        return new ChunkPosition(hit.blockX, hit.blockY, hit.blockZ);
    }

    public static Entity getPlayerLookingAtEntity(EntityPlayer player, float reach){
        Vec3 vec3d = Vec3.createVectorHelper(player.posX, (player.posY + 1.6200000000000001D) - player.yOffset, player.posZ);
        Vec3 vec3d1 = player.getLookVec();
        Vec3 vec3d2 = vec3d.addVector(vec3d1.xCoord * reach, vec3d1.yCoord * reach, vec3d1.zCoord * reach);
        MovingObjectPosition hit = player.worldObj.rayTraceBlocks(vec3d, vec3d2);
        if(hit == null || hit.typeOfHit != MovingObjectType.ENTITY){
            return null;
        }
        return hit.entityHit;
    }
 
2,955
12
Не робит последний, ибо как оказалось rayTrace не катит для энтити, только для блоков.
 
Сверху