Sign in to follow this  
Followers 0
Sleash

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

5 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

Столкнулся с проблемой по FamID и fID.

При создании семьи всё идет хорошо, семьи в 'family' создаются в порядке своего id (1,2,3,4 и тд)
Но в 'accounts' - 'FamID' не присваивается id семьи.

Оно присваивается только до первого перезапуска, далее famammount обнуляется и начинает присваивать заново (1,2,3 и тд), хотя id фамы - 10.

Запрос:
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, "", "");

Уже какой час с этим вожусь, не моуг понять как решить, помогите пожалуйста.

 

Заметил, что там есть база 'other', но сама база к теме не была приложена. В итоге создал сам, но туда ничего не сохраняет, хотя в моде есть запрос:
new mysql_query[512];
format(mysql_query, sizeof(mysql_query), "UPDATE `other` SET  `famamount` = '%d'", famamount);

mysql_function_query(connects, mysql_query, false, "", "");

Share this post


Link to post
Share on other sites
4 минуты назад, phizlfs сказал:

Но в 'accounts' - 'FamID' не присваивается id семьи

 

4 минуты назад, phizlfs сказал:

В итоге создал сам, но туда ничего не сохраняет

 

Посмотрите в логах MySQL, что там на этот счет есть.

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

    • Kutuzov
      By Kutuzov
      Автор данного канала снимает уроки по программированию на Pawn, также скоро будет на 20 подписчиков снимать мод с нуля в samp. 
      Приглашаем всех на канал, а также особенно новичков. Даже если вы уже знаете pawn, подпишитесь пожалуйста на его канал и поддержите его.
      Автор канала не требует денег!!! Он обучает всех бесплатно!!!
      Ссылка на канал: https://www.youtube.com/@prog_samp_easy
       
      Также у него есть свой тг канал, но начнет вести его, как только будет не менее 10 подписчиков.
       Ссылка на тг канал: https://t.me/pawndevelop
       
      Всем удачи
    • Sleash
      By Sleash
      Всем доброго времени суток. Сегодня мне бы хотелось вам рассказать от таких функциях в PAWN-языке, как SetTimer и SetTimerEx.
      Сразу сделаю такое примечание: Для SetTimer и SetTimerEx можно использовать ТОЛЬКО public!!!
      SetTimer
      Итак, для начала приступим к лёгкому и пойдём по нарастающей:
      Первое, это SetTimer. Функция включает в себя 3 параметра:
      native SetTimer(funcname[], interval, repeating); funcname[] - Это название функции, по сути - название вашего pablic в кавычках.
      interval - Интервалы от вызова таймера до срабатывания pablic
                     Так же если стоит повторение таймера, то будет работать как интервал между таймерами.
                     Измеряется в миллисекундах. 1000 миллисекунд равно 1 секунде
      repating - Тут всё просто: будет ли повторяться ваша функция. Может иметь значения: true - будет выполняться повторение ИЛИ false - вызывается 1 раз.
      Давайте разберём пример для наглядности:
      forward Info(); public Info() {     SendClientMessageToAll(0xFFFFFFFF, "Наш сайт: pawno-rus.ru"); } // И теперь давайте вызовем данный таймер при запуске мода public OngameModeInit() {     SetTimer("Info", 1000*60*20, true);     return true } Давайте разберёмся по интервалу: 1000*60*20. Так как я писал ранее, что 1000 млСек = 1 сек, то: 1 сек * 60 = 1 минута; 1 минута * 20 = 20 минут.
      Таким образом данный таймер будет выводить каждые 20 минут для всех игроков на сервере в чат: "pawno-rus.ru".
       
      SetTimerEx
       
      По сути с SetTimer - всё, теперь перейдём к следующей функции: SetTimerEx:
      native SetTimerEx(funcname[], interval, repeating, const format[], {Float,_}:...); Тут добавляются ещё 2 параметра:
      const format[] - формат данных для ввода в функцию. (Такие как: s, d, f);
      {Float,_}:... - переменные или значение для данных из const fromat[]
      Из данных объяснения мало что можно понять незнающему или начинающему скриптеру, поэтому давайте разберём на примере кода, который при входу даёт на авторизацию две минуты игроку:
      forward autorez(playerid); public autorez(playerid) {     if(/*проверка на то залогинился ли игрок*/)     {         SendClientMessage(playerid, 0xFFFFFFFF, "Вы были кикнуты по причине: Время на авторизацию истекло.");         Kick(playerid);         return true;     }     return true; } //Дальше уже добавлям сам таймер public OnPlayerConnect(playerid) {     SetTimerEx("autorez", 1000*60*2, false, "d", playerid);     return true; } Если первые три пункта мы уже разбирали. то начнём сразу с 4-го:
      4. Тут в кавычках надо вставлять тип данных. Наподобие функции format(output[], len, "%s %d %f", string, int, float), только без знака процента (%)
      5. Тут уже указывают сами данные, так же разберём как и предыдущий: format(output[], len, "%s %d %f ", string, int, float)
       
      Я надеюсь что кому-то помог, а если что непонятно, то спрашивайте, всегда помогу.
    • NoVate
      By NoVate
      Доброго времени суток 
       
      Многие новички задавались вопросом: "Как создать свой RP сервер?", "С чего начать разработку?", "Это сложно и я не справлюсь".
      После таких вопросов многие уходили с этой темы и оставляли её на последней полке. Некоторые брались и сталкивались с большими проблемами. И только часть из этих людей доходили до какого-то результата.
       
      Моя цель: сделать создание сервера в SA:MP проще. Чтобы каждый из тех, кто интересовался созданием сервера мог спокойно взять готовую, а что самое главное - базовую сборку и под неё уже создавать различные свои задумки. SA:MP на данный момент не особо актуален, а тем более самый обычный клиент, НО, как мне кажется, если сделать что-то невероятное, то аудитория заметит это и ей будет достаточно интересно "пощупать" данное новшество.
       
      Для тех, кто начнёт писать: "Ты видел свой код?", "Ты сделал не правильно в 777-ой строке" и так далее. Сразу отвечу, цитируя:
       
      Кому стало интересно и кто хотел бы ознакомиться со сборком - прошу в мой Github (не реклама).
      Буду делать коммиты по мере свободного времени и написании кода.
      Если есть какие-то идеи, то пишите в мой Discord сервера (не реклама), который можно будет найти на той же странице.
       
      Спасибо всем за прочтение и хорошего настроения 
    • xiemoniyaz
      By xiemoniyaz
      C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 017: undefined symbol "GEO_MAX_COUNTRY_NAME_LENGTH" C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 009: invalid array size (negative, zero or out of bounds) C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 036: empty statement C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : fatal error 107: too many error messages on one line Compilation aborted. Pawn compiler 3.2.3664          Copyright (c) 1997-2016, ITB CompuPhase 4 Errors.  
       
      cmd:get(playerid, params[]) {     extract params -> new player; else return SendClientMessage(playerid, -1, !"/get [playerid]");     new string[GEO_MAX_COUNTRY_NAME_LENGTH+GEO_MAX_REGION_NAME_LENGTH+GEO_MAX_CITY_NAME_LENGTH+GEO_MAX_PROVIDER_NAME_LENGTH+GEO_MAX_MOBILE_STATUS_LENGTH+GEO_MAX_PROXY_LENGTH-6+118];     format(string, sizeof(string),     "Страна: %s\n\     Регион: %s\n\     Город: %s\n\     Провайдер: %s\n\     Использует ли моб.сеть: %s\n\     Использует ли прокси: %s",     GetPlayerIpCountry(player),     GetPlayerIpRegion(player),     GetPlayerIpCity(player),     GetPlayerIpProvider(player),     GetPlayerIpMobileStatus(player),     GetPlayerIpProxyStatus(player));     ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, !" ", string, !"Закрыть", !"");     return true; }  
    • DEST
      By DEST
      Командный процессор: zcmd / dc_cmd + sscanf.