Странное поведение частиц при спавне

Версия Minecraft
1.11.2
1,015
9
102
Всем примет, седня решил сделать спавн частиц около игрока. Всё вроде бы правильно сделал, но почему-то частицы спавнятся не на той позиции, что я указываю, но зато к ней летят, т.е. сходятся в одной точке из определенной стороны. Выглядит это примерно так:
2db02d09ca591fc93b7be67dc1bed83b-full.png

ab4ff190cb4fd1bfd956eff0fa05d432-full.png
Вот код пакета, где происходит спавн частиц:
Код:
public class PacketSpawnParticle extends AbstractPacket<PacketSpawnParticle> {
    protected int type;
    protected float x;
    protected float y;
    protected float z;
    protected float xSpeed;
    protected float ySpeed;
    protected float zSpeed;
    protected int count;
    protected float randomXPos;
    protected float randomXMotion;
    protected float randomYPos;
    protected float randomYMotion;
    protected float randomZPos;
    protected float randomZMotion;

    public PacketSpawnParticle(){}

    public PacketSpawnParticle(int type, float x, float y, float z, float xSpeed, float ySpeed, float zSpeed, int count){
        this(type, x, y, z, xSpeed, ySpeed, zSpeed, count, 0, 0);
    }

    public PacketSpawnParticle(int type, float x, float y, float z, float xSpeed, float ySpeed, float zSpeed, int count, float randomPos, float randomMotion){
        this(type, x, y, z, xSpeed, ySpeed, zSpeed, count, randomPos, randomPos, randomPos, randomMotion, randomMotion, randomMotion);
    }

    public PacketSpawnParticle(int type, float x, float y, float z, float xSpeed, float ySpeed, float zSpeed, int count, float randomXPos, float randomXMotion, float randomYPos, float randomYMotion, float randomZPos, float randomZMotion) {
        this.type = type;
        this.x = x;
        this.y = y;
        this.z = z;
        this.xSpeed = xSpeed;
        this.ySpeed = ySpeed;
        this.zSpeed = zSpeed;
        this.count = count;
        this.randomXPos = randomXPos;
        this.randomXMotion = randomXMotion;
        this.randomYPos = randomYPos;
        this.randomYMotion = randomYMotion;
        this.randomZPos = randomZPos;
        this.randomZMotion = randomZMotion;
    }


    @Override
    public void toBytes(final ByteBuf buf) {
        buf.writeInt(type);
        buf.writeInt(count);
        buf.writeFloat(x);
        buf.writeFloat(y);
        buf.writeFloat(z);
        buf.writeFloat(xSpeed);
        buf.writeFloat(ySpeed);
        buf.writeFloat(zSpeed);
        buf.writeFloat(randomXPos);
        buf.writeFloat(randomYPos);
        buf.writeFloat(randomZPos);
        buf.writeFloat(randomXMotion);
        buf.writeFloat(randomYMotion);
        buf.writeFloat(randomZMotion);
    }

    @Override
    public void fromBytes(final ByteBuf buf) {
        type = buf.readInt();
        count = buf.readInt();
        x = buf.readFloat();
        y = buf.readFloat();
        z = buf.readFloat();
        xSpeed = buf.readFloat();
        ySpeed = buf.readFloat();
        zSpeed = buf.readFloat();
        randomXPos = buf.readFloat();
        randomYPos = buf.readFloat();
        randomZPos = buf.readFloat();
        randomXMotion = buf.readFloat();
        randomYMotion = buf.readFloat();
        randomZMotion = buf.readFloat();
    }

    @Override
    public void handleClientSide(PacketSpawnParticle message, EntityPlayer player) {
        for (int i = 0; i < message.count; i++) {
            float xRandPos = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomXPos;
            float yRandPos = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomYPos;
            float zRandPos = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomZPos;
            float xRandMotion = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomXMotion;
            float yRandMotion = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomYMotion;
            float zRandMotion = (ModUtils.random.nextInt(2) == 0 ? -1 : 1) * ModUtils.random.nextFloat() * message.randomZMotion;

            player.world.spawnParticle(
                    EnumParticleTypes.getParticleFromId(message.type),
                    message.x + xRandPos,
                    message.y + yRandPos,
                    message.z + zRandPos,
                    message.xSpeed + xRandMotion,
                    message.ySpeed + yRandMotion,
                    message.zSpeed + zRandMotion
            );
        }
    }

    @Override
    public void handleServerSide(PacketSpawnParticle message, EntityPlayer player) {
    }
}
Вот так пакет отправляется:
Код:
 Vec3d particlePos = args.player.getPositionEyes(Minecraft.getMinecraft().getRenderPartialTicks());               
NetworkHandler.sendToAll(new PacketSpawnParticle(EnumParticleTypes.PORTAL.getParticleID(), (float)particlePos.xCoord, (float)particlePos.yCoord, (float)particlePos.zCoord, 0.5f, 0.5f, 0.5f, 100, 0.2f,2f));

Как сделать так, что бы они спавнились со всех сторон игрока и улетали от него?
 
Agravaine написал(а):
А как у тебя вообще работает пакет, если ты с клиента всем игрокам его отправляешь?

С чего ты взял, что отправляется с клиента? С сервера всё отсылается, а клиент обрабатывает
 
Ivasik написал(а):
В начале sendToServer, в хандлереСервер sendToAllAround(Зачем всем посылать, ведь они и так не увидят их?) и потом только твой пакет. Мою тему почитай.

Окей, sendToAllAround надо использовать, да, но зачем отсылать пакет вначале серверу? У меня и так метод только с серверной части обрабатывается. Скорее всего это проблема не с пакетами
 
Minebot написал(а):
Ivasik написал(а):
В начале sendToServer, в хандлереСервер sendToAllAround(Зачем всем посылать, ведь они и так не увидят их?) и потом только твой пакет. Мою тему почитай.

Окей, sendToAllAround надо использовать, да, но зачем отсылать пакет вначале серверу? У меня и так метод только с серверной части обрабатывается

Алё, ты должен получить позицию игрока с сервера, а потом передать клиентам.
 
Ivasik написал(а):
Minebot написал(а):
Ivasik написал(а):
В начале sendToServer, в хандлереСервер sendToAllAround(Зачем всем посылать, ведь они и так не увидят их?) и потом только твой пакет. Мою тему почитай.

Окей, sendToAllAround надо использовать, да, но зачем отсылать пакет вначале серверу? У меня и так метод только с серверной части обрабатывается

Алё, ты должен получить позицию игрока с сервера, а потом передать клиентам.

Я и так передаю координаты игрока с сервера на клиент :-/  В args, переменная player с сервера, да и сам поток с сервера


Оказывается у каждого вида частиц свои особенности. Та, которая у меня, по стандарту оффсетается в определенную сторону и двигается туда, где её заспавнили. Так что оказывается надо было только поменять тип частиц
 
Oldestkon написал(а):
А ты попробуй запустить игру не в режиме интегрированного клиент-сервера.

Ёёёёёё, весь мод разошелся по швам. Там у меня пол классов не присутствуют на сервере. Пойду все чинить и плакать в подушку  :)
 
Назад
Сверху