Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила форума

Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов.
Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу.
Для поиска плагинов и модов существует соответствующий раздел.

Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены.
Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер

playermodel.amxx

, НАСТРОЙКА
Статус пользователя dezdumona
сообщение 5.6.2013, 18:40
Сообщение #1


Стаж: 12 лет

Сообщений: 51
Благодарностей: 1
Полезность: < 0

Этот плагин как известно меняет модели игрокам. Все прекрасно работает, но мне бы хотелось чтоб файл модели скачавался клиенту только в тот момент когда игрок с нестандартной моделью находиться непосредственно на сервере.
Подскажите как это можно реализовать.

исходник тут
Код
#include <amxmodx>
#include <amxmisc>
#include <cstrike>

// ---- [debug settings]

#define DEBUG_MODE 0

#define DEBUG_LOGFILE "playermodel.log"
#define DEBUG_MSG_BEGIN "========= PLAYERMODEL DEBUG ========="
#define DEBUG_MSG_END   "====================================="
#define DEBUG_MSG_ERROR "[PLAYERMODEL ERROR] "
#define DEBUG_MSG_LOG "[PLAYERMODEL LOG] "

// ---- [end]


// ---- [console messages]

#define CONSOLE_MSG_HLIN "----------------------------------------"
#define CONSOLE_MSG_HEAD "[PLAYERMODEL - Models.ini]"
//#define CONSOLE_MSG_FOOT "[PLAYERMODEL - End of Models.ini]"
#define CONSOLE_MSG_MODELS_LIST "[MODELS]"

#define CONSOLE_MSG_DEL_INVALID "Invalid number. Type amx_playermodel_ini to get models index."
#define CONSOLE_MSG_DEL_DELETED "Line %s has been deleted."
#define CONSOLE_MSG_DEL_UPDATED "Current game model settings have been updated"
#define CONSOLE_MSG_SET_RESTART "You need to restart map to apply changes."
#define CONSOLE_MSG_SET_UPDATE "Models.ini has been updated."
#define CONSOLE_MSG_SET_ADD "Line added to Models.ini."
#define CONSOLE_MSG_SET_NORESTART "Model(s) have been set with precached files - no need to restart."
#define CONSOLE_MSG_SET_MODEL_INVALID "Invalid Model: %s. ^nType 'amx_playermodel_models to get a list of valid models"
#define CONSOLE_MSG_SET_ID_INVALID "Invalid ID"
#define CONSOLE_MSG_MODELSLIST_FOOT "(*) - Models that have been precached in this session."
#define CONSOLE_MSG_ACCESS_INVALID "You don't have admin access change/view models.."
#define CONSOLE_MSG_INI_CREATE "** Models.ini has just been created."
// ---- [end]


// ---- [constants indexes]

#define LN_TYPE_BLANK 0
#define LN_TYPE_VALID 1

#define AUTH_TYPE_BOTNAME 0
#define AUTH_TYPE_STEAMID 1
#define AUTH_TYPE_IP 2

// ---- [end]


// ---- [general settings]

#define MODELSINI_SCRATCH_LIMIT 9 //blank lines may be overwritten in models.ini after this line number

//max models in models.ini..
#define MAX_MODELS 64
#define MAX_PLAYERS 33

// max cs and cz models,
// shouldn't be changed unless there's a valve update...
#define MAX_CZ_MODELS 5
#define MAX_CS_MODELS 4

#define TAG_BOTDEFAULT "*BOTDEFAULT"
#define TAG_DEFAULT "*DEFAULT"
#define TAG_FORCEPRECACHE_CHAR "*"
#define TAG_COMMANDSET_BY_STEAMID "&"
#define TAG_COMMANDSET_BY_IP "%"
#define TAG_COMMANDSET_NULL "_"
#define TAG_REPLACE "*REPLACE"

#define STATUS_MODEL_NOTSET 0
#define STATUS_MODEL_SETBYID 1
#define STATUS_MODEL_BOTDEFAULT 2
#define STATUS_MODEL_DEFAULT 4
#define STATUS_MODEL_REPLACEMENT 8
#define STATUS_MODEL_NOMODEL 16
#define STATUS_MODEL_RESET 32

#define SETMODEL_RESET -4
#define SETMODEL_REPLACE -3
#define SETMODEL_DEFAULT -2
#define SETMODEL_BOTDEFAULT -1

#define NULLINDEX 8080 //-1 is being used...
#define REPLACEMENT_SIGN "$"


// ---- [end]


// Globals
new g_PlayerId[MAX_MODELS][25] // list of players ids
new g_PrecachedList[MAX_MODELS][32]
new g_PrecachedCount
new g_ModelInfo[2][MAX_MODELS] // info about the models for each team
new g_ModelsCount //models count    

new g_ModelStatus[MAX_PLAYERS] // array to check if a player model has been set, so it won't be set
              //  unless it's necessary
new g_BotsModel[2] = {-1,-1}// bots' unique model
new g_DefaultModel[2] = {-1, -1} // human's default model

#if DEBUG_MODE == 1
new logmsg[192]
#endif

public plugin_init() {
    
    register_plugin("Player Model", "2.13c", "commonbullet")
    
    register_event("ResetHUD", "set_players_models", "be")
    
    register_logevent ("auto_balance_triggered", 4, "3=auto")
    
    register_concmd ("amx_playermodel_ini","list_ini",ADMIN_KICK,"list models.ini")
    register_concmd ("amx_playermodel_del","del_line",ADMIN_KICK,"<line>")
    register_concmd ("amx_playermodel_models","list_models",ADMIN_KICK,"list valid models")
    register_concmd ("amx_playermodel_set","set_line",ADMIN_KICK,"<*modelname> | <steam|id|ip|botname> <model1> <model2>")
    register_cvar ("amx_playermodel_round_checkid", "0")

}


// ---- [Models.ini handlers]

public list_ini (id,level,cid) {
    
    if (!cmd_access(id, level, cid, 0)) {
        console_print(id, CONSOLE_MSG_ACCESS_INVALID)
        return PLUGIN_HANDLED
    }
    
    new path[66]
    new validlines[MAX_MODELS]
    new vlinesnum
    new linestr[100]
    new len = 0
    
    get_inipath(path,65)
    get_ini_lines(validlines,vlinesnum,LN_TYPE_VALID)
    
    console_print(id, "^n%s^n%s^n%s",CONSOLE_MSG_HLIN,CONSOLE_MSG_HEAD,CONSOLE_MSG_HLIN)
    
    for (new i = 0;i<vlinesnum;i++){
        read_file (path,validlines[i],linestr,99,len)
        console_print(id, "[%d]^t^t%s",i+1,linestr)
    }
    console_print(id, CONSOLE_MSG_HLIN)    
    
    return PLUGIN_HANDLED
    
}



public del_line (id,level,cid){
    
    if (!cmd_access(id, level, cid, 0)){        
        console_print(id, CONSOLE_MSG_ACCESS_INVALID)
        return PLUGIN_HANDLED
    }
    
    new numst[2]
    new num
    new bool:isvalidnum
    new validlines[MAX_MODELS]
    new vlinesnum
    new msg[128]
    new bool:updated
    
    read_argv (1,numst,2)
    num = str_to_num(numst)
    
    if (strlen(numst)==0 || !num){
        list_ini(id,level,cid)
        console_print(id, CONSOLE_MSG_DEL_INVALID)
        return PLUGIN_HANDLED
    }
    
    else {
    
        get_ini_lines(validlines,vlinesnum,LN_TYPE_VALID)        
        isvalidnum = (num <= vlinesnum) ? true : false
        if (isvalidnum) {
            
            new authid[20]
            new linestr[30]
            new path[66]
            new len            
            
            get_inipath(path,65)
            read_file (path,validlines[num-1],linestr,29,len)
            
            parse (linestr,authid,19)            
            write_file (path, "", validlines[num-1])
            
            format (msg,127,CONSOLE_MSG_DEL_DELETED,num)
            console_print(id, "!! %s", authid)
            if(equali(authid,TAG_BOTDEFAULT)) {
                new bots[32]
                new botnum
                
                get_players (bots,botnum,"d")            
                g_BotsModel[0] = -1
                g_BotsModel[1] = -1
                updated = true
                
                for (new i=0;i<botnum;i++) {                                    
                    g_ModelStatus[bots[i]] |= STATUS_MODEL_RESET                
                    set_players_models(bots[i])                    
                }                
            }
            
            else if(equali(authid, TAG_DEFAULT)) {
                new players[32]
                new playersnum
                
                get_players(players, playersnum, "c")
                g_DefaultModel[0] = -1
                g_DefaultModel[1] = -1
                updated = true
                for(new i = 0; i < playersnum; i++) {
                    g_ModelStatus[players[i]] |= STATUS_MODEL_RESET
                    set_players_models(players[i])
                }                    
            }
            
            else if(equal(authid, TAG_REPLACE)) {
                new players[32]
                new playersnum
                new modelname[32]
                new modelfind[32]
                new modelreplace[32]        
        
                parse(linestr, authid, 1, modelfind, 31, modelreplace, 31)
                
                for(new ind = 0; ind < MAX_MODELS; ind++) {
                    if(!equal(g_PlayerId[ind], REPLACEMENT_SIGN))
                        continue
                    if(equal(g_ModelInfo[0][ind], modelfind) && equal(g_ModelInfo[1][ind], modelreplace)) {
                        for (new i=ind;i<(g_ModelsCount-1);i++){
                            g_PlayerId[i] = g_PlayerId[i+1]
                            g_ModelInfo[i] = g_ModelInfo[i+1]
                            g_ModelsCount--
                            break
                        }
                    }
                }
                
                get_players(players, playersnum)
                for(new i = 0; i < playersnum; i++) {
                    cs_get_user_model(players[i], modelname, 31)
                    if(equal(modelname, modelreplace)) {
                        g_ModelStatus[players[i]] |= STATUS_MODEL_RESET
                        set_players_models(players[i])
                    }
                }
                updated = true
            }
            
            else if (!(strfind(authid,TAG_FORCEPRECACHE_CHAR) > -1) && strlen(authid)>1) {                            
                new ind = find_registered_id(authid)            
                if (ind > -1){
                    
                    new players[32]
                    new playersnum
                    new authtype
                    new checkid                    
                                        
                    for (new i=ind;i<(g_ModelsCount-1);i++){
                        g_PlayerId[i] = g_PlayerId[i+1]
                        g_ModelInfo[i] = g_ModelInfo[i+1]
                    }
                    
                    g_ModelsCount--                
                    get_players (players,playersnum)
            
                    for (new i=0;i<playersnum;i++) {                        
                        check_authtype(players[i],authid,authtype,checkid)                        
                        if (checkid) {
                            g_ModelStatus[players[i]] |= STATUS_MODEL_RESET
                            set_players_models(players[i])
                            break
                        }                                
                    }
                    if (checkid)
                        updated = true
                }                
                
            }
            list_ini(id,level,cid)
            console_print(id, CONSOLE_MSG_DEL_DELETED,num)
            if (updated)
                console_print(id, CONSOLE_MSG_DEL_UPDATED)            
            
        }
        else {
            list_ini(id,level,cid)
            console_print(id, CONSOLE_MSG_DEL_INVALID)
            return PLUGIN_HANDLED
        }
    }
    
    
        
    return PLUGIN_HANDLED
    
}

public list_models(id,level,cid){
    
    if (!cmd_access(id, level, cid, 0)){
        console_print(id, CONSOLE_MSG_ACCESS_INVALID)
        return PLUGIN_HANDLED
    }
    
    new models [32][16]
    new teamid
    new len
    new tabcount
    new indexstr[8]
    new msghead[3][] = {
        "CT Default Models^n",
        "T Default Models^n",
        "Available Custom Models^n"
    }
    new msg[256]
    
    for (new i=0;i<3;i++){
        
        switch (i){
            case 0:{                
                teamid = 1
                get_default_models (models,len,teamid)
            }
            case 1:{
                teamid = 0
                get_default_models (models,len,teamid)
            }
            case 2:{
                get_custom_models (models,len,31)
            }
        }
        
        format(msg,96,"%s%s^n",msghead[i],CONSOLE_MSG_HLIN)
        
        for (new q=0;q<len;q++){
            
            strcat(msg,models[q],255)
            
            if (i<2){
                format (indexstr,7," (#%d)",q+1)
                strcat (msg,indexstr,255)
            }
            else if (find_precached_ind(models[q])>-1){
                format(indexstr,7," (*)")
                strcat (msg,indexstr,255)
            }
                
            
            if (tabcount < 3)
                strcat(msg,"^t^t^t^t",255)
            else if ((q+1)<len) {
            
                strcat(msg,"^n",255)
                
                tabcount = 0;
            }
            
            tabcount ++
                
        }
        console_print(id, "%s^n",msg)        
        tabcount = 0
    }
    console_print(id, CONSOLE_MSG_MODELSLIST_FOOT)
        
    return PLUGIN_HANDLED

}

public set_line (id,level,cid){
    
    if (!cmd_access(id, level, cid, 0)){
        console_print(id, CONSOLE_MSG_ACCESS_INVALID)
        return PLUGIN_HANDLED
    }
    
    new arg1[32]
    new arg2[32]
    new arg3[32]
    new forceprecache
    
    read_argv (1,arg1,31)
    read_argv (2,arg2,31)
    read_argv (3,arg3,31)
    
    if (strlen(arg1)==0){
        console_print(id, CONSOLE_MSG_SET_ID_INVALID)
        return PLUGIN_HANDLED
    }
    
    if ((strfind (arg1,TAG_FORCEPRECACHE_CHAR)==0) && (strlen(arg2)==0) && (strlen(arg3)==0) && (!equali(arg1,TAG_BOTDEFAULT))){
                
        substr (arg1,arg3,31,1)
        
        if (is_valid_model(arg3))
            forceprecache = 1
        
        else {
            console_print(id, CONSOLE_MSG_SET_MODEL_INVALID,arg2)
            return PLUGIN_HANDLED
        }        
        
    }
    
    else {
        if (strfind (arg1,TAG_COMMANDSET_BY_STEAMID) ==0){
            
            new temp[32]
            new pid
            
            substr (arg1,temp,31,1)
            
            pid = get_user_index (temp)
            
            if (pid && !is_user_bot(pid))
                get_user_authid(pid,arg1,31)
            
            else {
                console_print(id, CONSOLE_MSG_SET_ID_INVALID)
                return PLUGIN_HANDLED
            }
            
        }
        
        if (strfind (arg1,TAG_COMMANDSET_BY_IP) ==0){
            
            new temp[32]
            new pid
            
            substr (arg1,temp,31,1)
            pid = get_user_index (temp)
            
            if (pid && !is_user_bot(pid))
                get_user_ip (pid,arg1,31)
            
            else{
                console_print(id, CONSOLE_MSG_SET_ID_INVALID)
                return PLUGIN_HANDLED
            }
            
        }
        
        
        
    
        if (!is_valid_model(arg2)){
            console_print(id, CONSOLE_MSG_SET_MODEL_INVALID,arg2)
            return PLUGIN_HANDLED
        }
        
        if ((strlen(arg3)>0) && !is_valid_model(arg3)){
            console_print(id, CONSOLE_MSG_SET_MODEL_INVALID,arg3)
            return PLUGIN_HANDLED
        }
    }
    
    new line    
    new blanklines[MAX_MODELS]
    new blanknum
    new linestr[100]
    new path[66]    
    new msg[128]
    new iniline
    new searchstr[21]    
    
    get_inipath(path,65)
    line = -1
    format (searchstr,20,"^"%s^"",arg1)
    
    iniline = find_line_by_id (searchstr)
    
    if (iniline>-1)
        line = iniline
    else {    
        get_ini_lines (blanklines,blanknum,LN_TYPE_BLANK)        
        if (blanknum && (blanklines[blanknum-1]>=MODELSINI_SCRATCH_LIMIT))
            line = blanklines[blanknum-1]
    }
    
    if (strlen(arg3)>0 && !forceprecache)
        format(linestr,99,"^"%s^" ^"%s^" ^"%s^"",arg1,arg2,arg3)
    
    else if (forceprecache)
        format(linestr,99,"^"%s^"",arg1)
    
    else
        format(linestr,99,"^"%s^" ^"%s^"",arg1,arg2)
    
    
    new Tind
    new CTind
    new mayupdate // may update without restart
    
    if (strfind(arg2,"#")==0){
        new error
        get_models_by_number(arg2,arg2,arg3,error)
    }
    
    Tind =  (equal(arg2, "_")) ? NULLINDEX : find_precached_ind(arg2)
    CTind = (equal(arg2, "_")) ? NULLINDEX : (strlen(arg3)>0) ? find_precached_ind(arg3) : Tind    
    
    mayupdate = (!forceprecache)? ((Tind>-1) && (CTind>-1)) : ((CTind>-1))
    
    if (mayupdate) {
        
        if (equali(arg1,TAG_DEFAULT)) {            
            new players[32]
            new playernum            
            get_players (players,playernum,"c")            
            g_DefaultModel[0] = Tind
            g_DefaultModel[1] = CTind
            
            for (new i=0; i < playernum; i++) {                            
                g_ModelStatus[players[i]] |= STATUS_MODEL_RESET                
                set_players_models(players[i])                
            }
        }
        
        if (equali(arg1,TAG_BOTDEFAULT)){            
            
            new bots[32]
            new botnum
            
            get_players (bots,botnum,"d")            
            g_BotsModel[0] = Tind
            g_BotsModel[1] = CTind
            
            for (new i=0;i<botnum;i++){                
                                
                g_ModelStatus[bots[i]] |= STATUS_MODEL_RESET                
                set_players_models(bots[i])                
            }
        }
        
        else if(equal(arg1, TAG_REPLACE)) {
            new players[32]
            new playersnum
            new modelname[32]        
            get_players(players, playersnum)
            
            new slot = find_empty_slot()
            if(slot > -1) {
                format(g_PlayerId[slot], 24, REPLACEMENT_SIGN)
                g_ModelInfo[0][slot] = Tind
                g_ModelInfo[1][slot] = CTind
                for(new i = 0; i < playersnum; i++) {
                    cs_get_user_model(players[i], modelname, 31)
                    if(equali(modelname, arg2)) {                        
                        g_ModelStatus[players[i]] |= STATUS_MODEL_RESET
                        set_players_models(players[i])
                    }
                }
            }
        }
        
        else if (!forceprecache){
        
            new ind = find_registered_id(arg1)
            new players[32]
            new playersnum
            new authtype
            new checkid            
            
            if (ind > -1){
                                
                g_ModelInfo[0][ind] = Tind
                g_ModelInfo[1][ind] = CTind                            
                format(msg,47,CONSOLE_MSG_SET_UPDATE)
            }
            
            else {                
                copy (g_PlayerId[g_ModelsCount],24,arg1)            
                g_ModelInfo[0][g_ModelsCount] = Tind
                g_ModelInfo[1][g_ModelsCount] = CTind
                ind = g_ModelsCount
                g_ModelsCount ++            
                format(msg,47,CONSOLE_MSG_SET_ADD)                
            }
                                    
            get_players (players,playersnum)
        
            for (new i=0;i<playersnum;i++){
                
                check_authtype(players[i],g_PlayerId[ind],authtype,checkid)
                
                if (checkid){
                    g_ModelStatus[players[i]] |= STATUS_MODEL_RESET
                    set_players_models(players[i])
                    break
                }            
            }                        
        }
        
        strcat (msg,"^n",127)
        strcat (msg,CONSOLE_MSG_SET_NORESTART,127)
        
        
    }
    
    else {
        format(msg,47,CONSOLE_MSG_SET_ADD,127)
        strcat (msg,"^n",127)
        strcat (msg,CONSOLE_MSG_SET_RESTART,127)
    }
    
    write_file (path,linestr,line)
    
    list_ini(id,level,cid)
    console_print(id, msg)
    
    return PLUGIN_HANDLED
    
}

find_empty_slot() {
    for(new i = 0; i < MAX_MODELS; i++) {
        if(!strlen(g_PlayerId[i]))
            return i
    }
    return -1
}

// ---- [End of Models.ini handlers]


// ---- [Shared functions]

get_inipath(path[],len){
    
    get_configsdir( path , len )
    format(path , len , "%s/models.ini",path)
    
    if (!file_exists(path)){
        write_file (path,"",-1)
        server_print (CONSOLE_MSG_INI_CREATE)
    }
}

get_ini_lines(validlines[],&vlinesnum,linetype){
    vlinesnum = 0;
    new szFile[66]
    
    get_inipath (szFile,65)    
    
    new szLine[63] , line = 0, len = 0
    
    while(read_file(szFile, line ++ , szLine , 62 , len) && vlinesnum<MAX_MODELS){
        switch (linetype){
            case LN_TYPE_VALID: {        
                
                if(szLine[0] == ';' || !len)
                    continue
                else {
                    validlines[vlinesnum] = line -1
                    vlinesnum ++
                }
            }
            case LN_TYPE_BLANK: {
                if (!len){
                    validlines[vlinesnum] = line - 1
                    vlinesnum ++
                }
            }
        }
            
    }
}

get_default_models(models[][],&len,teamid){
    
    new defaultTmodels [5][] = {        
        "terror",
        "leet",
        "arctic",
        "guerilla",
        "militia"
    }
    new defaultCTmodels[5][] = {
        "urban",
        "gsg9",
        "sas",
        "gign",
        "spetsnaz"
    }
    
    len = (is_running("czero")) ? 5 : 4
    
    for (new i=0;i<len;i++){
        if (teamid){
            copy (models[i],15,defaultCTmodels[i])
            
        }
        else {
            copy (models[i],15,defaultTmodels[i])            
        }
    }
    
}

get_custom_models(custommodels[][],&len,maxlen){
    
    new models[16]
    new modelpath [65]
    new fh = open_dir("models/player",models,31)
    
    next_file (fh,models,15)
    len = 0
    
    while (next_file(fh,models,15)){        
        format (modelpath,64,"models/player/%s/%s%s",models,models,".mdl")
        if (file_exists(modelpath) && (len < maxlen)){
            
            copy(custommodels[len],15,models)
            len ++            
        }
            
    }    
    close_dir(fh)    

}

is_valid_model(model[]){
    
    new bool:isvalid
    new lim = (is_running("czero")) ? 5 : 4
    
    if ( (strfind(model,"#")==0) && (isdigit(model[1])) ){
        new num = str_to_num (model[1])        
        if ((num>=1) && (num<=lim))
            isvalid = true
    }
    
    else if(equal(model, "_"))
        isvalid = true
    
    else {        
        for (new j=0;j<3;j++){
            
            new cdmodels[32][16]
            
            if (j<2)
                get_default_models (cdmodels,lim,j)
            
            else
                get_custom_models (cdmodels,lim,31)
            
            for (new i=0;i<lim;i++){
                if (equali(cdmodels[i],model)){
                    isvalid = true
                    break
                }
            }
            if (isvalid)
                break
        }
    }
    
    return isvalid            
    
}

get_models_by_number(numst[],Tmodel[],CTmodel[],&error=0){
    
    new Default_T_Models [5][16]
    new Default_CT_Models[5][16]
    new dlen
    
    get_default_models (Default_T_Models,dlen,0)
    get_default_models (Default_CT_Models,dlen,1)
    
    if (equal("#1",numst)){
        copy (Tmodel,31,Default_T_Models[0])
        copy (CTmodel,31,Default_CT_Models[0])
        
    }
            
    else if (equal("#2",numst)){
        copy (Tmodel,31,Default_T_Models[1])
        copy (CTmodel,31,Default_CT_Models[1])
    }
    
    else if (equal("#3",numst)){
        copy (Tmodel,31,Default_T_Models[2])
        copy (CTmodel,31,Default_CT_Models[2])
    }
    
    else if (equal("#4",numst)){
        copy (Tmodel,31,Default_T_Models[3])
        copy (CTmodel,31,Default_CT_Models[3])
    }
    
    else if (equal("#5",numst) && is_running("czero")){
        copy (Tmodel,31,Default_T_Models[4])
        copy (CTmodel,31,Default_CT_Models[4])
    }
    
    else error = 1
}

find_registered_id(idstr[]){
    new index = -1
    for (new i=0;i<g_ModelsCount;i++){
        
        if (equali(idstr,g_PlayerId[i])){
            index  = i
            break
        }        
    }
    return index    
}

find_line_by_id(idstr[]){
    
    new szFile[66]
    new idline = -1    
    get_inipath (szFile,65)    
    new szLine[21] , line = 0, len = 0
    new bool:linefound = false
    
    while(read_file(szFile, line ++ , szLine , 20 , len)){
        
        if ((strfind(szLine,idstr)==0)){
            
            if (!linefound){
                idline = line - 1
                linefound = true
            }
            // clean models.ini duplicate ids
            else
                write_file(szFile,"",line)
        }
        
    }
    
    return idline
}

find_precached_ind(model[]){
    new ind = -1
    for (new i=0;i<g_PrecachedCount;i++){
        if (equali(model,g_PrecachedList[i])){
            ind = i
            break
        }
    }
    return ind
}

check_authtype(id, checkauthid[], &authtype, &checkid=false, authid[50]=""){
    
    authtype = -1
        
    // bots don't have steamid, so they are indexed by name ...
    if (is_user_bot(id)){
        get_user_name(id,authid,49)
        checkid = (equali(authid,checkauthid))
        #if DEBUG_MODE == 1
        authtype = AUTH_TYPE_BOTNAME
        #endif            
    }
    
    //  ... while humans are supposed to have a steamid or a IP.
    else if ( strfind(checkauthid,"STEAM")>-1 || strfind (checkauthid,"VALVE")>-1) {
        get_user_authid(id,authid,49)
        checkid = equali(authid,checkauthid)
        #if DEBUG_MODE == 1
        authtype = AUTH_TYPE_STEAMID
        #endif
    }
                        
    else {
        get_user_ip (id,authid,49)
        checkid = (strfind(authid,checkauthid)>-1)
        #if DEBUG_MODE == 1
        authtype = AUTH_TYPE_IP
        #endif
    }
    return authtype
}

stock substr(const str[],dest[],len,lpos){
    
    new pos,ind
    
    for (pos=lpos;pos<strlen(str);pos++){
        if (ind<len){
            dest[ind] = str[pos]
            ind ++
        }
    }
    
}

// ---- [End of shared funtions]



#if DEBUG_MODE == 1
public debugMsg(const msg[]){
    server_print (msg)
    write_file (DEBUG_LOGFILE,msg)
}
#endif


// ---- [Precache]

public plugin_precache() {    
    
    new Default_T_Models [5][16]
    new Default_CT_Models[5][16]
    new dlen
    
    get_default_models (Default_T_Models,dlen,0)
    get_default_models (Default_CT_Models,dlen,1)    
    
    for (new i=0;i<dlen;i++){
        copy(g_PrecachedList[g_PrecachedCount],15,Default_T_Models[i])
        g_PrecachedCount ++
    }
    
    for (new i=0;i<dlen;i++){
        copy(g_PrecachedList[g_PrecachedCount],15,Default_CT_Models[i])
        g_PrecachedCount ++
    }    
    
    #if DEBUG_MODE == 1
    format (logmsg,127,DEBUG_MSG_BEGIN)
    debugMsg (logmsg)
    #endif
    
    new szFile[66]
    get_inipath (szFile,65)
    
    #if DEBUG_MODE == 1
    format (logmsg,191,"%s%s%s",DEBUG_MSG_LOG,"AMXMODX CONFIG DIR: ",szFile)
    debugMsg (logmsg)
    #endif
    
    new szLine[101]
    new line
    new len
    new mayprecache_CT
    new mayprecache_T
    new forceprecache
    new isnullmodel_CT
    new isnullmodel_T
    new isreplacement
    
    while(read_file(szFile, line ++ , szLine , 100 , len) && (g_ModelsCount < MAX_MODELS) ) {
        
        if(szLine[0] == ';' || !len) continue
    
        new arg1[32]
        new arg2[32]
        new arg3[32]
        
        mayprecache_CT = 1 //flags if a CT model needs to be precached
        mayprecache_T = 1 //flags if a T model needs to be precached
        forceprecache = 0
        isnullmodel_CT = 0
        isnullmodel_T = 0
        isreplacement = 0
        
        parse (szLine, arg1 , 24 , arg2 , 31, arg3 , 31)        
        
        if (strfind(arg2, "#")>-1) {
            
            new error
            
            mayprecache_CT = 0
            mayprecache_T = 0
            
            get_models_by_number (arg2,arg2,arg3,error)            
            if (error){
                server_print ("[model error] Invalid Model Index: %s",arg2)
                continue
            }            
        }
        
        else if ( (strfind(arg1,TAG_FORCEPRECACHE_CHAR)==0) && (strlen(arg1)>1) && (strlen(arg2)==0) && (strlen(arg3)==0)){
            
            substr(arg1,arg3,31,1)
            mayprecache_T = 0
            if (find_precached_ind(arg3)>-1)
                continue            
        }
        
                
        
        else {    
            // model replacement
            if (equali(arg1, TAG_REPLACE)) {
                if(equali(arg2, arg3))
                    continue
                isreplacement = 1
            }    
            
            // if there's only one model they'll be the same for CTs and Ts
            else if (!strlen(arg3)){
                if(!strlen(arg2))
                    continue
                copy (arg3,31,arg2)
                mayprecache_T = 0
            }
            else {
                if(equal(arg3, TAG_COMMANDSET_NULL)) {
                    isnullmodel_CT = 1
                    mayprecache_CT = 0
                }
                if(equal(arg2, TAG_COMMANDSET_NULL)) {
                    isnullmodel_T = 1
                    mayprecache_T = 0
                }
            }            
            
            // This will prevent unecessary caching.
            // for default models            
            for (new ind = 0; ind < g_PrecachedCount; ind ++) {                
                if (mayprecache_CT && equali(arg3, g_PrecachedList[ind]))
                    mayprecache_CT = 0                
                if (mayprecache_T && equali(arg2, g_PrecachedList[ind]))
                    mayprecache_T = 0                
                if (!mayprecache_CT && !mayprecache_T)
                    break        
            }                            
        }                
        
        // if it's a default model, it doesn't need to be cached    
        if (mayprecache_CT){
            
            new modelpath [65]
            format (modelpath,64,"models/player/%s/%s%s",arg3,arg3,".mdl")
            
            if (file_exists(modelpath)) {                
                #if DEBUG_MODE == 1
                format (logmsg,191,"%s%s%s",DEBUG_MSG_LOG," PRECACHING CT CUSTOM MODEL :",modelpath)
                debugMsg (logmsg)
                #endif
                
                precache_model(modelpath)                
                copy (g_PrecachedList[g_PrecachedCount],31,arg3)
                g_PrecachedCount ++                
            }
            
            else {                
                server_print ("[model error] File Not Found: %s",modelpath)
                #if DEBUG_MODE == 1
                format (logmsg,191,"[model error] File Not Found: %s",modelpath)
                debugMsg (logmsg)
                #endif
                continue
            }
        }
        
        if (mayprecache_T && (!equali(arg2,arg3))){
            
            new modelpath [65]
            format (modelpath,64,"models/player/%s/%s%s",arg2,arg2,".mdl")
            
            if (file_exists(modelpath)){
                
                #if DEBUG_MODE == 1
                format (logmsg,191,"%s%s%s",DEBUG_MSG_LOG," PRECACHING T CUSTOM MODEL :",modelpath)
                debugMsg (logmsg)                
                #endif
                
                precache_model(modelpath)
                copy (g_PrecachedList[g_PrecachedCount],31,arg2)                    
                g_PrecachedCount ++
                
            }
            else {
                server_print ("[model error] File Not Found: %s",modelpath)
                #if DEBUG_MODE == 1
                format (logmsg,191,"[model error] File Not Found: %s",modelpath)
                debugMsg (logmsg)
                #endif
                continue
            }
        }
        
        // sets bots' unique models, if specified
        
        new CTmodelind
        new Tmodelind
        
        CTmodelind = (isnullmodel_CT) ? NULLINDEX : find_precached_ind(arg3)
        Tmodelind = (isnullmodel_T) ? NULLINDEX : find_precached_ind(arg2)
        
        if ((CTmodelind>-1) && (Tmodelind>-1) && !forceprecache){
        
            if (equali(TAG_BOTDEFAULT,arg1)){
                g_BotsModel[0] = Tmodelind
                g_BotsModel[1] = CTmodelind
            }
            
            if (equali(TAG_DEFAULT, arg1)){
                g_DefaultModel[0] = Tmodelind
                g_DefaultModel[1] = CTmodelind
            }
            
            else {
                if(isreplacement)
                    format(g_PlayerId[g_ModelsCount], 24, REPLACEMENT_SIGN)
                else
                    copy(g_PlayerId[g_ModelsCount],24, arg1)
                g_ModelInfo[0][g_ModelsCount] = Tmodelind
                g_ModelInfo[1][g_ModelsCount] = CTmodelind
                g_ModelsCount++
            }
        }        
        
    }
    
    #if DEBUG_MODE == 1
    server_print(DEBUG_MSG_END)
    if (line == 0){
        format (logmsg,65,"%s models.ini EMPTY OR NOT FOUND",DEBUG_MSG_ERROR)
        debugMsg (logmsg)
    }    
    #endif
    

}

// ---- [End of Precache]


// ---- [reset models functions]

public auto_balance_triggered(){
    
    new id
    new name [32]
    new logdata0[128]
    
    read_logargv(0,logdata0,127)    
    parse_loguser(logdata0, name, 31)
    id = get_user_index(name)
    if(g_ModelStatus[id] != STATUS_MODEL_NOTSET)
        g_ModelStatus[id] |= STATUS_MODEL_RESET
    else
        g_ModelStatus[id] = STATUS_MODEL_NOTSET
    
}

public client_infochanged (id){
    if(g_ModelStatus[id] != STATUS_MODEL_NOTSET)
        g_ModelStatus[id] |= STATUS_MODEL_RESET
    else
        g_ModelStatus[id] = STATUS_MODEL_NOTSET
}

public client_command (id) {
    // check if a player selected another team
    new arg[13]
    
    if (read_argv(0, arg, 12) > 11)
        return PLUGIN_CONTINUE
        
    if (equal("chooseteam",arg) || equal ("jointeam",arg)){
        #if DEBUG_MODE == 1
        new playername[32]
        get_user_name (id,playername,31)
        format(logmsg,191,"%s%s%s(%d)",DEBUG_MSG_LOG,"RESET MODEL OF ",playername,id)
        debugMsg (logmsg)
        #endif
        g_ModelStatus[id] = STATUS_MODEL_NOTSET
        
    }
    
    return PLUGIN_CONTINUE
}


public client_disconnect(id) {

    g_ModelStatus[id] = STATUS_MODEL_NOTSET
    #if DEBUG_MODE == 1
    format (logmsg,191,"%s%s%d",DEBUG_MSG_LOG,"DISCONNECTED slot ",id)
    debugMsg (logmsg)
    #endif
    
}

// ---- [end of reset models functions]


// ---- [set models]

public set_players_models(id) {
    
    if(!is_user_connected(id))
        return PLUGIN_CONTINUE
    
    if (cs_get_user_vip(id))
        g_ModelStatus[id] = STATUS_MODEL_NOTSET
        
    //#if DEBUG_MODE == 1
    new playername[32]
    get_user_name (id,playername,31)
    //#endif
    
    if(g_ModelStatus[id] & STATUS_MODEL_RESET) {
        if(!(g_ModelStatus[id] & STATUS_MODEL_NOMODEL)) {
            cs_reset_user_model(id)
        }
        g_ModelStatus[id] = STATUS_MODEL_NOTSET
    }
            
    
    if (g_ModelStatus[id] != STATUS_MODEL_NOTSET && !get_cvar_num("amx_playermodel_round_checkid")) {
            #if DEBUG_MODE == 1        
            format (logmsg,191,"%s%s%s(%d)",DEBUG_MSG_LOG,"WON'T SET MODEL THIS TIME BECAUSE IT'S ALREADY BEEN SET ",playername,id)
            debugMsg (logmsg)
            #endif
            return PLUGIN_CONTINUE
    }
    
    //new id = read_data (1)
    new authid[50]
    
    #if DEBUG_MODE == 1
    new ip[200]
    new steamid[32]
    get_user_ip (id,ip,199)
    get_user_authid (id,steamid,31)
    format (logmsg,191,"%s%s%s(%d) - ip:%s, steamid:%s",DEBUG_MSG_LOG," PLAYER CHECK MODEL UPDATE: ",playername,id,ip,steamid)
    debugMsg (logmsg)
    #endif
    
    // avoid extra processing - models are only set when needed
    
    
    new authtype
    new checkid
    new index
    new currentmodel[32]
    new params[3]
    new name[32]
    get_user_name(id, name, 31)
    
    cs_get_user_model(id, currentmodel, 31)
    
    for (index = 0; index < g_ModelsCount; index++) {
        if(equal(g_PlayerId[index], REPLACEMENT_SIGN)) {
            if(equali(g_PrecachedList[g_ModelInfo[0][index]], currentmodel)) {
                params[0] = id
                params[1] = SETMODEL_REPLACE
                params[2] = index
                server_print("$$%d", index)
                //if(task_exists(id))
                set_task (0.8,"set_model",id,params,3)
                return PLUGIN_CONTINUE                
            }
        }
    }
    
    for (index = 0; index < g_ModelsCount; index ++) {
        if(equal(g_PlayerId[index], REPLACEMENT_SIGN))
            continue
        check_authtype(id,g_PlayerId[index],authtype,checkid,authid)
        if (checkid)
            break
    }
                        
    params[0] = id //playerid
    
    if (checkid)
        params[1] = index
    else if (is_user_bot(id)) {
        if((g_BotsModel[0]>-1) && (g_BotsModel[1]>-1)) {
            params[1] = SETMODEL_BOTDEFAULT
        }
        else {
            g_ModelStatus[id] = STATUS_MODEL_NOMODEL
            return PLUGIN_CONTINUE
        }
    }
    else if(g_DefaultModel[0] > -1 && g_DefaultModel[1] > -1) {
        params[1] = SETMODEL_DEFAULT
    }
    else {
        g_ModelStatus[id] = STATUS_MODEL_NOMODEL
        return PLUGIN_CONTINUE
    }
    
    // this delay prevents some bugs.                    
    set_task (0.8,"set_model",id,params,3)
    
            
    #if DEBUG_MODE == 1
    switch (authtype){
        case AUTH_TYPE_BOTNAME: {
            format (logmsg,191,"%s%s%s(%d)",DEBUG_MSG_LOG,"AUTH TYPE = NAME FOR BOT: ",playername,id)
            debugMsg (logmsg)
        }
        case AUTH_TYPE_STEAMID: {
            format (logmsg,191,"%s%s%s(%d) - steamid: %s",DEBUG_MSG_LOG,"AUTH TYPE = STEAMID FOR USER: ",playername,id,authid)
            debugMsg (logmsg)
        }
        case AUTH_TYPE_IP: {
            format (logmsg,191,"%s%s%s(%d) - ip: %s",DEBUG_MSG_LOG,"AUTH TYPE = IP FOR USER: ",playername,id,authid)
            debugMsg (logmsg)
        }
    }
    #endif    

    return PLUGIN_CONTINUE
}

public set_model (const params[]){
    
    new id = params[0] // playerid.
    new ind = params[1] // model index.
    new team         
    
    team = get_user_team(id) - 1
    
    if (team>=0 && team<2){
        
        if(ind == SETMODEL_REPLACE) {
            new ind2 = params[2]        
            if(g_ModelInfo[1][ind2] != NULLINDEX) {                
                cs_set_user_model(id, g_PrecachedList[g_ModelInfo[1][ind2]])
                g_ModelStatus[id] = STATUS_MODEL_REPLACEMENT
                #if DEBUG_MODE == 1
                new playername[32]
                get_user_name(id, playername, 31)
                format(logmsg, 191, "%s <%s> MODEL REPLACED %s->%s",
                    DEBUG_MSG_LOG,
                    playername,
                    g_PrecachedList[g_ModelInfo[0][ind2]],
                    g_PrecachedList[g_ModelInfo[1][ind2]])
                #endif
            }
        }
        
        //else if(ind & SETMODEL_RESET)
        //    cs_reset_user_model(id)
        else if(ind == SETMODEL_BOTDEFAULT) {
            if(g_BotsModel[team] != NULLINDEX) {
                cs_set_user_model (id, g_PrecachedList[g_BotsModel[team]])
                g_ModelStatus[id] = STATUS_MODEL_BOTDEFAULT
            }
        }
        else if(ind == SETMODEL_DEFAULT) {
            if(g_DefaultModel[team] != NULLINDEX) {
                cs_set_user_model (id, g_PrecachedList[g_DefaultModel[team]])                
                g_ModelStatus[id] = STATUS_MODEL_DEFAULT
            }
        }
            
        else {
            if(g_ModelInfo[team][ind] != NULLINDEX) {
                cs_set_user_model (id, g_PrecachedList[g_ModelInfo[team][ind]])
                #if DEBUG_MODE == 1
                new playername[32]
                get_user_name (id,playername,31)
                format (logmsg,191,"%s%s<%s(%d)> HAS BEEN SET TO <%s>",DEBUG_MSG_LOG,"MODEL OF ",playername,id,g_PrecachedList[g_ModelInfo[team][ind]])
                debugMsg (logmsg)
                #endif
                g_ModelStatus[id] = STATUS_MODEL_SETBYID
            }
        }        
        
    }
    
}
// ---- [end of set models]
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
urpok
сообщение 5.6.2013, 19:04
Сообщение #2
Стаж: 13 лет

Сообщений: 890
Благодарностей: 164
Полезность: 0

Спрячь под споллер.

Вот исходник, им можешь заменить любую модельку, для любого игрока:
Прикрепленный файл  playermodel.sma ( 31,47 килобайт ) Кол-во скачиваний: 117


Модельки буду видны всем, но только на твоём сервере. Модельки тебе придётся качать самому, в инете их как гомна.

Вот, файл .ini в нём меняешь и управляешь, модельками:
models.ini

Отредактировал: HeBuguMka, - 5.6.2013, 19:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя LaFA
сообщение 5.6.2013, 19:07
Сообщение #3


Стаж: 16 лет

Сообщений: 4505
Благодарностей: 3256
Полезность: 793

Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя stefkone
сообщение 5.6.2013, 19:41
Сообщение #4


Иконка группы

Стаж: 19 лет

Сообщений: 1711
Благодарностей: 1130
Полезность: 1068

Цитата(LaFA @ 5.6.2013, 20:07) *
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст
Скрытый текст

улыбнуло
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя dezdumona
сообщение 6.6.2013, 21:42
Сообщение #5


Стаж: 12 лет

Сообщений: 51
Благодарностей: 1
Полезность: < 0

Цитата(HeBuguMka @ 5.6.2013, 21:04) *
Спрячь под споллер.

Вот исходник, им можешь заменить любую модельку, для любого игрока:
Прикрепленный файл  playermodel.sma ( 31,47 килобайт ) Кол-во скачиваний: 117


Модельки буду видны всем, но только на твоём сервере. Модельки тебе придётся качать самому, в инете их как гомна.

Вот, файл .ini в нём меняешь и управляешь, модельками:
models.ini

Я не понимаю зачем Вы мне выдали тот же файл что я указал. Мне необходимо его отредактировать так чтоб файл скачавалась ТОЛЬКО когда игрок с нестандартной молькой играет на сервере.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Rejiser
сообщение 6.6.2013, 21:53
Сообщение #6


Стаж: 15 лет

Сообщений: 2261
Благодарностей: 1068
Полезность: 870

Цитата(dezdumona @ 6.6.2013, 23:42) *
Я не понимаю зачем Вы мне выдали тот же файл что я указал. Мне необходимо его отредактировать так чтоб файл скачавалась ТОЛЬКО когда игрок с нестандартной молькой играет на сервере.

Невозможно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: