Здравствуйте, меня долго не было, потому что проект IV:MP распался. Сейчас идет разработка над двумя проектами для GTA IV.
Пока я начну с этого проекта. Начну с системы регистрации пока на файлах, вскоре перейдем на MySql.
В конце мода добавим сам класс EasyINI.

Код:
class EasyINI {
	lastsec = null;
	sections = {};
	filename = "";
	constructor(fname) {
    filename = fname;
    fileCreate(fname);
    local tf = eFile(fname, "r");
    sections.clear();
    lastsec = null;
    while(!tf.eos()) {
    	local line = tf.readline(),
    	res = regexp(@"\[[\C]+]").search(line);
    	if(!line.len() || line[0] == ';') {
        continue;
    	}
    	if(res != null) {
        local secname = line.slice(res.begin+1, res.end-1);
        if(findSection(secname) == null) {
        	createSection(secname);
        }
        lastsec = secname;
        continue;
    	}
    	if(lastsec == null) {
        continue;
    	}
    	res = regexp(" = ").search(line);
    	if(res != null) {
        setKey(lastsec, line.slice(0, res.begin), line.slice(res.end));
    	}
    }
	}
/*
* Internal Methods
*/
	function createSection(name) {
    return (sections[name] <- {});
	}
	function findSection(name) {
    if(sections.rawin(name)) {
    	return sections[name];
    }
    return null;
	}
	function createKey(section, key, val) {
    if(findSection(section) != null) {
    	sections[section][key] <- val;
    	return true;
    } else {
    	createSection(section);
    	local s = findSection(section);
    	if(s == null) {
        log("Some serious shit happened. Tell the scripter about that.");
        return false;
    	}
    	s[key] <- val;
    	return true;
    }
    return false;
	}
/*
* Public Methods
*/
	function keyExists(section, key) {
    local s = findSection(section);
    if(s == null) {
    	return false;
    }
    return (s.rawin(key));
	}
	function setKey(section, key, val) {
    if(val == null) {
    	throw "EasyINI Exception: Value must not be null!";
    }
    if(!keyExists(section, key)) {
    	createKey(section, key, val.tostring());
    } else {
    	findSection(section)[key] <- val.tostring();
    }
	}
	function getKey(section, key) {
    if(!keyExists(section, key)) {
    	return null;
    }
    return sections[section][key];
	}
	function deleteKey(section, key) {
    if(!keyExists(section, key)) {
    	return false;
    }
    return delete sections[section][key];
	}
	function deleteSection(name) {
    if(findSection(name) == null) {
    	return false;
    }
    return delete sections[name];
	}
	function logData() {
    foreach(i,s in sections) {
    	log("[" + i + "]");
    	foreach(j,k in s) {
        log(j + " = " + k);
    	}
    }
	}
	function reloadData() {
    sections.clear();
    lastsec = null;
    local tf = eFile(fname, "r");
    while(!tf.eos()) {
    	local line = tf.readline();
    	res = regexp(@"\[[\C]+]").secReg.search(line);
    	if(!line.len() || line[0] == ';') {
        continue;
    	}
    	if(res != null) {
        local secname = line.slice(res.begin+1, res.end-1);
        if(findSection(secname) == null) {
        	createSection(secname);
        }
        lastsec = secname;
        continue;
    	}
    	if(lastsec == null) {
        continue;
    	}
    	res = regexp(" = ").secReg.search(line);
    	if(res != null) {
        setKey(lastsec, line.slice(0, res.begin), line.slice(res.end));
    	}
    }
	}
	function saveData() {
    local tf = eFile(filename, "w");
    tf.writeline(";File generated by EasyINI");
    foreach(i,s in sections) {
    	tf.writeline("[" + i + "]");
    	foreach(j,k in s) {
        tf.writeline(j + " = " + k);
    	}
    }
	}
}

function fileCreate(filename) {
	local tf = file(filename, "a+");
	tf = null;
	return true;
}

Далее там же добавим класс чтения файлов

Код:
class eFile extends file {
	function readline() {
    local result = "";
    while(!this.eos()) {
    	local c = this.readn('c');
    	if(c == '\n' || !c)	{
        return result;
    	}
    	if(c == '\r') {
        continue;
    	}
    	result += c.tochar();
    }
    return result;
	}
	function writeline(line) {
    foreach(char in line) {
    	this.writen(char, 'c'); 
    }
    this.writen('\n', 'c');
	}
}

И еще там же

Код:
function fileExists(filename)
{
        try
        {
                local testfile = file(filename, "r");
        }
        catch(e)
        {
                return false;
        }
        return true;
}

Ну вот сейчас можно начать саму систему. Система будет работать через команды, так ка GUI пока нет
В самом начале мода

Код:
const COLOR_RED = 0xFF0000;
const COLOR_SHADOW = 0x8A795D;
Код:
local users = {};

Далее в onPlayerJoin( player ) создадим таблицу

Код:
player.spawn(-380.787,351.273,14.2655,90.0);
users[player] <- {};
users[player].logged <- 0;
users[player].money <- 0;

Далее идем в onPlayerRequestSpawn(player)

Код:
local name = player.getName();
      if(users[player].logged == 0) {
    if(!fileExists("users/"+name+".ini")) {
    	player.sendMessage("/register [password]", COLOR_WHITE, true);
    }
    else if(fileExists("users/"+name+".ini")) {
    	player.sendMessage("/login [password]", COLOR_SHADOW, false);
    }
	} else if(users[player].logged == 1) {
    player.spawn(1034.912109, -563.173462, 31.809320, 90.0);
	}

Далее будут наши команды, в onPlayerCommand(command, player)

Код:
local cmd = split(command, " ");
         if(cmd[0] == "register") {
    if(cmd.len() >= 2) {
    	onPlayerRegister(player, cmd[1].tostring());
    } else {
    	player.sendMessage("/register [password]", COLOR_RED, true);
    }
	}
	if(cmd[0] == "login") {
    if(cmd.len() >= 2) {
    	onPlayerLogin(player, cmd[1].tostring());
    } else {
    	player.sendMessage("/login [password]", COLOR_RED, true);
    }
	}

Теперь создадим 2 функции

Код:
function onPlayerRegister(player, password) {
	local name = player.getName();
	if(!fileExists("users/"+name+".ini")) {
    local pass = password.tostring();
    local pFile = EasyINI("users/"+name+".ini");
    pFile.setKey("Account Settings", "Password", pass.tostring());
    	pFile.setKey("Account Settings", "Money", "1000");
    pFile.saveData();
    player.sendMessage("/login [password]", COLOR_SHADOW, false);
	}
	return true;
}

function onPlayerLogin(player, password) {
	local name = player.getName();
	if(fileExists("users/"+name+".ini")) {
    	local pFile = EasyINI("users/"+name+".ini");
    	local pass = password.tostring();
    	if(pass == pFile.getKey("Account Settings", "Password")) {
    	users[player].money = pFile.getKey("Account Settings", "Money").tointeger();
    	pFile.saveData();
    	users[player].logged = 1;
    	onPlayerRequestSpawn(player);
    } else {
    	player.sendMessage("Неверный пароль", COLOR_RED, true);
    }
	} else {
    player.sendMessage("Наберите /register [password]", COLOR_RED, false);
	}
}

Вроде все. Если будут какие то вопросы задавайте