PDA

Просмотр полной версии : [Вопрос] 0 скин при спавне и смешивание паролей.



McGetto
01.09.2015, 14:48
Короче.
1 баг. При спавне, скин меняется на 0(CJ), например при выходе с наблюдение, после смерти и т.п. Сразу скажу, что я 100 раз перепроверил код. Нигде не стоит SetPlayerSkin или что-то в этом роде. Да и проверять не зачем. Так как 0 скин вижу только я(у себя), другие игроки видят мой настоящий скин(не 0).

2 баг. Смешиваются пароли. Я использую функцию strins для записи пароля из "inputtext" в переменную. Потом я записываю пароль в базу данных. Захожу в бд и вижу что пароли смешались, например пароль от 1 аккаунта - 123, а от второго должен был быть 456, но вместо этого 123456. 100% уверен что это из-за strins, так как я проверил - вставил эту функцию в другую часть кода(не при регистрации), и заметил, что пароли тоже смешиваются - значит проблема не в базе данных. После я заменил функцию strins на функцию strpack. В другой части кода пароли не смешивались и все было прекрасно, но аккаунт вообще перестал даже регистрироваться.

Ну вот и все. 2 гадких бага. Помогите, может кто-либо сталкивался хотя-бы с одним из них.)

$continue$
01.09.2015, 16:21
OnPlayerSpawn покажите.

Короче.
1 баг. При спавне, скин меняется на 0(CJ), например при выходе с наблюдение, после смерти и т.п. Сразу скажу, что я 100 раз перепроверил код. Нигде не стоит SetPlayerSkin или что-то в этом роде. Да и проверять не зачем. Так как 0 скин вижу только я(у себя), другие игроки видят мой настоящий скин(не 0).

После я заменил функцию strins на функцию strpack.
А Вы сами поняли, что Вы сделали?
http://i.imgur.com/jLMPU5D.png
Участок кода где используется strins в студию!

McGetto
02.09.2015, 12:29
case dRegister:
{
if(!response) return ShowPlayerDialog(playerid, dOptions, DIALOG_STYLE_LIST, "{FFFFFF}Настройки", "Сменить ник\nОтправить новый пароль на E-mail\nОтправить новый пароль на телефон(SMS)", "Выбрать", "Назад");
if(!strlen(inputtext)) return Register_dialog(playerid);
for(new i = strlen(inputtext)-1; i != -1; i--)
{
switch(inputtext[i])
{
case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;
default: return Register_dialog(playerid), SendClientMessage(playerid, RED, "Пароль содержит запрещеные символы.");
}
}
strins(PlayerInfo[playerid][pPassword], inputtext, 0);
//strpack(PlayerInfo[playerid][pPassword], inputtext);
format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`Nick`, `Password`) VALUES ('%s', '%s')", PlayerInfo[playerid][pNick], PlayerInfo[playerid][pPassword]);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");

new Pass[128]; format(Pass, sizeof(Pass), "Ваш пароль - %s, никому его не сообщайте!", inputtext), SendClientMessage(playerid, -1, Pass);
ShowPlayerDialog(playerid, dRegisterGameInfo, DIALOG_STYLE_MSGBOX, "{FFFFFF}Регистрация", "Цель игры - получить высокий уровень, купить дом, транспорт\nПопасть в клан, захватить территории\nКлавиша Y - Основное меню\nF6 или T - чат", "Хорошо", "");
return 1;
}

Это весь код диалога регистрации. Кстати я когда скидывал тебе этот код, обнаружил, что я не прописал размер строки. Я ввел:
strpack(PlayerInfo[playerid][pPassword], inputtext);
а надо было:
strpack(PlayerInfo[playerid][pPassword], inputtext, 0);

Может проблема в этом?

$continue$
02.09.2015, 18:44
const MAX_PLAYER_PASSWORD = /* максимальная длина пароля */;
Попробуйте так:


case dRegister:
{
if (!response)
return ShowPlayerDialog(playerid, dOptions, DIALOG_STYLE_LIST, "{FFFFFF}Настройки", "Сменить ник\nОтправить новый пароль на E-mail\nОтправить новый пароль на телефон(SMS)", "Выбрать", "Назад");
if (!strlen(inputtext))
return Register_dialog(playerid);
for (new i = strlen(inputtext) - 1; i != -1; i--)
{
switch (inputtext[i])
{
case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;
default:
return Register_dialog(playerid), SendClientMessage(playerid, RED, "Пароль содержит запрещеные символы.");
}
}
new temp[63 + MAX_PLAYER_PASSWORD + MAX_PLAYER_NAME + 1];
PlayerInfo[playerid][pPassword] = "\0"; // Или EOS
strins(PlayerInfo[playerid][pPassword], inputtext, 0);
mysql_format(mysql_connect_ID, temp, sizeof(temp), "INSERT INTO `accounts` (`Nick`, `Password`) VALUES ('%e', '%e')", PlayerInfo[playerid][pNick], PlayerInfo[playerid][pPassword]);
mysql_function_query(mysql_connect_ID, temp, false, "", "");

temp[0] = "\0"; // Или EOS

format(temp, sizeof(temp), "Ваш пароль - %s, никому его не сообщайте!", inputtext);
SendClientMessage(playerid, -1, temp);
temp[0] = "\0"; // Или EOS
ShowPlayerDialog(playerid, dRegisterGameInfo, DIALOG_STYLE_MSGBOX, "{FFFFFF}Регистрация", "Цель игры - получить высокий уровень, купить дом, транспорт\nПопасть в клан, захватить территории\nКлавиша Y - Основное меню\nF6 или T - чат", "Хорошо", "");
return 1;
}

McGetto
02.09.2015, 20:50
strmid(PlayerInfo[playerid][pPassword], inputtext, 0, strlen(inputtext), 64);

Так не проще? По-моему исправился. Но все равно спасибо за совет.)

А что с багом со скином? Не встречал такой?

McGetto
04.09.2015, 21:39
Не может такого быть, чтобы ни у кого не был 1 баг.((

#Vito
05.09.2015, 01:00
Нигде не стоит SetPlayerSkin или что-то в этом роде.
Ну так добавь, в чем проблема?
В OnPlayerSpawn

SetPlayerSkin(playerid, PlayerInfo[playerid][pModel]);

McGetto
12.09.2015, 00:45
Тогда сначала будет скин CJ, и только потом наш скин. Короче скин CJ будет мельком заметен.

Я узнал почему при спавне 0 скин, это потому что мы не выбираем скин стандартными стрелками.

Если выбрать скин стрелками. А потом его сменить например через команду какую-нибудь функцией SetPlayerSkin. То при спавне будет скин который мы выбрали стрелками.

Пытался вызвать функцию нажатия стрелок: OnPlayerRequestClass(playerid, PlayerInfo[playerid][pSkin]), но ничего не вышло((

Может я не правильно вызываю, или так нельзя?

#Vito
12.09.2015, 12:19
AddPlayerClass (https://wiki.sa-mp.com/wiki/AddPlayerClass_RU)

McGetto
14.09.2015, 08:20
Ты про это?:
public OnGameModeInit()
{
for(new i = 0; i < 312; i++) AddPlayerClass(i,0,0,0,0,0,0,0,0,0,0);
...
return 1;
}

#Vito
14.09.2015, 23:11
Так и не понял, в чем твоя проблема.


Тогда сначала будет скин CJ, и только потом наш скин. Короче скин CJ будет мельком заметен.
А по-другому никак.. Так везде, ну можешь поставить ф-цию SetPlayerSkin в самое начало паблика, что бы было еще менее заметно.

McGetto
15.09.2015, 11:42
Еще как "как")) У Absolute DM рега на текстдрвах(т.е НЕ на стрелках скин выбираем) и скин НЕ мелькает!

#Vito
15.09.2015, 16:48
Еще как "как")) У Absolute DM рега на текстдрвах(т.е НЕ на стрелках скин выбираем) и скин НЕ мелькает!

public OnPlayerRequestClass(playerid, classid) return 0;
И скин не будет мелькать.. Для того, чтоб он вообще не мелькал, используй ф-цию SetPlayerPos после завершения регистрации, то есть не вызывай OnPlayerSpawn

McGetto
17.09.2015, 13:25
Я не вызываю. Это SA-MP автоматически вызывает после смерти или при выходе из наблюдения (TogglePlayerSpectate).

А в OnPlayerRequestClass у меня диалог регистрации, я не могу там return 0 ставить. И кстать у abs dm тоже диалог регистрации в OnPlayerRequestClass.

#Vito
17.09.2015, 13:49
Поставь туда проверки залогинен ли игрок.

public OnPlayerRequestClass(playerid, classid)
{
if(PlayerInfo[playerid][pLogged]) return 0;
// Тут регистрация
}

McGetto
17.09.2015, 18:34
Это че такое?:crazy:

Это абсолютно ничем не помогает. После смерти этот паблик не вызывается, вызывается паблик OnPlayerSpawn.

Вот что я намудрил:


OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 2023.5000, 1343.6250, 10.8203), SetPlayerFacingAngle(playerid, 25.0000);
SetPlayerCameraPos(playerid, 2024.8748, 1348.0020, 11.6050), SetPlayerCameraLookAt(playerid, 2024.5593, 1347.0548, 11.4299);
//Диалог регистрации
if(!Logged[playerid]) SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
}


Теперь при нажатий на стрелки при авторизации скины не меняются.
Таким образом я добился чтобы скин не мелькал зарегистрированным пользователям.

Не знаю как сделать для не зарегистрированных пользователей и для тех кто сменил скин в игре (через команду и т.п)