TheZipa
Участник
- Сообщения
- 45
- Реакции
- 7
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();
}
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"));
}
Ошибка не на этапе компиляции. Я видео прикладывал выше, в чём заключается проблема.Так, а проблема то в чем, Вы рабочий код скопировать не в состоянии?
//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() проще и я даже делал таким образом (смотри комментарий выше), но я всё же просто пытаюсь понять проблему и спрашиваю у подобных тебе гениев. В исходнике реализация абсолютно такая же и также в нём не было никаких отдельных проверок для определённых игроков (к слову, исходники также указаны выше).Вот объясни, для чего показывать отдельно игроку(TE_Send(iClients, iClientCount) и потом этой-же самой временной функцией, причём зачем-то в цикле!!! и то-же самое всем игрокам? В чем смысл? Я даже заинтересовался, такой бездарности я пока не встречал. Даже если предположить, что такое гавно каким то образом еще и работает, я совершенно не удивляюсь тому, что одна временная ф-я просто забивает другую на стадии отправки клиенту. Я вообще удивлен как это "творение" вообще работает? Ты когда этот код воровал, наверняка в исходнике цикл был предусмотрен для показа определенным игрокам, а ты так всё и оставил.
Почему нельзя просто сразу всем отправить(TE_SendToAll() )? Меня, конкретно этот момент заинтересовал.
Или уже так закопипастились друг у друга, что вообще смысл происходящего потеряли? Может быть я что-то упустил?
Я не знал, что это так работает, нужно было сразу так и объяснить. Спасибо за помощь и критику.Я тебе и объясняю проблему. Ты отправляешь клиенту _TE, и тут же, эту же самую _TE снова отправляешь тому же самому клиенту.
Вот я и спрашиваю тебя - зачем? Зачем весь этот тупой код? Какая разница как в исходнике, ты сам-то думай.
Я про математику уже не говорю ничего, как по мне, прежде чем извлекать длину вектора, его нужно нормализовать, что-бы не было зависимостей и уже потом начинать действия с векторами.
Если чушь, об'ясни в чём она заключается по твоему мнению. Давай поспорим, пока время есть, дома сижу-болею.@TheZipa, он тебе чушь говорит.
Всё хорошо, он местами прав. Главное, что вроде как получилось исправить баг, я просто отправляю эффекты клиентам 1 раз, вместо 2, пока что всё работает.@TheZipa, это наш местный супер-чел, который решился помочь кому-то в кои то веки, чтобы травой и мхом не покрыться, либо утешить своё эго. Тут дело может быть в самом эффекте.
Ты отправляешь отдельно игроку, который стрелял, и всем (из другой позиции), его можешь даже и не слушать и, если удалил этот участок кода, обязательно верни на место.
P.S. Судя по всему, ты отдельно проверял через SendAll, и оно не помогло.
@tonline_kms65_1, Посмотреть вложение 87818
Сообщения автоматически склеены:
К слову, @Kruzya, скорость просмотра видео в районе 10кб/с, так и надо?![]()
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();
Не, я просто перед каждым TE_DispatchEffect отправлял клиенту, но нужно было просто отправить всем в конце 1 раз. Раньше вот так было:@TheZipa, так в этом коде 2 раза ведь... Он на это и бубнел
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();
Судя по этому оно тестировалось и так:Раньше вот так было:
// TE_SendToAll() ошибку не исправляет
а если закомментить TE_DispatchEffect(GLOW, fEndPos, fEndPos); то ничего не поменяется?вроде как получилось исправить баг, я просто отправляю эффекты клиентам 1 раз, вместо 2, пока что всё работает.
Эффект остался, но отображается иначеа если закомментить TE_DispatchEffect(GLOW, fEndPos, fEndPos); то ничего не поменяется?