Отображение Zeus Эффекта

TheZipa

Участник
Сообщения
45
Реакции
7
Привет. Написал небольшой плагин с трассерами пуль и проблема в том, что электрические (zeus) трассера у меня отображаются не совсем корректно. Иногда они отображаются, а иногда нет и я не совсем понимаю, в чём может быть проблема. Логику Zeus трассеров я подсмотрел здесь.
 

TheZipa

Участник
Сообщения
45
Реакции
7
Проблема происходит где-то в этих строчках кода. Я дебажил как мог и вызов отрисовки трассеров (TE_DispatchEffect) происходит корректно как и должно быть, но почему-то иногда они не отображаются, может ли это быть баг движка или я где-то недосмотрел? Другие плагины не конфликтуют, я выключил все, но баг остался.

Hook Event Bullet Impact:
float fEndPos[3], fPercentage;
 
    fEndPos[0] = GetEventFloat(hEvent, "x");
    fEndPos[1] = GetEventFloat(hEvent, "y");
    fEndPos[2] = GetEventFloat(hEvent, "z");
 
    if(g_bIsLighting[iClient])
    {
        float fMuzzlePos[3], fCameraPos[3];
        GetWeaponAttachmentPosition(iClient, "muzzle_flash", fMuzzlePos);
        GetWeaponAttachmentPosition(iClient, "camera_buymenu", fCameraPos);
     
        //Create an offset for first person
        float fPovPos[3];
        fPovPos[0] = fMuzzlePos[0] - fCameraPos[0];
        fPovPos[1] = fMuzzlePos[1] - fCameraPos[1];
        fPovPos[2] = fMuzzlePos[2] - fCameraPos[2] + 0.1;
        ScaleVector(fPovPos, 0.4);
        SubtractVectors(fMuzzlePos, fPovPos, fPovPos);
     
        //Move the beam a bit forward so it isn't too close for first person
        float fDistance = GetVectorDistance(fPovPos, fEndPos);
        fPercentage = 0.2 / (fDistance / 100);
        fPovPos[0] = fPovPos[0] + ((fEndPos[0] - fPovPos[0]) * fPercentage);
        fPovPos[1] = fPovPos[1] + ((fEndPos[1] - fPovPos[1]) * fPercentage);
        fPovPos[2] = fPovPos[2] + ((fEndPos[2] - fPovPos[2]) * fPercentage);
     
        //Display the particle to first person
        TE_DispatchEffect(TASER, fPovPos, fEndPos, g_fLastAngles[iClient]);
        TE_SendToClient(iClient);
     
        //Display the particle to everyone else under the normal position
        TE_DispatchEffect(TASER, fMuzzlePos, fEndPos, g_fLastAngles[iClient]);
        int[] iClients = new int[MaxClients];
        int iClientCount;
        for (int i = 1; i <= MaxClients; i++)
        {
            if (!IsClientInGame(i) || i == iClient || IsFakeClient(i))
                continue;
            iClients[iClientCount++] = i;
        }
        TE_Send(iClients, iClientCount);
        // TE_SendToAll() ошибку не исправляет
         
        fEndPos[0] = fEndPos[0] + ((fPovPos[0] - fEndPos[0]) * fPercentage);
        fEndPos[1] = fEndPos[1] + ((fPovPos[1] - fEndPos[1]) * fPercentage);
        fEndPos[2] = fEndPos[2] + ((fPovPos[2] - fEndPos[2]) * fPercentage);
     
        TE_DispatchEffect(GLOW, fEndPos, fEndPos);
        TE_SendToAll();
    }

TE_DispatchEffect:
void TE_DispatchEffect(const char[] particle, const float pos[3], const float endpos[3], const float angles[3] = NULL_VECTOR)
{
    TE_Start("EffectDispatch");
    TE_WriteFloatArray("m_vStart.x", pos, 3);
    TE_WriteFloatArray("m_vOrigin.x", endpos, 3);
    TE_WriteVector("m_vAngles", angles);
    TE_WriteNum("m_nHitBox", GetParticleEffectIndex(particle));
    TE_WriteNum("m_iEffectName", GetEffectIndex("ParticleEffect"));
}
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Так, а проблема то в чем, Вы рабочий код скопировать не в состоянии?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
//Display the particle to first person TE_DispatchEffect(TASER, fPovPos, fEndPos, g_fLastAngles[iClient]); TE_SendToClient(iClient); //Display the particle to everyone else under the normal position TE_DispatchEffect(TASER, fMuzzlePos, fEndPos, g_fLastAngles[iClient]); int[] iClients = new int[MaxClients]; int iClientCount; for (int i = 1; i <= MaxClients; i++) { if (!IsClientInGame(i) || i == iClient || IsFakeClient(i)) continue; iClients[iClientCount++] = i; } TE_Send(iClients, iClientCount);

Вот объясни, для чего показывать отдельно игроку(TE_Send(iClients, iClientCount) и потом этой-же самой временной функцией, причём зачем-то в цикле!!! и то-же самое всем игрокам? В чем смысл? Я даже заинтересовался, такой бездарности я пока не встречал. Даже если предположить, что такое гавно каким то образом еще и работает, я совершенно не удивляюсь тому, что одна временная ф-я просто забивает другую на стадии отправки клиенту. Я вообще удивлен как это "творение" вообще работает? Ты когда этот код воровал, наверняка в исходнике цикл был предусмотрен для показа определенным игрокам, а ты так всё и оставил.
Почему нельзя просто сразу всем отправить(TE_SendToAll() )? Меня, конкретно этот момент заинтересовал.
Или уже так закопипастились друг у друга, что вообще смысл происходящего потеряли? Может быть я что-то упустил?
 

TheZipa

Участник
Сообщения
45
Реакции
7
Вот объясни, для чего показывать отдельно игроку(TE_Send(iClients, iClientCount) и потом этой-же самой временной функцией, причём зачем-то в цикле!!! и то-же самое всем игрокам? В чем смысл? Я даже заинтересовался, такой бездарности я пока не встречал. Даже если предположить, что такое гавно каким то образом еще и работает, я совершенно не удивляюсь тому, что одна временная ф-я просто забивает другую на стадии отправки клиенту. Я вообще удивлен как это "творение" вообще работает? Ты когда этот код воровал, наверняка в исходнике цикл был предусмотрен для показа определенным игрокам, а ты так всё и оставил.
Почему нельзя просто сразу всем отправить(TE_SendToAll() )? Меня, конкретно этот момент заинтересовал.
Или уже так закопипастились друг у друга, что вообще смысл происходящего потеряли? Может быть я что-то упустил?
Спокойнее. Это же не код ревью. Согласен, что TE_SendToAll() проще и я даже делал таким образом (смотри комментарий выше), но я всё же просто пытаюсь понять проблему и спрашиваю у подобных тебе гениев. В исходнике реализация абсолютно такая же и также в нём не было никаких отдельных проверок для определённых игроков (к слову, исходники также указаны выше).
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Я тебе и объясняю проблему. Ты отправляешь клиенту _TE, и тут же, эту же самую _TE снова отправляешь тому же самому клиенту.
Вот я и спрашиваю тебя - зачем? Зачем весь этот тупой код? Какая разница как в исходнике, ты сам-то думай.

Я про математику уже не говорю ничего, как по мне, прежде чем извлекать длину вектора, его нужно нормализовать, что-бы не было зависимостей и уже потом начинать действия с векторами.
 
Последнее редактирование:

TheZipa

Участник
Сообщения
45
Реакции
7
Я тебе и объясняю проблему. Ты отправляешь клиенту _TE, и тут же, эту же самую _TE снова отправляешь тому же самому клиенту.
Вот я и спрашиваю тебя - зачем? Зачем весь этот тупой код? Какая разница как в исходнике, ты сам-то думай.

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

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@TheZipa, это наш местный супер-чел, который решился помочь кому-то в кои то веки, чтобы травой и мхом не покрыться, либо утешить своё эго. Тут дело может быть в самом эффекте.
Ты отправляешь отдельно игроку, который стрелял, и всем (из другой позиции), его можешь даже и не слушать и, если удалил этот участок кода, обязательно верни на место.
P.S. Судя по всему, ты отдельно проверял через SendAll, и оно не помогло.

@tonline_kms65_1, images (1).jpeg
Сообщения автоматически склеены:

К слову, @Kruzya, скорость просмотра видео в районе 10кб/с, так и надо? 👁️
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@TheZipa, он тебе чушь говорит.
Если чушь, об'ясни в чём она заключается по твоему мнению. Давай поспорим, пока время есть, дома сижу-болею.
У меня опыта с эффектами поболее твоего, про остальных вообще молчу.
Если у тебя есть вариант, предложи человеку, зачем просто так писать?
Я свой вариант ему предложил, давай ты предложи, я оценю его.
 

TheZipa

Участник
Сообщения
45
Реакции
7
@TheZipa, это наш местный супер-чел, который решился помочь кому-то в кои то веки, чтобы травой и мхом не покрыться, либо утешить своё эго. Тут дело может быть в самом эффекте.
Ты отправляешь отдельно игроку, который стрелял, и всем (из другой позиции), его можешь даже и не слушать и, если удалил этот участок кода, обязательно верни на место.
P.S. Судя по всему, ты отдельно проверял через SendAll, и оно не помогло.

@tonline_kms65_1, Посмотреть вложение 87818
Сообщения автоматически склеены:

К слову, @Kruzya, скорость просмотра видео в районе 10кб/с, так и надо? 👁️
Всё хорошо, он местами прав. Главное, что вроде как получилось исправить баг, я просто отправляю эффекты клиентам 1 раз, вместо 2, пока что всё работает.

C++:
        TE_DispatchEffect(TASER, fPovPos, fEndPos, g_fLastAngles[iClient]);
        TE_SendToClient(iClient);

        TE_DispatchEffect(TASER, fMuzzlePos, fEndPos, g_fLastAngles[iClient]);
            
        fEndPos[0] = fEndPos[0] + ((fPovPos[0] - fEndPos[0]) * fPercentage);
        fEndPos[1] = fEndPos[1] + ((fPovPos[1] - fEndPos[1]) * fPercentage);
        fEndPos[2] = fEndPos[2] + ((fPovPos[2] - fEndPos[2]) * fPercentage);
        
        TE_DispatchEffect(GLOW, fEndPos, fEndPos);
        TE_SendToAll();
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@TheZipa, так в этом коде 2 раза ведь... Он на это и бубнел
 

TheZipa

Участник
Сообщения
45
Реакции
7
@TheZipa, так в этом коде 2 раза ведь... Он на это и бубнел
Не, я просто перед каждым TE_DispatchEffect отправлял клиенту, но нужно было просто отправить всем в конце 1 раз. Раньше вот так было:

C++:
        TE_DispatchEffect(TASER, fPovPos, fEndPos, g_fLastAngles[iClient]);
        TE_SendToClient(iClient);

        TE_DispatchEffect(TASER, fMuzzlePos, fEndPos, g_fLastAngles[iClient]);
        int[] iClients = new int[MaxClients];
        int iClientCount;
        for (int i = 1; i <= MaxClients; i++)
        {
            if (!IsClientInGame(i) || i == iClient || IsFakeClient(i))
                continue;
            iClients[iClientCount++] = i;
        }
        TE_Send(iClients, iClientCount); // Лишняя отправка клиентам
      
        fEndPos[0] = fEndPos[0] + ((fPovPos[0] - fEndPos[0]) * fPercentage);
        fEndPos[1] = fEndPos[1] + ((fPovPos[1] - fEndPos[1]) * fPercentage);
        fEndPos[2] = fEndPos[2] + ((fPovPos[2] - fEndPos[2]) * fPercentage);
  
        TE_DispatchEffect(GLOW, fEndPos, fEndPos);
        TE_SendToAll();
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@TheZipa,
Сами по себе партиклы это не спрайты, поэтому, если их отправлять всем, то они должны быть видны так же всем, независимо от направления.
Со спрайтами там ситуация сложнее, вот там можно использовать отрисовку спрайта игроку, бывает что от игрока спрайт не виден, это уже особенность движка.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
вроде как получилось исправить баг, я просто отправляю эффекты клиентам 1 раз, вместо 2, пока что всё работает.
а если закомментить TE_DispatchEffect(GLOW, fEndPos, fEndPos); то ничего не поменяется?
 

TheZipa

Участник
Сообщения
45
Реакции
7
Дело похоже не совсем в этом. Эффект всё ровно периодически пропадает.
 
Сверху Снизу