Замена моделей.

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
6
Реакции
1
Предупреждения
5
Неверный раздел форума
Не могу понять что не так с этим плагином. Загрузка модели идёт, а замены не происходит. В plugins ini оставил только стандартные плагины, так что конфликтов быть не может. Была таже самая проблема с custom_models плагином, в итоге пришлось всю ночь дописывать плагин который заменяется модельки по 3м флагам на 6. Тут я уже бессилен, помогите плс..

Установлено:
Server: 7559 MyArena Hosting
ReHLDS https://img.shields.io/github/v/release/dreamstalker/rehlds?include_prereleases
ReGameDLL https://img.shields.io/github/v/release/s1lentq/ReGameDLL_CS?include_prereleases
ReAPI https://img.shields.io/github/v/release/s1lentq/ReAPI?include_prereleases
Metamod-r https://img.shields.io/github/v/release/theAsmodai/metamod-r?include_prereleases
AMXModX https://img.shields.io/badge/release-v1.9.0.5291-blue


В replweapon.ini 1 строчка.
"t" "flags" "ak47" "models/imprs/vip/p_ak47.mdl" "models/imprs/vip/v_ak47.mdl" "models/imprs/vip/w_ak47.mdl"


Код:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <engine>


#define PLUGIN "Weapon replace model"
#define VERSION "1.0"
#define AUTHOR "vk.com/CSPlugin"


enum _:STRWEAPON { //Для того что бы соотносить в файле прописи с реальным оружием.
    WEAP_CSW,
    WEAP_TEXT[14],
    WEAP_NAME[20],
    WEAP_MODELS[64]
}
new gWeapon[][STRWEAPON] = { //Список оружия, которое можно заменить.
    {CSW_P228,        "p228"    , "weapon_p228"        ,    "models/w_p228.mdl"},
    {CSW_SCOUT,        "scout"    , "weapon_scout"    ,    "models/w_scout.mdl"},
    {CSW_HEGRENADE,    "he"    , "weapon_hegrenade",    "models/w_hegrenade.mdl"},
    {CSW_XM1014,    "xm1014", "weapon_xm1014"    ,    "models/w_xm1014.mdl"},
    {CSW_MAC10,        "mac10"    , "weapon_mac10"     ,    "models/w_mac10.mdl"},
    {CSW_AUG,        "aug"    , "weapon_aug"        ,    "models/w_aug.mdl"},
    {CSW_ELITE,        "elite"    , "weapon_elite"     ,    "models/w_elite.mdl"},
    {CSW_FIVESEVEN,    "fn57"    , "weapon_fiveseven",    "models/w_fiveseven.mdl"},
    {CSW_UMP45,        "ump45"    , "weapon_ump45"    ,    "models/w_ump45.mdl"},
    {CSW_SG550,        "sg550"    , "weapon_sg550"    ,    "models/w_sg550.mdl"},
    {CSW_GALIL,        "galil"    , "weapon_galil"    ,    "models/w_galil.mdl"},
    {CSW_FAMAS,        "famas"    , "weapon_famas"    ,    "models/w_famas.mdl"},
    {CSW_USP,        "usp"    , "weapon_usp"        ,    "models/w_usp.mdl"},
    {CSW_GLOCK18,    "glock"    , "weapon_glock18"    ,    "models/w_glock18.mdl"},
    {CSW_AWP,        "awp"    , "weapon_awp"        ,    "models/w_awp.mdl"},
    {CSW_MP5NAVY,    "mp5"    , "weapon_mp5navy"    ,    "models/w_mp5.mdl"},
    {CSW_M249,        "m249"    , "weapon_m249"        ,    "models/w_m249.mdl"},
    {CSW_M3,        "m3"    , "weapon_m3"        ,    "models/w_m3.mdl"},
    {CSW_M4A1,        "m4a1"    , "weapon_m4a1"        ,    "models/w_m4a1.mdl"},
    {CSW_TMP,        "tmp"    , "weapon_tmp"        ,    "models/w_tmp.mdl"},
    {CSW_G3SG1,        "g3sg1"    , "weapon_g3sg1"    ,    "models/w_g3sg1.mdl"},
    {CSW_DEAGLE,    "deagle", "weapon_deagle"    ,    "models/w_deagle.mdl"},
    {CSW_SG552,        "sg552"    , "weapon_sg552"    ,    "models/w_sg552.mdl"},
    {CSW_AK47,        "ak47"    , "weapon_ak47"        ,    "models/w_ak47.mdl"},
    {CSW_KNIFE,        "knife"    , "weapon_knife"    ,    "models/w_knife.mdl"},
    {CSW_P90,        "p90"    , "weapon_p90"        ,    "models/w_p90.mdl"}
}
new bool:gRegHamItem[sizeof gWeapon]; //Что бы не регестрировать оружия которые не прописаны.


enum _:STRWEAPREAD { //Структура добавляемых моделей оружий.
    WR_NUM,                //Номер оружия в массиве gWeapon, для быстрого его поиска.
    WR_SPARAM[64],        //Параметр по которому сохранять.
    WR_SPARTYPE,        //Тип параметра сохранения.
    WR_WEAPON[16],        //Тип оружия соответсвует  gWeapon[WEAP_TEXT], для определения номера WR_NUM
    WR_MODELP[128],        // новая _p модель
    WR_MODELV[128],        // новая _м модель
    WR_MODELW[128]        // новая _w модель
}
new Array:gArrWeapon; //Динамический массив для записи всех моделей.

//Для определения параметра сохранения и изменения порядка его приоритета.
enum _:STRSAVETYPE {
    ST_FLAGS,
    ST_STEAM,
    ST_NAME
}
new gSzSType[][] = {
    "flags",
    "steam",
    "name"
}
new gSType[] = {
    ST_FLAGS,
    ST_STEAM,
    ST_NAME
}

enum PRIORITY { //Для того что бы при поиске оружий подходящих для замены игроку учитывать приоритет.
    P_NUM,
    P_PRIOR
}
new gPlWeap[33][sizeof gWeapon][PRIORITY]; //Массив для записи идентификаторов в динамич массиве для быстрого поиска при замене оружий.


//Читаем и кишируем
public ReadModels() {
    gArrWeapon = ArrayCreate(STRWEAPREAD);
    //Считываем из файла параметры
    new filepatch[128],ArrWeapon[STRWEAPREAD],strSparType[16];
    formatex(filepatch, charsmax(filepatch), "addons/amxmodx/configs/replweapon.ini")
    if(!dir_exists("addons/amxmodx/configs")) {
        mkdir("addons/amxmodx/configs");
    }
    if(file_exists(filepatch)) {
        static buffer[512];
        new iLine, iNum;

        for(iLine = 0; read_file(filepatch, iLine, buffer, charsmax(buffer), iNum); iLine++) {
            if(iNum > 0 && buffer[0] != '/' && buffer[1] != '/') {
                trim(buffer);
                // "name/steam/flags"     "name|steam|flags" "weapon"        "p" "v" "w"
                parse(buffer,ArrWeapon[WR_SPARAM],charsmax(ArrWeapon[WR_SPARAM]),
                            strSparType,charsmax(strSparType),
                            ArrWeapon[WR_WEAPON],charsmax(ArrWeapon[WR_WEAPON]),
                            ArrWeapon[WR_MODELP],charsmax(ArrWeapon[WR_MODELP]),
                            ArrWeapon[WR_MODELV],charsmax(ArrWeapon[WR_MODELV]),
                            ArrWeapon[WR_MODELW],charsmax(ArrWeapon[WR_MODELW])
                ); //Парсим строки.
               

                //Проверяем тип по которому прописана модель.
                for(new i=0;i<sizeof(gSzSType);i++) {
                    if(equali(strSparType,gSzSType[i])) {
                        ArrWeapon[WR_SPARTYPE] = gSType[i];
                    }
                }
                           
                //Проверяем наличие всех моделей, если какой то нет, значит не добавляем оружие.
                new bool:isExists = true, pointer[3] = {
                    WR_MODELP,
                    WR_MODELV,
                    WR_MODELW
                }
                for(new i=0;i<sizeof(pointer);i++) {
                    if(!file_exists(ArrWeapon[pointer[i]])) {
                        isExists = false;
                        break;
                    }
                }
                if(isExists) { //Если все модели есть - кишируем и добавляем в систему.
                    //Ищем соответствие среди оружий.
                    for(new i=0;i<sizeof(gWeapon);i++) {
                        if(equali(ArrWeapon[WR_WEAPON],gWeapon[i][WEAP_TEXT])) {
                            gRegHamItem[i] = true;
                            ArrWeapon[WR_NUM] = i;
                            break;
                        }
                    }
               
                    engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[0]]);
                    engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[1]]);
                    engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[2]]);
                    ArrayPushArray(gArrWeapon,ArrWeapon);
                }
            }
        }
    } else {
        new i=0;
        write_file(filepatch, "// Это строка пример комментария", i++);
        write_file(filepatch, "// Плагин замены моделей оружия по нику/стиму/флагу, ", i++);
        write_file(filepatch, "// если игрок сразу подходит под несколько записей, модель будет заменена ", i++);
        write_file(filepatch, "// на первую найденую запись с учётом приоритета (ник/стим/флаг).",    i++);
        write_file(filepatch, "// Формат прописи моделей:.",    i++);
        write_file(filepatch, "// ^"name/steam/flags^"     ^"name|steam|flags^" ^"weapon^"        ^"p^" ^"v^" ^"w^"",    i++);
        write_file(filepatch, "// Пример прописи (ник/стим/флаг):",    i++);
        write_file(filepatch, "// ^"vk.com/CSPlugin^" ^"name^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"",    i++);
        write_file(filepatch, "// ^"STEAM_0:4:1722678988^" ^"steam^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"",    i++);
        write_file(filepatch, "// ^"bcd^" ^"flags^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"",    i++);
        write_file(filepatch, "// Список оружий для которых можно заменить модели: ",    i++);
   
        new str[512],iLen = 0;
        iLen+=formatex(str[iLen],charsmax(str) - iLen,"//");
        for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
            iLen+=formatex(str[iLen],charsmax(str)-iLen,"%s,",gWeapon[iweap][WEAP_TEXT]);
        }
        write_file(filepatch, str, i++);
        write_file(filepatch, "// ВНИМАНИЕ: Для ножа в _w моделе обязательно указать ЛЮБУЮ кешируемую модель в плагине.",    i++);
    }
}
public plugin_precache() {
    ReadModels();
}
public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);
   
    register_forward(FM_SetModel, "fw_SetModel"); //Установка модели оружию на земле.
    for(new weap=0;weap<sizeof(gWeapon);weap++) {
        if(gRegHamItem[weap] && !equali(gWeapon[weap][WEAP_NAME],"weapon_knife")) { //Проверяем что это оружие прописано.
            RegisterHam(Ham_Item_Deploy, gWeapon[weap][WEAP_NAME], "Ham_Deploy_Post", 1);
        }
    }
    RegisterHam( Ham_Item_Deploy, "weapon_knife" , "ItemDeploy_Knife_Post", 1 ) //Для замени моделей ножей.
   
}
public client_putinserver(id) { //При входе сразу помечаем какие модели будут заменяться и на какие.
    for(new i=0;i<sizeof(gPlWeap[]);i++) { //Обнуляем все данные прыдущего игрока.
        gPlWeap[id][i][P_NUM] = -1;
        gPlWeap[id][i][P_PRIOR] = -1; //Приоритет ставим -1, так как есть приоритет 0.
    }
   
    new iSize = ArraySize(gArrWeapon);
    new ArrWeapon[STRWEAPREAD];
   
    for(new num=0;num<iSize;num++) {
        ArrayGetArray(gArrWeapon,num,ArrWeapon);

        if(gPlWeap[id][ArrWeapon[WR_NUM]][P_PRIOR] < ArrWeapon[WR_SPARTYPE]) { //Сначала проверяем приоритет, так как для этого нужно меньше времени процессора.
            if(is_par_value(id,ArrWeapon[WR_SPARTYPE],ArrWeapon[WR_SPARAM])) { //Если нашли совпадение по параметрам.
                gPlWeap[id][ArrWeapon[WR_NUM]][P_NUM] = num; //Помечаем что для этого игрока, для этого оружия найдено совпадение.
                gPlWeap[id][ArrWeapon[WR_NUM]][P_PRIOR] = ArrWeapon[WR_SPARTYPE]; //Устанавливаем текущий приоритет.
            }
        }
    }
}
public is_par_value(id,szParam, szVariable[] ) { //Функция проверки совпадения по параметрам.
    new szVar[64];
   
    if(szParam == ST_NAME)
        get_user_name(id, szVar, charsmax(szVar) );
    if(szParam == ST_STEAM)
        get_user_authid(id, szVar, charsmax(szVar))
   
    if(equali(szVariable,szVar)) {
        return true;
    } else return false;
   
    if(szParam == ST_FLAGS) {
        if(get_user_flags(id) & read_flags(szVariable))
            return true;
        else
            return false;
    }
    return false;
}

public fw_SetModel(entity, model[]) { //Замена модели на земле.
    if(!is_valid_ent(entity))
        return FMRES_IGNORED;
   
    static szClassName[33];
    entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName));
       
    if(!equal(szClassName, "weaponbox"))
        return FMRES_IGNORED;

    static iOwner;
    iOwner = entity_get_edict(entity, EV_ENT_owner);
    static iweaponID;
   
    for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
        if(gPlWeap[iOwner][iweap][P_NUM] != -1) {
            if(equal(model, gWeapon[iweap][WEAP_MODELS])) {
                iweaponID = find_ent_by_owner(-1, gWeapon[iweap][WEAP_NAME], entity);
               
                if(!is_valid_ent(iweaponID))
                    return FMRES_IGNORED;
           
                static ArrWeapon[STRWEAPREAD];
                ArrayGetArray(gArrWeapon,gPlWeap[iOwner][iweap][P_NUM],ArrWeapon);
               
                entity_set_model(entity, ArrWeapon[WR_MODELW]);
                return FMRES_SUPERCEDE;
            }
        }
    }
    return FMRES_IGNORED;
}
public Ham_Deploy_Post(ent) { //Замена модели в руках.
    const XO_WEAPON  = 4
    const m_pPlayer  = 41
   
    new id = get_pdata_cbase( ent, m_pPlayer, XO_WEAPON );
    replace_weapon_models(id);
}
replace_weapon_models(id) {
    if(is_user_alive(id)) {
        new weapon = get_pdata_int(get_pdata_cbase(id, 373, 5), 43, 4)
        for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
            if(gPlWeap[id][iweap][P_NUM] != -1) {
                if(weapon == gWeapon[iweap][WEAP_CSW]) {
                   
                    static ArrWeapon[STRWEAPREAD];
                    ArrayGetArray(gArrWeapon,gPlWeap[id][iweap][P_NUM],ArrWeapon);
                   
                    set_pev(id, pev_viewmodel2, ArrWeapon[WR_MODELV]);
                    set_pev(id, pev_weaponmodel2, ArrWeapon[WR_MODELP]);
                }
            }
        }
    }
}
public ItemDeploy_Knife_Post(ent) { //Меняем модели ножа.
   
    const XO_WEAPON  = 4
    const m_pPlayer  = 41
   
    new id = get_pdata_cbase( ent, m_pPlayer, XO_WEAPON );
   
    for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
        if(gPlWeap[id][iweap][P_NUM] != -1) {
            if(gWeapon[iweap][WEAP_CSW] == CSW_KNIFE) {
                static ArrWeapon[STRWEAPREAD];
                ArrayGetArray(gArrWeapon,gPlWeap[id][iweap][P_NUM],ArrWeapon);
               
                set_pev(id, pev_viewmodel2, ArrWeapon[WR_MODELV]);
                set_pev(id, pev_weaponmodel2, ArrWeapon[WR_MODELP]);
            }
        }
    }
}
 
Сообщения
6
Реакции
1
Предупреждения
5
Оказывается что плагин работает, но не работает выдача только по флагам.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу