[РЕШЕНО] Пара новых вопросов! Уверен, кто-то точно шарит!

Svyatoy

Участник
Сообщения
335
Реакции
137
А я всё тут и снова здороваюсь с вами! Ах да, Привет!
Спасибо, что зашел почитать.
Естественно я искал сам, но видимо не нашел, поэтому и пишу сюда в надежде получить помощь
Короче:

Задача #1:
Нужно как-то проверить, что в определённом радиусе от игрока нет ничего. Т.е. на месте игрока мы можем спокойно создать цилиндр радиусом N и в него ничего не залезет от карты. Видел подобный функционал на некоторых JailBreak. Когда ставишь точку для игры LR - если круг упирается в стену или вроде того, то пишет "Что-то мешает поставить точку здесь"

Задача #2:
Также на Jail серваке увидел такую прикольную штуку (метку). Есть круг и вверх на определённую высоту из него вылетают искры по диагонали. Естественно они не статичные, а движутся.
Кстати вот фотка:
SP.jpg


Заранее большое спасибо за любую оказанную помощь!
 
Решение
Когда ставишь точку для игры LR - если круг упирается в стену или вроде того, то пишет "Что-то мешает поставить точку здесь"
Первый раз использую TraceHull, может что-то забыл. Проверяет "доступность" места, вроде работает.

C-подобный:
#include <sdktools_trace>
#include <sdktools_engine>
#include <sdktools_functions>

public void OnPluginStart(){
    RegConsoleCmd("sm_trace", CMD_CHECK);
}

Action CMD_CHECK(int iClient, int iArgs){

    float fStart[3], fAng[3];
    GetClientEyePosition(iClient, fStart);
    GetClientEyeAngles(iClient, fAng);
   
    TR_TraceRayFilter(fStart, fAng, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayer, iClient);

    if (TR_DidHit()){
        if(TR_GetEntityIndex() != 0){...

Banana

Участник
Сообщения
892
Реакции
113
А я всё тут и снова здороваюсь с вами! Ах да, Привет!
Спасибо, что зашел почитать.
Естественно я искал сам, но видимо не нашел, поэтому и пишу сюда в надежде получить помощь
Короче:

Задача #1:
Нужно как-то проверить, что в определённом радиусе от игрока нет ничего. Т.е. на месте игрока мы можем спокойно создать цилиндр радиусом N и в него ничего не залезет от карты. Видел подобный функционал на некоторых JailBreak. Когда ставишь точку для игры LR - если круг упирается в стену или вроде того, то пишет "Что-то мешает поставить точку здесь"

Задача #2:
Также на Jail серваке увидел такую прикольную штуку (метку). Есть круг и вверх на определённую высоту из него вылетают искры по диагонали. Естественно они не статичные, а движутся.
Кстати вот фотка:
Заранее большое спасибо за любую оказанную помощь!
1. для чего?
2. Скрин дай
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Когда ставишь точку для игры LR - если круг упирается в стену или вроде того, то пишет "Что-то мешает поставить точку здесь"
Первый раз использую TraceHull, может что-то забыл. Проверяет "доступность" места, вроде работает.

C-подобный:
#include <sdktools_trace>
#include <sdktools_engine>
#include <sdktools_functions>

public void OnPluginStart(){
    RegConsoleCmd("sm_trace", CMD_CHECK);
}

Action CMD_CHECK(int iClient, int iArgs){

    float fStart[3], fAng[3];
    GetClientEyePosition(iClient, fStart);
    GetClientEyeAngles(iClient, fAng);
   
    TR_TraceRayFilter(fStart, fAng, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayer, iClient);

    if (TR_DidHit()){
        if(TR_GetEntityIndex() != 0){
            PrintToChat(iClient, "На пути какая-то энтити.");
        }else{
            TR_GetEndPosition(fStart);
            TR_TraceHull(fStart, fStart, view_as<float>({-70.0, -70.0, 0.0}), view_as<float>({70.0, 70.0, 150.0}), MASK_SOLID);

            switch(TR_GetEntityIndex()){
                case -1:{
                    PrintToChat(iClient, "Подходящее место.");
                }
                case 0:{
                    PrintToChat(iClient, "Место заходит за текстуры.");
                }
                default:{
                    PrintToChat(iClient, "Место занято другими энтити.");
                }
            }
        }
    }
    return Plugin_Handled;
}

bool TraceEntityFilterPlayer(int iEnt, int iMask, any iData){
    return iData != iEnt;
}
 
Решение

Svyatoy

Участник
Сообщения
335
Реакции
137
Первый раз использую TraceHull, может что-то забыл. Проверяет "доступность" места, вроде работает.

C-подобный:
#include <sdktools_trace>
#include <sdktools_engine>
#include <sdktools_functions>

public void OnPluginStart(){
    RegConsoleCmd("sm_trace", CMD_CHECK);
}

Action CMD_CHECK(int iClient, int iArgs){

    float fStart[3], fAng[3];
    GetClientEyePosition(iClient, fStart);
    GetClientEyeAngles(iClient, fAng);

    TR_TraceRayFilter(fStart, fAng, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayer, iClient);

    if (TR_DidHit()){
        if(TR_GetEntityIndex() != 0){
            PrintToChat(iClient, "На пути какая-то энтити.");
        }else{
            TR_GetEndPosition(fStart);
            TR_TraceHull(fStart, fStart, view_as<float>({-70.0, -70.0, 0.0}), view_as<float>({70.0, 70.0, 150.0}), MASK_SOLID);

            switch(TR_GetEntityIndex()){
                case -1:{
                    PrintToChat(iClient, "Подходящее место.");
                }
                case 0:{
                    PrintToChat(iClient, "Место заходит за текстуры.");
                }
                default:{
                    PrintToChat(iClient, "Место занято другими энтити.");
                }
            }
        }
    }
    return Plugin_Handled;
}

bool TraceEntityFilterPlayer(int iEnt, int iMask, any iData){
    return iData != iEnt;
}
Выглядит интересно! Но как я понял тут точка ставится на место взгляда, а в моём случае нужно на место нахождения игрока.

Т.е. где сейчас стоит игрок, мы пытаемся построить цилиндр радиусом N.
И, если я верно понял, то наш радиус тут это {-70.0, -70.0, 0.0} to {70.0, 70.0, 150.0}

Если не трудно, помоги пожалуйста подредактировать под текущую позицию.
Я полагаю, что GetClientEyePosition мы заменим на GetClientAbsOrigin, а что делать с GetClientEyeAngles и fAng для TR_TraceRayFilter

@Someone , Огромное спасибо за готовое решение! Теперь я уже сам додумал, как мне переделать под свою задачу.
Если интересно, то вот мой вариант, когда метка ставится по текущей позиции игрока.


Sourcepawn:
#include <sdktools_trace>

public void OnPluginStart()
{
    RegConsoleCmd("sm_trace", CMD_CHECK);
}

Action CMD_CHECK(int iClient, int iArgs)
{
    float fStart[3];

    GetClientAbsOrigin(iClient, fStart);
    fStart[2] += 10;    // Делаем по координате высоты +10 т.к. иногда бывают маленькие объекты, которые нам не критичны

    TR_TraceHull(fStart, fStart, view_as<float>({-70.0, -70.0, 0.0}), view_as<float>({70.0, 70.0, 150.0}), MASK_SOLID);

    int iEnt = TR_GetEntityIndex();
    if(iEnt == 0)
    {
        PrintToChat(iClient, "Место заходит за текстуры.");
    }
    else
    {
        if(!IsValidClient(iEnt)) // Варинт где iEnt == -1 нам не подходит т.к. всегда будет Ent нашего игрока в центре круга
        {
            PrintToChat(iClient, "Место занято другими энтити.");
        }
        else
        {
            PrintToChat(iClient, "Подходящее место.");
        }
    }
    return Plugin_Handled;
}

stock bool IsValidClient(int iClient)
{
    if(iClient > 0 && iClient < MaxClients+1 && IsClientInGame(iClient) && !IsFakeClient(iClient))
        return true;

    return false;
}


#2 круг это бесплатный маркер от @TiBarification, после покупки любого плагина можно скачать с его форума
@gtixon , Огромное спасибо за наводку! Нашел, где скачать!

Итак! Задачи решены, всем ОГРОМНОЕ спасибо за помощь!
Всем удачи!
 
Последнее редактирование:
Сверху Снизу