Спавн частиц

Спавн частиц

7,099
324
1,509
hohserg1 добавил(а) новый ресурс:

Спавн частиц на сервере - Вспомогательный метод, позволяющий спаунить частицы со стороны сервера, чтобы было видно на клиенте

На некоторых старых версиях, например, 1.7.10 спавнить частицы можно только на клиенте.
Небольшой метод, приведенный ниже, позволяет решить эту проблему

Java:
public void spawnParticle(World world, String particleType, float x, float y, float z, float velX, float velY, float velZ, float dispersion, int count) {
    if (!world.isRemote) {
        S2APacketParticles spacketparticles = new S2APacketParticles(particleType, x, y, z, velX, velY, velZ, dispersion, count)...

Узнать больше об этом ресурсе...
 
145
7
31
Партиклы на сервере можно спавнить через WorldServer#func_147487_a, в EntityFishHook спавнятся так
 
7,099
324
1,509
1,417
44
594
Лучше упомянуть для наивных, что много частиц таким образом лучше не спавнить. Если требуется какую-то структуру из частиц сделать (Например сферу), не надо отправлять пакет на каждую частицу. Достаточно 1 пакета на каждый клиент в радиусе, чтобы он сам спавнил их самостоятельно. Думаю причина очевидна.

1586674820352.png
Ну и пример того, чего нельзя делать отправкой пакетов на каждый партикл
 
7,099
324
1,509
А хайпиксель делает и ничего)
 
7,099
324
1,509
@tox1cozZ, да, но ведь клиент ванильный, он не поддерживает группы частиц, сгруппированных всякими спиралями, сферами и другими сложными фигурами. Хотя он в принципе поддерживает спавн множества частиц от одного пакета, но там логика жестко задана, можно только рандомные облака частиц спаунить: NetHandlerPlayClient#handleParticles

@GoogleTan, неа, не ловил. Хотя можно попробовать для интереса
 

sk9zist :l

Исправился
981
18
157
Не думаю, что сложно:
Класс:
public void func_147487_a(String p_147487_1_, double p_147487_2_, double p_147487_4_, double p_147487_6_,
        int p_147487_8_, double p_147487_9_, double p_147487_11_, double p_147487_13_, double p_147487_15_) {
    S2APacketParticles s2apacketparticles = new S2APacketParticles(p_147487_1_, (float) p_147487_2_,
            (float) p_147487_4_, (float) p_147487_6_, (float) p_147487_9_, (float) p_147487_11_,
            (float) p_147487_13_, (float) p_147487_15_, p_147487_8_);

    for (int j = 0; j < this.playerEntities.size(); ++j) {
        EntityPlayerMP entityplayermp = (EntityPlayerMP) this.playerEntities.get(j);
        ChunkCoordinates chunkcoordinates = entityplayermp.getPlayerCoordinates();
        double d7 = p_147487_2_ - (double) chunkcoordinates.posX;
        double d8 = p_147487_4_ - (double) chunkcoordinates.posY;
        double d9 = p_147487_6_ - (double) chunkcoordinates.posZ;
        double d10 = d7 * d7 + d8 * d8 + d9 * d9;

        if (d10 <= 256.0D) {
            entityplayermp.playerNetServerHandler.sendPacket(s2apacketparticles);
        }
    }
}
Не очень то и много полезного, делает этот метод.

NetHandlerPlayClient#handleParticles
Java:
public void handleParticles(S2APacketParticles p_147289_1_)
{
    if (p_147289_1_.func_149222_k() == 0)
    {
        double var2 = (double)(p_147289_1_.func_149227_j() * p_147289_1_.func_149221_g());
        double var4 = (double)(p_147289_1_.func_149227_j() * p_147289_1_.func_149224_h());
        double var6 = (double)(p_147289_1_.func_149227_j() * p_147289_1_.func_149223_i());
        this.clientWorldController.spawnParticle(p_147289_1_.func_149228_c(), p_147289_1_.func_149220_d(), p_147289_1_.func_149226_e(), p_147289_1_.func_149225_f(), var2, var4, var6);
    }
    else
    {
        for (int var15 = 0; var15 < p_147289_1_.func_149222_k(); ++var15)
        {
            double var3 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149221_g();
            double var5 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149224_h();
            double var7 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149223_i();
            double var9 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149227_j();
            double var11 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149227_j();
            double var13 = this.avRandomizer.nextGaussian() * (double)p_147289_1_.func_149227_j();
            this.clientWorldController.spawnParticle(p_147289_1_.func_149228_c(), p_147289_1_.func_149220_d() + var3, p_147289_1_.func_149226_e() + var5, p_147289_1_.func_149225_f() + var7, var9, var11, var13);
        }
    }
}

@hohserg1 когда будет обновление поста, с этой самой оптимизацией?
 
Последнее редактирование:
7,099
324
1,509
Не думаю, что сложно:
Конечно не сложно, если знать про него, эффект знания задним числом. Сей слив можно было формить в виде тутора о юзе одного уже существующего метода, но выглядеть это будет не солидно
когда будет обновление поста, с этой самой оптимизацией?
Я чтоли обещал, что оно будет? Это @Tenebrius нафантазировал)
Не знаю, когда будет и будет ли. Скорее всего когда мне придется решать задачу о частицах в каком-нить своем моде
 

sk9zist :l

Исправился
981
18
157
1,417
44
594
Я это не к туториалу адресовал, а к пункту p.s.
Если тебе надо спавнить мене, чем десяток партиклей, то что париться?

Всю информацию дал. Берем, пишем пару строк кода, запускаем их на клиенте, как я говорил, по триггеру-пакету с сервера. Profit.

Туториал трогать не надо
 
Сверху