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