Question

Здравствуйте, команда форума и его пользователи. Перепробовал разные способы сохранения здоровья в базу данных, но они не подходят для меня. Буду благодарен, если кто-то поделится данной системой.

Share this post


Link to post

18 answers to this question

  • 0

@Tookie Johnson, что конкретно пробовали, что не подходит? 

Share this post


Link to post
  • 0

TS Posted (edited) · Report post

@Cawfeehttps://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://pawn.wiki/index.php%3F/topic/30348-sohranenie-zdorovja-i-broni-pri-vihode/&ved=2ahUKEwjRupq1l6WFAxWQGRAIHZz2CWYQFnoECA4QAQ&usg=AOvVaw1bm2L15SncC3uGm4AHbLBM

 

В Ютубе тоже смотрел. Делал также, ничего не сохранялось.

Я могу вам скинуть как у меня обновляется айпи в базе данных при авторизации, а мы попробуем разобраться, как на основе этого сделать сохранение хп.

Edited by Tookie Johnson

Share this post


Link to post
  • 0

@Tookie Johnson, показывайте сохранение IP-адреса, коль уж можете.

Share this post


Link to post
  • 0

TS Posted (edited) · Report post

@Cawfee , доброе утро. Держите:

new string[256];
new lastip[15];
GetPlayerIp(playerid, lastip, 15);
format(string, sizeof(string), "UPDATE `accounts` SET `pLastIp` = '%s' WHERE `pName` = '%s'", lastip, pInfo[playerid][pName]);
mysql_function_query(database, string, 0"""");

 

Извините за такую подачу кода, не получается исправить 

Edited by Cawfee

Share this post


Link to post
  • 0

@Tookie Johnson, превосходно. Вы по аналогии создали новый столбец в таблице accounts для хранения значения здоровья? В предложенном SQL-запросе изменили название поля и аргумент lastip на значение здоровья игрока? Куда вставляли полученный код? 

Share this post


Link to post
  • 0

TS Posted (edited) · Report post

@Cawfee , да. Дожидаясь ответа от вас сегодня, я попытался сделать систему сохранения хп, но я теперь умираю при спавне.

@Cawfee в public OnPlayerDisconnect. SetPlayerHealth(playerid, pInfo[playerid][pHealth] в public OnPlayerSpawn.

Я пробовал и %d и %f, не получилось.

В загрузку аккаунта тоже добавлял. Если надо записи в консоле, то скину могу скинуть 

Edited by Tookie Johnson

Share this post


Link to post
  • 0

@Tookie Johnson, будет лучше, если покажете конкретные фрагменты кода с указанием места их размещения.

Share this post


Link to post
  • 0

@Cawfee, хорошо, 5 минут и всё будет здесь 

 

Уважаемый @Cawfee , простите меня за ваше потраченное время на меня. Не сохранялось всё из-за того, что я пробел поставил между Float: и pHealth. Я проверил, сохраняется. Ещё раз, извините меня, пожалуйста. В следующий раз буду обращаться на форум только если в крайнем случае нужно. Но спасибо вам за то, что явились на помощь и пытались помочь. 

Share this post


Link to post
  • 0

@Tookie Johnson, ничего страшного. Хорошо, что все хорошо. Но проблема навряд ли в пробеле.

Share this post


Link to post
  • 0

@Cawfee , я тут заметил, что после регистрации 0 хп и смерть, а когда снова вхожу в аккаунт, то всё хорошо 

 

Попробую добавить хп сохранение после регистрации 

Share this post


Link to post
  • 0

TS Posted (edited) · Report post

@Cawfee , всё таки проблему не до конца решил. После регистрации умираю, но когда вхожу в этот аккаунт, всё уже работает.

Спойлер

enum player_information
{
    Float:pHealth
}

public OnPlayerDisconnect(playerid, reason)
{
    new string[256];
    new Float:health;
    GetPlayerHealth(playerid, health);
    format(string, sizeof(string), "UPDATE `accounts` SET `pHealth` = '%f' WHERE `pName` = '%s'", health, pInfo[playerid][pName]);
    mysql_function_query(database, string, 0"""");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    SetPlayerHealth(playerid, pInfo[playerid][pHealth]);
    return 1;
}

forward p_login(playerid);
public p_login(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows)
    {
        pInfo[playerid][pHealth] = cache_get_field_content_float(0"pHealth");
        authorization[playerid] = true; SpawnPlayer(playerid);
    }
    else
    {
        static const fmt_str[] = "Добро пожаловать на {F2BC58}California RolePlay [#1]\n{FFFFFF}Аккаунт: {6EF83C}%s\n{FFFFFF}Пинг: {6EF83C}%d\n{FFFFFF}Ваш игровой аккаунт зарегистрирован. Если Вы не\n{FFFFFF}регистрировали этот аккаунт, то используйте другой\nникнейм.\n\n{C3C3C3}Введите пароль от Вашего аккаунта и нажмите 'Вход'.";
        new string[sizeof(fmt_str) - 2 + MAX_PLAYER_NAME];
        format(string, sizeof(string), fmt_str, pInfo[playerid][pName], GetPlayerPing(playerid));
        ShowPlayerDialog(playerid, 4, DIALOG_STYLE_PASSWORD, "{F2BC58}Авторизация", string, "Далее""");
        SendClientMessage(playerid, -1"{FFFFFF}Вы успешно авторизировались. Желаем Вам приятной игры на {F2BC58}California Role Play{FFFFFF}!");
    }
}

 

 

В базе данных:

Столбец: pHealth

Тип: FLOAT

Как определено: 100

Спойлер

----------
Loaded log file: "server_log.txt".
----------
SA-MP Dedicated Server
----------------------
v0.3.7-R2, (C)2005-2015 SA-MP Team
[08:43:06] filterscripts = "" (string)
[08:43:06] weburl = "www.sa-mp.com" (string)
[08:43:06
[08:43:06] Server Plugins
[08:43:06] --------------
[08:43:06] Loading plugin: crashdetect.so
[08:43:06] CrashDetect plugin 4.19.4
[08:43:06] Loaded.
[08:43:06] Loading plugin: ColAndreas_static.so
[08:43:06] *********************
[08:43:06] ** Created By: **
[08:43:06] ** [uL]Chris42O **
[08:43:06] ** [uL]Slice **
[08:43:06] ** [uL]Pottus **
[08:43:06] *********************
[08:43:06] No collision data found.
[08:43:06] *********************
[08:43:06] ColAndreas Loaded
[08:43:06] v1.4.0
[08:43:06] *********************
[08:43:06] Loaded.
[08:43:06] Loading plugin: mysql_static.so
[08:43:06] plugin.mysql: R39-6 successfully loaded.
[08:43:06] Loaded.
[08:43:06] Loading plugin: pawnraknet.so
[08:43:06] Pawn.RakNet plugin v1.2.0 by urShadow loaded
[08:43:06] Loaded.
[08:43:06] Loading plugin: CRP.so
[08:43:06
[08:43:06] ______________________________________
[08:43:06] Convert Rus To Pwn v0.1.1 loaded
[08:43:06] ______________________________________
[08:43:06] By: Fro (c) Copyright <TBG 2009-2011
[08:43:06] ______________________________________
[08:43:06] Loaded.
[08:43:06] Loading plugin: pawncmd.so
[08:43:06] Pawn.CMD plugin v3.2.0 by urShadow has been loaded
[08:43:06] Loaded.
[08:43:06] Loading plugin: sscanf4.so
[08:43:06] [Vehicle/skin server limits] Loaded...
[08:43:06] Loaded.
[08:43:06] Loading plugin: sscanf.so
[08:43:06
[08:43:06] ===============================
[08:43:06] sscanf plugin loaded.     
[08:43:06] Version: 2.8.3        
[08:43:06] (c) 2018 Alex "Y_Less" Cole  
[08:43:06] ===============================
[08:43:06] Loaded.
[08:43:06] Loading plugin: streamer.so
[08:43:06

*** Streamer Plugin v2.8.2 by Incognito loaded ***
[08:43:06] Loaded.
[08:43:06] Loading plugin: TOTP.so
[08:43:06] TOTP plugin v1.0.1 by Games loaded.
[08:43:06] Loaded.
[08:43:06] Loaded 10 plugins.
[08:43:06
[08:43:06] Filterscripts
[08:43:06] ---------------
[08:43:06] Loaded 0 filterscripts.
[08:43:06
----------------------------------
[08:43:06] Blank Gamemode by your name here
[08:43:06] ----------------------------------
[08:43:06] Number of vehicle models: 0
[08:43:54] [connection] 85.26.235.46:21274 requests connection cookie.
[08:43:54] [connection] incoming connection: 85.26.235.46:21274 id: 0
[08:43:55] [join] Test_Account has joined the server (0:85.26.235.46)
[08:44:11] [death] Test_Account died 255
[08:44:15] [death] Test_Account died 255
[08:44:30] [part] Test_Account has left the server (0:0)

 

 

Edited by Cawfee

Share this post


Link to post
  • 0

@Tookie Johnson, в личных сообщениях создайте диалог с собой (напишите сами себе) и попробуйте потренироваться со вставкой кода. Здесь описание.

 

Чем завершается регистрация? Где код последнего диалога?

Share this post


Link to post
  • 0

TS Posted (edited) · Report post

@Cawfee, регистрация заканчивается после выбора пола.

 

Спойлер

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 0:
        {
            if(!response)
                return Kick(playerid);
            if(!strlen(inputtext))
            {
                static const fmt_str[] = "{FFFFFF}Добро пожаловать на {F2BC58}California RolePlay [#1]\n{FFFFFF}Пинг: {6EF83C}%d\n{FFFFFF}Данный аккаунт {6EF83C}свободен {FFFFFF}для регистрации.\n\n{FFFFFF}Придумайте пароль для вашего будущего аккаунта.\n\n{C3C3C3}* Длина пароля должна составлять от от 4 до 30 символов.\n{C3C3C3}* Пароль может состоять из русских и латинских символов.";
                new string[sizeof(fmt_str) - 2 + MAX_PLAYER_NAME];
                format(string, sizeof(string), fmt_str, pInfo[playerid][pName], GetPlayerPing(playerid));
                ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "{F2BC58}Регистрация", string, "Далее""");
                return 1;
            }
            if(strlen(inputtext) < 4 || strlen(inputtext) > 30)
                return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "{F2BC58}Регистрация""{FFFFFF}Пароль должен содержать от 4 до 30 символов и букв""Далее""");
            for(new i = strlen(inputtext); i != 0; --i)
            switch(inputtext[i])
            {
                case 'А'..'Я''а'..'я'' ':
                    return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "{F2BC58}Регистрация""{FFFFFF}Ваш пароль не должен содержать русских букв.""Далее""");
            }
            strmid(pInfo[playerid][pPassword], inputtext, 0, strlen(inputtext), 20);
            ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"{F2BC58}Регистрация","{FFFFFF}Введите Ваш действуйющий адрес электронной почты.\nУбедительно просим Вас ввести существующую почту, так как в дальнейшем\nона понадобится Вам для дополнительной защиты Вашего аккаунта.\n\n{C3C3C3}* Почта должна быть указана с символом '@'.\n{C3C3C3}* Почта может состоять максимум из 50 символов.""Далее","");
    }
    case 1:
    {
        if(response)
        {
            if(!strlen(inputtext)) return ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"{F2BC58}Регистрация","{FFFFFF}Введите Ваш действуйющий адрес электронной почты.\nУбедительно просим Вас ввести существующую почту, так как в дальнейшем\nона понадобится Вам для дополнительной защиты Вашего аккаунта.\n\n{C3C3C3}* Почта должна быть указана с символом '@'.\n{C3C3C3}* Почта может состоять максимум из 50 символов.""Далее","");
            if(strfind(inputtext, "@"true) == -1 || strfind(inputtext, "\n"true) != -1 || strfind(inputtext, "."true) == -1)
            {
                ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"{F2BC58}Регистрация","{FFFFFF}Введите Ваш действуйющий адрес электронной почты.\nУбедительно просим Вас ввести существующую почту, так как в дальнейшем\nона понадобится Вам для дополнительной защиты Вашего аккаунта.\n\n{C3C3C3}* Почта должна быть указана с символом '@'.\n{C3C3C3}* Почта может состоять максимум из 50 символов.""Далее","");
                return true;
            }
            strmid(pInfo[playerid][pEmail], inputtext, 0, strlen(inputtext), 50);
            new st[100];
            format(st, sizeof(st), "SELECT * FROM `accounts` WHERE `pEmail` = '%s'", inputtext);
            mysql_function_query(database, st, true"FindPlayerEmale","i", playerid);
            new string[256];
            SendClientMessage(playerid, 0xFFFFFFFF, string);
            ShowPlayerDialog(playerid, 3, DIALOG_STYLE_MSGBOX, "{F2BC58}Регистрация""{FFFFFF}Выберите пол для Вашего будущего персонажа""Мужской""Женский");
        }
    }
    case 3:
    {
        if(!response)
        {
            pInfo[playerid][pSex] = 2;
            new RandomF = random(sizeof(gRandomF));
            SetPlayerSkin(playerid,gRandomF[RandomF]);
            pInfo[playerid][pSkin] = gRandomF[RandomF];
        }
        else
        {
            pInfo[playerid][pSex] = 1;
            new RandomM = random(sizeof(gRandomM));
            SetPlayerSkin(playerid,gRandomM[RandomM]);
            pInfo[playerid][pSkin] = gRandomM[RandomM];
        }
        pInfo[playerid][pLevel] = 1;
        authorization[playerid] = true;
        new Year, Month, Day;
        getdate(Year, Month, Day);
        new regdate[13];
        format(regdate, sizeof(regdate), "%02d.%02d.%d", Day, Month, Year);
        new Second, Minute, Hour;
        gettime(Second, Minute, Hour);
        new regtime[11];
        format(regtime, sizeof(regtime), "%02d:%02d:%02d", Second, Minute, Hour);
        new regip[15];
        GetPlayerIp(playerid, regip, 15);
        static const fmt_str[] = "INSERT INTO `accounts` (`pName`, `pPassword`, `pEmail`, `pSex`, `pSkin`, `pLevel`, `pRegDate`, `pRegTime`, `pRegIp`) VALUES ('%s', '%s', '%s', '%d', '%d', '%d', '%s', '%s', '%s')";
        new string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME)+(-2+20)+(-2+50+1)+(-2+1)+(-2+3)+(-2+4)+(-2+13)+(-2+11)+(-2+15)];
        format(string, sizeof(string), fmt_str, pInfo[playerid][pName], pInfo[playerid][pPassword], pInfo[playerid][pEmail], pInfo[playerid][pSex], pInfo[playerid][pSkin], pInfo[playerid][pLevel], regdate, regtime, regip);
        mysql_function_query(database, string, 0"""");
        format(string, sizeof(string),"{6EF83C}%s{FFFFFF}, вы прошли регистрацию. Желаем приятной игры на {F2BC58}California  Role Play{FFFFFF}!", pInfo[playerid][pName]);
        SendClientMessage(playerid, -1, string);
        SpawnPlayer(playerid);
    }
    case 4:
    {
        if(!response)
            return Kick(playerid);
        if(!strlen(inputtext))
        {
            static const fmt_str[] = "Добро пожаловать на {F2BC58}California RolePlay [#1]\n{FFFFFF}Аккаунт: {6EF83C}%s\n{FFFFFF}Пинг: {6EF83C}%d\n{FFFFFF}Ваш игровой аккаунт зарегистрирован. Если Вы не\n{FFFFFF}регистрировали этот аккаунт, то используйте другой\nникнейм.\n\n{C3C3C3}Введите пароль от Вашего аккаунта и нажмите 'Вход'.";
            new string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME)];
            format(string, sizeof(string), fmt_str, pInfo[playerid][pName], GetPlayerPing(playerid));
            ShowPlayerDialog(playerid, 4, DIALOG_STYLE_PASSWORD, "{F2BC58}Авторизация", string, "Далее""");
            SendClientMessage(playerid, -1"{FFFFFF}Вы успешно авторизировались. Желаем Вам приятной игры на {F2BC58}California  Role Play{FFFFFF}!");
            return 1;
        }
        static const fmt_str[] = "SELECT * FROM `accounts` WHERE `pName` = '%s' AND `pPassword` = '%s'";
        new string[sizeof(fmt_str) - 2 + MAX_PLAYER_NAME - 2 + 20 + 1];
        format(string, sizeof(string), fmt_str, pInfo[playerid][pName], inputtext);
        mysql_function_query(database, string, 1"p_login""i", playerid);
    }
}
        return 1;
}}
        return 1;
}
        return 1;
}

 

case 3 - это выбор пола.

 

*Вместо 3-х ретюрнов у меня 1 (похоже баг кода тут).

Edited by Tookie Johnson

Share this post


Link to post
  • 0
В 02.04.2024 в 19:14, Tookie Johnson сказал:

 сохранения здоровья в базу данных

для чего и кто это придумал :nini:

Share this post


Link to post
  • 0

@ddrgtagfon, умные люди придумали для того, чтобы было.

Share this post


Link to post
  • 0

@Tookie Johnson, вы выставляете значение по умолчанию для здоровья игрока в базе данных, а в моде считываете это значение только при авторизации, но не регистрации. Вам нужно либо по окончании регистрации (перед SpawnPlayer) установить: pInfo[playerid][pHealth] = 100, либо после регистрации направлять игрока на авторизацию.

Share this post


Link to post
  • 0

@Cawfee, я попробую сейчас, спасибо!

 

@Cawfee, спасибо! Огромное вам спасибо за информацию по вставке кода и ответ по решению проблемы, я запомню это и постараюсь не допускать подобные ошибки. Спасибо вам большое, я благодарен. Можете закрывать тему <3 (это сердечко).

 

Я благодарен вам, честно 

Share this post


Link to post
  • 0
2 часа назад, Tookie Johnson сказал:

<3 (это сердечко)

По такому случаю добавил новый смайл (в следующий раз если наберете этот же символ и нажмете пробел, он автоматически подставится) :)

Share this post


Link to post
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Tufxgod
      By Tufxgod
      Пойду на проект в качестве разработчика.
      Опыт в павн 2 года, умею писать системы любой сложности, владею mysql.
      Пишите в лс!
    • tivan666ban
      By tivan666ban
      дедуги в консоли при подключении к серверу: [debug] Run time error 3: "Stack/heap collision (insufficient stack size)"
      [debug]  Stack pointer (STK) is 0xFFFEC394, heap pointer (HEA) is 0x1B40
      [debug] AMX backtrace:
      [debug] #0 00000000 in public OnPlayerConnect () in Untitled.amx