Как проверить что линия проходить сквозь дым ?

komashchenko

Идиот
Сообщения
916
Реакции
2,570
Пример проверки показан на CSGO, но на CSS так же.

Поскольку трассировкой это сделать нельзя, воспользуемся функцией с помощью которой проверяется может ли бот видеть точку, а именно IsLineBlockedBySmoke.

PHP:
#include sdktools

stock bool LineGoesThroughSmoke(float from[3], float to[3])
{
    static Address TheBots;
    static Handle CBotManager_IsLineBlockedBySmoke;
    static int OS;
    
    if(OS == 0)
    {
        Handle hGameConf = LoadGameConfigFile("LineGoesThroughSmoke.games");
        if(!hGameConf)
        {
            SetFailState("Could not read LineGoesThroughSmoke.games.txt");
            return false;
        }
        
        OS = GameConfGetOffset(hGameConf, "OS");
        
        TheBots = GameConfGetAddress(hGameConf, "TheBots");
        if(!TheBots)
        {
            CloseHandle(hGameConf);
            SetFailState("TheBots == null");
            return false;
        }
        
        StartPrepSDKCall(SDKCall_Raw);
        PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CBotManager::IsLineBlockedBySmoke");
        PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_Pointer);
        PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_Pointer);
        if(OS == 1) PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
        PrepSDKCall_SetReturnInfo(SDKType_Bool, SDKPass_Plain);
        if(!(CBotManager_IsLineBlockedBySmoke = EndPrepSDKCall()))
        {
            CloseHandle(hGameConf);
            SetFailState("Failed to get CBotManager::IsLineBlockedBySmoke function");
            return false;
        }
        
        CloseHandle(hGameConf);
    }
    
    if(OS == 1) return SDKCall(CBotManager_IsLineBlockedBySmoke, TheBots, from, to, 1.0);
    return SDKCall(CBotManager_IsLineBlockedBySmoke, TheBots, from, to);
}
 

Вложения

  • LineGoesThroughSmoke.games.txt
    903 байт · Просмотры: 25

Черная вдова

Участник
Сообщения
2,795
Реакции
670
Пример проверки показан на CSGO, но на CSS так же.

Поскольку трассировкой это сделать нельзя, воспользуемся функцией с помощью которой проверяется может ли бот видеть точку, а именно IsLineBlockedBySmoke.

PHP:
#include sdktools

stock bool LineGoesThroughSmoke(float from[3], float to[3])
{
    static Address TheBots;
    static Handle CBotManager_IsLineBlockedBySmoke;
    static int OS;
  
    if(OS == 0)
    {
        Handle hGameConf = LoadGameConfigFile("LineGoesThroughSmoke.games");
        if(!hGameConf)
        {
            SetFailState("Could not read LineGoesThroughSmoke.games.txt");
            return false;
        }
      
        OS = GameConfGetOffset(hGameConf, "OS");
      
        TheBots = GameConfGetAddress(hGameConf, "TheBots");
        if(!TheBots)
        {
            CloseHandle(hGameConf);
            SetFailState("TheBots == null");
            return false;
        }
      
        StartPrepSDKCall(SDKCall_Raw);
        PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CBotManager::IsLineBlockedBySmoke");
        PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_Pointer);
        PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_Pointer);
        if(OS == 1) PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
        PrepSDKCall_SetReturnInfo(SDKType_Bool, SDKPass_Plain);
        if(!(CBotManager_IsLineBlockedBySmoke = EndPrepSDKCall()))
        {
            CloseHandle(hGameConf);
            SetFailState("Failed to get CBotManager::IsLineBlockedBySmoke function");
            return false;
        }
      
        CloseHandle(hGameConf);
    }
  
    if(OS == 1) return SDKCall(CBotManager_IsLineBlockedBySmoke, TheBots, from, to, 1.0);
    return SDKCall(CBotManager_IsLineBlockedBySmoke, TheBots, from, to);
}
Это можно еще сделать из знаний геометрии зная лишь x,y,z дыма и координаты вектора
В итоге получается задача проходит ли вектор через плоскость
 
Последнее редактирование:
Сверху Снизу