Sleash

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

В теме 5 сообщений

Решил с неделю назад написать простенькую систему семей, справился +- за 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;
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

@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;

 

Отредактировано пользователем Sleash`en

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с проблемой по 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, "", "");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, phizlfs сказал:

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Sleash
      От 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
      От NoVate
      Доброго времени суток 
       
      Многие новички задавались вопросом: "Как создать свой RP сервер?", "С чего начать разработку?", "Это сложно и я не справлюсь".
      После таких вопросов многие уходили с этой темы и оставляли её на последней полке. Некоторые брались и сталкивались с большими проблемами. И только часть из этих людей доходили до какого-то результата.
       
      Моя цель: сделать создание сервера в SA:MP проще. Чтобы каждый из тех, кто интересовался созданием сервера мог спокойно взять готовую, а что самое главное - базовую сборку и под неё уже создавать различные свои задумки. SA:MP на данный момент не особо актуален, а тем более самый обычный клиент, НО, как мне кажется, если сделать что-то невероятное, то аудитория заметит это и ей будет достаточно интересно "пощупать" данное новшество.
       
      Для тех, кто начнёт писать: "Ты видел свой код?", "Ты сделал не правильно в 777-ой строке" и так далее. Сразу отвечу, цитируя:
       
      Кому стало интересно и кто хотел бы ознакомиться со сборком - прошу в мой Github (не реклама).
      Буду делать коммиты по мере свободного времени и написании кода.
      Если есть какие-то идеи, то пишите в мой Discord сервера (не реклама), который можно будет найти на той же странице.
       
      Спасибо всем за прочтение и хорошего настроения 
    • xiemoniyaz
      От 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
      От DEST
      Командный процессор: zcmd / dc_cmd + sscanf.
       
    • Daniil Korochansky
      От 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