PDA

Просмотр полной версии : [Вопрос] Для чего нужен [playerid]



Artzes
02.12.2017, 23:45
Для чего используется [playerid] в коде? К примеру, в некоторых ТеквтДравах используют [playerid], в некоторых нет. Также и просто в скриптах:
if(PlayerInfo[playerid][pAdmin] < 1) return true; pAdmin я понимаю еще, т.к это переменная есть в enum PlayerInfo. Но зачем playerid? Разве без него компилятор не поймет что мы к этому пользователю действие совершаем. Просто, где нужно его использовать, а где нет, объясните. т.к я в сампе достаточно давно, слышал, что [playerid] начали использовать, чтоб слет аккаунтов не происходил или перемешка данных. Тип, после перезахода у человека, у которого не было дома - появился дом, который был у человека который был под ИДом, под которым зашел новый чел.

- - - Добавлено - - -

И еще вопрос, из-за чего раньше на серверах происходил слет акккаунтов или перемешка данных. К примеру, у игромании была перемешка данных связанная с ИДом, как я выше сказал, у Аризоны слет..

Kovshevoy
02.12.2017, 23:52
playerid - твой порядковый номер в реальный момент времени на сервере, то есть значение которое присваевается индивидуально для каждого игрока.
А на счет текстдравов, есть два типа - глобальный и личный. Глобальный - для всех одинаковый и не изменяемый (в большинстве случаев), а личный - для всех указывается по разному, в зависимости от значения.

- - - Добавлено - - -

Давай разеберем на вот таком примере команды для передачи личных сообщений другому игроку.
ID с которого идет отправка сообщения - playerid, то есть это ты отправляешь сообщение.
ID который увидит и примет твое сообщение - giveplayerid.
giveplayerid == INVALID_PLAYER_ID - Если ID человека, которому ты отправляешь это смс нет на сервере (кикнули или просто ошибся в цифре, или же такого слота вообще нет), выдаст тебе смс - что данный игрок не на сервере.
Когда ты отправишь сообщение игроку, ему вылетит текст внизу экрана - New message!, и только ему отправится, и увидит тоже, только он. И наоборот так же, если он тебе будет отправлять - увидишь только ты.
Машина же не понимает, что ты например хочешь Васе отправить СМС, а не Пете. Ты понимаешь, что тебе именно Васе сбросить надо, а машина делает то, что ты ей приказал. А ей нужно как-то определить, что это именно Вася, а не Петя. Если вопросы будут, задавай, подскажу что-то.


CMD:pm(playerid, params[])
{
new giveplayerid;
if(sscanf(params, "rs[128]", giveplayerid, params))
return SendClientMessage(playerid, COLOR_ORANGE, "/pm [ID] [Текст]");

if(giveplayerid == INVALID_PLAYER_ID)
return SendClientMessage(playerid,COLOR_WHITE,"Указанный игрок не найден на сервере");

GetPlayerName(playerid, sendername, sizeof(sendername));
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
format(string, sizeof(string), "(( PM от %s(%d): %s ))", sendername, playerid, params);
GameTextForPlayer(giveplayerid, "~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~y~New message!", 3000, 3);
SendClientMessage(giveplayerid, 0xFFFF00FF, string);
format(string, sizeof(string), "(( PM для %s(%d): %s ))", giveplayer, giveplayerid, params);
SendClientMessage(playerid, 0xFFFF00FF, string);
return true;
}

Artzes
03.12.2017, 00:16
ну, это я им сам понимаю. Вопрос в другом. К примеру, взял код со стороннего портала, автор: sportsman
new Text:DopPasBox;
new Text:DopPasKey[12];
new PlayerText:DopPasText[MAX_PLAYERS];

#define SCM SendClientMessage
#define COLOR_LIGHTBLUE 0x33CCFFAA


enum pInfo
{
pOtherPass
};
new Player[MAX_PLAYERS][pInfo];


public OnGameMode()
{
DopPasBox = TextDrawCreate(360.500000, 220.249969, "usebox");
TextDrawLetterSize(DopPasBox, 0.0, 11.674073);
TextDrawTextSize(DopPasBox, 278.0, 0.000000);
TextDrawAlignment(DopPasBox, 1);
TextDrawColor(DopPasBox, 0);
TextDrawUseBox(DopPasBox, true);
TextDrawBoxColor(DopPasBox, 102);
TextDrawSetShadow(DopPasBox, 0);
TextDrawSetOutline(DopPasBox, 0);
TextDrawFont(DopPasBox, 0);
DopPasKey[0] = TextDrawCreate(313.500000, 299.249877, "0");
TextDrawTextSize(DopPasKey[0], 321.0, 12.666503);
DopPasKey[1] = TextDrawCreate(297.500000, 245.000030, "1");
TextDrawTextSize(DopPasKey[1], 305.558776, 12.666503);
DopPasKey[2] = TextDrawCreate(314.0, 245.0, "2");
TextDrawTextSize(DopPasKey[2], 322.500000, 17.499511);
DopPasKey[3] = TextDrawCreate(331.0, 245.000091, "3");
TextDrawTextSize(DopPasKey[3], 340.0, 12.666503);
DopPasKey[4] = TextDrawCreate(296.500000, 264.249877, "4");
TextDrawTextSize(DopPasKey[4], 305.500000, 12.666503);
DopPasKey[5] = TextDrawCreate(313.500000, 263.666687, "5");
TextDrawTextSize(DopPasKey[5], 322.0,12.666503);
DopPasKey[6] = TextDrawCreate(330.500000, 264.250000, "6");
TextDrawTextSize(DopPasKey[6], 339.0, 12.666503);
DopPasKey[7] = TextDrawCreate(296.500000, 281.750061, "7");
TextDrawTextSize(DopPasKey[7], 304.500000, 12.666503);
DopPasKey[8] = TextDrawCreate(313.500000, 281.750000, "8");
TextDrawTextSize(DopPasKey[8], 322.0,12.666503);
DopPasKey[9] = TextDrawCreate(330.0, 281.750061, "9");
TextDrawTextSize(DopPasKey[9], 338.0, 12.666503);
DopPasKey[10] = TextDrawCreate(296.500000, 299.249969, "c");
TextDrawTextSize(DopPasKey[10], 304.500000, 12.666503);
DopPasKey[11] = TextDrawCreate(329.0, 301.000030, ">");
TextDrawTextSize(DopPasKey[11], 338.0, 12.666503);
for(new i; i < 12; i++)
{
TextDrawLetterSize(DopPasKey[i], 0.449999, 1.600000);
TextDrawAlignment(DopPasKey[i], 0);
TextDrawColor(DopPasKey[i], -1378294017);
TextDrawSetShadow(DopPasKey[i], 0);
TextDrawSetOutline(DopPasKey[i], 0);
TextDrawBackgroundColor(DopPasKey[i], 51);
TextDrawFont(DopPasKey[i], 3);
TextDrawSetProportional(DopPasKey[i], 1);
TextDrawSetSelectable(DopPasKey[i], true);
}
return true;
}
public OnPlayerConnect(playerid)
{
Player[playerid][pOtherPass] = 0;


DopPasText[playerid] = CreatePlayerTextDraw(i, 319.500000, 227.833312, "-");
PlayerTextDrawLetterSize(i, DopPasText[playerid], 0.285499, 1.223330);
PlayerTextDrawTextSize(i, DopPasText[playerid], 313.0, 58.916694);
PlayerTextDrawAlignment(i, DopPasText[playerid], 2);
PlayerTextDrawColor(i, DopPasText[playerid], 65535);
PlayerTextDrawUseBox(i, DopPasText[playerid], true);
PlayerTextDrawBoxColor(i, DopPasText[playerid], -2139062017);
PlayerTextDrawSetShadow(i, DopPasText[playerid], 0);
PlayerTextDrawSetOutline(i, DopPasText[playerid], 0);
PlayerTextDrawFont(i, DopPasText[playerid], 1);
return true;
}


public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
for(new i; i < 10; i++)
{
if(clickedid == DopPasKey[i])
{
new pass[5];
if(GetPVarInt(playerid, "ShowTextDopPass") == 1 || GetPVarInt(playerid, "ShowTextDopPass") == 3)
{
GetPVarString(playerid, "DopPassword[0]", pass, sizeof(pass));
strinz = "";
format(strinz, 5, "%s%d", pass, i);
SetPVarString(playerid, "DopPassword[0]", strinz);
}
if(GetPVarInt(playerid, "ShowTextDopPass") == 2)
{
GetPVarString(playerid, "DopPassword[1]", pass, sizeof(pass));
strinz = "";
format(strinz, 5, "%s%d", pass, i);
SetPVarString(playerid, "DopPassword[1]", strinz);
}
strinz = "";
for(new a = 0; a <= strlen(pass); a++) format(strinz, 5, "%sx", strinz);
PlayerTextDrawSetString(playerid, DopPasText[playerid], strinz);
return true;
}
}
if(clickedid == DopPasKey[10]) // C
{
switch(GetPVarInt(playerid, "ShowTextDopPass"))
{
case 1: SetPVarString(playerid, "DopPassword[0]", "");
case 2: SetPVarString(playerid, "DopPassword[1]", "");
case 3: SetPVarString(playerid, "DopPassword[0]", "");
}
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
return true;
}
if(clickedid == DopPasKey[11]) // >
{
new passcount[5];
if(GetPVarInt(playerid, "ShowTextDopPass") == 1)
{
GetPVarString(playerid, "DopPassword[0]", passcount, sizeof(passcount));
if(strlen(passcount) < 4) return SCM(playerid, COLOR_GREY, "Пароль должен состоять из 4 чисел.");
SCM(playerid, COLOR_LIGHTBLUE, "Введите дополнительный пароль ещё раз.");
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
SetPVarInt(playerid, "ShowTextDopPass", 2);
}
else if(GetPVarInt(playerid, "ShowTextDopPass") == 2)
{
new DopPass[2][5];
GetPVarString(playerid, "DopPassword[0]", DopPass[0], 5);
GetPVarString(playerid, "DopPassword[1]", DopPass[1], 5);
if(strcmp(DopPass[0], DopPass[1], true) == 0)
{
Player[playerid][pOtherPass] = strval(DopPass[1]);
//UpdateOtherValue(playerid, "OtherPass", Player[playerid][pOtherPass]); Сохарним в БД (У меня MySQL (как у Вас, я не знаю))
SCM(playerid, COLOR_LIGHTBLUE, "Дополнительный пароль установлен.");
ProtectionHide(playerid);
CancelSelectTextDraw(playerid);
}
else
{
if(strlen(DopPass[1]) < 4) return true;
SCM(playerid, 0xFFFFFFAA, "Повторный пароль введен не верно.");
}
}
else if(GetPVarInt(playerid, "ShowTextDopPass") == 3)
{
new DopPassOk[5];
GetPVarString(playerid, "DopPassword[0]", DopPassOk, 5);
if(strval(DopPassOk) != Player[playerid][pOtherPass])
{
new count = GetPVarInt(playerid, "ProtectioCount");
SetPVarInt(playerid, "ProtectioCount", count+1);
if(count+1 >= 3) return Kick(playerid);
return SCM(playerid, 0xFFFFFFAA, "Дополнительный пароль введен не верно. Попробуйте ещё раз.");
}
CancelSelectTextDraw(playerid);
ProtectionHide(playerid);
OnPlayerLoginYes(playerid);
}
return true;
}
//--------------------------------------------------------------------------
else if(clickedid == Text:INVALID_TEXT_DRAW)
{
if(GetPVarInt(playerid, "ShowTextDopPass") > 0)
{
if(GetPVarInt(playerid, "ShowTextDopPass") == 1 || GetPVarInt(playerid, "ShowTextDopPass") == 2) DiaProtection(playerid);
for(new i; i < 12; i++) TextDrawHideForPlayer(playerid, DopPasKey[i]);
if(GetPVarInt(playerid, "ShowTextDopPass") == 3) return Kick(playerid);
ProtectionHide(playerid);
}
}

return false;
}



public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmd, "/doppass", true) == 0)
{
ProtectionShow(playerid, 1);
}
return true;
}





Ваш public/stock авторизации
{
if(Player[playerid][pOtherPass] == 0)
{
// Если доп. пароль не установлен
}
else
{
ProtectionShow(playerid, 3);
}
return true;
}



stock ProtectionShow(playerid, count)
{
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
for(new i; i < 12; i++) TextDrawShowForPlayer(playerid, DopPasKey[i]);
TextDrawShowForPlayer(playerid, DopPasBox);
PlayerTextDrawShow(playerid, DopPasText[playerid]);
SelectTextDraw(playerid, 0x4598A5FF);
SetPVarInt(playerid, "ShowTextDraw", 1);
SetPVarInt(playerid, "ShowTextDopPass", count);
return true;
}
stock ProtectionHide(playerid)
{
for(new i; i < 12; i++) TextDrawHideForPlayer(playerid, DopPasKey[i]);
TextDrawHideForPlayer(playerid, DopPasBox);
PlayerTextDrawHide(playerid, DopPasText[playerid]);
DeletePVar(playerid, "DopPassword[0]");
DeletePVar(playerid, "DopPassword[1]");
DeletePVar(playerid, "ShowTextDopPass");
DeletePVar(playerid, "ShowTextDraw");
return true;
}

Почему он в первом коде ТД [playerid] не написал, а в другом написал(где OnPlayerConnect)? И то и другой одинаково используются

Kovshevoy
03.12.2017, 00:23
ну, это я им сам понимаю. Вопрос в другом. К примеру, взял код со стороннего портала, автор: sportsman
new Text:DopPasBox;
new Text:DopPasKey[12];
new PlayerText:DopPasText[MAX_PLAYERS];

#define SCM SendClientMessage
#define COLOR_LIGHTBLUE 0x33CCFFAA


enum pInfo
{
pOtherPass
};
new Player[MAX_PLAYERS][pInfo];


public OnGameMode()
{
DopPasBox = TextDrawCreate(360.500000, 220.249969, "usebox");
TextDrawLetterSize(DopPasBox, 0.0, 11.674073);
TextDrawTextSize(DopPasBox, 278.0, 0.000000);
TextDrawAlignment(DopPasBox, 1);
TextDrawColor(DopPasBox, 0);
TextDrawUseBox(DopPasBox, true);
TextDrawBoxColor(DopPasBox, 102);
TextDrawSetShadow(DopPasBox, 0);
TextDrawSetOutline(DopPasBox, 0);
TextDrawFont(DopPasBox, 0);
DopPasKey[0] = TextDrawCreate(313.500000, 299.249877, "0");
TextDrawTextSize(DopPasKey[0], 321.0, 12.666503);
DopPasKey[1] = TextDrawCreate(297.500000, 245.000030, "1");
TextDrawTextSize(DopPasKey[1], 305.558776, 12.666503);
DopPasKey[2] = TextDrawCreate(314.0, 245.0, "2");
TextDrawTextSize(DopPasKey[2], 322.500000, 17.499511);
DopPasKey[3] = TextDrawCreate(331.0, 245.000091, "3");
TextDrawTextSize(DopPasKey[3], 340.0, 12.666503);
DopPasKey[4] = TextDrawCreate(296.500000, 264.249877, "4");
TextDrawTextSize(DopPasKey[4], 305.500000, 12.666503);
DopPasKey[5] = TextDrawCreate(313.500000, 263.666687, "5");
TextDrawTextSize(DopPasKey[5], 322.0,12.666503);
DopPasKey[6] = TextDrawCreate(330.500000, 264.250000, "6");
TextDrawTextSize(DopPasKey[6], 339.0, 12.666503);
DopPasKey[7] = TextDrawCreate(296.500000, 281.750061, "7");
TextDrawTextSize(DopPasKey[7], 304.500000, 12.666503);
DopPasKey[8] = TextDrawCreate(313.500000, 281.750000, "8");
TextDrawTextSize(DopPasKey[8], 322.0,12.666503);
DopPasKey[9] = TextDrawCreate(330.0, 281.750061, "9");
TextDrawTextSize(DopPasKey[9], 338.0, 12.666503);
DopPasKey[10] = TextDrawCreate(296.500000, 299.249969, "c");
TextDrawTextSize(DopPasKey[10], 304.500000, 12.666503);
DopPasKey[11] = TextDrawCreate(329.0, 301.000030, ">");
TextDrawTextSize(DopPasKey[11], 338.0, 12.666503);
for(new i; i < 12; i++)
{
TextDrawLetterSize(DopPasKey[i], 0.449999, 1.600000);
TextDrawAlignment(DopPasKey[i], 0);
TextDrawColor(DopPasKey[i], -1378294017);
TextDrawSetShadow(DopPasKey[i], 0);
TextDrawSetOutline(DopPasKey[i], 0);
TextDrawBackgroundColor(DopPasKey[i], 51);
TextDrawFont(DopPasKey[i], 3);
TextDrawSetProportional(DopPasKey[i], 1);
TextDrawSetSelectable(DopPasKey[i], true);
}
return true;
}
public OnPlayerConnect(playerid)
{
Player[playerid][pOtherPass] = 0;


DopPasText[playerid] = CreatePlayerTextDraw(i, 319.500000, 227.833312, "-");
PlayerTextDrawLetterSize(i, DopPasText[playerid], 0.285499, 1.223330);
PlayerTextDrawTextSize(i, DopPasText[playerid], 313.0, 58.916694);
PlayerTextDrawAlignment(i, DopPasText[playerid], 2);
PlayerTextDrawColor(i, DopPasText[playerid], 65535);
PlayerTextDrawUseBox(i, DopPasText[playerid], true);
PlayerTextDrawBoxColor(i, DopPasText[playerid], -2139062017);
PlayerTextDrawSetShadow(i, DopPasText[playerid], 0);
PlayerTextDrawSetOutline(i, DopPasText[playerid], 0);
PlayerTextDrawFont(i, DopPasText[playerid], 1);
return true;
}


public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
for(new i; i < 10; i++)
{
if(clickedid == DopPasKey[i])
{
new pass[5];
if(GetPVarInt(playerid, "ShowTextDopPass") == 1 || GetPVarInt(playerid, "ShowTextDopPass") == 3)
{
GetPVarString(playerid, "DopPassword[0]", pass, sizeof(pass));
strinz = "";
format(strinz, 5, "%s%d", pass, i);
SetPVarString(playerid, "DopPassword[0]", strinz);
}
if(GetPVarInt(playerid, "ShowTextDopPass") == 2)
{
GetPVarString(playerid, "DopPassword[1]", pass, sizeof(pass));
strinz = "";
format(strinz, 5, "%s%d", pass, i);
SetPVarString(playerid, "DopPassword[1]", strinz);
}
strinz = "";
for(new a = 0; a <= strlen(pass); a++) format(strinz, 5, "%sx", strinz);
PlayerTextDrawSetString(playerid, DopPasText[playerid], strinz);
return true;
}
}
if(clickedid == DopPasKey[10]) // C
{
switch(GetPVarInt(playerid, "ShowTextDopPass"))
{
case 1: SetPVarString(playerid, "DopPassword[0]", "");
case 2: SetPVarString(playerid, "DopPassword[1]", "");
case 3: SetPVarString(playerid, "DopPassword[0]", "");
}
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
return true;
}
if(clickedid == DopPasKey[11]) // >
{
new passcount[5];
if(GetPVarInt(playerid, "ShowTextDopPass") == 1)
{
GetPVarString(playerid, "DopPassword[0]", passcount, sizeof(passcount));
if(strlen(passcount) < 4) return SCM(playerid, COLOR_GREY, "Пароль должен состоять из 4 чисел.");
SCM(playerid, COLOR_LIGHTBLUE, "Введите дополнительный пароль ещё раз.");
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
SetPVarInt(playerid, "ShowTextDopPass", 2);
}
else if(GetPVarInt(playerid, "ShowTextDopPass") == 2)
{
new DopPass[2][5];
GetPVarString(playerid, "DopPassword[0]", DopPass[0], 5);
GetPVarString(playerid, "DopPassword[1]", DopPass[1], 5);
if(strcmp(DopPass[0], DopPass[1], true) == 0)
{
Player[playerid][pOtherPass] = strval(DopPass[1]);
//UpdateOtherValue(playerid, "OtherPass", Player[playerid][pOtherPass]); Сохарним в БД (У меня MySQL (как у Вас, я не знаю))
SCM(playerid, COLOR_LIGHTBLUE, "Дополнительный пароль установлен.");
ProtectionHide(playerid);
CancelSelectTextDraw(playerid);
}
else
{
if(strlen(DopPass[1]) < 4) return true;
SCM(playerid, 0xFFFFFFAA, "Повторный пароль введен не верно.");
}
}
else if(GetPVarInt(playerid, "ShowTextDopPass") == 3)
{
new DopPassOk[5];
GetPVarString(playerid, "DopPassword[0]", DopPassOk, 5);
if(strval(DopPassOk) != Player[playerid][pOtherPass])
{
new count = GetPVarInt(playerid, "ProtectioCount");
SetPVarInt(playerid, "ProtectioCount", count+1);
if(count+1 >= 3) return Kick(playerid);
return SCM(playerid, 0xFFFFFFAA, "Дополнительный пароль введен не верно. Попробуйте ещё раз.");
}
CancelSelectTextDraw(playerid);
ProtectionHide(playerid);
OnPlayerLoginYes(playerid);
}
return true;
}
//--------------------------------------------------------------------------
else if(clickedid == Text:INVALID_TEXT_DRAW)
{
if(GetPVarInt(playerid, "ShowTextDopPass") > 0)
{
if(GetPVarInt(playerid, "ShowTextDopPass") == 1 || GetPVarInt(playerid, "ShowTextDopPass") == 2) DiaProtection(playerid);
for(new i; i < 12; i++) TextDrawHideForPlayer(playerid, DopPasKey[i]);
if(GetPVarInt(playerid, "ShowTextDopPass") == 3) return Kick(playerid);
ProtectionHide(playerid);
}
}

return false;
}



public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmd, "/doppass", true) == 0)
{
ProtectionShow(playerid, 1);
}
return true;
}





Ваш public/stock авторизации
{
if(Player[playerid][pOtherPass] == 0)
{
// Если доп. пароль не установлен
}
else
{
ProtectionShow(playerid, 3);
}
return true;
}



stock ProtectionShow(playerid, count)
{
PlayerTextDrawSetString(playerid, DopPasText[playerid], "-");
for(new i; i < 12; i++) TextDrawShowForPlayer(playerid, DopPasKey[i]);
TextDrawShowForPlayer(playerid, DopPasBox);
PlayerTextDrawShow(playerid, DopPasText[playerid]);
SelectTextDraw(playerid, 0x4598A5FF);
SetPVarInt(playerid, "ShowTextDraw", 1);
SetPVarInt(playerid, "ShowTextDopPass", count);
return true;
}
stock ProtectionHide(playerid)
{
for(new i; i < 12; i++) TextDrawHideForPlayer(playerid, DopPasKey[i]);
TextDrawHideForPlayer(playerid, DopPasBox);
PlayerTextDrawHide(playerid, DopPasText[playerid]);
DeletePVar(playerid, "DopPassword[0]");
DeletePVar(playerid, "DopPassword[1]");
DeletePVar(playerid, "ShowTextDopPass");
DeletePVar(playerid, "ShowTextDraw");
return true;
}

Почему он в первом коде ТД [playerid] не написал, а в другом написал(где OnPlayerConnect)? И то и другой одинаково используются

OnGameModeInit - там подгружаются функции для всех игроков, соответственно не нужно указывать конкретный ID для которого присваивается этот текстдрав. То есть он - глобальный, абсолютно для всех одинаковый.
В PlayerConnect - игрок подключается - и конкретно для него подгружается этот ТД, и значение там может поменятся в любой момент и это значение увидит только он. Говорю же, глобальные для всех, личные для каждого индивидуально.

- - - Добавлено - - -

В общем первый ТД - статический, без изменений. ТД для playerid, динамический, меняется в зависимости от команды, которую ты задал для машины.

- - - Добавлено - - -

В твоем случае это регистрация же?
Ну вот, регистрация для всех игроков одинаковая, вот для этого и стоит глобальный ТД, а значения уже которые там будут идти - индивидуальные.

Artzes
03.12.2017, 00:29
хорошо разобрались. Теперь про слет и перемешку данных от аккаунта. Как избеждать слета аккаунтов и перемешки данных? Подробно выше написал

Kovshevoy
03.12.2017, 00:32
хорошо разобрались. Теперь про слет и перемешку данных от аккаунта. Как избеждать слета аккаунтов и перемешки данных? Подробно выше написал

Вот на счет этого уже без понятия. Скорей всего нужно делать правильные запросы, если у тебя MySQL (и советую использовать его в качестве хранения данных, ибо зачастую с "перемешиванием" данных, проблемы у mxINI). Я не сталкивался лично с перемешкой данных и слета аккаунтов.

iWors
09.11.2018, 02:38
хорошо разобрались. Теперь про слет и перемешку данных от аккаунта. Как избеждать слета аккаунтов и перемешки данных? Подробно выше написал
При дисконнекте обнулять данные (уровень, пароль и прочее).

Зря поднял тему, на дату не посмотрев...

X!X
11.11.2018, 17:13
При дисконнекте обнулять данные (уровень, пароль и прочее).

Зря поднял тему, на дату не посмотрев...

Почему при дисконнекте? Может наоборот, при коннекте обнулять все переменные лучше?:bad:

DeimoS
12.11.2018, 11:31
Если правильно строить логику своего скрипта, то и обнулять ничего не придётся: все переменные будут принимать нужные значения при загрузке аккаунта.