Защита аккаунта пользователя
#21

Quote:
Originally Posted by Miller
Посмотреть сообщение
Stepashka, вот:

Код:
	if(PlayerInfo[playerid][pAccountProtection] == 1)
	{
		GetPlayerIp(playerid, currentip, sizeof(currentip));
    		if(strcmp(currentip,PlayerInfo[playerid][pLastIp]))
    		{
    	    		SendClientMessage(playerid, COLOR_LIGHTYELLOW, "Ваш IP адрес не совпадает с IP адресом использованным при установке защиты аккаунта!");
    	    		Kick(playerid);
    		}
	}
А pLastIp точно в акк сохраняется?
Reply
#22

Makar93, да, проверял, если защиты на аккаунт не стоит, с каждой авторизацией записывается IP адрес, с которого собственно и заходил пользователь...
Reply
#23

Ну так в чем проблема, сделай чобы читалось из файла и записывалось при выходе...
Reply
#24

Распечатой прямо перед проверкой что записано в currentip и PlayerInfo[playerid][pLastIp], я думаю самому сразу станет понятно в чем проблема.
Reply
#25

Stepashka, пистец, однако >_>

Quote:

[22:34:10] Incoming connection: 127.0.0.1:56936
[22:34:10] [join] Jkeee has joined the server (0:127.0.0.1)
[22:34:22] [log] 127.0.0.1
[22:34:22] [log] 
[22:34:22] [part] Jkeee has left the server (0:2)

Получается из файла не так считывает? о_О

Вот что я впилил для проверки:

Quote:

printf("[log] %s", currentip);
printf("[log] %s", PlayerInfo[playerid][pLastIp]);

Reply
#26

значит не так, или не туда, или вообще не считывает
Reply
#27

Romanius, Что же делать? :O strmid никак нельзя использовать о.о?
Reply
#28

запись ip где находится?
в каком паблике?
покажи код записи ip с указанием паблика и всем тем что у тебя выше этого кода в этом паблике
Reply
#29

Секунду, сейчас скину
Reply
#30

DANGER1979, Код записи IP в файл находится в самодельном паблике =), который вызывается при успешном логине игрока...

Запись IP адреса первая в паблике...

А как выглядит можно посмотреть страницей ранее, Stepashka скидывал >_<
Reply
#31

Makar93, писать систему заного такой гемор

Я хочу попробовать сделать систему авторизации на mxINI , только бы код не запороть, а то я бэкап делать постоянно забываю.
Reply
#32

Научишься на mxINI - делай на SQLite.
Reply
#33

научишься на SQLite делай на MySQL научишься на MySQL шли в задницу павн
Reply
#34

Romanius, =D
Reply
#35

ну хз хз... Я с MXini и dini так и не умею работать. Ну а в SQLite вродь разобрался (спасибо OFFREAL'y)
Reply
#36

ну если считать экономией места, то можно записывать бинарные данные. Работает так же быстро. И данные более в компактном виде. Если надо, могу дать набросок сохранения и загрузки базовых данных в бинарный файл (размер файла всегда будет 9 байт (ну или больше не помню))
Reply
#37

Romanius, кидай сюда
Reply
#38

PHP код:
#include <a_samp>
#include <r_io>
stock bernstein(string[])
{
    new 
hash = -1;
    
    for(new 
ij; (string[i]); i++)
        
hash hash 33 j;
    return 
hash;
}
enum OFFSETS
{
    
HEADER         0,
    
PASSWORD     3,
    
KILLS        7,
    
DEATHS        9,
    
MONEY        11,
    
HEALTH        15,
    
ARMOUR        16,
    
POSX        17,
    
POSY        21,
    
POSZ        25,
    
POSA        29,
}
stock writeData(filename[])
{
    new 
File:fopen(filenameio_write);
    
    
/* === Хедер файла === */
    
writeByte(f0x75);  // буква u (сокращение от User :D)
    
writeByte(f0x73);  // буква s (сокращение от SAMP :D:D)
    
writeByte(f0x72);  // буква r (сокращение от Romanius :D:D:D)
    /* =================== */
    
    /* === Пароль === */
    
writeInt32(fbernstein("PaSsWoRd"));
    
/* ============== */
    
    /* === Фраги === */
    
writeInt16(f10); // <----- Убийства
    
writeInt16(f3);  // <----- Смерти
    /* ============= */
    
    /* === Деньги === */
    
writeInt32(f123456);
    
/* ============== */
    
    /* === Жизни, броня === */
    
writeByte(f100);
    
writeByte(f50);
    
/* ==================== */
    
    /* === Позиция === */
    
writeInt32(ffloatround(52.32 100.0));     // <----- X
    
writeInt32(ffloatround(-121.12 100.0)); // <----- Y
    
writeInt32(ffloatround(5.78 100.0));     // <----- Z
    
writeInt32(ffloatround(330.62 100.0));     // <----- A
    /* =============== */
    
    
    
fclose(f);
}
public 
OnFilterScriptInit()
{
    
writeData("Romanius.usr");
    
    new 
ts tickcount();
    
    new 
File:fopen("Romanius.usr"io_read);
    new 
header[3];
    
    
header[0] = readByte(u);
    
header[1] = readByte(u);
    
header[2] = readByte(u);
    
    if(
header[0] != 0x75 && header[1] != 0x73 && header[2] != 0x72)
    {
        print(
"Invalid user file!");
    
        
fclose(u);
        
        return;
    }
    
    new 
password     readInt32(u);
    
    new 
kills         readInt16(u);
    new 
deaths         readInt16(u);
    
    new 
money        readInt32(u);
    
    new 
health        readByte(u);
    new 
armour        readByte(u);
    
    new 
Float:X        float(readInt32(u)) / 100.0;
    new 
Float:Y        float(readInt32(u)) / 100.0;
    new 
Float:Z        float(readInt32(u)) / 100.0;
    new 
Float:A        float(readInt32(u)) / 100.0;
    
    
fclose(u);
    
    
printf("Time is: %d"tickcount() - ts);
    
    
printf("User data:\n\tPassword: %d\n\tKills: %d\n\tDeaths: %d\n\tMoney: %d\n\tHealth: %d\n\tArmour: %d\n\tX: %.2f\n\tY: %.2f\n\tZ: %.2f\n\tA: %.2f\n\t",
    
passwordkillsdeathsmoneyhealtharmourXYZA);

Такой способ хранения данных, будет занимать только 33 байт на диске. Теперь о структуре файла:


Сортировка байт Little Edian.

Хедер (3 байта)
Пароль (4 байта)
Убийства (2 байта)
Смерти (2 байта)
Деньги (4 байта)
Жизни (1 байт)
Броня (1 байт)
X (4 байта)
Y (4 байта)
Z (4 байта)
A (4 байта)

Скачать инклуд r_io
Reply
#39

А можно всё это теперь уроком выложить? Спасибо
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)