Последние Файлы GTA 4
Последние Файлы GTA-MP
Реклама
[NUT]Регистрация и авторизация на диалогах
Anokian Дата: Понедельник, 17.12.2012, 02:03 | Сообщение # 1
Новенький
Группа:
Пользователи
Сообщений: 36
Награды:
0
Репутация:
49
Замечания:
0%
Статус:
Урок: создание регистрации и авторизации на диалогах. Автор: Anokian (я) Skype: anokian_s Введение: Занимаюсь разработкой копии The Godfather на IVMP, когда будет релиз альфы не знаю, но из ништяков есть регистрация и авторизация на диалогах, чего я пока-что ни в одном моде не встречал, как разработка пойдёт дальше не знаю, так-что в любом случае я пожалуй выложу свою наработку с подробным описанием установки. Прошу сильно не пинать, пишу в ночи, довольно устал, о всех ошибках - пишите в тему, исправлю. 1. Создадим папку "accounts" в корне сервера. 2. Теперь нам нужно научить GM работать с .ini файлами (создавать, читать и редактировать их), в этом нам поможет скрипт прикрепленный ниже, но к нему потом, выполним всё по пунктам. 1) Подключим чтение файла в котором будет скрипт к самому GM, для этого в любом месте, желательно в самом начале что бы не потерять потом впишем строку: Code
dofile("resources/easyini.nut");
2) Создадим в корне сервера папку "resources". 3) Далее любым удобным для вас редактором (я использую MC Visual Studio 9 c плагином скьюррела) создадим в папке "resources" файл easyini.nut и запишем в него следующий код: [cut=easyini.nut] 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'); } } [/cut] 3. Далее укажем в GM, какие функции мы будем использовать, в любом месте, желательно опять в конце. Code
addEvent("playerConnect", onPlayerConnect); addEvent("playerDisconnect", onPlayerDisconnect); addEvent("playerCommand", onPlayerCommand); addEvent("dialogResponse", onDialogResponse);
4. Запишем скрипт функции исполняемой при подключении, она сообщит игроку, что необходимо делать что бы зарегистрироваться/залогиниться, так-же укажем функцию загрузки. Code
function onPlayerConnect(playerid) { Player[playerid] = CPlayer(playerid); sendPlayerMessage(playerid, "Регистрация - /register || Авторизация - /login ", orange); sendPlayerMessage(playerid, "Вы не сможете двигаться пока не авторизируетесь.", orange); return 1; } function loadPlayer(playerid) { Player[playerid].loadPlayer(); return 1; }
5. Теперь перейдём к функции ввода команд, сначала скрипт команды авторизации, потом регистрации. Code
function onPlayerCommand(playerid, command) { local cmd = split(command, " "); //Регистрация if(cmd[0] == "/login") { if(Player[playerid].Logged != 0) return sendPlayerMessage(playerid, "Вы уже авторизировались.", tomato); sendPlayerMessage(playerid,"Введите пароль от вашего аккаунта.",white); showPlayerDialog(playerid,loginDialogId,DIALOG_STYLE_INPUT,"Login","Please enter your password","Login","Cancel"); return 1; } if(cmd[0] == "/register") { if(Player[playerid].Logged != 0) return sendPlayerMessage(playerid, "Вы уже авторизировались.", tomato); sendPlayerMessage(playerid,"Введите пароль для регистрации вашего аккаунта.",white); showPlayerDialog(playerid,registerDialogId,DIALOG_STYLE_INPUT,"Register account","Please enter your password","Register","Cancel"); return 1; } return 0; }
6. Команды открытия диалогов созданы, но сами диалоги и их функции отсутствуют, напишем их: Code
function showPlayerDialog(playerid, dialogid, type, windowtext, maintext, firstbuttontext, secondbuttontext = "") { triggerClientEvent(playerid, "GUIDialog", dialogid, type, windowtext, maintext, firstbuttontext, secondbuttontext); togglePlayerControls(playerid, false); return true; } function onDialogResponse(playerid, dialogid, response, listitem, inputtext) { togglePlayerControls(playerid, true); switch(dialogid) { case loginDialogId: if(!response) return 1; if(inputtext.len() < 3) { sendPlayerMessage(playerid,"Слишком короткий пароль!",tomato); showPlayerDialog(playerid,loginDialogId,DIALOG_STYLE_INPUT,"Login","Please enter your password","Login","Cancel"); return 1; } if(!FileExists("accounts/"+getPlayerName(playerid)+".ini")) return sendPlayerMessage(playerid, "Вы не зарегистрировались!", tomato); local ini = EasyINI("accounts/"+getPlayerName(playerid)+".ini"); if(md5(inputtext) != ini.getKey("PlayerInfo", "Password")) return sendPlayerMessage(playerid, "Неверный пароль!", tomato); sendPlayerMessage(playerid, "Вы успешно авторизировались.", white, false); Player[playerid].loadPlayer(); break; case registerDialogId: if(!response) return 1; if(inputtext.len() < 3) { sendPlayerMessage(playerid, "Слишком короткий пароль!", tomato); showPlayerDialog(playerid,registerDialogId,DIALOG_STYLE_INPUT,"Register account","Please enter your password","Register","Cancel"); return 1; } if(FileExists("accounts/"+getPlayerName(playerid)+".ini")) return sendPlayerMessage(playerid, "Этот ник уже занят", tomato); savePlayer(playerid); Player[playerid].Logged = 1; sendPlayerMessage(playerid, "Аккаунт зарегестрирован, ваш пароль: "+inputtext+"", tomato, false); log(getPlayerName(playerid)+" has registered his account!"); break; } return true; }
7. Забыл указать в начале, но не суть важна, впишем это в любое место, необходимо для работы диалогов. Code
const DIALOG_STYLE_MSGBOX = 0; const DIALOG_STYLE_INPUT = 1; const DIALOG_STYLE_LIST = 2; const loginDialogId = 1; const registerDialogId = 2;
8. Добавим сохранение аккаунта при отключении игрока от сервера. Code
function onPlayerDisconnect(playerid, reason) { if(FileExists("accounts/"+getPlayerName(playerid)+".ini") && Player[playerid].Logged == 1) { savePlayer(playerid); Player[playerid].Clear(); } return 1; } function savePlayer(playerid) { Player[playerid].savePlayer(); return 1; }
9. Последнее что нужно сделать, это записать скрипт сохранения ini файла. Code
class CPlayer { constructor(newID) { pID = newID; } function loadPlayer() { local ini = EasyINI("accounts/"+getPlayerName(pID)+".ini"); Password = md5(ini.getKey("PlayerInfo","Password")); SpawnX = ini.getKey("PlayerInfo", "SpawnX").tofloat(); SpawnY = ini.getKey("PlayerInfo", "SpawnY").tofloat(); SpawnZ = ini.getKey("PlayerInfo", "SpawnZ").tofloat(); Logged = 1; ini.saveData(); } function savePlayer() { local ini = EasyINI("accounts/"+getPlayerName(pID)+".ini"); ini.setKey("PlayerInfo", "Password",md5(Password.tostring())); ini.setKey("PlayerInfo", "Logged",Logged.tostring()); ini.setKey("PlayerInfo", "SpawnX",SpawnX.tostring()); ini.setKey("PlayerInfo", "SpawnY",SpawnY.tostring()); ini.setKey("PlayerInfo", "SpawnZ",SpawnZ.tostring()); ini.saveData(); } function Clear() { pID = 0; Password = ""; Logged = 0; SpawnX = 0.0; SpawnY = 0.0; SpawnZ = 0.0; } pID = 0; Password = ""; Logged = 0; SpawnX = 0.0; SpawnY = 0.0; SpawnZ = 0.0; };
На этом всё, если я конечно ничего не забыл, а если вдруг забыл - пишите в тему. Ах да, по поводу цветов текста, в моём GM они записаны простыми словами (green, white), у вас-же при запуске сервера будут ошибки и работа скрипта остановится на том месте, где сервер не смог понять, что значат эти параметры. Расшифровку цветов можно выдрать из многих модов, только учтите что регистр тоже имеет значение, выглядит это примерно так: Code
const green = 0x20AA20FF;
Добавлено (17.12.2012, 02:03) --------------------------------------------- Вовремя вспомнил. В моде должен быть массив игроков:
Code
local Player = array(getPlayerSlots(),0);
А так-же клиентскрипт диалогов, создаём файл dialogs.nut так как я описывал в пункте 2 и вписываем в него скрипт: [cut=dialogs.nut] local screen = guiGetScreenSize(); //-----| Gui local GUIDIalogId = 0; local GUIDialogMSGBox = {}; local GUIDialogInput = {}; local GUIDialogList = {}; local GUIDialogListButtonsChosen = 0; local GUIDialogListButtonsNow = 0; local GUIDialogListButtons = 5; local GUIDialogMSGBoxTextsNow = 0; local GUIDialogMSGBoxTexts = 2; local GUIDialogInputTextsNow = 0; local GUIDialogInputTexts = 2; local GUIDialogLineSize = 13.0; // Main window GUIDialogMSGBox.window <- GUIWindow(); GUIDialogMSGBox.window.setPosition(screen[0]/2-230, screen[1]/2-85, false); GUIDialogMSGBox.window.setSize(460.0, 130.0, false); GUIDialogMSGBox.window.setText("Window text"); GUIDialogMSGBox.window.setVisible(false); // Buttons GUIDialogMSGBox.firstbutton <- GUIButton(); GUIDialogMSGBox.firstbutton.setParent(GUIDialogMSGBox.window.getName()); GUIDialogMSGBox.firstbutton.setPosition(50.0, 70.0, false); GUIDialogMSGBox.firstbutton.setSize(170.0, 30.0, false); GUIDialogMSGBox.firstbutton.setText("Button 1"); GUIDialogMSGBox.firstbutton.setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogMSGBox.secondbutton <- GUIButton(); GUIDialogMSGBox.secondbutton.setParent(GUIDialogMSGBox.window.getName()); GUIDialogMSGBox.secondbutton.setPosition(240.0, 70.0, false); GUIDialogMSGBox.secondbutton.setSize(170.0, 30.0, false); GUIDialogMSGBox.secondbutton.setText("Button 2"); GUIDialogMSGBox.secondbutton.setProperty("NormalTextColour", "FFFFFFFF"); // Main window GUIDialogInput.window <- GUIWindow(); GUIDialogInput.window.setPosition(screen[0]/2-230, screen[1]/2-85, false); GUIDialogInput.window.setSize(460.0, 150.0, false); GUIDialogInput.window.setText("Window text"); GUIDialogInput.window.setVisible(false); // Input edit box GUIDialogInput.inputtext <- GUIEditBox(); GUIDialogInput.inputtext.setParent(GUIDialogInput.window.getName()); GUIDialogInput.inputtext.setPosition(20.0, 42.0, false); GUIDialogInput.inputtext.setSize(410.0, 20.0, false); GUIDialogInput.inputtext.setProperty("BlinkCaret", "true"); GUIDialogInput.inputtext.setProperty("BlinkCaretTimeout", "1.0"); GUIDialogInput.inputtext.setProperty("Font", "calibri"); GUIDialogInput.inputtext.setProperty("SelectedTextColour", "FF0000FF"); // Buttons GUIDialogInput.firstbutton <- GUIButton(); GUIDialogInput.firstbutton.setParent(GUIDialogInput.window.getName()); GUIDialogInput.firstbutton.setPosition(50.0, 90.0, false); GUIDialogInput.firstbutton.setSize(170.0, 30.0, false); GUIDialogInput.firstbutton.setText("Button 1"); GUIDialogInput.firstbutton.setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogInput.secondbutton <- GUIButton(); GUIDialogInput.secondbutton.setParent(GUIDialogInput.window.getName()); GUIDialogInput.secondbutton.setPosition(240.0, 90.0, false); GUIDialogInput.secondbutton.setSize(170.0, 30.0, false); GUIDialogInput.secondbutton.setText("Button 2"); GUIDialogInput.secondbutton.setProperty("NormalTextColour", "FFFFFFFF"); // Main window GUIDialogList.window <- GUIWindow(); GUIDialogList.window.setPosition(screen[0]/2-230, screen[1]/2-85, false); GUIDialogList.window.setSize(460.0, 150.0, false); GUIDialogList.window.setText("Window text"); GUIDialogList.window.setVisible(false); // Buttons GUIDialogList.firstbutton <- GUIButton(); GUIDialogList.firstbutton.setParent(GUIDialogList.window.getName()); GUIDialogList.firstbutton.setPosition(50.0, 70.0, false); GUIDialogList.firstbutton.setSize(170.0, 30.0, false); GUIDialogList.firstbutton.setText("Button 1"); GUIDialogList.firstbutton.setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogList.secondbutton <- GUIButton(); GUIDialogList.secondbutton.setParent(GUIDialogList.window.getName()); GUIDialogList.secondbutton.setPosition(240.0, 70.0, false); GUIDialogList.secondbutton.setSize(170.0, 30.0, false); GUIDialogList.secondbutton.setText("Button 2"); GUIDialogList.secondbutton.setProperty("NormalTextColour", "FFFFFFFF"); function onScriptInit() { GUIDialogList.button <- array(GUIDialogListButtons, null); for(local i = 0; i < GUIDialogListButtons; i++) { GUIDialogList.button[i] = GUIButton(); GUIDialogList.button[i].setParent(GUIDialogList.window.getName()); GUIDialogList.button[i].setPosition(50.0, 50.0 + (i*20.0).tofloat(), false); GUIDialogList.button[i].setSize(360.0, 20.0, false); GUIDialogList.button[i].setText("Button " + i); GUIDialogList.button[i].setProperty("NormalTextColour", "FFFFFFFF"); } // MSG Box GUIDialogMSGBox.text <- array(GUIDialogMSGBoxTexts, null); for(local i = 0; i < GUIDialogMSGBoxTexts; i++) { GUIDialogMSGBox.text[i] = GUIText(); GUIDialogMSGBox.text[i].setParent(GUIDialogMSGBox.window.getName()); GUIDialogMSGBox.text[i].setPosition(20.0, 10.0 + (i*GUIDialogLineSize).tofloat(), false); GUIDialogMSGBox.text[i].setText(" "); GUIDialogMSGBox.text[i].setProperty("Font", "calibri#5#1"); } GUIDialogInput.text <- array(GUIDialogInputTexts, null); for(local i = 0; i < GUIDialogInputTexts; i++) { GUIDialogInput.text[i] = GUIText(); GUIDialogInput.text[i].setParent(GUIDialogInput.window.getName()); GUIDialogInput.text[i].setPosition(20.0, 10.0 + (i*GUIDialogLineSize).tofloat(), false); GUIDialogInput.text[i].setText(" "); GUIDialogInput.text[i].setProperty("Font", "calibri#5#1"); } return 1; } addEvent("scriptInit", onScriptInit); function onButtonClick(btnName, bState) { if(btnName == GUIDialogMSGBox.firstbutton.getName() || btnName == GUIDialogMSGBox.secondbutton.getName()) { local response; if(btnName == GUIDialogMSGBox.firstbutton.getName()) response = 1; else response = 0; triggerServerEvent("dialogResponse", GUIDIalogId, response, 0, "Null"); GUIDialogMSGBox.window.setVisible(false); for(local i = 0; i < GUIDialogMSGBoxTextsNow; i++) { GUIDialogMSGBox.text[i].setVisible(false); } GUIDialogMSGBox.firstbutton.setVisible(false); GUIDialogMSGBox.secondbutton.setVisible(false); guiToggleCursor(false); GUIDIalogId = 0; GUIDialogMSGBoxTextsNow = 0; } //-----| else if(btnName == GUIDialogInput.firstbutton.getName() || btnName == GUIDialogInput.secondbutton.getName()) { local response; if(btnName == GUIDialogInput.firstbutton.getName()) response = 1; else response = 0; triggerServerEvent("dialogResponse", GUIDIalogId, response, 0, GUIDialogInput.inputtext.getText()); GUIDialogInput.window.setVisible(false); for(local i = 0; i < GUIDialogInputTextsNow; i++) { GUIDialogInput.text[i].setVisible(false); } GUIDialogInput.inputtext.setVisible(false); GUIDialogInput.firstbutton.setVisible(false); GUIDialogInput.secondbutton.setVisible(false); guiToggleCursor(false); GUIDIalogId = 0; GUIDialogInputTextsNow = 0; } //-----| else if(btnName == GUIDialogList.firstbutton.getName() || btnName == GUIDialogList.secondbutton.getName()) { local response; if(btnName == GUIDialogList.firstbutton.getName()) response = 1; else response = 0; triggerServerEvent("dialogResponse", GUIDIalogId, response, GUIDialogListButtonsChosen, GUIDialogList.button[GUIDialogListButtonsChosen].getText()); for(local a = 0; a < GUIDialogListButtonsNow; a++) { GUIDialogList.button[a].setVisible(false); GUIDialogList.button[a].setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogList.button[a].setProperty("HoverTextColour", "FFFFFFFF"); } GUIDialogList.window.setVisible(false); GUIDialogList.firstbutton.setVisible(false); GUIDialogList.secondbutton.setVisible(false); guiToggleCursor(false); GUIDIalogId = 0; } //-----| else { for(local i = 0; i < GUIDialogListButtonsNow; i++) { if(btnName == GUIDialogList.button[i].getName()) { if(i == GUIDialogListButtonsChosen) { triggerServerEvent("dialogResponse", GUIDIalogId, 1, i, GUIDialogList.button[i].getText()); for(local a = 0; a < GUIDialogListButtonsNow; a++) { GUIDialogList.button[a].setVisible(false); GUIDialogList.button[a].setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogList.button[a].setProperty("HoverTextColour", "FFFFFFFF"); } GUIDialogList.window.setVisible(false); GUIDialogList.firstbutton.setVisible(false); GUIDialogList.secondbutton.setVisible(false); guiToggleCursor(false); GUIDIalogId = 0; } else { GUIDialogList.button[GUIDialogListButtonsChosen].setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogList.button[GUIDialogListButtonsChosen].setProperty("HoverTextColour", "FFFFFFFF"); GUIDialogList.button[i].setProperty("NormalTextColour", "FFFF0000"); GUIDialogList.button[i].setProperty("HoverTextColour", "FFFF0000"); GUIDialogListButtonsChosen = i; } break; } } } return 1; } addEvent("buttonClick", onButtonClick); function showGUIDialog(id, type, windowtext, maintext, firstbuttontext, secondbuttontext) { if(type == 0) { GUIDIalogId = id; GUIDialogMSGBox.window.setText(windowtext); GUIDialogMSGBox.firstbutton.setText(firstbuttontext); GUIDialogMSGBox.secondbutton.setText(secondbuttontext); local text = split(maintext, "\n"); GUIDialogMSGBox.window.setSize(460.0, 130.0 + ((text.len()-1)*GUIDialogLineSize), false); if(text.len() > GUIDialogMSGBoxTexts) { GUIDialogMSGBox.text <- array(text.len(), null); for(local i = 0; i < text.len(); i++) { GUIDialogMSGBox.text[i] = GUIText(); GUIDialogMSGBox.text[i].setParent(GUIDialogMSGBox.window.getName()); GUIDialogMSGBox.text[i].setPosition(20.0, 10.0 + (i*GUIDialogLineSize).tofloat(), false); GUIDialogMSGBox.text[i].setText(text[i]); GUIDialogMSGBox.text[i].setProperty("Font", "calibri#5#1"); GUIDialogMSGBox.text[i].setVisible(true); } GUIDialogMSGBoxTexts = text.len(); GUIDialogMSGBoxTextsNow = text.len(); } else { for(local i = 0; i < text.len(); i++) { GUIDialogMSGBox.text[i].setText(text[i]); GUIDialogMSGBox.text[i].setVisible(true); } for(local i = text.len(); i < GUIDialogMSGBoxTexts; i++) { GUIDialogMSGBox.text[i].setVisible(false); } GUIDialogMSGBoxTextsNow = text.len(); } GUIDialogMSGBox.window.setVisible(true); GUIDialogMSGBox.firstbutton.setVisible(true); guiToggleCursor(true); if(secondbuttontext == "") { GUIDialogMSGBox.firstbutton.setPosition(145.0, 70.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogMSGBox.secondbutton.setVisible(false); } else { GUIDialogMSGBox.firstbutton.setPosition(50.0, 70.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogMSGBox.secondbutton.setPosition(240.0, 70.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogMSGBox.secondbutton.setVisible(true); } GUIDialogMSGBox.window.setPosition(screen[0]/2-220, screen[1]/2-85-(text.len()*GUIDialogLineSize/2), false); } else if(type == 1) { GUIDIalogId = id; GUIDialogInput.window.setText(windowtext); GUIDialogInput.firstbutton.setText(firstbuttontext); GUIDialogInput.secondbutton.setText(secondbuttontext); GUIDialogInput.inputtext.setText(""); local text = split(maintext, "\n"); GUIDialogInput.window.setSize(460.0, 150.0 + ((text.len()-1)*GUIDialogLineSize), false); if(text.len() > GUIDialogInputTexts) { GUIDialogInput.text <- array(text.len(), null); for(local i = 0; i < text.len(); i++) { GUIDialogInput.text[i] = GUIText(); GUIDialogInput.text[i].setParent(GUIDialogInput.window.getName()); GUIDialogInput.text[i].setPosition(20.0, 10.0 + (i*GUIDialogLineSize).tofloat(), false); GUIDialogInput.text[i].setText(text[i]); GUIDialogInput.text[i].setProperty("Font", "calibri#5#1"); GUIDialogInput.text[i].setVisible(true); } GUIDialogInputTexts = text.len(); GUIDialogInputTextsNow = text.len(); } else { for(local i = 0; i < text.len(); i++) { GUIDialogInput.text[i].setText(text[i]); GUIDialogInput.text[i].setVisible(true); } for(local i = text.len(); i < GUIDialogInputTexts; i++) { GUIDialogInput.text[i].setVisible(false); } GUIDialogInputTextsNow = text.len(); } GUIDialogInput.window.setVisible(true); GUIDialogInput.inputtext.setVisible(true); GUIDialogInput.firstbutton.setVisible(true); guiToggleCursor(true); if(secondbuttontext == "") { GUIDialogInput.firstbutton.setPosition(145.0, 90.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogInput.secondbutton.setVisible(false); } else { GUIDialogInput.firstbutton.setPosition(50.0, 90.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogInput.secondbutton.setPosition(240.0, 90.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogInput.secondbutton.setVisible(true); } GUIDialogInput.inputtext.setPosition(20.0, 42.0 + ((text.len()-1)*GUIDialogLineSize), false); GUIDialogInput.window.setPosition(screen[0]/2-230, screen[1]/2-85-(text.len()*GUIDialogLineSize/2), false); } else { GUIDIalogId = id; GUIDialogList.window.setText(windowtext); GUIDialogList.firstbutton.setText(firstbuttontext); GUIDialogList.secondbutton.setText(secondbuttontext); local text = split(maintext, "\n"); GUIDialogList.window.setSize(460.0, 150.0 + ((text.len())*20.0), false); GUIDialogListButtonsChosen = 0; if(text.len() > GUIDialogListButtons) { GUIDialogList.button <- array(text.len(), null); for(local i = 0; i < text.len(); i++) { GUIDialogList.button[i] = GUIButton(); GUIDialogList.button[i].setParent(GUIDialogList.window.getName()); GUIDialogList.button[i].setPosition(50.0, 50.0 + (i*20.0).tofloat(), false); GUIDialogList.button[i].setSize(360.0, 20.0, false); GUIDialogList.button[i].setText(text[i]); GUIDialogList.button[i].setProperty("NormalTextColour", "FFFFFFFF"); GUIDialogList.button[i].setVisible(true); } GUIDialogListButtons = text.len(); GUIDialogListButtonsNow = text.len(); } else { for(local i = 0; i < text.len(); i++) { GUIDialogList.button[i].setText(text[i]); GUIDialogList.button[i].setVisible(true); } for(local i = text.len(); i < GUIDialogListButtons; i++) { GUIDialogList.button[i].setVisible(false); } GUIDialogListButtonsNow = text.len(); } GUIDialogList.button[GUIDialogListButtonsChosen].setProperty("NormalTextColour", "FFFF0000"); GUIDialogList.button[GUIDialogListButtonsChosen].setProperty("HoverTextColour", "FFFF0000"); GUIDialogList.window.setVisible(true); GUIDialogList.firstbutton.setVisible(true); guiToggleCursor(true); if(secondbuttontext == "") { GUIDialogList.firstbutton.setPosition(145.0, 70.0 + (text.len() * 20), false); GUIDialogList.secondbutton.setVisible(false); } else { GUIDialogList.firstbutton.setPosition(50.0, 70.0 + (text.len() * 20), false); GUIDialogList.secondbutton.setPosition(240.0, 70.0 + (text.len() * 20), false); GUIDialogList.secondbutton.setVisible(true); } GUIDialogList.window.setPosition(screen[0]/2-220, screen[1]/2-85-(text.len()*10), false); } return true; } addEvent("GUIDialog", showGUIDialog); [/cut] В settings.xml вписываем: Code
<!-- The scripts the client will download and run --> <clientscript>Dialogs.nut</clientscript>
[IV:MP] The Godfather 0.1 alpha ██████████ 100% http://www.samp-rus.com/forum/61-23963-1 [IV:MP] The Godfather 0.2 beta ███▓▓▓▓▓▓▓ 30%
Ghost-X Дата: Понедельник, 17.12.2012, 06:33 | Сообщение # 2
Мастер джэдай
Группа:
Продвинутые
Сообщений: 3548
Награды:
36
Город: Наб. Челны
Репутация:
856
Замечания:
40%
Статус:
http://www.samp-rus.com/forum/61-20190-1 Ну ведь почти ничего не изменилось? Так же - http://www.samp-rus.com/forum/61-18633-428662-16-1325880680
Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит. Хочешь остаться при своем мнении - держи его при себе.
Anokian Дата: Понедельник, 17.12.2012, 16:38 | Сообщение # 3
Новенький
Группа:
Пользователи
Сообщений: 36
Награды:
0
Репутация:
49
Замечания:
0%
Статус:
Ghost-X , не каждый сможет написать регистрацию только по одной теме описания диалогов. В том GF нет регистрации на диалогах, а в том GF который ты переделал я вообще разбираться не стал, там столько косяков что её замучаешься запускать, сначала он ini не читал, потом с цветами текста головняк начался, я заставил кое-как его работать до открытия диалогов регистрации, дальше забил. Не суть, кому-нибудь пригодится.
[IV:MP] The Godfather 0.1 alpha ██████████ 100% http://www.samp-rus.com/forum/61-23963-1 [IV:MP] The Godfather 0.2 beta ███▓▓▓▓▓▓▓ 30%
Ghost-X Дата: Понедельник, 17.12.2012, 21:39 | Сообщение # 4
Мастер джэдай
Группа:
Продвинутые
Сообщений: 3548
Награды:
36
Город: Наб. Челны
Репутация:
856
Замечания:
40%
Статус:
Quote (Anokian )
сначала он ini не читал
Наверно надо было папки соответствующие создать? И версию с регистрацией на диалогах там же можно найти. Так что не разевайте варежку на мою работу. Писал я ее год назад, в разгар сессии
Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит. Хочешь остаться при своем мнении - держи его при себе.
Anokian Дата: Вторник, 18.12.2012, 20:34 | Сообщение # 5
Новенький
Группа:
Пользователи
Сообщений: 36
Награды:
0
Репутация:
49
Замечания:
0%
Статус:
Quote (Ghost-X )
Наверно надо было папки соответствующие создать?
Я-то не догадался Quote (Ghost-X )
И версию с регистрацией на диалогах там же можно найти.
Она-то и не работает. Не сохраняет в ini координаты, пароль сохраняет как-то боком-раком что он потом не подходит, в общем она неработоспособна. Quote (Ghost-X )
Так что не разевайте варежку на мою работу. Писал я ее год назад, в разгар сессии
Я ничего против не имею, что ещё можно требовать от работы в паблике, но факты остаются фактами. Я сам сейчас пишу GF с нуля, и как-раз сессия, посмотрим что получится.Добавлено (18.12.2012, 20:34) --------------------------------------------- Теперь эта регистрация уже не совсем актуальна, как выложу альфу GF, оттуда можно будет взять регистрацию гораздо лучше.
[IV:MP] The Godfather 0.1 alpha ██████████ 100% http://www.samp-rus.com/forum/61-23963-1 [IV:MP] The Godfather 0.2 beta ███▓▓▓▓▓▓▓ 30%