Спавн частиц

Спавн частиц

5,547
186
1,040
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)...

Узнать больше об этом ресурсе...
 
144
7
31
Партиклы на сервере можно спавнить через WorldServer#func_147487_a, в EntityFishHook спавнятся так
 
5,547
186
1,040
5,547
186
1,040
1,407
44
307
Лучше упомянуть для наивных, что много частиц таким образом лучше не спавнить. Если требуется какую-то структуру из частиц сделать (Например сферу), не надо отправлять пакет на каждую частицу. Достаточно 1 пакета на каждый клиент в радиусе, чтобы он сам спавнил их самостоятельно. Думаю причина очевидна.

1586674820352.png
Ну и пример того, чего нельзя делать отправкой пакетов на каждый партикл
 
5,547
186
1,040
А хайпиксель делает и ничего)
 

tox1cozZ

aka Agravaine
Модератор
7,242
460
2,220
У них полностью своё ядро. Они там могут делать все что вздумается.
 
5,547
186
1,040
@tox1cozZ, да, но ведь клиент ванильный, он не поддерживает группы частиц, сгруппированных всякими спиралями, сферами и другими сложными фигурами. Хотя он в принципе поддерживает спавн множества частиц от одного пакета, но там логика жестко задана, можно только рандомные облака частиц спаунить: NetHandlerPlayClient#handleParticles

@GoogleTan, неа, не ловил. Хотя можно попробовать для интереса
 
1,407
44
307
Но мы же с вами пишем не плагины)
Т.к. у нас в распоряжении клиент и сервер сайд, то об оптимизации следует задуматься
 
484
3
47
Не думаю, что сложно:
Класс:
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 когда будет обновление поста, с этой самой оптимизацией?
 
Последнее редактирование:
5,547
186
1,040
Не думаю, что сложно:
Конечно не сложно, если знать про него, эффект знания задним числом. Сей слив можно было формить в виде тутора о юзе одного уже существующего метода, но выглядеть это будет не солидно
когда будет обновление поста, с этой самой оптимизацией?
Я чтоли обещал, что оно будет? Это @Tenebrius нафантазировал)
Не знаю, когда будет и будет ли. Скорее всего когда мне придется решать задачу о частицах в каком-нить своем моде
 
1,407
44
307
Я это не к туториалу адресовал, а к пункту p.s.
Если тебе надо спавнить мене, чем десяток партиклей, то что париться?

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

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