BlackHead1673
|
Дата: Пятница, 09.06.2023, 02:22:31 | Сообщение # 1 |
|
Сообщений: 18
Репутация: 0 [ +/- ]
|
|
Можете пожалуйста подсказать, как сделать проверку если между игроками есть препятствие ? Что-то пробовал/тыкал, но не натыкал
Код stock bool IsTargetInSightRange(int client, int target, float angle=90.0, float distance=0.0, bool heightcheck=true, bool negativeangle=false, bool OnlyPlayer=true) { if(angle > 360.0 || angle < 0.0) ThrowError("Angle Max : 360 & Min : 0. %d isn't proper angle.", angle); if(!IsValidClient(client)) ThrowError("Client is not Alive."); if(!IsValidClient(target)) ThrowError("Target is not Alive."); float clientpos[3], targetpos[3], anglevector[3], targetvector[3], resultangle, resultdistance; GetClientEyeAngles(client, anglevector); anglevector[0] = anglevector[2] = 0.0; GetAngleVectors(anglevector, anglevector, NULL_VECTOR, NULL_VECTOR); NormalizeVector(anglevector, anglevector); if(negativeangle) NegateVector(anglevector);
GetClientAbsOrigin(client, clientpos); GetClientAbsOrigin(target, targetpos); if(heightcheck && distance > 0) resultdistance = GetVectorDistance(clientpos, targetpos); clientpos[2] = targetpos[2] = 0.0; MakeVectorFromPoints(clientpos, targetpos, targetvector); NormalizeVector(targetvector, targetvector); resultangle = RadToDeg(ArcCosine(GetVectorDotProduct(targetvector, anglevector)));
if(resultangle <= angle/2) { if(distance > 0) { if(OnlyPlayer) { Handle tr = TR_TraceRayFilterEx(clientpos, targetpos, MASK_VISIBLE, RayType_Infinite, TRDontHitTarget, client); //PrintToChatAll("%d", TR_GetEntityIndex(tr)); if(0 < TR_GetEntityIndex(tr) < MaxClients) { delete tr; return true; } else { delete tr; return false; } } if(!heightcheck) resultdistance = GetVectorDistance(clientpos, targetpos); if(distance >= resultdistance) return true; else return false; } else return true; } else return false; } public bool TRDontHitTarget(int entity, int mask, any data) { if (entity == data) return false; return true; }
UPD*
Вроде решил/нашел Если вдруг кому нужно, то вот функция
Код stock bool ClientViews(int viewer,int target, float fMaxDistance=0.0, float fThreshold=0.73) { // Получить вид и целевое положение глаз float fViewPos[3]; GetClientEyePosition(viewer, fViewPos); float fViewAng[3]; GetClientEyeAngles(viewer, fViewAng); float fViewDir[3]; float fTargetPos[3]; GetClientEyePosition(target, fTargetPos); float fTargetDir[3]; float fDistance[3]; // Рассчитать направление взгляда fViewAng[0] = fViewAng[2] = 0.0; GetAngleVectors(fViewAng, fViewDir, NULL_VECTOR, NULL_VECTOR); // Рассчитайте расстояние до зрителя, чтобы узнать, видно ли его. fDistance[0] = fTargetPos[0]-fViewPos[0]; fDistance[1] = fTargetPos[1]-fViewPos[1]; fDistance[2] = 0.0; if (fMaxDistance != 0.0) { if (((fDistance[0]*fDistance[0])+(fDistance[1]*fDistance[1])) >= (fMaxDistance*fMaxDistance)) return false; } // Проверить скалярное произведение. Если он отрицательный, это означает, что зритель смотрит // назад к цели. NormalizeVector(fDistance, fTargetDir); if (GetVectorDotProduct(fViewDir, fTargetDir) < fThreshold) return false; // Теперь проверьте, нет ли препятствий между ними с помощью raycasting. Handle hTrace = TR_TraceRayFilterEx(fViewPos, fTargetPos, MASK_PLAYERSOLID_BRUSHONLY, RayType_EndPoint, ClientViewsFilter); if (TR_DidHit(hTrace)) { delete hTrace; return false; } delete hTrace; // Готово, видно return true; } public bool ClientViewsFilter(int Entity, int Mask, any Junk) { if (Entity >= 1 && Entity <= MaxClients) return false; return true; }
Сообщение отредактировал BlackHead1673 - Вторник, 13.06.2023, 19:28:41 |
|
| |