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

 
Ответить в эту темуОткрыть новую тему
> Пропадает флаг
xmouse
сообщение 18.6.2018, 22:53
Сообщение #1


*

Registred
Сообщений: 2
Регистрация: 26.10.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.418



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

Создаю флаг в плаермобайл. Выставляю его персонажу. Цепляю на флаг условия - всё работает.
Но каждый раз как я делаю ребут (не релогин), флаг становится 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();
       }
     }

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

Мне бы хоть понять, должно ли оно в таком виде функционировать как я ожидаю. Запорол ли я что-то или мне надо прост что-т дописать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 19.6.2018, 3:50
Сообщение #2


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 3227
Пользователь №: 7.166



Выглядит как баг 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 не получится, сейвы перестанут грузиться. Нужно с версией сериализации заморочиться и проверку добавить. Если сейвы потерять не критично, то исправляй прямо так, удаляй сейвы и стартуй с нуля.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
xmouse
сообщение 19.6.2018, 5:40
Сообщение #3


*

Registred
Сообщений: 2
Регистрация: 26.10.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.418



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

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

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

Идут мои первые дни C#. Пока нравится но порой так голова болит - это первый вопрос на который я сорвался. ))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 23:04
Designed by Nickostyle