3 сообщения в этой теме

PTaH - P Tools and Hooks
 

Скрытый текст

#if defined _PTaH_included
  #endinput
#endif
#define _PTaH_included


#define AF_UNSPEC    0
#define AF_INET    2
#define AF_INET6    10

#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46


enum PTaH_HookType
{
    Hook,
    UnHook
};

enum PTaH_Hook
{
    PTaH_GiveNamedItem = 0,
    PTaH_GiveNamedItemPre,
    PTaH_WeaponCanUse,
    PTaH_SetPlayerModel,
    PTaH_SetPlayerModelPre,
    PTaH_ConsolePrint,
    PTaH_MapContentList,
    PTaH_OnClientConnect,
    PTaH_ExecuteStringCommand,
    PTaH_ServerConsolePrint
};

enum EStickerAttributeType
{
    StickerID,
    WearProgress,
    PatternScale,
    PatternRotation
};

methodmap CEconItemDefinition
{
    //!!!!!!!!!!!!!!!!!!!!! CEconItemDefinition не является Handle, CloseHandle() - НЕ НУЖЕН !!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!! Всегда проверяйте, не равен ли CEconItemDefinition - NULL ( if(ItemDefinition) ) !!!!!!!!!!!!!!!!!!!!!

    /**
     *    Получает DefinitionIndex.
     *    -
     * @return    Возвращает DefinitionIndex.
     *    -
     * @error CEconItemDefinition == NULL.
    */
    public native int GetDefinitionIndex();
   
    /**
     *    Получает LoadoutSlot.
     * @param def            значение по умолчанию.
     *    -
     * @return    Возвращает LoadoutSlot.
     *    -
     * @error CEconItemDefinition == NULL.
    */
    public native int GetLoadoutSlot(int def = -1);
   
    /**
     *    Получает колиество слотов под Sticker.
     *    -
     * @return    Возвращает StickerSlotsCount.
     *    -
     * @error CEconItemDefinition == NULL.
    */
    public native int GetNumSupportedStickerSlots();
};

methodmap CEconItemView
{
    //!!!!!!!!!!!!!!!!!!!!! CEconItemView не является Handle, CloseHandle() - НЕ НУЖЕН !!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!! Всегда проверяйте, не равен ли CEconItemDefinition - NULL ( if(ItemDefinition) ) !!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!! Если игрок выйдет с сервера то после вызова функции для полученого CEconItemView (PTaH_GetEconItemViewFromWeapon ет относиться если iEnt будет уничтожена) вы получете Crash сервера !!!!!!!!!!!!!!!!!!!!!
   
    /**
     *    Получает индекс скина оружия.
     *    -
     * @return    Возвращает PaintKitIndex.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetCustomPaintKitIndex();
   
    /**
     *    Получает смещение скина оружия.
     *    -
     * @return    Возвращает PaintKitSeed.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetCustomPaintKitSeed();
   
    /**
     *    Получает качество скина оружия.
     * @param def            значение по умолчанию.
     *    -
     * @return    Возвращает PaintKitWear.
     *    -
     * @error CEconItemView == NULL.
    */
    public native float GetCustomPaintKitWear(float def = -1.0);
   
    /**
     *    Получает значение атрибута по номеру слота Sticker.
     * @param iSlot            индекс слота.
     * @param ESAT            атрибут.
     * @param def            значение по умолчанию.
     *    -
     * @return    Возвращает StickerAttribute.
     *    -
     * @error CEconItemView == NULL.
     * -
     * StickerID - возращает int, def тоже нужно передавать int
     * WearProgress, PatternScale, PatternRotation - возращает float, def тоже нужно передавать float
    */
    public native any GetStickerAttributeBySlotIndex(int iSlot, EStickerAttributeType ESAT, any def);
   
    /**
     *    Провека: Можно ли обменивать оружие
     *    -
     * @return    Возвращает Tradable.
     *    -
     * @error CEconItemView == NULL.
    */
    public native bool IsTradable();
   
    /**
     *    Проверка: Можно ли продать оружие - http://steamcommunity.com/market/
     *    -
     * @return    Возвращает Marketable.
     *    -
     * @error CEconItemView == NULL.
    */
    public native bool IsMarketable();
   
    /**
     *    Получает ItemDefinition.
     *    -
     * @return    Возвращает CEconItemDefinition.
     *    -
     * @error CEconItemView == NULL.
    */
    public native CEconItemDefinition GetItemDefinition();
   
    /**
     *    Получает AccountID владельца скина (сверить можно по GetSteamAccountID).
     *    -
     * @return    Возвращает AccountID.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetAccountID();
   
    /**
     *    Получает индекс владельца оружия.
     *    -
     * @return    Возвращает iClient.
     *    -
     * @error CEconItemView == NULL.
    */
    public int GetClientIndex()
    {
        int AccountID = this.GetAccountID();
        for (int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && AccountID == GetSteamAccountID(i)) return i;
        return 0;
    }
   
    /**
     *    Получает кастюмный ли ItemView.
     *    -
     * @return    Возвращает IsCustom.
     *    -
     * @error CEconItemView == NULL.
    */
    public bool IsCustomItemView()
    {
        return this.GetAccountID() != 0 ? true:false;
    }
   
    /**
     *    Получает Quality скина.
     *    -
     * @return    Возвращает Quality.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetQuality();
   
    /**
     *    Получает Rarity скина.
     *    -
     * @return    Возвращает Rarity.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetRarity();
   
    /**
     *    Получает Flags скина.
     *    -
     * @return    Возвращает Flags.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetFlags();
   
    /**
     *    Получает Origin скина.
     *    -
     * @return    Возвращает Origin.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetOrigin();
   
    /**
     *    Получает Неймтег скина.
     * @param sBuf            строка.
     * @param iLen            размер строки (максимальная длина, которая может быть - 161).
     *    -
     * @return    Возвращает длину Неймтега.
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetCustomName(char[] sBuf, int iLen);
   
    /**
     *    Получает количество StatTrak.
     *    -
     * @return    Возвращает количество StatTrak (если StatTrak = -1 значит его нет).
     *    -
     * @error CEconItemView == NULL.
    */
    public native int GetStatTrakKill();
};

methodmap AddrInfo
{
    //!!!!!!!!!!!!!!!!!!!!! AddrInfo is not Handle, CloseHandle() - NOT NEEDED !!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!! Always check, if not wounded AddrInfo - NULL ( if(AddrInfo) ) !!!!!!!!!!!!!!!!!!!!!
   
    /**
     *    Получает версию IP адреса (AF_INET или AF_INET6).
     *    -
     * @return    AF_INET или AF_INET6.
     *    -
     * @error AddrInfo == NULL.
    */
    property int Family
    {
        public native get();
    }
   
    /**
     *    Записывает IP адрес в строку.
     *    -
     * @noreturn
     *    -
     * @error AddrInfo == NULL.
    */
    public native void GetIP(char[] sBuffer, int len);
   
    /**
     *    Получает AddrInfo следующего IP.
     *    -
     * @return    AddrInfo.
     *    -
     * @error AddrInfo == NULL.
    */
    property AddrInfo NextIP
    {
        public native get();
    }
   
    /**
     *    Очищает выделенную по AddrInfo память (!!! очищать нужно только основной AddrInfo, AddrInfo полученный с NextIP очищать не нужно !!!).
     *    -
     * @noreturn
     *    -
     * @error AddrInfo == NULL.
    */
    public native void ClearMem();
};


typeset PTaHCB
{
    /** GiveNamedItem
     *
     *    Вызывается когда игрок получает предмет.
     *    -
     * @param iClient            Индекс игрока.
     * @param sClassname        Класснейм предмета.
     * @param Item                Кастюмизация предмета.
     * @param iEnt                Индекс Ентити предмета.
     *    -
     * @noreturn
    */
    function void (int iClient, const char[] sClassname, const CEconItemView Item, int iEnt);
   
    /** GiveNamedItemPre
     *
     *    Вызывается перед выдачей предмета.
     *    -
     * @param iClient            Индекс игрока.
     * @param sClassname        Класснейм оружия.
     * @param Item                Кастюмизация предмета.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled остановит выдачу предмета. Возврат Plugin_Continue разрешит выдачу предмета без изменений. Возврат Plugin_Changed разрешит выдачу примета с изминениями.
    */
    function Action (int iClient, char sClassname[64], CEconItemView &Item);
   
    /** WeaponCanUse
     *
     *    Вызывается когда игрок пытается поднять предмет.
     *    -
     * @param iClient            Индекс игрока.
     * @param iEnt                Индекс Ентити предмета.
     * @param CanUse            Для возврата без изменений.
     *    -
     * @return    Возврат false запретит подъем предмета. Возврат CanUse вернет ответ без изменений. Возврат true разрешит подъем предмета.
    */
    function bool (int iClient, int iEnt, bool CanUse);
   
    /** SetPlayerModel
     *
     *    Вызывается после смены модели игроку.
     *    -
     * @param iClient            Индекс игрока.
     * @param sModel            Путь к модели.
     *    -
     * @noreturn
    */
    function void (int iClient, const char[] sModel);
   
    /** SetPlayerModelPre
     *
     *    Вызывается перед сменой модели игроку.
     *    -
     * @param iClient            Индекс игрока.
     * @param sModel            Путь к текущей модели игрока.
     * @param sNewModel            Путь к новой модели.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled остановит смену модели. Возврат Plugin_Continue разрешит смену модели без изменений. Возврат Plugin_Changed разрешит смену на измененную модель.
    */
    function Action (int iClient, const char[] sModel, char sNewModel[128]);
   
    /** ConsolePrint/ExecuteStringCommand
     * ConsolePrint
     *
     *    Вызывается перед выводом сообщения в консоль игроку.
     *    -
     * @param iClient            Индекс игрока.
     * @param sMessage            Текст сообщения.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled запретит вывод сообщения. Возврат Plugin_Continue разрешит вывод сообщения без изменений. Возврат Plugin_Changed разрешит вывод измененного сообщения.
     *    -
     * ExecuteStringCommand
     *
     *    Вызывается перед выполнением команды игрока на сервере.
     *    -
     * @param iClient            Индекс игрока.
     * @param sMessage            Команда.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled запретит выполнение. Возврат Plugin_Continue разрешит выполнение без изменений. Возврат Plugin_Changed разрешит выполнение с изенениями.
    */
    function Action (int iClient, char sMessage[512]);
   
    /** MapContentList
     *
     *    Вызывается перед созданием контента карты который будет добавлен в скачку(AddFileToDownloadsTable не вызывает данное событие).
     *    -
     * @param sFile                Путь к файлу который будет добавлен в скачку.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled запретит добавление контента в скачку. Возврат Plugin_Continue разрешит добавление контента в скачку без изменений. Возврат Plugin_Changed разрешит добавление контента в скачку с изменением.
    */
    function Action (char sFile[128]);   
   
    /** OnClientConnect
     *
     *    Вызывается перед авторизацией клиента на сервере.
     *    -
     * @param sName                Никнейм клиента.
     * @param sPassword            Пароль который он ввел.
     * @param sIp                IP клиента.
     * @param sSteamID            SteamID (2 версии) клиента.
     * @param rejectReason        Причина неавторизации.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled запретит авторизацию клиента. Возврат Plugin_Continue разрешит авторизацию без изменений. Возврат Plugin_Changed разрешит авторизацию с изменением.
    */
    function Action (const char[] sName, char sPassword[128], const char[] sIp, const char[] sSteamID, char rejectReason[512]);
   
    /** ServerConsolePrint
     *
     *    Вызывается перед выводом сообщение в консоль сервера (Будьте аккуратны при роботе с сообщениями).
     *    -
     * @param sMessage                Сообщение которое печатается в консоль сервера.
     *    -
     * @return    Возврат Plugin_Stop или Plugin_Handled запретит вывод сообщения. Возврат Plugin_Continue разрешит вывод без изменений.
    */
    function Action (const char[] sMessage);
};

/**
*    Активирует хук.
* @param type                    Тип хука.
* @param hk                    Hook/UnHook.
* @param callback                Обратный вызов.
*    -
* @return    Возвращает true в случае удачи, иначе false.
*/
native bool PTaH(PTaH_Hook hk, PTaH_HookType type, PTaHCB callback);

/**
*    Получает CEconItemDefinition из ClassName оружия.
* @param sClassName                    ClassName оружия.
*    -
* @return    Возвращает CEconItemDefinition.
*/
native CEconItemDefinition PTaH_GetItemDefinitionByName(const char[] sClassName);

/**
*    Получает CEconItemView оружия клиента.
* @param iClient                    Индекс клиента.
* @param iTeam                        Индекс команды.
* @param iLoadoutSlot                Индекс слота оружия.
*    -
* @return    Возвращает CEconItemDefinition.
*    -
* @error невалдный iClient, !(2 <= iTeam <= 3).
*/
native CEconItemView PTaH_GetItemInLoadout(int iClient, int iTeam, int iLoadoutSlot);

/**
*    Получает CEconItemView оружия.
* @param iEnt                    Индекс оружия.
*    -
* @return    Возвращает CEconItemDefinition.
*    -
* @error невалдный iEnt, iEnt не является оружием.
*/
native CEconItemView PTaH_GetEconItemViewFromWeapon(int iEnt);

/**
*    Выдает игроку предмет с указанным CEconItemView.
* @param iClient                Индекс игрока.
* @param sClassname            Класнейм предмета.
* @param Item                    Кастюмизация предмета.
*    -
* @return    Возвращает индекс предмета.
*    -
* @error невалдный iClient.
*/
native int PTaH_GivePlayerItem(int iClient, const char[] sClassname, CEconItemView Item);

/**
*    Получает md5 hash файла.
* @param sFile                    Путь к файлу.
* @param sBuffer                Строка куда будет записан hash.
* @param len                    Длина строки.
*    -
* @return    Возвращает true в случаи успеха.
*    -
* @error sFile не существует.
*/
native bool PTaH_MD5File(const char[] sFile, char[] sBuffer, int len);

/**
*    Получает AddrInfo по хост имени.
* @param sHostName                Имя хоста.
* @param family                Поколение IP (AF_INET | AF_INET6 | AF_UNSPEC).
* @param addr                    Переменная в которую будет записано AddrInfo в случаи успеха.
*    -
* @return    Индекс ошибки (если есть).
*/
native int PTaH_GetAddrInfo(const char[] sHostName, int family, AddrInfo &addr);

/**
*    Получает ошибку по ее индексу.
* @param error                    Индекс ошибки.
* @param sBuffer                Строка куда будет записана ошибка.
* @param len                    Длина sBuffer.
*    -
* @return    Количество записанных символов.
*/
native int PTaH_Gai_StrError(int error, char[] sBuffer, int len);

public Extension __ext_PTaH =
{
    name = "PTaH",
    file = "PTaH.ext",
#if defined AUTOLOAD_EXTENSIONS
    autoload = 1,
#else
    autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
    required = 1,
#else
    required = 0,
#endif
};

#if !defined REQUIRE_EXTENSIONS
public __ext_PTaH_SetNTVOptional()
{
    MarkNativeAsOptional("PTaH");
    MarkNativeAsOptional("PTaH_GetItemDefinitionByName");
    MarkNativeAsOptional("CEconItemDefinition.GetDefinitionIndex");
    MarkNativeAsOptional("CEconItemDefinition.GetLoadoutSlot");
    MarkNativeAsOptional("CEconItemDefinition.GetNumSupportedStickerSlots");
    MarkNativeAsOptional("PTaH_GetItemInLoadout");
    MarkNativeAsOptional("PTaH_GetEconItemViewFromWeapon");
    MarkNativeAsOptional("CEconItemView.GetCustomPaintKitIndex");
    MarkNativeAsOptional("CEconItemView.GetCustomPaintKitSeed");
    MarkNativeAsOptional("CEconItemView.GetCustomPaintKitWear");
    MarkNativeAsOptional("CEconItemView.GetStickerAttributeBySlotIndex");
    MarkNativeAsOptional("CEconItemView.IsTradable");
    MarkNativeAsOptional("CEconItemView.IsMarketable");   
    MarkNativeAsOptional("CEconItemView.GetItemDefinition");
    MarkNativeAsOptional("CEconItemView.GetAccountID");
    MarkNativeAsOptional("CEconItemView.GetQuality");
    MarkNativeAsOptional("CEconItemView.GetRarity");
    MarkNativeAsOptional("CEconItemView.GetFlags");
    MarkNativeAsOptional("CEconItemView.GetOrigin");
    MarkNativeAsOptional("CEconItemView.GetCustomName");
    MarkNativeAsOptional("CEconItemView.GetStatTrakKill");
    MarkNativeAsOptional("PTaH_GivePlayerItem");
    MarkNativeAsOptional("PTaH_MD5File");
    MarkNativeAsOptional("PTaH_GetAddrInfo");
    MarkNativeAsOptional("PTaH_Gai_StrError");
    MarkNativeAsOptional("AddrInfo.Family.get");
    MarkNativeAsOptional("AddrInfo.GetIP");
    MarkNativeAsOptional("AddrInfo.NextIP.get");
}
#endif

 


Скрытый текст

Weapon Info


#pragma semicolon 1
#include <PTaH>

public void OnPluginStart()
{
    PTaH(PTaH_ExecuteStringCommand, Hook, ExecuteStringCommand);
    PTaH(PTaH_OnClientConnect, Hook, OnClientConnectPre);
    PTaH(PTaH_GiveNamedItemPre, Hook, GiveNamedItemPre);
    PTaH(PTaH_MapContentList, Hook, MapContentList);
    PTaH(PTaH_WeaponCanUse, Hook, WeaponCanUse);
    PTaH(PTaH_ConsolePrint, Hook, ConsolePrint);
    PTaH(PTaH_SetPlayerModel, Hook, SetPlayerModel);
    PTaH(PTaH_ServerConsolePrint, Hook, ServerConsolePrint);
    RegConsoleCmd("ptah", ptah_);
}

   
public Action ptah_(int iClient, int args)
{
    char buf[64];
   
    AddrInfo addr;
    int res = PTaH_GetAddrInfo("forums.alliedmods.net", AF_UNSPEC, addr);
    if(res == 0)
    {
        PrintToChatAll("GetAddrInfo - forums.alliedmods.net");
        AddrInfo p;
        for(p = addr; p; p = p.NextIP)
        {
            p.GetIP(buf, sizeof(buf));
            PrintToChatAll("%s %s", p.Family == 2 ? "IP":"IP6", buf);
        }
        addr.ClearMem();
    }
    else
    {
        PTaH_Gai_StrError(res, buf, sizeof(buf));
        PrintToChatAll("GetAddrInfo - %d %s", res, buf);
    }
   
    PTaH_MD5File("addons/metamod.vdf", buf, sizeof(buf));
    PrintToChatAll("HASH - addons/metamod.vdf - %s", buf);
    return Plugin_Handled;
}

public Action ExecuteStringCommand(int iClient, char sMessage[512])
{
    //Blocking command status
    static char sMessage2[512];
    sMessage2 = sMessage;
    //Remove space and tabs (commands its passed in the original form without a slew of front space and tab and etc) "           status   "
    TrimString(sMessage2);
    //*Client could write "status 3453 4534 5456 2354"
    if(StrContains(sMessage2, "status") == 0)
    {
        PrintToChatAll("%N Introduced command status", iClient);
        return Plugin_Handled;
    }
    return Plugin_Continue;
}

public Action OnClientConnectPre(const char[] sName, char sPassword[128], const char[] sIp, const char[] sSteamID, char rejectReason[512])
{
    LogMessage("OnClientConnectPre %s %s %s", sName, sIp, sSteamID);
    return Plugin_Continue;
}

//We are doing the same thing as https://forums.alliedmods.net/showthread.php?t=236199 (do not forget say thank you to Dr!fter)
public Action GiveNamedItemPre(int iClient, char sClassname[64], CEconItemView &Item)
{
    if(!Item || !Item.IsCustomItemView())
    {
        CEconItemDefinition ItemDefinition = PTaH_GetItemDefinitionByName(sClassname);
        if(ItemDefinition)
        {
            int iTeam = GetClientTeam(iClient);
            int iLoadoutSlot = ItemDefinition.GetLoadoutSlot();
            CEconItemView Item2 = PTaH_GetItemInLoadout(iClient, iTeam, iLoadoutSlot);
            if(!Item2.IsCustomItemView())
            {
                Item2 = PTaH_GetItemInLoadout(iClient, iTeam == 2 ? 3:2, iLoadoutSlot);
                //                                    Fix the problem when its gave tec9 instead five-seven
                if(Item2.IsCustomItemView() && ItemDefinition.GetDefinitionIndex() == Item2.GetItemDefinition().GetDefinitionIndex())
                {
                    Item = Item2;
                    return Plugin_Changed;
                }
            }
        }
    }
    return Plugin_Continue;
}

//Blocking loading .nav files
public Action MapContentList(char sFile[128])
{
    if(StrContains(sFile, ".nav") != -1) return Plugin_Handled;
    return Plugin_Continue;
}

//Allowing Counter-terrorist pick up C4
public bool WeaponCanUse(int iClient, int iEnt, bool CanUse)
{
    static char sClassname[64];
    GetEdictClassname(iEnt, sClassname, sizeof(sClassname));
    if(StrEqual(sClassname, "weapon_c4")) return true;
    return CanUse;
}

//Withdraw in the chat client that writes to the console
public Action ConsolePrint(int iClient, char sMessage[512])
{
    PrintToChat(iClient, sMessage);
    return Plugin_Continue;
}

public void SetPlayerModel(int iClient, const char[] sModel)
{
    PrintToChatAll("%N Set Model %s", iClient, sModel);
}

//Block out messages that contain DataTable warning
public Action ServerConsolePrint(const char[] sMessage)
{
    if (StrContains(sMessage, "DataTable warning") != -1) return Plugin_Handled;
    return Plugin_Continue;
}

 

 


Спасибо: Dr!fter, Peace-Maker, GoD-Tony, rom4s

Ссылки
Source
Builds
Gamedata

Changelog:

1.0.1

  • Добавлен хук ServerConsolePrint
  • Исправлен PTaH_GetEconItemViewFromWeapon для Windows (Спасибо GoD-Tony)
  • PTaH_GetHostByName заменен на PTaH_GetAddrInfo

 

1.0.2

  • Исправления из-за обновы CSGO. Спасибо Peace-Maker, GoD-Tony, rom4s

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    В 20.02.2016 в 23:10, Феникс сказал:

    PTaH - P Tools and Hooks
     

    include
      Показать содержимое
    
    
    #if defined _PTaH_included
      #endinput
    #endif
    #define _PTaH_included
    
    
    #define AF_UNSPEC    0
    #define AF_INET    2
    #define AF_INET6    10
    
    #define INET_ADDRSTRLEN 16
    #define INET6_ADDRSTRLEN 46
    
    
    enum PTaH_HookType
    {
        Hook,
        UnHook
    };
    
    enum PTaH_Hook
    {
        PTaH_GiveNamedItem = 0,
        PTaH_GiveNamedItemPre,
        PTaH_WeaponCanUse,
        PTaH_SetPlayerModel,
        PTaH_SetPlayerModelPre,
        PTaH_ConsolePrint,
        PTaH_MapContentList,
        PTaH_OnClientConnect,
        PTaH_ExecuteStringCommand,
        PTaH_ServerConsolePrint
    };
    
    enum EStickerAttributeType
    {
        StickerID,
        WearProgress,
        PatternScale,
        PatternRotation
    };
    
    methodmap CEconItemDefinition
    {
        //!!!!!!!!!!!!!!!!!!!!! CEconItemDefinition не является Handle, CloseHandle() - НЕ НУЖЕН !!!!!!!!!!!!!!!!!!!!!
        //!!!!!!!!!!!!!!!!!!!!! Всегда проверяйте, не равен ли CEconItemDefinition - NULL ( if(ItemDefinition) ) !!!!!!!!!!!!!!!!!!!!!
    
        /**
         *    Получает DefinitionIndex.
         *    -
         * @return    Возвращает DefinitionIndex.
         *    -
         * @error CEconItemDefinition == NULL.
        */
        public native int GetDefinitionIndex();
       
        /**
         *    Получает LoadoutSlot.
         * @param def            значение по умолчанию.
         *    -
         * @return    Возвращает LoadoutSlot.
         *    -
         * @error CEconItemDefinition == NULL.
        */
        public native int GetLoadoutSlot(int def = -1);
       
        /**
         *    Получает колиество слотов под Sticker.
         *    -
         * @return    Возвращает StickerSlotsCount.
         *    -
         * @error CEconItemDefinition == NULL.
        */
        public native int GetNumSupportedStickerSlots();
    };
    
    methodmap CEconItemView
    {
        //!!!!!!!!!!!!!!!!!!!!! CEconItemView не является Handle, CloseHandle() - НЕ НУЖЕН !!!!!!!!!!!!!!!!!!!!!
        //!!!!!!!!!!!!!!!!!!!!! Всегда проверяйте, не равен ли CEconItemDefinition - NULL ( if(ItemDefinition) ) !!!!!!!!!!!!!!!!!!!!!
        //!!!!!!!!!!!!!!!!!!!!! Если игрок выйдет с сервера то после вызова функции для полученого CEconItemView (PTaH_GetEconItemViewFromWeapon ет относиться если iEnt будет уничтожена) вы получете Crash сервера !!!!!!!!!!!!!!!!!!!!!
       
        /**
         *    Получает индекс скина оружия.
         *    -
         * @return    Возвращает PaintKitIndex.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetCustomPaintKitIndex();
       
        /**
         *    Получает смещение скина оружия.
         *    -
         * @return    Возвращает PaintKitSeed.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetCustomPaintKitSeed();
       
        /**
         *    Получает качество скина оружия.
         * @param def            значение по умолчанию.
         *    -
         * @return    Возвращает PaintKitWear.
         *    -
         * @error CEconItemView == NULL.
        */
        public native float GetCustomPaintKitWear(float def = -1.0);
       
        /**
         *    Получает значение атрибута по номеру слота Sticker.
         * @param iSlot            индекс слота.
         * @param ESAT            атрибут.
         * @param def            значение по умолчанию.
         *    -
         * @return    Возвращает StickerAttribute.
         *    -
         * @error CEconItemView == NULL.
         * -
         * StickerID - возращает int, def тоже нужно передавать int
         * WearProgress, PatternScale, PatternRotation - возращает float, def тоже нужно передавать float
        */
        public native any GetStickerAttributeBySlotIndex(int iSlot, EStickerAttributeType ESAT, any def);
       
        /**
         *    Провека: Можно ли обменивать оружие
         *    -
         * @return    Возвращает Tradable.
         *    -
         * @error CEconItemView == NULL.
        */
        public native bool IsTradable();
       
        /**
         *    Проверка: Можно ли продать оружие - http://steamcommunity.com/market/
         *    -
         * @return    Возвращает Marketable.
         *    -
         * @error CEconItemView == NULL.
        */
        public native bool IsMarketable();
       
        /**
         *    Получает ItemDefinition.
         *    -
         * @return    Возвращает CEconItemDefinition.
         *    -
         * @error CEconItemView == NULL.
        */
        public native CEconItemDefinition GetItemDefinition();
       
        /**
         *    Получает AccountID владельца скина (сверить можно по GetSteamAccountID).
         *    -
         * @return    Возвращает AccountID.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetAccountID();
       
        /**
         *    Получает индекс владельца оружия.
         *    -
         * @return    Возвращает iClient.
         *    -
         * @error CEconItemView == NULL.
        */
        public int GetClientIndex()
        {
            int AccountID = this.GetAccountID();
            for (int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && AccountID == GetSteamAccountID(i)) return i;
            return 0;
        }
       
        /**
         *    Получает кастюмный ли ItemView.
         *    -
         * @return    Возвращает IsCustom.
         *    -
         * @error CEconItemView == NULL.
        */
        public bool IsCustomItemView()
        {
            return this.GetAccountID() != 0 ? true:false;
        }
       
        /**
         *    Получает Quality скина.
         *    -
         * @return    Возвращает Quality.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetQuality();
       
        /**
         *    Получает Rarity скина.
         *    -
         * @return    Возвращает Rarity.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetRarity();
       
        /**
         *    Получает Flags скина.
         *    -
         * @return    Возвращает Flags.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetFlags();
       
        /**
         *    Получает Origin скина.
         *    -
         * @return    Возвращает Origin.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetOrigin();
       
        /**
         *    Получает Неймтег скина.
         * @param sBuf            строка.
         * @param iLen            размер строки (максимальная длина, которая может быть - 161).
         *    -
         * @return    Возвращает длину Неймтега.
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetCustomName(char[] sBuf, int iLen);
       
        /**
         *    Получает количество StatTrak.
         *    -
         * @return    Возвращает количество StatTrak (если StatTrak = -1 значит его нет).
         *    -
         * @error CEconItemView == NULL.
        */
        public native int GetStatTrakKill();
    };
    
    methodmap AddrInfo
    {
        //!!!!!!!!!!!!!!!!!!!!! AddrInfo is not Handle, CloseHandle() - NOT NEEDED !!!!!!!!!!!!!!!!!!!!!
        //!!!!!!!!!!!!!!!!!!!!! Always check, if not wounded AddrInfo - NULL ( if(AddrInfo) ) !!!!!!!!!!!!!!!!!!!!!
       
        /**
         *    Получает версию IP адреса (AF_INET или AF_INET6).
         *    -
         * @return    AF_INET или AF_INET6.
         *    -
         * @error AddrInfo == NULL.
        */
        property int Family
        {
            public native get();
        }
       
        /**
         *    Записывает IP адрес в строку.
         *    -
         * @noreturn
         *    -
         * @error AddrInfo == NULL.
        */
        public native void GetIP(char[] sBuffer, int len);
       
        /**
         *    Получает AddrInfo следующего IP.
         *    -
         * @return    AddrInfo.
         *    -
         * @error AddrInfo == NULL.
        */
        property AddrInfo NextIP
        {
            public native get();
        }
       
        /**
         *    Очищает выделенную по AddrInfo память (!!! очищать нужно только основной AddrInfo, AddrInfo полученный с NextIP очищать не нужно !!!).
         *    -
         * @noreturn
         *    -
         * @error AddrInfo == NULL.
        */
        public native void ClearMem();
    };
    
    
    typeset PTaHCB
    {
        /** GiveNamedItem
         *
         *    Вызывается когда игрок получает предмет.
         *    -
         * @param iClient            Индекс игрока.
         * @param sClassname        Класснейм предмета.
         * @param Item                Кастюмизация предмета.
         * @param iEnt                Индекс Ентити предмета.
         *    -
         * @noreturn
        */
        function void (int iClient, const char[] sClassname, const CEconItemView Item, int iEnt);
       
        /** GiveNamedItemPre
         *
         *    Вызывается перед выдачей предмета.
         *    -
         * @param iClient            Индекс игрока.
         * @param sClassname        Класснейм оружия.
         * @param Item                Кастюмизация предмета.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled остановит выдачу предмета. Возврат Plugin_Continue разрешит выдачу предмета без изменений. Возврат Plugin_Changed разрешит выдачу примета с изминениями.
        */
        function Action (int iClient, char sClassname[64], CEconItemView &Item);
       
        /** WeaponCanUse
         *
         *    Вызывается когда игрок пытается поднять предмет.
         *    -
         * @param iClient            Индекс игрока.
         * @param iEnt                Индекс Ентити предмета.
         * @param CanUse            Для возврата без изменений.
         *    -
         * @return    Возврат false запретит подъем предмета. Возврат CanUse вернет ответ без изменений. Возврат true разрешит подъем предмета.
        */
        function bool (int iClient, int iEnt, bool CanUse);
       
        /** SetPlayerModel
         *
         *    Вызывается после смены модели игроку.
         *    -
         * @param iClient            Индекс игрока.
         * @param sModel            Путь к модели.
         *    -
         * @noreturn
        */
        function void (int iClient, const char[] sModel);
       
        /** SetPlayerModelPre
         *
         *    Вызывается перед сменой модели игроку.
         *    -
         * @param iClient            Индекс игрока.
         * @param sModel            Путь к текущей модели игрока.
         * @param sNewModel            Путь к новой модели.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled остановит смену модели. Возврат Plugin_Continue разрешит смену модели без изменений. Возврат Plugin_Changed разрешит смену на измененную модель.
        */
        function Action (int iClient, const char[] sModel, char sNewModel[128]);
       
        /** ConsolePrint/ExecuteStringCommand
         * ConsolePrint
         *
         *    Вызывается перед выводом сообщения в консоль игроку.
         *    -
         * @param iClient            Индекс игрока.
         * @param sMessage            Текст сообщения.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled запретит вывод сообщения. Возврат Plugin_Continue разрешит вывод сообщения без изменений. Возврат Plugin_Changed разрешит вывод измененного сообщения.
         *    -
         * ExecuteStringCommand
         *
         *    Вызывается перед выполнением команды игрока на сервере.
         *    -
         * @param iClient            Индекс игрока.
         * @param sMessage            Команда.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled запретит выполнение. Возврат Plugin_Continue разрешит выполнение без изменений. Возврат Plugin_Changed разрешит выполнение с изенениями.
        */
        function Action (int iClient, char sMessage[512]);
       
        /** MapContentList
         *
         *    Вызывается перед созданием контента карты который будет добавлен в скачку(AddFileToDownloadsTable не вызывает данное событие).
         *    -
         * @param sFile                Путь к файлу который будет добавлен в скачку.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled запретит добавление контента в скачку. Возврат Plugin_Continue разрешит добавление контента в скачку без изменений. Возврат Plugin_Changed разрешит добавление контента в скачку с изменением.
        */
        function Action (char sFile[128]);   
       
        /** OnClientConnect
         *
         *    Вызывается перед авторизацией клиента на сервере.
         *    -
         * @param sName                Никнейм клиента.
         * @param sPassword            Пароль который он ввел.
         * @param sIp                IP клиента.
         * @param sSteamID            SteamID (2 версии) клиента.
         * @param rejectReason        Причина неавторизации.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled запретит авторизацию клиента. Возврат Plugin_Continue разрешит авторизацию без изменений. Возврат Plugin_Changed разрешит авторизацию с изменением.
        */
        function Action (const char[] sName, char sPassword[128], const char[] sIp, const char[] sSteamID, char rejectReason[512]);
       
        /** ServerConsolePrint
         *
         *    Вызывается перед выводом сообщение в консоль сервера (Будьте аккуратны при роботе с сообщениями).
         *    -
         * @param sMessage                Сообщение которое печатается в консоль сервера.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled запретит вывод сообщения. Возврат Plugin_Continue разрешит вывод без изменений.
        */
        function Action (const char[] sMessage);
    };
    
    /**
    *    Активирует хук.
    * @param type                    Тип хука.
    * @param hk                    Hook/UnHook.
    * @param callback                Обратный вызов.
    *    -
    * @return    Возвращает true в случае удачи, иначе false.
    */
    native bool PTaH(PTaH_Hook hk, PTaH_HookType type, PTaHCB callback);
    
    /**
    *    Получает CEconItemDefinition из ClassName оружия.
    * @param sClassName                    ClassName оружия.
    *    -
    * @return    Возвращает CEconItemDefinition.
    */
    native CEconItemDefinition PTaH_GetItemDefinitionByName(const char[] sClassName);
    
    /**
    *    Получает CEconItemView оружия клиента.
    * @param iClient                    Индекс клиента.
    * @param iTeam                        Индекс команды.
    * @param iLoadoutSlot                Индекс слота оружия.
    *    -
    * @return    Возвращает CEconItemDefinition.
    *    -
    * @error невалдный iClient, !(2 <= iTeam <= 3).
    */
    native CEconItemView PTaH_GetItemInLoadout(int iClient, int iTeam, int iLoadoutSlot);
    
    /**
    *    Получает CEconItemView оружия.
    * @param iEnt                    Индекс оружия.
    *    -
    * @return    Возвращает CEconItemDefinition.
    *    -
    * @error невалдный iEnt, iEnt не является оружием.
    */
    native CEconItemView PTaH_GetEconItemViewFromWeapon(int iEnt);
    
    /**
    *    Выдает игроку предмет с указанным CEconItemView.
    * @param iClient                Индекс игрока.
    * @param sClassname            Класнейм предмета.
    * @param Item                    Кастюмизация предмета.
    *    -
    * @return    Возвращает индекс предмета.
    *    -
    * @error невалдный iClient.
    */
    native int PTaH_GivePlayerItem(int iClient, const char[] sClassname, CEconItemView Item);
    
    /**
    *    Получает md5 hash файла.
    * @param sFile                    Путь к файлу.
    * @param sBuffer                Строка куда будет записан hash.
    * @param len                    Длина строки.
    *    -
    * @return    Возвращает true в случаи успеха.
    *    -
    * @error sFile не существует.
    */
    native bool PTaH_MD5File(const char[] sFile, char[] sBuffer, int len);
    
    /**
    *    Получает AddrInfo по хост имени.
    * @param sHostName                Имя хоста.
    * @param family                Поколение IP (AF_INET | AF_INET6 | AF_UNSPEC).
    * @param addr                    Переменная в которую будет записано AddrInfo в случаи успеха.
    *    -
    * @return    Индекс ошибки (если есть).
    */
    native int PTaH_GetAddrInfo(const char[] sHostName, int family, AddrInfo &addr);
    
    /**
    *    Получает ошибку по ее индексу.
    * @param error                    Индекс ошибки.
    * @param sBuffer                Строка куда будет записана ошибка.
    * @param len                    Длина sBuffer.
    *    -
    * @return    Количество записанных символов.
    */
    native int PTaH_Gai_StrError(int error, char[] sBuffer, int len);
    
    public Extension __ext_PTaH =
    {
        name = "PTaH",
        file = "PTaH.ext",
    #if defined AUTOLOAD_EXTENSIONS
        autoload = 1,
    #else
        autoload = 0,
    #endif
    #if defined REQUIRE_EXTENSIONS
        required = 1,
    #else
        required = 0,
    #endif
    };
    
    #if !defined REQUIRE_EXTENSIONS
    public __ext_PTaH_SetNTVOptional()
    {
        MarkNativeAsOptional("PTaH");
        MarkNativeAsOptional("PTaH_GetItemDefinitionByName");
        MarkNativeAsOptional("CEconItemDefinition.GetDefinitionIndex");
        MarkNativeAsOptional("CEconItemDefinition.GetLoadoutSlot");
        MarkNativeAsOptional("CEconItemDefinition.GetNumSupportedStickerSlots");
        MarkNativeAsOptional("PTaH_GetItemInLoadout");
        MarkNativeAsOptional("PTaH_GetEconItemViewFromWeapon");
        MarkNativeAsOptional("CEconItemView.GetCustomPaintKitIndex");
        MarkNativeAsOptional("CEconItemView.GetCustomPaintKitSeed");
        MarkNativeAsOptional("CEconItemView.GetCustomPaintKitWear");
        MarkNativeAsOptional("CEconItemView.GetStickerAttributeBySlotIndex");
        MarkNativeAsOptional("CEconItemView.IsTradable");
        MarkNativeAsOptional("CEconItemView.IsMarketable");   
        MarkNativeAsOptional("CEconItemView.GetItemDefinition");
        MarkNativeAsOptional("CEconItemView.GetAccountID");
        MarkNativeAsOptional("CEconItemView.GetQuality");
        MarkNativeAsOptional("CEconItemView.GetRarity");
        MarkNativeAsOptional("CEconItemView.GetFlags");
        MarkNativeAsOptional("CEconItemView.GetOrigin");
        MarkNativeAsOptional("CEconItemView.GetCustomName");
        MarkNativeAsOptional("CEconItemView.GetStatTrakKill");
        MarkNativeAsOptional("PTaH_GivePlayerItem");
        MarkNativeAsOptional("PTaH_MD5File");
        MarkNativeAsOptional("PTaH_GetAddrInfo");
        MarkNativeAsOptional("PTaH_Gai_StrError");
        MarkNativeAsOptional("AddrInfo.Family.get");
        MarkNativeAsOptional("AddrInfo.GetIP");
        MarkNativeAsOptional("AddrInfo.NextIP.get");
    }
    #endif

     


    Пример/Тестовый плагин

      Показать содержимое

    Weapon Info

    
    
    #pragma semicolon 1
    #include <PTaH>
    
    public void OnPluginStart()
    {
        PTaH(PTaH_ExecuteStringCommand, Hook, ExecuteStringCommand);
        PTaH(PTaH_OnClientConnect, Hook, OnClientConnectPre);
        PTaH(PTaH_GiveNamedItemPre, Hook, GiveNamedItemPre);
        PTaH(PTaH_MapContentList, Hook, MapContentList);
        PTaH(PTaH_WeaponCanUse, Hook, WeaponCanUse);
        PTaH(PTaH_ConsolePrint, Hook, ConsolePrint);
        PTaH(PTaH_SetPlayerModel, Hook, SetPlayerModel);
        PTaH(PTaH_ServerConsolePrint, Hook, ServerConsolePrint);
        RegConsoleCmd("ptah", ptah_);
    }
    
       
    public Action ptah_(int iClient, int args)
    {
        char buf[64];
       
        AddrInfo addr;
        int res = PTaH_GetAddrInfo("forums.alliedmods.net", AF_UNSPEC, addr);
        if(res == 0)
        {
            PrintToChatAll("GetAddrInfo - forums.alliedmods.net");
            AddrInfo p;
            for(p = addr; p; p = p.NextIP)
            {
                p.GetIP(buf, sizeof(buf));
                PrintToChatAll("%s %s", p.Family == 2 ? "IP":"IP6", buf);
            }
            addr.ClearMem();
        }
        else
        {
            PTaH_Gai_StrError(res, buf, sizeof(buf));
            PrintToChatAll("GetAddrInfo - %d %s", res, buf);
        }
       
        PTaH_MD5File("addons/metamod.vdf", buf, sizeof(buf));
        PrintToChatAll("HASH - addons/metamod.vdf - %s", buf);
        return Plugin_Handled;
    }
    
    public Action ExecuteStringCommand(int iClient, char sMessage[512])
    {
        //Blocking command status
        static char sMessage2[512];
        sMessage2 = sMessage;
        //Remove space and tabs (commands its passed in the original form without a slew of front space and tab and etc) "           status   "
        TrimString(sMessage2);
        //*Client could write "status 3453 4534 5456 2354"
        if(StrContains(sMessage2, "status") == 0)
        {
            PrintToChatAll("%N Introduced command status", iClient);
            return Plugin_Handled;
        }
        return Plugin_Continue;
    }
    
    public Action OnClientConnectPre(const char[] sName, char sPassword[128], const char[] sIp, const char[] sSteamID, char rejectReason[512])
    {
        LogMessage("OnClientConnectPre %s %s %s", sName, sIp, sSteamID);
        return Plugin_Continue;
    }
    
    //We are doing the same thing as https://forums.alliedmods.net/showthread.php?t=236199 (do not forget say thank you to Dr!fter)
    public Action GiveNamedItemPre(int iClient, char sClassname[64], CEconItemView &Item)
    {
        if(!Item || !Item.IsCustomItemView())
        {
            CEconItemDefinition ItemDefinition = PTaH_GetItemDefinitionByName(sClassname);
            if(ItemDefinition)
            {
                int iTeam = GetClientTeam(iClient);
                int iLoadoutSlot = ItemDefinition.GetLoadoutSlot();
                CEconItemView Item2 = PTaH_GetItemInLoadout(iClient, iTeam, iLoadoutSlot);
                if(!Item2.IsCustomItemView())
                {
                    Item2 = PTaH_GetItemInLoadout(iClient, iTeam == 2 ? 3:2, iLoadoutSlot);
                    //                                    Fix the problem when its gave tec9 instead five-seven
                    if(Item2.IsCustomItemView() && ItemDefinition.GetDefinitionIndex() == Item2.GetItemDefinition().GetDefinitionIndex())
                    {
                        Item = Item2;
                        return Plugin_Changed;
                    }
                }
            }
        }
        return Plugin_Continue;
    }
    
    //Blocking loading .nav files
    public Action MapContentList(char sFile[128])
    {
        if(StrContains(sFile, ".nav") != -1) return Plugin_Handled;
        return Plugin_Continue;
    }
    
    //Allowing Counter-terrorist pick up C4
    public bool WeaponCanUse(int iClient, int iEnt, bool CanUse)
    {
        static char sClassname[64];
        GetEdictClassname(iEnt, sClassname, sizeof(sClassname));
        if(StrEqual(sClassname, "weapon_c4")) return true;
        return CanUse;
    }
    
    //Withdraw in the chat client that writes to the console
    public Action ConsolePrint(int iClient, char sMessage[512])
    {
        PrintToChat(iClient, sMessage);
        return Plugin_Continue;
    }
    
    public void SetPlayerModel(int iClient, const char[] sModel)
    {
        PrintToChatAll("%N Set Model %s", iClient, sModel);
    }
    
    //Block out messages that contain DataTable warning
    public Action ServerConsolePrint(const char[] sMessage)
    {
        if (StrContains(sMessage, "DataTable warning") != -1) return Plugin_Handled;
        return Plugin_Continue;
    }

     

     


    Спасибо: Dr!fter, Peace-Maker, GoD-Tony, rom4s

    Ссылки
    Source
    Builds
    Gamedata

    Changelog:
    1.0.1

    • Добавлен хук ServerConsolePrint
    • Исправлен PTaH_GetEconItemViewFromWeapon для Windows (Спасибо GoD-Tony)
    • PTaH_GetHostByName заменен на PTaH_GetAddrInfo

     

     

    L 11/19/2016 - 19:12:19: [SM] Unable to load extension "PTaH.ext": /host/19144/24381/csgo/addons/sourcemod/extensions/PTaH.ext.so: cannot open shared object file: No such file or directory

     

     

    вот что пишет

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    В 19.11.2016 в 12:34, Sapsan сказал:

     

     

    L 11/19/2016 - 19:12:19: [SM] Unable to load extension "PTaH.ext": /host/19144/24381/csgo/addons/sourcemod/extensions/PTaH.ext.so: cannot open shared object file: No such file or directory

     

    вот что пишет

     

    Открой билды и скачай последнюю версию.

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах

    Создайте аккаунт или войдите для комментирования

    Вы должны быть пользователем, чтобы оставить комментарий

    Создать аккаунт

    Зарегистрируйтесь для получения аккаунта. Это просто!


    Зарегистрировать аккаунт

    Войти

    Уже зарегистрированы? Войдите здесь.


    Войти сейчас