Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Вопросы по RunUO _ Пропадает флаг

Автор: xmouse 18.6.2018, 22:53

Добрый вечер. Озадачен одной странной вещью, понимаю что я его-то не понимаю.

Создаю флаг в плаермобайл. Выставляю его персонажу. Цепляю на флаг условия - всё работает.
Но каждый раз как я делаю ребут (не релогин), флаг становится false на любом персонаже.
Я закоментировал всё кроме самой основы... Чего не хватает ? Чего я не понимаю ? Помогите ))

Код
    public enum PlayerFlag : ulong // First 16 bits are reserved for default-distro use, start custom flags at 0x00010000
    {
    ... //срезал лишнее
        CanBuyCarpets = 0x100000000,
        VoidPool = 0x200000000,
        CanUseAmbrosia= 0x400000000 // Вот этот
    }

    [CommandProperty(AccessLevel.GameMaster)]
     public bool CanUseAmbrosia
     {
       get { return GetFlag(PlayerFlag.CanUseAmbrosia); }
       set
       {
         SetFlag(PlayerFlag.CanUseAmbrosia, value);
         InvalidateProperties();
       }
     }

Ах и да... я наткнулся на то что ранка "померла", на то что разумней пользоватся СерУО. Не стал спорить с этим, да и они как две капли воды.

Мне бы хоть понять, должно ли оно в таком виде функционировать как я ожидаю. Запорол ли я что-то или мне надо прост что-т дописать.

Автор: Soteric 19.6.2018, 3:50

Выглядит как баг ServUO.

Код
public enum PlayerFlag : ulong
...
writer.Write((int)m_Flags);
...
m_Flags = (PlayerFlag)reader.ReadInt();

Они говорят, что PlayerFlag имеет тип ulong и в памяти должен занимать 8 байт. При этом когда они сохраняют и загружают значение, то работают с ним как с int, то есть 4 байтовым числом. Поэтому флаги до четвертого байта вычитываются, а дальше нет.

Попробуй взять чистый сервер, на котором еще ничего нет, добавить туда твой флаг и поменять write/read на следующее:
Код
writer.Write((ulong)m_Flags);
...
m_Flags = (PlayerFlag)reader.ReadULong();

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

Автор: xmouse 19.6.2018, 5:40

Ух ты. Верно - логично.
Жалко я удалил свой пост с СервУО до того как увидел твой ответ тут.
Значит я всёж не тупость спросил... значит ответ от них должен бы поступить. (пересоздам и пополню информацией.)

Спасибо! Хоть один человек покопался и дал ответ.

Кстати я обошёл это, создал int просто и серелиазовал его.

Идут мои первые дни C#. Пока нравится но порой так голова болит - это первый вопрос на который я сорвался. ))

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)