Здравствуйте, меня долго не было, потому что проект 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);
}
}Вроде все. Если будут какие то вопросы задавайте


