Sign in to follow this  
Followers 0
Sleash`en

Небольшая система семей

3 posts in this topic

Решил с неделю назад написать простенькую систему семей, справился +- за 2-3 дня, но потом ещё дня 4 ё*ся с БД, что успешно пофиксил и внёс поправки в мод.
И вот хотелось бы сейчас поделиться с вами:

Для начала добавим в начало мода все переменные и Enum

Спойлер

new famamount;
new Text3D:famd[MAX_PLAYERS];
enum finfo
{
        fID,
        fName[32],
        fOwner[MAX_PLAYER_NAME],
        fZam[MAX_PLAYER_NAME],
        fColor,
        fCColor,
        fMembers,
        fCDate[32],
};
new FamInfo[1000][finfo];
new FamColors[][12] = {"{FF0000}","{FD1493}","{32CD32}","{FF8C00}"
,"{FFFF00}","{0000FF}","{00FFFF}","{FFFFFF}"
,"{8B4513}","{000000}","{C0C0C0}"};
enum pInfo
{
        pNames[MAX_PLAYER_NAME],
        pFamID,
};
new PlayerInfo[playerid][pInfo];

 

После чего добавим forwardы для функций:

Спойлер

forward CheckFamNameCreate(playerid, result[]);
forward CheckAkkvign(playerid, inputtext[]);
forward CheckFamNameNEW(playerid, inputtext[]);
forward LoadFams();
forward OtherLoad();

 

Дальше паблики сампа (Вход, выход, спавн):

Спойлер

public OnPlayerConnected(playerid)
{
    //Должна быть загрузка данных из БД
    if(PlayerInfo[playerid][pFamID] > 0) Delete3DTextLabel(famd[playerid]);
}

public OnPlayerDisconnect(playerid, ressom)
{
    PlayerInfo[playerid][pFamID] = 0;
}

public OnPlayerSpawn(playerid)
{
    if(PlayerInfo[playerid][pFamID] > 0)
    {
        new famstr[144];
        format(famstr, sizeof(famstr), "%s%s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]], FamInfo[PlayerInfo[playerid][pFamID]][fName]);
        famd[playerid] = Create3DTextLabel(famstr,0xFFA0A0D0,0.0,0.0,1500.0,30.0,0,1);
        Attach3DTextLabelToPlayer(famd[playerid], playerid, 0.00.00.7);
    }
}

 

Дальше по списку у нас диалоги:

Спойлер

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        switch(dialogid)
        {
                case 16667:
                {
                        if(!response) return true;
                        switch(listitem)
                        {
                                case 0:
                                {
                                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],Nick(playerid),true)) return Error(playerid, "Только лидеру!");
                                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam],"None",true)) return Error(playerid, "У вас уже есть заместитель!");
                                        SPD(playerid, 16668, DIALOG_STYLE_INPUT, "Новый зам.""Введите ID игрока, которого хотете поставить на пост своего зама:""Ввести""Отмена");
                                }
                                case 1:
                                {
                                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],Nick(playerid),true)) return Error(playerid, "Только лидеру!");
                                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam],"None",true) == 0return Error(playerid, "У вас и так нет заместителя!");
                                        strmid(FamInfo[PlayerInfo[playerid][pFamID]][fZam],"None",0,strlen("None"),32);
                            new form[144];
                                                        format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] снял с поста зама: %s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                                                        FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid,FamInfo[PlayerInfo[playerid][pFamID]][fZam]);
                                                        SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
                                                        SaveFams();
                                                        return true;
                                }
                                case 2:
                                {
                                    SPD(playerid, 16669, DIALOG_STYLE_INPUT, "Название""Введите новое название:""Ввести""Отмена");
                                }
                                case 3:
                                {
                                        SPD(playerid, 16670, DIALOG_STYLE_INPUT, "Исключение""Введите ник игрока, которого хотите выгнать:""Ввести""Отмена");
                                }
                                case 4:
                                {
                                        new colors[600];
                                        for(new d = 0; d < sizeof(FamColors); d++)
                                        {
                                            if(d == 0) format(colors,sizeof(colors), "%s####################################\n",FamColors[d]);
                                                else if(d == 11) format(colors,sizeof(colors), "%s%s####################################",colors,FamColors[d]);

                                                else format(colors,sizeof(colors), "%s%s####################################\n",colors,FamColors[d]);
                                        }
                                        SPD(playerid, 16671, DIALOG_STYLE_LIST, "\t\tВыбирете новый цвет семьи:", colors, "Выбрать","Отмена");
                                }
                                case 5:
                                {
                                        new colors[600];
                                        for(new d = 0; d < sizeof(FamColors); d++)
                                        {
                                            if(d == 0) format(colors,sizeof(colors), "%####################################\n",FamColors[d]);
                                                else if(d == 11) format(colors,sizeof(colors), "%s%s####################################",colors,FamColors[d]);

                                                else format(colors,sizeof(colors), "%s%s####################################\n",colors,FamColors[d]);
                                        }
                                        SPD(playerid, 16672, DIALOG_STYLE_LIST, "\t\tВыбирете новый цвет чата семьи:", colors, "Выбрать","Отмена");
                                }
                        }
                }
                case 16672:
                {
                        FamInfo[PlayerInfo[playerid][pFamID]][fCColor] = listitem;
                        new form[144];
                        format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] сменил цвет чата семьи",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                            FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid);
                        SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
                        SaveFams();
                        return true;
                }
                case 16671:
                {
                        FamInfo[PlayerInfo[playerid][pFamID]][fColor] = listitem;
                        new form[144];
                        format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] сменил цвет семьи",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                    FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid);
                        SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
                        SaveFams();
                        for(new fp; fp < MAX_PLAYERS; fp++)
                        {
                                if(PlayerInfo[fp][pFamID] == PlayerInfo[playerid][pFamID])
                                {
                    format(form, sizeof(form), "%s%s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]], FamInfo[PlayerInfo[playerid][pFamID]][fName]);
                                        famd[fp] = Create3DTextLabel(form,0xFFA0A0D0,0.0,0.0,1500.0,30.0,0,1);
                                        Attach3DTextLabelToPlayer(famd[fp], fp, 0.00.00.7);
                                }
                        }
                        return true;
                }
                case 16670:
                {
                        if(!strlen(inputtext))return SPD(playerid, 16670, DIALOG_STYLE_INPUT, "Исключение""Введите ник игрока, которого хотите выгнать:""Ввести""Отмена");
                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],Nick(playerid),true)) return Error(playerid, "Доступно только создателю семьи!");
                        //      format(mysql_query, sizeof(mysql_query), "SELECT * FROM `accounts` WHERE `Fastss` = '%s'", inputtext);
                        //      mysql_function_query(connects, mysql_query, false, "", "");
                        /*cache_get_data(rows, fields);
                        if(!rows) return*/
                        new query[75];
                        mysql_format(connects, query, 85"SELECT `id` FROM `accounts` WHERE `Fastss` = '%s' LIMIT 1", inputtext);
                        mysql_function_query(connects, mysql_query, true"CheckAkkvign""ds", playerid, inputtext);
                        //if(!mysql_num_rows(connects)) return

                }
                case 16669:
                {
                        if(!response) return true;
                        if(!strlen(inputtext)) return SPD(playerid, 16669, DIALOG_STYLE_INPUT, "Название""Введите новое название:""Ввести""Отмена");
                        for(new i = strlen(inputtext); i != 0; --i){
                        switch(inputtext[i]){case 'А'..'Я''а'..'я'return Error(playerid, "Нельзя использовать русские буквы!");}}
                        if(strlen(inputtext) > 32return Error(playerid, "Максимальное кол-во букв 32");
                        new select[144];
                        mysql_format(connects, select, sizeof(select), "SELECT * FROM `family` WHERE `fName` = '%s'", inputtext);
                        mysql_function_query(connects, select, true"CheckFamNameNEW""ds", playerid, inputtext);
                        SaveFams();
                        return true;
                }
                case 16668:
                {
            if(!response) return true;
            if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],Nick(playerid),true)) return Error(playerid, "Доступно только создателю семьи!");
            if(!strlen(inputtext)) return SPD(playerid, 16668, DIALOG_STYLE_INPUT, "Новый зам.""Введите ID игрока, которого хотите поставить на пост своего зама:""Ввести""Отмена");
            for(new i = 0; i < strlen(inputtext); i++)
            switch (inputtext[i]){ case 'A'..'Z','a'..'z','А'..'Я','а'..'я'' 'return SPD(playerid, 16668, DIALOG_STYLE_INPUT, "Новый зам.""Введите ID игрока, которого хотете поставить на пост своего зама:""Ввести""Отмена"); }
            new playa = strval(inputtext);
            if(!IsPlayerConnected(playa) || playa == INVALID_PLAYER_ID || playa == playerid) return Error(playerid, "Неверный ID");
            if(PlayerInfo[playa][pFamID] != PlayerInfo[playerid][pFamID]) return Error(playerid, "Игрок должен быть в вашей семье!");
            strmid(FamInfo[PlayerInfo[playerid][pFamID]][fZam],Nick(playa),0,strlen(Nick(playa)),32);
            new form[144];
            format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] поставил нового зама: %s[%d]",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                    FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid,Nick(playa),playa);
                        SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
                        SaveFams();
                        return true;
                }
                case 16666:
                {
                    new pid = GetPVarInt(playerid, "ifamidl"), fid = GetPVarInt(playerid, "ifamid");
                        if(!response)
                        {
                                SendMes(pid, 0xFFFFFFFF"Игрок %s[%d] отказался от приглашения в семью", Nick(playerid),playerid);
                                SCM(playerid, 0xFFFFFFFF,"Вы отказались от вступления в семью!");
                                DeletePVar(playerid, "ifamidl"), DeletePVar(playerid, "ifamid");
                                return true;
                        }
                        else
                        {
                            new famstr[144];
                            SCM(playerid, COLOR_GREEN, "Вы приняли приглашение в семью!");
                            SendMes(pid, COLOR_GREEN, "Игрок %s[%d] принял приглашение в семью!",Nick(playerid),playerid);
                            PlayerInfo[playerid][pFamID] = fid;
                                format(famstr, sizeof(famstr), "%s[%s] {FFFFFF}%s[%d] пригласил нового члена в семью: %s[%d]", FamColors[FamInfo[fid][fColor]], FamInfo[fid][fName], Nick(pid), pid, Nick(playerid), playerid);
                                SCMFam(fid,0xFFFFFFFF,famstr);
                                FamInfo[fid][fMembers]++;
                                format(famstr, sizeof(famstr), "%s%s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]], FamInfo[PlayerInfo[playerid][pFamID]][fName]);
                                famd[playerid] = Create3DTextLabel(famstr,0xFFA0A0D0,0.0,0.0,1500.0,30.0,0,1);
                                Attach3DTextLabelToPlayer(famd[playerid], playerid, 0.00.00.7);
                                DeletePVar(playerid, "ifamidl"), DeletePVar(playerid, "ifamid");
                                SaveFams();
                                return true;
                        }
                }
                case 16665:
                {
                        if(!response) return true;
                        if(!strlen(inputtext)) return SPD(playerid, 16665, DIALOG_STYLE_INPUT, "Создание семьи""Что бы создать семью, введите название семью ниже:""Ввести""Отмена");
                        new ffc[64];
                        format(ffc, sizeof(ffc), "/famcreate %s", inputtext);
                        OnPlayerCommandText(playerid, ffc);
                        return true;
                }
        }
}

 

Дальше на очереди паблик запуска мода:

Спойлер

public OnGameModeInit()
{
    CreateDynamicPickup(131423395.89501359.08871085.5210, -1, -1, -120.0);
        CreateDynamic3DTextLabel("Создание семей\n{FF0000}Используйте \'ALT\'",0xFFFFFFFF395.89501359.08871085.5210,20.0, INVALID_PLAYER_ID,INVALID_VEHICLE_ID, 1, -1, -1, -120.0);
}

 

И самое интересное, команды, которые были написаны в доисторческом стиле, а именно OnPlayerCommandText, так как писал я уже под готовый мод:

Спойлер

public OnPlayerCommandText(playerid, cmdtext[])
{
        // --------------------------- СИСТЕМА СЕМЕЙ --------------------------
        else if(strcmp(cmd, "/famcreate"true) == 0)
        {
            if(PlayerInfo[playerid][pFamID] != 0return Error(playerid, "Вы уже состоите в семье!");
                if(PlayerInfo[playerid][pLevel] < 15return Error(playerid, "Семью создать можно только с 15-го уровня");
                new length = strlen(cmdtext);
                while ((idx < length) && (cmdtext[idx] <= ' '))
                {
                        idx++;
                }
                new offset = idx;
                new result[90];
                while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
                {
                        result[idx - offset] = cmdtext[idx];
                        idx++;
                }
                result[idx - offset] = EOS;
                if(!strlen(result)) return SPD(playerid, 16665, DIALOG_STYLE_INPUT, "Создание семьи""Что бы создать семью, введите название семью ниже:""Ввести""Отмена");
                for(new i = strlen(result); i != 0; --i)
                switch(result[i]){
                        case 'А'..'Я''а'..'я'return Error(playerid, "Нельзя использовать русские буквы!");
                        case '\'''`'return Error(playerid, "Недопустимые символы");}
                if(strlen(result) > 32return Error(playerid, "Максимальное кол-во букв 32");
                new select[144];
                mysql_format(connects, select, sizeof(select), "SELECT * FROM `family` WHERE `fName` = '%s'", result);
                mysql_function_query(connects, select, true"CheckFamNameCreate""ds", playerid,result);
                return true;
        }
        else if(strcmp(cmd, "/finvite"true) == 0)
        {
            if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вам недоступна эта функция!");
                else if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner], PlayerInfo[playerid][pNames], true) && \
                    strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam], PlayerInfo[playerid][pNames], true)) return Error(playerid, "Вы не лидер/зам. семьи!");
        tmp = strcharsplit(cmdtext, idx);
                if(!strlen(tmp)) return Use(playerid, "/finvite [id]");
                new playa = ReturnUser(tmp), form[144], fid = PlayerInfo[playerid][pFamID];
                if(!IsPlayerConnected(playa) || gPlayerLogged[playa] == 0 || playa == INVALID_PLAYER_ID) return Error(playerid, "Неверный ID игрока");
                if(PlayerInfo[playa][pFamID] == PlayerInfo[playerid][pFamID]) return Error(playerid, "Игрок уже состоит в вашей семье!");
                new Float:px,Float:py,Float:pz; GetPlayerPos(playa,px,py,pz);
                if(!PlayerToPoint(3,playerid,px,py,pz)) return Error(playerid, "Вы далекто от игрока!");
                if(PlayerInfo[playa][pFamID] != 0return Error(playerid, "Игрок уже состоит в другой семье!");
                format(form, sizeof(form),"{FFFFFF}%s[%d] предлагает вас вступить в семью%s %s", Nick(playerid), playerid, FamColors[FamInfo[fid][fColor]], FamInfo[fid][fName]);
                SPD(playa, 16666, DIALOG_STYLE_MSGBOX, "Приглашение", form, "Да""Нет");
                SetPVarInt(playa, "ifamidl", playerid);
                SetPVarInt(playa, "ifamid", fid);
                return true;
        }
        else if(strcmp(cmd, "/funinvite"true) == 0)
        {
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вам недоступна эта функция!");
            else if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner], PlayerInfo[playerid][pNames], true) && \
                    strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam], PlayerInfo[playerid][pNames], true)) return Error(playerid, "Вы не лидер/зам. семьи!");
        tmp = strcharsplit(cmdtext, idx);
                if(!strlen(tmp)) return Use(playerid, "/funinvite [id]");
                new playa = ReturnUser(tmp), form[144];
                if(!IsPlayerConnected(playa) || gPlayerLogged[playa] == 0 || playa == INVALID_PLAYER_ID) return Error(playerid, "Неверный ID игрока");
                if(PlayerInfo[playa][pFamID] != PlayerInfo[playerid][pFamID]) return Error(playerid, "Игрок не состоит в вашей семье!");
                new length = strlen(cmdtext);
                while ((idx < length) && (cmdtext[idx] <= ' '))
                {
                        idx++;
                }
                new offset = idx;
                new result[128];
                while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
                {
                        result[idx - offset] = cmdtext[idx];
                        idx++;
                }
                result[idx - offset] = EOS;
                if(!strlen(result)) return Use(playerid, "/funinvite [id] [причина]");
                if(playa == playerid) return Use(playerid, "/fleave");
                else if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner], result, true) == 0 || \
                    strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam], result, true) == 0return Error(playerid, "Нельзя выгнать лидера/зама!");
                SendMes(playerid, 0xFFFFFFFF"Вы выгнали %s[%d] из семьи по причине: %s",Nick(playa), playa, result);
                SendMes(playa, 0xFFFFFFFF"%s[%d] выгнал ваз из семьи по причине: %s", Nick(playerid), playerid, result);
                format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] выгнал из семьи %s[%d] по причине: %s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                                 FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid,Nick(playa),playa,result);
                SCMFam(PlayerInfo[playerid][pFamID],0xFFFFFFFF, form);
                PlayerInfo[playa][pFamID] = 0;
                Delete3DTextLabel(famd[playerid]);
                --FamInfo[PlayerInfo[playerid][pFamID]][fMembers];
                return true;
        }
        else if(strcmp(cmd, "/fleave"true) == 0)
        {
            new form[144];
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вам и так не состоите в семье!");
        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],Nick(playerid),true) == 0return Error(playerid, "Вы не можете покинуть семью, так как её создатель!");
        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam],Nick(playerid),true) == 0) strmid(FamInfo[PlayerInfo[playerid][pFamID]][fZam],"None",0,strlen("None"),32);
        SCM(playerid, 0xFFFFFFFF,"Вы успешно покинули семью!");
        format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] покинул семью",FamInfo[PlayerInfo[playerid][pFamID]][fColor],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                FamInfo[PlayerInfo[playerid][pFamID]][fCColor],Nick(playerid),playerid);
        SCMFam(PlayerInfo[playerid][pFamID],0xFFFFFFFF, form);
        --FamInfo[PlayerInfo[playerid][pFamID]][fMembers];
                PlayerInfo[playerid][pFamID] = 0;
        }
        else if(strcmp(cmd, "/fampanel"true) == 0 || strcmp(cmd, "/fp"true) == 0)
        {
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вам недоступна эта функция!");
            else if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner], PlayerInfo[playerid][pNames], true) && \
                    strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam], PlayerInfo[playerid][pNames], true)) return Error(playerid, "Вы не лидер/зам. семьи!");
                SPD(playerid, 16667, DIALOG_STYLE_LIST, "Меню семью""Поставить заместителя\nСнять текущего заместителя\nИзменить название семьи\nВыгнать человека [Offline]\nСменить цвет семьи\nСменить цвет чата""Выбрать","Отмена");
        }
        else if(strcmp(cmd, "/faminfo"true) == 0 || strcmp(cmd, "/fi"true) == 0)
        {
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вы не состоите в семье!");
                new finfos[512], fid = PlayerInfo[playerid][pFamID];
        format(finfos,sizeof(finfos),"\n\t%s%s{ffffff}\n\n\tЛидер: %s\n\tЗам: %s\n\n\tДата создания: %s\n\tЧисленность семьи: %d чел.",\
                FamColors[FamInfo[fid][fColor]],FamInfo[fid][fName],FamInfo[fid][fOwner],FamInfo[fid][fZam],FamInfo[fid][fCDate],FamInfo[fid][fMembers]);
                SPD(playerid, 0, DIALOG_STYLE_MSGBOX,"Информация:", finfos, "Ок""");
                return true;
        }
        else if(strcmp(cmd, "/fmembers"true) == 0 || strcmp(cmd, "/fonline"true) == 0)
        {
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вы не состоите в семье!");
                new finfon[32],finfos[512], fid = PlayerInfo[playerid][pFamID], m;
                for(new i = 0; i < MAX_PLAYERS; i++)
                {
                    if(!IsPlayerConnected(i) || i == INVALID_PLAYER_ID) continue;
                        if(PlayerInfo[i][pFamID] != fid) continue;
                        if(strcmp(FamInfo[fid][fOwner],Nick(i),true) == 0) format(finfos,sizeof(finfos), "%sЛидер: %s[%d]\n",finfos,Nick(i),i);
                        else if(strcmp(FamInfo[fid][fZam],Nick(i),true) == 0) format(finfos,sizeof(finfos), "%sЗам.: %s[%d]\n",finfos,Nick(i),i);
                        else format(finfos,sizeof(finfos), "%sУчастник: %s[%d]\n",finfos,Nick(i),i);
                        m++;
                }
                format(finfos, sizeof(finfos), "%s\n{669999}Всего в сети: %d чел.", finfos,m);
        format(finfon, sizeof(finfon), "%s****ы семьи ONline",FamInfo[fid][fColor]);
        SPD(playerid, 0, DIALOG_STYLE_MSGBOX,finfon, finfos, "Ок""");
        return true;
        }
        else if(strcmp(cmd, "/fc"true) == 0 || strcmp(cmd, "/k"true) == 0)
        {
        if(PlayerInfo[playerid][pFamID] == 0return Error(playerid, "Вы не состоите в семье!");
        new length = strlen(cmdtext);
                while ((idx < length) && (cmdtext[idx] <= ' '))
                {
                        idx++;
                }
                new offset = idx;
                new result[128];
                while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
                {
                        result[idx - offset] = cmdtext[idx];
                        idx++;
                }
                result[idx - offset] = EOS;
                if(!strlen(result)) return SendClientMessage(playerid, COLOR_GREEN, "Вводите: /fc [text] или /k [text]");
        for(new k = 0; k < MAX_PLAYERS; k++)
        if(PlayerInfo[playerid][pFamID] == PlayerInfo[k][pFamID]) SendMes(k, 0xFFFFFFFF"%s[%s]{FFFFFF} %s[%d]: %s%s", FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                                         PlayerInfo[playerid][pNames],playerid,FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],result);
                return true;
        }// --------------------------- СИСТЕМА СЕМЕЙ -------------------------- END
}

 

Оставшиеся стоки и паблики "искусственного" создания:

Спойлер

stock SCMFam(famid,color,msg[])
{
        for(new fp; fp < MAX_PLAYERS; fp++)
        if(PlayerInfo[fp][pFamID] == famid) SCM(fp,color,msg);
}

public CheckAkkvign(playerid, inputtext[])
{
        static rows, fields;
        cache_get_data(rows, fields);
        if(!rows) return Error(playerid, "Данный аккаунт не найден!");
        new /*rows, fields,*/tmp[4];
        cache_get_field_content(0"pFamID", tmp);
                        if(strval(tmp) != PlayerInfo[playerid][pFamID]) return SendMes(playerid,COLOR_GREY,"[ MySql ] Аккаунт %s не является вашим членом семьи.",inputtext);
                        for(new ip; ip < MAX_PLAYERS; ip++)
                        if(strcmp(PlayerInfo[playerid][pNames], inputtext, true) == 0return Error(playerid, "Игрок в сети!");
                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fOwner],inputtext, true) == 0return Error(playerid, "Невозможно выгнать создателя семьи");
                        if(strcmp(FamInfo[PlayerInfo[playerid][pFamID]][fZam],inputtext,true) == 0)
                        {
                                strmid(FamInfo[PlayerInfo[playerid][pFamID]][fZam],"None",0,strlen("None"),32);
                        new form[144];
                                format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] снял с поста зама: %s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                                               FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid,inputtext);
                                SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
                        }
                        new mysql_query[144];
                        mysql_format(connects, mysql_query, sizeof(mysql_query), "UPDATE `accounts` SET `pFamID` = '0' WHERE `Fastss` = '%s'", inputtext);
                        mysql_function_query(connects, mysql_query, false"""");
                        SendMes(playerid, COLOR_GREY, "[ MySql ] Аккаунт %s успешно выгнан из семьи.", inputtext);
                        --FamInfo[PlayerInfo[playerid][pFamID]][fMembers]
;
                        SaveFams();
        return true;
}
public CheckFamNameCreate(playerid, result[])
{
        static rows, fields;
        cache_get_data(rows, fields);
        if(rows) return Error(playerid, "Данное имя уже занято!");
                SendMes(playerid, COLOR_YELLOW, "Вы успешно создали семью \"%s\"",result);
                new cdf[32],yr,mh,dy, insert[256];
                getdate(yr,mh,dy);
                format(cdf, sizeof(cdf), "%d-%d-%d", dy,mh,yr);
                new nns[32] = "None";
                mysql_format(connects, insert, sizeof(insert), "INSERT INTO `family` (`fName`, `fOwner`, `fZam`, `fColor`, `fCColor`, `fMembers`, `fCDate`) VALUES ('%s','%s', '%s', '7', '7', '1', '%s')",result,PlayerInfo[playerid][pNames],nns,cdf);

                mysql_function_query(connects, insert, false"""");
                mysql_format(connects, insert, sizeof(insert), "UPDATE `accounts` SET `pFamID` = (SELECT fID FROM `family` WHERE fName = '%s' LIMIT 1) WHERE Fastss = '%s'",result,PlayerInfo[playerid][pNames]);
                mysql_function_query(connects, insert, false"""");
                famamount++;
                PlayerInfo[playerid][pFamID] = famamount;
                FamInfo[famamount][fID] = famamount;
                strmid(FamInfo[famamount][fName], result, 0, strlen(result), 255);
                strmid(FamInfo[famamount][fOwner], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
                strmid(FamInfo[famamount][fZam], "None"0, strlen("None"), 32);
                FamInfo[famamount][fColor] = 7;
                FamInfo[famamount][fCColor] = 7;
                FamInfo[famamount][fMembers] = 1;
                strmid(FamInfo[famamount][fCDate], cdf, 0, strlen(cdf), 255);
                format(insert, sizeof(insert), "%s%s",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]], result);
                famd[playerid] = Create3DTextLabel(insert,0xFFA0A0D0,0.0,0.0,1500.0,30.0,0,1);
                Attach3DTextLabelToPlayer(famd[playerid], playerid, 0.00.00.7);
        return true;
}
public CheckFamNameNEW(playerid, inputtext[])
{
        static rows, fields;
        cache_get_data(rows, fields);
        if(rows) return Error(playerid, "Данное имя уже занято!");
        strmid(FamInfo[PlayerInfo[playerid][pFamID]][fName],inputtext,0,strlen(inputtext),32);
        new form[144];
        format(form, sizeof(form), "%s[%s]{ffffff} NEWS: %s%s[%d] сменил название семьи",FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fColor]],FamInfo[PlayerInfo[playerid][pFamID]][fName], \
                                                                                         FamColors[FamInfo[PlayerInfo[playerid][pFamID]][fCColor]],Nick(playerid),playerid);
        SCMFam(PlayerInfo[playerid][pFamID], 0xFFFFFFFF, form);
        return true;
}

 

И последнее - загрузка и выгрузка данных БД:

Спойлер

public OtherLoad()
{
    publics:OnLoadMaterialsCallback()
        {
                new rows, fields, vresult[21];
                cache_get_data(rows, fields);
                //
                //
                cache_get_field_content(0"famamount", vresult); famamount = strval(vresult);
                return true;
        }
}

stock SaveMaterials()
{
        new mysql_query[512];
        format(mysql_query, sizeof(mysql_query), "UPDATE `other` SET  `famamount` = '%d'", famamount);
        mysql_function_query(connects, mysql_queryfalse"""");
        return true;
}

public LoadFams()
{
        static rows, fields;
        cache_get_data(rows, fields);
        new temp[64], i = 1, fi = 0;
        if(rows)
        {
                for(new he = 0; he < rows; he++)
                {
                        cache_get_row(he, 0, temp), FamInfo[i][fID] = strval(temp);
                        cache_get_row(he, 1, temp), strmid(FamInfo[i][fName], temp, 0, strlen(temp), 32);
                        cache_get_row(he, 2, temp), strmid(FamInfo[i][fOwner], temp, 0, strlen(temp), 32);
                        cache_get_row(he, 3, temp), strmid(FamInfo[i][fZam], temp, 0, strlen(temp), 32);
                        cache_get_row(he, 4, temp), FamInfo[i][fColor] = strval(temp);
                        cache_get_row(he, 5, temp), FamInfo[i][fCColor] = strval(temp);
                        cache_get_row(he, 6, temp), FamInfo[i][fMembers] = strval(temp);
                        cache_get_row(he, 7, temp), strmid(FamInfo[i][fCDate], temp, 0, strlen(temp), 32);
                        i++;
                        fi++;
                }
                printf("Фамы загружены - %d", fi);
        }
        else print("Фамы не загружены");
        return true;
}
stock SaveFams()
{
        for(new houseid = 1; houseid < sizeof(FamInfo); houseid++)
        {
                new update[600];
                update = "UPDATE `family` SET ";
                acc_str_strcat(update, sizeof(update), "fName", FamInfo[houseid][fName]);
                acc_str_strcat(update, sizeof(update), "fOwner", FamInfo[houseid][fOwner]);
                acc_str_strcat(update, sizeof(update), "fZam", FamInfo[houseid][fZam]);
                acc_int_strcat(update, sizeof(update), "fColor", FamInfo[houseid][fColor]);
                acc_int_strcat(update, sizeof(update), "fCColor", FamInfo[houseid][fCColor]);
                acc_int_strcat(update, sizeof(update), "fMembers", FamInfo[houseid][fMembers]);
                acc_str_strcat(update, sizeof(update), "fCDate", FamInfo[houseid][fCDate]);
                strdel(update, strlen(update)-1, strlen(update));
                format(stringer,sizeof(stringer)," WHERE `fID` = '%d'",houseid),strcat(update, stringer);
                mysql_function_query(connects, update, false"""");
        }
        return true;
}

 

 

Share this post


Link to post
Share on other sites

@Sleash`en, наверное, не помешало бы приложить SQL-запрос на создание таблицы family. Либо же саму таблицу (экспортировать ее из СУБД). И код функций acc_str_strcat, acc_int_strcat.

Share this post


Link to post
Share on other sites

 

@Cawfee Да, по поводу таблицы - согласен, а про acc_str_strcat и acc_int_strcat - думал что это функции инклуда a_mysql; (Писал уже на готовом моде)

stocks:

Спойлер

stock acc_int_strcat(query[], len, name[], number)
{
    format(stringer, sizeof(stringer), "`%s` = '%d',",name, number);
    strcat(query, stringer, len);
    return true;
}
stock acc_str_strcat(query[], len, name[], str[])
{
    format(stringer, sizeof(stringer), "`%s` = '%s',",name, str);
    strcat(query, stringer, len);
    return true;
}
// И Float до кучи и удобства
stock acc_float_strcat(query[], len, name[], Float:number)
{
    format(stringer, sizeof(stringer), "`%s` = '%f',", name, number);
    strcat(query, stringer, len);
    return true;
}

 

MySQL таблица:

Спойлер

CREATE TABLE `family` (
  `fID` int(11NOT NULL AUTO_INCREMENT,
  `fName` varchar(32NOT NULL,
  `fOwner` varchar(32NOT NULL,
  `fZam` varchar(32NOT NULL,
  `fColor` int(11NOT NULL,
  `fCColor` int(11NOT NULL,
  `fMembers` int(11NOT NULL,
  `fCDate` varchar(32NOT NULL,
  PRIMARY KEY (`fID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

Edited by Sleash`en

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • DEST
      By DEST
      Командный процессор: zcmd / dc_cmd + sscanf.
       
    • Daniil Korochansky
      By Daniil Korochansky
      Здравствуйте. Я заметил что нет нормальных полноценных IDE для Pawn, большинство IDE какие-то багованнные, выскакивают разнообразные ошибки, в "Extreme Studio" к примеру. А в Pawno работать не удобно и в нём довольно скудный функционал. Ну вот.
       
      Вот, сейчас я разрабатываю IDE которое называется "Spawn"(Samp pawn), которое потом будет много раз тестироваться, чтобы минимизировать самые разные ошибки если они будут. Когда будет закончена основа IDE, программа будет разрабатывать по предпочтениям пользователей/скриптеров, чтобы они хотели увидеть в программе, а там я уже буду решать реально ли требуется это программе или нет.
      Главная цель программы по максимуму упростить разработку серверов SAMP.
      Также программа будет как для Windows так и для Linux.
      Распространяться будет по лицензии GPL с закрытым исходным кодом. 
       
      Я немного опишу что можно будет делать в в программе, что уже реализовано и что хочу сделать:
       - Уже закончена работа над графической частью с которой взаимодействует пользователь(Меню, панель инструментов, диалог настроек, редактор и т. д.)
      - Реализована подсветка синтаксиса Pawn
      - Файлы будут открываться в вкладках редактора
      - Реализована "Карта документа (Document map)" в правой стороне редактора с которой можно взаимодействовать(прямо как Sublime Text)(В настройках можно будет скрыть)
      - Автоматическое закрытие скобок -> {}() ""
      - Подсветка скобок которые взаимосвязаны между собой, на которые указал пользователь курсором.(Настраивается)
      - Будет реализованы подсказки вызова(Call Tips) и авто-дополнение кода.
      - Реализована настройка подсветки языка и настройка шрифта
      - Live templates(Живые шаблоны)
      - Поддержка компиляторов от SAMP Team, Zeex и модификацией Zeex(которая на удивление очень быстро компилирует исходники) и конечно же переключение между ними
      И многое другое. 
       
      Есть сообщество Spawn, там можно найти так называемую статью "Roadmap"(или Карта разработки) которая регулярно обновляется, там так же отмечается что уже закончено.
      Сообщество: https://vk.com/spawnsoftware
    • Antoxa39
      By Antoxa39
      Привет! Кто не знает, я разрабатываю мод Guard RP. Вот ссылочка,жмякайте!
      Кто нибудь может написать какие работы добавить, оригинальные идеи возьму) На данный момент планируется обновление: Автосалон, автошкола,работы.
      Первых два пункта есть, да и есть 2 работы, это на Лесопилки ( без анимаций ), и почтальон.  Но все же хотелось бы больше. Жду предложений)
    • Antoxa39
      By Antoxa39
      Дратути,я научился делать регистрацию, и хочу поделится со всеми как это сделать им самим.
      1.Нам потребуется: Denwer или Open Server. ( Урок про подключение я делал ранее, так что обьяснять сейчас что и как делать для подключения не буду, но урок можно посмотреть тут)
      2.MySQL R39-6.
      3. Прямые руки.
      4. Переходим к процессу.
      //P.S БД - База Данных
      Делаем подключение к БД.
      main(){} #include <a_samp> #include <a_mysql> #include <Pawn.CMD> #include <sscanf2> #include <streamer> #include <time> //--------------   SQL     ---------------------- new dbHandle; #define MYSQL_HOST "127.0.0.1" #define MYSQL_USER "mysql" #define MYSQL_BD "urok" #define MYSQL_PASSWORD "mysql" //------------------------ public OnGameModeInit() {     dbHandle = mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_BD,MYSQL_PASSWORD);     CheckConnectSQL();     return 1; } public OnGameModeExit() {     return 1; } stock CheckConnectSQL() {     if(mysql_errno()) printf("Подключение к БД %s прервалось. Код ошибки: %d",MYSQL_BD,mysql_errno())     else printf("Подключение к БД %s успешно!",MYSQL_BD)     return 1; }
      Подключение сделано.
      Далее мы должны сделать такое: Когда игрок заходит на сервер, нужно проверить есть ли игрок с таким Никнеймом в БД.
      Делаем массив,который будет хранить в себе пароль,имя игрока. ( сделаем еще и уровень ).
      // перед --------------   SQL     ---------------------- создаем enum //Enum - это вещь, позволяющая создавать большее количество адресов одной переменной enum pInfo{     pID,     pNick[24],     pPassword[32],     pLevel } new Player[MAX_PLAYERS][pInfo];//Мы обьявили переменную,которая будет хранить в себе наш Enum. Идем создавать БД.
      1.
      2.
      3.
      4.
      5. Идем обратно к скриптингу
      И вот тут, мы сделаем проверку есть ли в БД аккаунт с таким никнеймом.
      public OnPlayerConnect(playerid) {     GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);//Мы записали ник игрока в массив pNick.     new query[100];//создаем переменную с запросом.     format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//Форматируем запрос, SELECT * FROM, то есть      //загружаем всю информацию о игроке с ником, записаным в pNick.     mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);//Посылаем запрос в БД, указываем ИД подключение - dbHandle. true - потому что мы хотим получить информацию. И вызываем следующим паблик "CheckPlayerBD"     return 1; } //в конец мода forward CheckPlayerBD(playerid); public  CheckPlayerBD(playerid) {     new rows,fields;     cache_get_data(rows,fields);//Проверили есть ли строка с таким именем.     if(!rows)//если нет такого игрока то показываем регистрацию     {         ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.", "Далее", "");     }     else     {         ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Рады видеть Вас снова на Urok. Авторизуйтесь.", "Далее", "");         cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);//Загружаем пароль игрока из БД.     }     return 1; } Я мог сделать ИД диалогов через енум, но для примера можно и так.
      Далее идем в OnDialogResponse
      public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {     switch(dialogid)     {         //case 1 это регистрация         case 1:         {             if(!response) return Kick(playerid); // если игрок отказывается от регистрации кикаем его.             if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль", "Далее", "");             //это была проверка на длину пароля             for(new i; i < strlen(inputtext); i++)             {                 switch(inputtext[i])                 {                     case 'A'..'Z','a'..'z','0'..'9':continue;                     default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Пароль может быть только: a-z, A-Z,0-9", "Далее", "");                 }             }             //это проверка на символы,если игрок будет писать пароль на русском, или какие нибудь другие символы             //например \*? то ему будет возвращатся этот же диалог,а если все отлично то регистрация продолжится.             new query[120 + MAX_PLAYER_NAME];//также создали запрос             format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);             /*Мы отформатировали строку,сделав в ней запрос: Добавить строку в таблице account, со столбцами pNick = '%s', %s значит строка             в данном случае эта строка, это массив который хранит в себе никнейм игрока,inputtext это введеный текст игроком, pLevel это уровень игрока,изначально в бд он будет 1.*/             mysql_query(dbHandle,query);             //теперь делаем запрос на загрузку акканута.             new query1[100];             format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//отфарматироваали новый запрос             mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);         }     }     case 2:     {         if(!response) return Kick(playerid); // если игрок отказывается от авторизации также кикаем его.         if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Неверный пароль", "Далее", "");//Делаем проверку на длину пароля, т.к при регистрации у нас пароль был от 4 до 32, тут тоже самое должно быть         for(new i; i < strlen(inputtext); i++)         {             switch(inputtext[i])             {                 case 'A'..'Z','a'..'z','0'..'9': continue;//если он также вводит правильные символы продолжаем выполнение кода для игрока.                 default: return  ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Не верный пароль!", "Далее", "");// при вводе спец.символов ему будет возвращать диалог авторизации             }         }         new query[120];         format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)//Загрузить информацию о игроке,и проверить совпадает введеный пароль игроком,с тем который в БД.         mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid);     }     return 1; } //создаем паблик LoadAcc forward LoadAcc(playerid); public LoadAcc(playerid) {     Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);// 0 потому что в БД может быть только одна строка с таким именем или ИД     Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);// приравнение, то есть записываем Левел и ИД игрока в наши массивы.     //Пароль и никнейм загружать не надо } forward CheckPass(playerid); public CheckPass(playerid) {     new rows,fields;     cache_get_data(rows,fields);//сверяем пароль     if(rows)     {         //если веденный пароль совпадает с паролем в БД то авторизуем игрока         SpawnPlayer(playerid);         SendClientMessage(playerid,-1,"Вы успешно авторизовались!");     }     else     {         //если нет то считаем попытки ввода пароля         SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1)         ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее","");         new str[64];         format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password"));         SendClientMessage(playerid,-1,str);//форматируем строку, где говорим игроку сколько у него осталось попыток         if(GetPVarInt(playerid,"wrong_password") >= 5) return Kick(playerid);//если игрок использовал больше 5 попыток, то кикаем его     } } и в OnGameModeExit()
      public OnGameModeExit() {     mysql_close(dbHandle);//отключаемся от БД     return 1; }  
    • Antoxa39
      By Antoxa39
      Здарова бандиты. ОПГ Павновское.
      Вообщем, в этом уроке я расскажу и покажу как подключить Базу Данных к MySQL.
      Не регистрацию,и не в готовом моде где просто пользователя пароль хост и т.д меняете.
      А подключение с нуля.
       
      1.Нам понадобится MySQL.  Я использую R39-6. Скачать 
      2.Приступаем к подготовительному этапу.
      Заходим в Pawn и подключаем MySQL чуть ниже инклюда a_samp. #include <a_mysql>
      Должно быть так.
      После этого отчищаем мод от хлама. Должно получится вот так: жмЫкс
      3.Подключение
      Дальше нам требуется создать переменную,эта переменная будет хранить ИД подключения. в MySQL R39 создаем простую переменную.
      new dbHandle;  В MySQL R41 создаем так:
       new MySQL:dbHandle;  
      теперь создаем Константы
      #define Host "127.0.0.1" #define User "root" // это если вы используете Denwer. Если хостинг указываете другого пользователя. #define DataBase "urok" #define Password_SQL ""//Если вы на хостинге ставите пароль,для Denwer пароль не требуется, чуть позже скажу как его установить Все, теперь переходим в public OnGameModeInit()
      public OnGameModeInit() {     dbHandle = mysql_connect(Host,User,DataBase,Password_SQL); // приравниваем нашу переменную с ИД подключением к коннекту к базе данных. Извиняюсь если коряво обьяснил. Это для R39     return 1; } Для R41
      public OnGameModeInit() {     dbHandle = mysql_connect(Host,User,Password_SQL,DataBase);// В R41 поменялись местами Пароль и База     return 1; } Если сделаем чтобы при подключении к базе выводилось сообщение о том,подключилось или нет. Я сделаю это без switch. Чтобы сильно не загружать смотрящих этот урок.
      Делаем все там же в public OnGameModeInit()
      public OnGameModeInit() {     dbHandle = mysql_connect(Host,User,DataBase,Password_SQL);     if(mysql_errno())     {         printf("Подключение к базе данных %s не удалось.",DataBase); // %s означает строку. То есть будет выводить название базы данных которое указано в #define DataBase     }     else     {         printf("Подключение к базе данных %s успешно",DataBase);     }     return 1; } Все, с этим закончили. Остался последний этап, это отключение базы данных когда мод выключается.
      Идем в паблик OnGameModeExit()
      public OnGameModeExit() {     mysql_close(dbHandle);     return 1; } Все. База данных подключена.
      Чтобы скачать Denwer жмите сюды: плямп
      Для установки можете перейти по этой ссылке: УСТАНОВКА