Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Система регистрации и защиты аккаунтов для шарда, Нужна помощь...
evil-SHADOW
сообщение Feb 7 2005, 13:32
Сообщение #1


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Здравствуйте, господа и дамы девелоперы, то бишь разработчики! :)

Нужна ваша помощь в таком деле: есть небольшой шард, где отсутствует система регистрации аккаунтов игроков и система защиты этих аккаунтов. Естественно, есть люди, которые этим пользуются, раздевают чужих персонажей и этим не дают людям спокойно играть. Поэтому меня попросили узнать, как сделать сабж. Подробности будут.

Надеюсь на ответы :)

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DBColl
сообщение Feb 7 2005, 13:47
Сообщение #2


4-х Кубовый
Иконки Групп

Класс: Некромант
Характер: Lawful Evil
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



evil-SHADOW
Тебе в тему шарды. Переношу тему.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Huk
сообщение Feb 7 2005, 14:49
Сообщение #3


Level 2
*

Класс: Монах
Характер: Lawful Neutral
Раса: Человек



Про защиту персонажей
http://www.wrg.ru/forums/index.php?showtopic=780
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
evil-SHADOW
сообщение Feb 15 2005, 09:46
Сообщение #4


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Прочитал. Проникся. Но вот есть такая проблема: пишу следующее

Neverwinter Script Source
object oPC = GetEnteringObject();
if (GetIsDM(oPC)) return;
string sPCName = GetPCPlayerName(oPC);
string sName = GetName(oPC);
string sCDKey = GetPCPublicCDKey(oPC);
string sID = "//"+sPCName+"//"+sName;

//-! Test output !-
//SendMessageToPC(oPC,"Your Security ID is: "+sID);

string sReadID = GetCampaignString("Security",sID);

// -! Test Output !-
//SendMessageToPC(oPC,"Saved Security ID is: "+sReadID);

    int SecurityDisabled = GetLocalInt(GetModule(),"SecurityDisable");

    WriteTimestampedLogEntry("Security: Character "+sName+" : Account: ["+sPCName+"]: with key: "+sCDKey);

    if (sReadID =="" || SecurityDisabled)
    {
        SetCampaignString("Security",sID,sCDKey);
        // -! Test Output
        //SendMessageToPC(oPC,"New Security ID saved");
    }
    else
    {
        if (sReadID != sCDKey)
        {
            // -! Test Output !-
            //SendMessageToPC(oPC,"Your CD Key is Invalid. Booting...");
            BootPC(oPC);
            SendMessageToAllDMs("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKey+ " != "+sReadID);
            WriteTimestampedLogEntry("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKey+ " != "+sReadID);
        }
        else
            WriteTimestampedLogEntry("Security: Check ok.");
    }

(поправьте, если где-то неправильно, я в упор не вижу здесь ошибки), создаю сервер, захожу серверным чаром. Насколько я понимаю, в первый раз не будет сохраненного в базе sReadID, и он должен создаваться. Но вот в чем проблема - или он не создается, или потом не читается, так при последующих входах на сервер я все равно получаю в качестве sReadID пустую строку.

Я чего-то не знаю?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Twin
сообщение Feb 16 2005, 03:10
Сообщение #5


Level 5
**

Класс: Некромант
Характер: Neutral Evil
Раса: Нежить
NWN: Скриптинг [PW]



Да, именно не сохраняется. У меня не сохранялись sID с символом кавычки (апострофа). Остальные символы не тестировал.
Тебе нужно заменять символ апострофа например на тильду. А если в имени игрока есть символ тильды, то бутить его. Чтобы играть им нельзя было.
Имхо. ;)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Vhall
сообщение Feb 16 2005, 16:04
Сообщение #6


Level 19
Иконки Групп

Класс: Обыватель
Характер: True Neutral
Раса: Дварф
NWN: Контент



Выходит мне ни на одном нормальном шарде не поиграть? :swoon: :(
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
evil-SHADOW
сообщение Feb 16 2005, 21:33
Сообщение #7


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Нет, тут с _kaa_ поговорил, и выяснили, в чем дело. Во встроенной БД имя переменной не может быть длинее 32 (или 31) символа, и, если имя переменной длинее, то оно при этом
Neverwinter Script Source
SetCampaignString("Security",sID,sCDKey);
обрезается. А потом эта команда
Neverwinter Script Source
GetCampaignString("Security",sID);
ищет в БД полное имя переменной (естественно, оно ведь ей передано необрезанным :) ), и, конечно же, благополучно его не находит. :D

Вот такие пироги с котятами (с) не помню кто :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Feb 17 2005, 10:30
Сообщение #8


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Собственно первая часть - проверенная информация, вторая - только предположение :)
Как я уже не раз говорил, встроенная БД - большой источник "веселостей".
Вот кратко, что вспомню.
1. Имя переменной (VarName) ограничено 32 символами.
2. Поиск имени переменной идет не точный! если есть два имени переменной типа name1 и name11 - на оба точных запроса найдется первое имя, т.е. GetCampaignString(db,"name11") вернет значение переменной "name1". такое поведение наблюдалось только для имен с цифрами на конце. если есть необходимость использовать такие имена - добавляйте в конце символ, скажем "name1z" и "name11z" уже не будут путаться.
Скорее всего это недокументированная "фича", но очень сложно было найти ошибку, когда нарвался на эту "фичу" :)
3. Из-за структуры БД (два файла, для данных что вмещаются в поле и для остальных) не все типы данных можно перезаписывать. Скажем если вы запишете SetCampaignInt() поверх старой информации - все нормально, размер базы не изменится. А если это будет SetCampaignString() - база просто вырастет на длину строки.Даже если вы удаляете переменную - реально размер не изменится и требуется перепаковка базы. Выход только один - удалить базу DestroyCampaignDatabase() и создать заново с новыми данными.
4. БД довольно тормазная на предмет записи большого количества данных. Принцип - "чем меньше используете - тем лучше" :) Хранить данные по игроку лучше всего на нодроп (галочка в тулсете на итеме) итемах в переменных, они сохраняются в .bic файле профиля игрока при выходе и командами ExportAllCharacters() и ExportSingleCharacter(oPC)



Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th March 2024 - 10:03