Allied Modders en español

Versión completa: Plugin de sistema de puntos no guarda al salir del juego.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas tardes gente, como andan ¿Todo bién? Saben que encontré un ZP por ahí y lo empecé a modificar un poco (realmente se muy poco sobre programación, edito las cosas básicas que no afectan al código). En este mismo tengo un sistema de skins (https://forums.alliedmods.net/showthread.php?t=262077) el cual te genera puntos por frags utilizando cierta arma, y al llegar a tanta cantidad de puntos con esa misma arma, desbloqueas una skin para la misma. Lo que pasa es que está todo bien al momento de salir juego, el cual no se guardan esos puntos generados, al momento de entrar al server vuelven a cómo estaban antes, en 0. Estaría re agradecido si pueden darme un mano con esto, les dejo el .sma del plugin acá abajo. Si necesitan de algo más solo díganmelo, saludos!
Código:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>

#define SAVETIME_MIN 0.5
#define SAVETIME_MAX 3.0
#define LOADTIME 2.5

#define MAXWEAPONS 30
#define SKINSPERWEAPONS 10
#define POINTSLEN 6

#define PORT 1

#pragma semicolon 1

new const PLUGIN[] = "Skin System";
new const VERSION[] = "2.33";
new const AUTHOR[] = "DeRoiD";

new KillPoints[31][33], Skin[31][SKINSPERWEAPONS],
vSkinMdl[31][SKINSPERWEAPONS][64], pSkinMdl[31][SKINSPERWEAPONS][64],
SkinName[31][SKINSPERWEAPONS][32], Already[31], Cvar_Save, pSave[3][32][33];
new PointsFile[64], SkinsFile[64];

new const WeaponNames[][] =
{
    "", "P228", "", "Scout", "He Grenade", "XM1014", "", "MAC10", "AUG",
    "", "Elite", "FiveSeven", "UMP45", "SG550", "Galil", "FAMAS",
    "USP", "Glock18", "AWP", "MP5", "M249", "M3", "M4A1", "TMP", "G3SG1",
    "", "Deagle", "SG552", "AK47", "Knife", "P90"
};
new const WeaponEntNames[][] =
{
    "weapon_p228", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_mac10",
    "weapon_aug", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
    "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp",
    "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp",
    "weapon_g3sg1", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90"
};

public plugin_init()
{    
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_cvar(PLUGIN, AUTHOR, FCVAR_SERVER);
    
    Cvar_Save = register_cvar("skin_s_savemod", "0");
    
    register_clcmd("say", "Say");
    register_clcmd("say_team", "Say");
    
    for(new Num; Num < sizeof WeaponEntNames; Num++)
    {
        RegisterHam(Ham_Item_Deploy, WeaponEntNames[Num], "WeaponModel", 1);
    }
    
    register_forward(FM_ClientUserInfoChanged, "NameChange");
    register_dictionary("skinsystem.txt");
    
    LoadSkins();
}
public plugin_precache() {
    static ConfigsDir[64];
    get_localinfo("amxx_configsdir", ConfigsDir, 63);
    formatex(PointsFile, 63, "%s/skinsystem/save.ini", ConfigsDir);
    formatex(SkinsFile, 63, "%s/skinsystem/skins.cfg", ConfigsDir);
    
    new Len, Line[256], Data[3][48], FileLine;
    FileLine = file_size(SkinsFile, 1);
    for(new Num = 0; Num < FileLine; Num++)
    {
        read_file(SkinsFile, Num, Line, 255, Len);
        parse(Line, Data[0], 31, Data[1], 47, Data[2], 47);
        
        if(Line[0] == ';' || strlen(Line) < 5)
            continue;

        remove_quotes(Data[1]);
        remove_quotes(Data[2]);
        
        if(containi(Data[1], ".mdl") != -1)
        {
            precache_model(Data[1]);
        }
                    
        if(containi(Data[2], ".mdl") != -1)
        {
            precache_model(Data[2]);
        }
    }
}
public NameChange(Player)
{
    if(!is_user_connected(Player) || get_pcvar_num(Cvar_Save) != 0)
        return FMRES_IGNORED;

    new OldName[32], NewName[32], Name[32];
    get_user_name(Player, Name, 31);
    pev(Player, pev_netname, OldName, charsmax(OldName));
    if(OldName[0])
    {
        get_user_info(Player, "name", NewName, charsmax(NewName));
        if(!equal(OldName, NewName))
        {
            remove_task(Player);
            
            LoadPlayer(Player);
            LoadPoints(Player);
        }
    }
    return FMRES_IGNORED;
}
public WeaponModel(Weapon) {
    new Player = get_pdata_cbase(Weapon, 41, 4);
    new WeaponID = cs_get_weapon_id(Weapon);
    
    if(Player > 32 || Player < 1
    || WeaponID < 1 || WeaponID > 30)
    {
        return HAM_SUPERCEDE;
    }
    
    for(new Num = 1; Num < MAXWEAPONS; Num++)
    {
        if(Num == WeaponID)
        {
            for(new x; x < Already[WeaponID]; x++)
            {
                if(KillPoints[WeaponID][Player] >= Skin[WeaponID][x])
                {
                    if(containi(vSkinMdl[WeaponID][x], ".mdl") != -1)
                    {
                        set_pev(Player, pev_viewmodel2, vSkinMdl[WeaponID][x]);
                    }
                    if(containi(pSkinMdl[WeaponID][x], ".mdl") != -1)
                    {
                        set_pev(Player, pev_weaponmodel2, pSkinMdl[WeaponID][x]);
                    }
                }
            }
        }
    }
    return HAM_IGNORED;
}
public LoadSkins() {
    new File;
    File = fopen(SkinsFile, "rt");
    
    if(File)
    {
        new Line[256], Type[32], Data[5][64];
        while(!feof(File))
        {
            fgets(File, Line, 255);
            
            if(Line[0] == ';' || strlen(Line) < 5)
                continue;
                
            parse(Line, Type, 31);
            
            for(new Num = 1; Num < MAXWEAPONS+1; Num++)
            {
                if(Already[Num] >= SKINSPERWEAPONS)
                    continue;
                
                if(equali(Type, WeaponNames[Num]))
                {
                    parse(Line, Data[0], 63, Data[1], 63, Data[2], 63, Data[3], 63, Data[4], 63);
                    copy(vSkinMdl[Num][Already[Num]], 63, Data[1]);
                    copy(pSkinMdl[Num][Already[Num]], 63, Data[2]);
                    copy(SkinName[Num][Already[Num]], 31, Data[4]);
                    Skin[Num][Already[Num]] = str_to_num(Data[3]);
                    Already[Num]++;
                }
            }
        }
        fclose(File);
    }
}
public client_death(Killer, Victim, Weapon)
{
    if(Killer == Victim
    || Killer > 32 || Killer < 1
    || Weapon == 25 || Weapon == 9
    || Weapon < 1 || Weapon > 30)
    {
        return PLUGIN_HANDLED;
    }
    
    set_task(random_float(SAVETIME_MIN, SAVETIME_MAX), "SavePoints", Killer);
    KillPoints[Weapon][Killer]++;
    
    return PLUGIN_CONTINUE;
}
public ShowSkins(Player, i)
{
    new MotdTitle[64];
    formatex(MotdTitle, 63, "%L", LANG_SERVER, "MOTD1");
    
    new Motd[1024], Line[256];
    formatex(Line, 255, "<body bgcolor=^"black^">^n<font color=^"red^">^n");
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<p align=^"center^">%s %s by: %s</p></font>^n<font color=^"greenyellow^">^n", PLUGIN, VERSION, AUTHOR);
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<p align=^"center^">%L:</p></font>^n", LANG_SERVER, "SKINS", WeaponNames[i]);
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<h5>^n<font color=^"white^">^n");
    add(Motd, 1023, Line, 255);
    
    for(new Num; Num < MAXWEAPONS; Num++)
    {
        if(Num != i)
        continue;
        formatex(Line, 255, "<p>");
        add(Motd, 1023, Line, 255);
        for(new x; x < SKINSPERWEAPONS; x++)
        {
            if(strlen(SkinName[Num][x]) < 2)
                continue;
            
            formatex(Line, 255, "<br>%s: (%L)", SkinName[Num][x], LANG_SERVER, "KILLS", Skin[Num][x]);
            add(Motd, 1023, Line, 255);
        }
        formatex(Line, 255, "</p>");
        add(Motd, 1023, Line, 255);
    }
    
    formatex(Line, 255, "^n</h5>^n</font>^n</body>");
    add(Motd, 1023, Line, 255);
    show_motd(Player, Motd, MotdTitle);
}
public ShowPoints(Player, Target)
{
    new Name[32], MotdTitle[64];
    get_user_name(Target, Name, 31);
    
    formatex(MotdTitle, 63, "%L", LANG_SERVER, "PKILLS", Name);
    
    new Motd[1024], Line[256];
    formatex(Line, 255, "<body bgcolor=^"black^">^n<font color=^"red^">^n");
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<p align=^"center^">%s %s by: %s</p></font>^n<font color=^"white^">^n", PLUGIN, VERSION, AUTHOR);
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<p align=^"center^">%L:</p></font>^n", LANG_SERVER, "PKILLS", Name);
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<font color=^"cyan^">^n");
    add(Motd, 1023, Line, 255);
    formatex(Line, 255, "<h5>^n");
    add(Motd, 1023, Line, 255);

    if(Target > 0)
    {
        formatex(Line, 255, "<p align=^"center^">");
        add(Motd, 1023, Line, 255);
        new Len;
        for(new Num = 1; Num < MAXWEAPONS+1; Num++)
        {
            if(Num == 2 || Num == 6 || Num == 9 || Num == 25)
            {
                continue;
            }
            
            Len++;
            
            if(Len < POINTSLEN)
            {
                formatex(Line, 255, " %s: %d |", WeaponNames[Num], KillPoints[Num][Target]);
                add(Motd, 1023, Line, 255);
            }
            else
            {
                Len = 0;
                formatex(Line, 255, " %s: %d</p>^n<p align=^"center^">", WeaponNames[Num], KillPoints[Num][Target]);
                add(Motd, 1023, Line, 255);
            }
        }
        formatex(Line, 255, "</p>");
        add(Motd, 1023, Line, 255);
    }
    
    formatex(Line, 255, "^n</h5>^n</font>^n</body>");
    add(Motd, 1023, Line, 255);
    show_motd(Player, Motd, MotdTitle);
}
public Say(Player)
{
    new Message[32];
    read_args(Message, 31);
    remove_quotes(Message);
    
    if(equali(Message, "/mykills"))
    {
        ShowPoints(Player, Player);
    }
    else if(containi(Message, "/skins") != -1)
    {
        for(new Num; Num < MAXWEAPONS+1; Num++)
        {
            if(containi(Message, WeaponNames[Num]) != -1)
            {
                ShowSkins(Player, Num);
                return PLUGIN_HANDLED;
            }
        }
    }
    else
    {
        new TargetName[32], Name[32], Command[32];
        parse(Message, Command, 31, TargetName, 31);
        if(equali(Command, "/kill"))
        {
            for(new Target; Target < 32; Target++)
            {
                if(Target == Player || !is_user_connected(Target))
                {
                    continue;
                }
                
                get_user_name(Target, Name, 31);
                
                if((containi(Name, TargetName) != -1))
                {
                    if(equali(Name, TargetName))
                    ShowPoints(Player, Target);
                    else if(strlen(TargetName) > 3)
                    ShowPoints(Player, Target);
                    return PLUGIN_HANDLED;
                }
            }
        }
    }
    return PLUGIN_CONTINUE;
}
public client_putinserver(Player)
{
    remove_task(Player);
    set_task(LOADTIME, "LoadPoints", Player);
}
public client_connect(Player)
{
    LoadPlayer(Player);
}
public LoadPoints(Player)
{
    if(!is_user_connected(Player))
    {
        return PLUGIN_HANDLED;
    }
    
    new File;
    File = fopen(PointsFile, "rt");
    
    if(File)
    {
        new Line[256];
        new LineName[32], Data[31][8];
        
        while(!feof(File))
        {
            fgets(File, Line, 255);
            
            if(Line[0] == ';' || strlen(Line) < 2)
                continue;
                
            parse(Line, LineName, 31);
            
            if(equal(LineName, pSave[get_pcvar_num(Cvar_Save)][Player]))
            {
                parse(Line, Data[0], 7, Data[1], 7, Data[2], 7, Data[3], 7, Data[4], 7, Data[5], 7,
                Data[6], 7, Data[7], 7, Data[8], 7, Data[9], 7, Data[10], 7, Data[11], 7, Data[12], 7,
                Data[13], 7, Data[14], 7, Data[15], 7, Data[16], 7, Data[17], 7, Data[18], 7, Data[19], 7,
                Data[20], 7, Data[21], 7, Data[22], 7, Data[23], 7, Data[24], 7, Data[25], 7, Data[26], 7,
                Data[27], 7, Data[28], 7, Data[29], 7, Data[30], 7);
                
                for(new Num = 1; Num < MAXWEAPONS+1; Num++)
                {
                    KillPoints[Num][Player] = str_to_num(Data[Num]);
                }
                return PLUGIN_HANDLED;
            }
        }
        fclose(File);
    }
    return PLUGIN_CONTINUE;
}
public SavePoints(Player)
{
    if(!is_user_connected(Player))
    {
        return PLUGIN_HANDLED;
    }
    
    new File;
    File = fopen(PointsFile, "rt");
    
    if(File)
    {
        new Line[192], LineNum;
        
        new LineName[32], bool:Found;
        
        while(!feof(File))
        {
            fgets(File, Line, 191);
            
            if(Line[0] == ';' || strlen(Line) < 2)
                continue;
                
            parse(Line, LineName, 31);
            
            if(equal(LineName, pSave[get_pcvar_num(Cvar_Save)][Player]) && !Found)
            {
                new SaveLine[256], PlayerPoints[256], String[8];
                
                for(new Num = 1; Num < MAXWEAPONS+1; Num++)
                {
                    format(String, 7, "^"%i^" ", KillPoints[Num][Player]);
                    add(PlayerPoints, 255, String);
                }
                
                formatex(SaveLine, 255, "^"%s^" %s", pSave[get_pcvar_num(Cvar_Save)][Player], PlayerPoints);
                write_file(PointsFile, SaveLine, LineNum);
                Found = true;
                return PLUGIN_HANDLED;
            }
            
            LineNum++;
        }
        
        if(!Found)
        {
            new SaveLine[256], PlayerPoints[256], String[8];
                
            for(new Num; Num < MAXWEAPONS; Num++)
            {
                format(String, 7, "^"%i^" ", KillPoints[Num][Player]);
                add(PlayerPoints, 255, String);
            }
            
            formatex(SaveLine, 255, "^"%s^" %s", pSave[get_pcvar_num(Cvar_Save)][Player], PlayerPoints);
            write_file(PointsFile, SaveLine);
            return PLUGIN_HANDLED;
        }
        fclose(File);
    }
    return PLUGIN_CONTINUE;
}
stock LoadPlayer(Player)
{
    new Num;
    for(Num = 1; Num < MAXWEAPONS+1; Num++)
    {
        KillPoints[Num][Player] = 0;
    }
    
    for(Num = 0; Num < 2; Num++)
    {
        pSave[0][Player] = "";
    }
    get_user_name(Player, pSave[0][Player], 31);
    get_user_ip(Player, pSave[1][Player], 31, PORT);
    get_user_authid(Player, pSave[2][Player], 31);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
*/
usa sql o vault
Sistema de cuentas MY/SQlite
https://amxmodx-es.com/showthread.php?tid=43

Tuto de Sqlite
https://amxmodx-es.com/showthread.php?tid=786

Te recomiendo mucho usar el guardado mysqlite es el mas bueno para todo, todos los otros guardados me han dado malas experiencias.
Pero si no entendes nada aca hay uno de adv vault que es el que mas safa entre los guardados.

https://amxmodx-es.com/showthread.php?tid=4954 (mi favorito)
https://amxmodx-es.com/showthread.php?tid=5627 (csAxel)

Tuto de adv vault (hecho por su propio creador)
https://amxmodx-es.com/showthread.php?tid=2950
(24/11/2021, 11:43 PM)Hinami escribió: [ -> ]usa sql o vault

Gracias por la recomenación!

(25/11/2021, 12:27 AM)[E]manuelitop15 escribió: [ -> ]Sistema de cuentas MY/SQlite
https://amxmodx-es.com/showthread.php?tid=43

Tuto de Sqlite
https://amxmodx-es.com/showthread.php?tid=786

Te recomiendo mucho usar el guardado mysqlite es el mas bueno para todo, todos los otros guardados me han dado malas experiencias.
Pero si no entendes nada aca hay uno de adv vault que es el que mas safa entre los guardados.

https://amxmodx-es.com/showthread.php?tid=4954 (mi favorito)
https://amxmodx-es.com/showthread.php?tid=5627 (csAxel)

Tuto de adv vault (hecho por su propio creador)
https://amxmodx-es.com/showthread.php?tid=2950

No he podido dar con esos plugins, lo de SQlite se me complicó un poco, tendré que dedicarle un poco mas de tiempo. Entre vueltas y vueltas actualicé el AMX al 1.9 y se me solucionó el problema, ahora si me lo guarda bien, agradezco tu respuesta tiempo, gracias!