Код RemovePlayerInfo покажи и все места, где используешь её
Код RemovePlayerInfo покажи и все места, где используешь её
PHP код:
stock RemovePlayerInfo(playerid)
{
s_player[playerid][pID] = 0;
s_player[playerid][pName][0] = EOS;
s_player[playerid][pPassword][0] = EOS;
s_player[playerid][pKills][0] = 0;
s_player[playerid][pDollar][0] = 0;
s_player[playerid][pDead][0] = 0;
return 1;
}
PHP код:
enum e_PLAYER_INFO
{
pID,
pName[MAX_PLAYER_NAME],
pPassword[31],
pKiller,
pDollar,
pDead
};
PHP код:
public UploadPlayerAccount(playerid)
{
s_player[playerid][pID] = cache_get_field_content_int(0, "id", mysql_connect_ID);
s_player[playerid][pKiller] = cache_get_field_content_int(0, "kills", mysql_connect_ID);
s_player[playerid][pDollar] = cache_get_field_content_int(0, "dollar", mysql_connect_ID);
s_player[playerid][pDead] = cache_get_field_content_int(0, "dead", mysql_connect_ID); //если что убирать надо
GameTextForPlayer(playerid,"~g~GO ~y~SPAWN", 5000, 5);
scm(playerid,-1,"Ваш аккаунт загружен");
scm(playerid,-1,"Ручное сохранение аккаунта - {FF6200}/saveacc");
player_no_connect{playerid} = 1;
TogglePlayerSpectating(playerid, false);
SpawnPlayer(playerid);
return 1;
}
PHP код:
stock CreateNewAccount(playerid, password[])
{
new query_string[66+MAX_PLAYER_NAME-4+30+(30+11)+(48+11)];
format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`, `kills`, `dollar`, `dead`) VALUES ('%s', '%s', '%d', '%d', '%d')",
s_player[playerid][pName], password, s_player[pKiller], s_player[pDollar], s_player[playerid][pDead]);
mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccountNumber", "i", playerid);
format(query_string, sizeof(query_string), "Вы зарегистрировали аккаунт.", s_player[playerid][pName]);
scm(playerid,-1,query_string);
player_no_connect{playerid} = 0;
format(query_string, sizeof(query_string),"\t{8D8D8D}Аккаунт успешно занесен в базу данных \n\n\t{FFFFFF}Имя аккаунта: {8CEB59}%s \n\t{FFFFFF}Пароль доступа: {8CEB59}%s\n\t{FFFFFF}Сделайте screenshot - {0EE68C}[F8] \n\n\t{8D8D8D}Просьба перезайти на сервер (в целях безопасности)", s_player[playerid][pName], s_player[playerid][pPassword]);
spd(playerid, dGuard,dsm,"{00FF0D}Guard HG", query_string,"Перезайти","");
TogglePlayerSpectating(playerid, false);
SpawnPlayer(playerid);
return 1;
}
PHP код:
stock SaveAccount(playerid)
{
new query_string[(21)+(16+11)+(20+MAX_PLAYER_NAME)+(16+30)+(13+11)+(15+10)] = "UPDATE `accounts` SET";
format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, s_player[playerid][pName]);
format(query_string, sizeof(query_string), "%s `password` = '%s',", query_string, s_player[playerid][pPassword]);
format(query_string, sizeof(query_string), "%s `kills` = '%d',", query_string, s_player[playerid][pKiller]);
format(query_string, sizeof(query_string), "%s `dollar` = '%d',", query_string, s_player[playerid][pDollar]);
format(query_string, sizeof(query_string), "%s `dead` = '%d'", query_string, s_player[playerid][pDead]);
format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, s_player[playerid][pID]);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
return 1;
}
Так а где ты RemovePlayerInfo вызываешь?
В смысле, я нигде её при дисконекте ни в гамемоде эксит не прописал, а где вобще надо
- - - Добавлено - - -
PHP код:
public OnGameModeExit()
{
mysql_close(mysql_connect_ID);
return 1;
}
- - - Добавлено - - -PHP код:
public OnPlayerDisconnect(playerid, reason)
{
player_no_connect{playerid} = 0;
SaveAccount(playerid);
return 1;
}
Я дебил, я незнаю как я мог такие важные дела пропустить. я Исправил да 0 при регистрации. Но мне так и не стало понятно кое что.
Почему когда этого стока я не прописывал в дисконекте, тогда работало на деньгах и киллах тоже там при регистрации после занятия слота прежнего игрока, 0 было, лишь в dead копировалось.
И это не всё я настолько криворукий что я ошибку в removeplayerinfo допустил, я к переменным добавил [0] = 0; крч.. мало ли что ещё появится. А так пока что спасибо всё заебок)
И да я хотел спросить, можно ли там где new query где прописаны по типа 21+(MAX_PLAYERS)+(21+231)+(232) и т.д (это пример)
Укоротить к примеру написав лишь new query[256] ну что бы не сложить всё это в длинную строчку
PHP код:
stock SaveAccount(playerid)
{
new query_string[[COLOR="#FF0000"](21)+(16+11)+(20+MAX_PLAYER_NAME)+(16+30)+(13+11)+(15+10)[/COLOR]] = "UPDATE `accounts` SET"; (укоротить по типу [256])
format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, s_player[playerid][pName]);
format(query_string, sizeof(query_string), "%s `password` = '%s',", query_string, s_player[playerid][pPassword]);
format(query_string, sizeof(query_string), "%s `kills` = '%d',", query_string, s_player[playerid][pKiller]);
format(query_string, sizeof(query_string), "%s `dollar` = '%d',", query_string, s_player[playerid][pDollar]);
format(query_string, sizeof(query_string), "%s `dead` = '%d'", query_string, s_player[playerid][pDead]);
format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, s_player[playerid][pID]);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
return 1;
}
А в указанных строках, памяти хватает? или я не правильно расчитал? сверху
- - - Добавлено - - -
тут надо выделять память? если надо, то как расчитать здесьPHP код:
stock CreateNewAccount(playerid, password[])
{
new query_string[66+MAX_PLAYER_NAME-4+30+(30+11)+(48+11)];
format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`,`password`,`kills`,`dollar`,`dead`) VALUES ('%s','%s','%d','%d','%d')",
s_player[playerid][pName], password, s_player[pKiller], s_player[pDollar], s_player[playerid][pDead]);
mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccountNumber", "i", playerid);
format(query_string, sizeof(query_string), "Вы зарегистрировали аккаунт.", s_player[playerid][pName]);
scm(playerid,-1,query_string);
player_no_connect{playerid} = 0;
format(query_string, sizeof(query_string),"\t{8D8D8D}Аккаунт успешно занесен в базу данных \n\n\t{FFFFFF}Имя аккаунта: {8CEB59}%s \n\t{FFFFFF}Пароль доступа: {8CEB59}%s\n\t{FFFFFF}Сделайте screenshot - {0EE68C}[F8] \n\n\t{8D8D8D}Просьба перезайти на сервер (в целях безопасности)", s_player[playerid][pName], s_player[playerid][pPassword]);
spd(playerid, dGuard,dsm,"{00FF0D}Guard HG", query_string,"Перезайти","");
TogglePlayerSpectating(playerid, false);
SpawnPlayer(playerid);
return 1;
}
Я в статье объяснял как нужно рассчитывать и составлять формулу.
Здравствуйте, у меня есть несколько вопросов, как я уже сказал, вашей системе регистрации. Сразу предупреждаю, что я новичок в pawn и вообще программировании. Вообщем, я так и не понял почему не стоит делать сохранение имени и пароля при дисконнекте игрока. Потом, я хотел добавить свой массив в enum pInfo, в который будет содержать либо "да" либо "нет"(1/0 соответственно), выделил для него размер один символ и в итоге выдает ошибку(warning 215: expression has no effect), в коде, мне кажется, все в порядке, хотя может быть вот эти фунции pInfo[playerid][pNation][0] = EOS и strins(pInfo[playerid][pNation][0], "1", 0) виноваты. Я так и не понял, что означает [0] после [pNation], может быть проблема в нем? Когда выделяю побольше размер массивуработает все без проблем, но это же вроде как не правильно. И последний вопрос, я понапихал кучу массивов с данными в pIfnfo, стоит ли так делать? Может стоит как то оптимизировать все это?
Потому что они никак не изменятся без ведома сервера, как, например, координаты, которые постоянно обновляются игроком. Смысл сохранять то, что не изменяется?
Так а зачем Вы создаёте массив, если хотите хранить число? Создавайте целочисленную переменную (член перечисления) и присваивайте ему значение:
PHP код:
enum e_PLAYER_INFO
{
pNation
}
new pInfo[MAX_PLAYERS][e_PLAYER_INFO];
pInfo[playerid][pNation] = 1;
Нет.
Огромной спасибо! Теперь все стало ясно. Вам +
- - - Добавлено - - -
Так, ладно, вот последний вопрос: что рекомендуется нагружать в первую очередь - базу данных или код и процессор сервера. То бишь, например, я делаю возможность игроку допустим выбрать пол или же цвет коже. Что будет в данном случае лучше, записывать в бд именно пол "Мужской/Женский" или же "1/0" и делать в коде проверку на то, если "1" вывести "Мужской". Надеюсь, понятно объяснил(
1/0 лучше
Может сделаешь версию урока под orm?
Ответ на твой вопрос: *клик*
Если у кого сложно с английским, то в Pawn нет возможности передавать байты по ссылке, а посему и исправить работу функции не получится.
Так как форум крайне тяжело обрабатывал статью при попытке редактирования, ибо в ней почти 112 тысяч символов и куча BB-кодов, пришлось разделить всю тему на 3 поста (за идею по реализации отдельное спасибо Daniel_Cortez).
Я постарался максимально сохранить общий вид и читаемость, но если вдруг всё же где-то не углядел несработавший BB-код или какую-то другую "аномалию" - просьба сообщить об этом :)
Касаемо подобной статьи по регистрации с использованием ORM: в планах, но пока нет ни настроения, ни времени :pardon: Но статья точно будет, просто настроение обычно приходит неожиданно и что-то планировать тут трудно :)
В FindPlayerInTable поправь регистр mysql_connect_id
В логине в default не хватает DeletePVar
Очень годно! Я просто в восторге! Всю ночь переписывал строки к себе в мод, и думал, сколько же надо терпения чтобы столько написать! Да ещё так толково!
Если нажать на кнопку Spawn то персонаж спавнится, и если авторизоваться и начать пользоваться чатом, то будет написано "Вы не можете использовать чат" (ну или как там было)
Фикс этого нужно делать самостоятельно, ибо это не относится к системе аккаунтов. Основная цель этого урока - объяснить как работать с базой данных и реализовать сохранение/загрузку. Диалоги, спавн, проверка статуса авторизации - всё это лишь примеры того, как можно связать работу с данными аккаунта и остальной мод, ибо способов реализации всего этого есть множество и нельзя сделать универсальный вариант.
Удалено (исправил)
Обновил начало статьи, убрав инструкцию для Denwer и заменив её на инструкцию к Open Server.