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

 
Ответить в эту темуОткрыть новую тему
> Смена управления над персонажем.
Aimed
сообщение 12.8.2014, 5:07
Сообщение #1


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Делаю турнир. Хочу что-бы перед турниром все чары игроков заменялись на других чаров и пакетный обмен соответственно подключался к новым чарам, а старые на время турнира спрячу.

Главный вопрос, как передать управление?
Сижу сейчас копаюсь в NetState, пока без успехов.

Пробовал просто другой NetState у мобайлов присвоить и так-же в самом NetState поменять мобайла на другого - максимум что получаю это управление сразу двумя чарами одновременно (IMG:style_emoticons/default/biggrin.gif) Да и то как-то подлагивать начинает....

Если что, у меня ядро и скрипты - все вместе компилируются, ядра как такового и нету вообщем-то.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
StaticZ
сообщение 14.8.2014, 0:04
Сообщение #2


*********

Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009
Группа: Пользователи
Наличность: 0
Из: РФ, Москва
Пользователь №: 11.948



Цитата(Aimed @ 12.8.2014, 6:07) *
Пробовал просто другой NetState у мобайлов присвоить и так-же в самом NetState поменять мобайла на другого - максимум что получаю это управление сразу двумя чарами одновременно (IMG:style_emoticons/default/biggrin.gif) Да и то как-то подлагивать начинает....


А обнулить NetState старого чара? А вообще там не все так просто и зависит от кода во многом ибо Mobile связан с NetState и Account, NetState опять же связан с Mobile и Account, как и Mobile с NetState и Account.. Т.е. тупо подменив NetState вы решите лишь часть проблемы, т.к. где-то может идти доступ к нему через Account, не говоря уже о том, что NetState остается связан с старой мобайлой.


Как вариант, можно еще вспомнить, что оригинал рассчитан на то что карты обрабатываются на разных серверах и при перемещении периодически идет пересоединение к другим серверам. Т.е. можно попытаться запросить клиент переконектится, тупо подменив мобайл в акке игрока:

Код
Gets or sets the character at a specified index for this account. Out of bound index values are handled; null returned for get, ignored for set.
ServerAccounting.Account[]


--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.
Game isn't a dream, it is the reality, reality which is coming while we dream...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 14.8.2014, 4:03
Сообщение #3


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Цитата(StaticZ @ 13.8.2014, 23:04) *

А обнулить NetState старого чара? А вообще там не все так просто и зависит от кода во многом ибо Mobile связан с NetState и Account, NetState опять же связан с Mobile и Account, как и Mobile с NetState и Account.. Т.е. тупо подменив NetState вы решите лишь часть проблемы, т.к. где-то может идти доступ к нему через Account, не говоря уже о том, что NetState остается связан с старой мобайлой.
Как вариант, можно еще вспомнить, что оригинал рассчитан на то что карты обрабатываются на разных серверах и при перемещении периодически идет пересоединение к другим серверам. Т.е. можно попытаться запросить клиент переконектится, тупо подменив мобайл в акке игрока:


Код
            Mobile player = new PlayerMobile();
            Container pack = player.Backpack;

            if (pack == null)
            {
                pack = new Backpack();
                pack.Movable = false;

                player.AddItem(pack);
            }
            player.Body = 0x191;
            player.Name = "Test Player";
            player.MoveToWorld(e.Mobile.Location, e.Mobile.Map);
            ((Account)e.Mobile.Account).SwapMainCharacter(player);//сохраняю главного чара на аккауте m_Mobiles[0] и заменяю его на player.
            player.Account = e.Mobile.Account;
            player.Player = true;
            player.NetState = e.Mobile.NetState;
            e.Mobile.NetState.Mobile = player;
            e.Mobile.Player = false;
            e.Mobile.NetState = null;


И смотри какой прикол выходит, если я обнуляю нетстейт старого мобайла e.Mobile.NetState = null;
Управление вообще не переходит новому мобайлу, но если начать печатать, то текст над головой нового мобайла появится и пейпердол нового мобайла открывается, если нажать кнопку.

Если нетстейт старого мобайла не обнулять, тогда я управляю двумя чарами одновременно!
Пробовал дебагом понять в чем суть - так и не смог, всё вроде правильно, нетстейт передал, а старый обнулил. А потом через какое-то время старый мобайл обратно свой нетстейт имеет, а новый мобайл стоит как вкопанный. Мистика (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 14.8.2014, 11:12
Сообщение #4


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22559
Из: Северная Корея
Пользователь №: 11.273



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

А по самой концепции турнира, я думаю можно просто передавать значения других персонажей, что в конечном итоге даст тот же самый результат.
К примеру есть игрок Вася и Петя, вот игрок Васи становится в точности как Петя со всеми его вещами, параметрами, внешним видом и именем, тоже самое происходит и с Петей. По окончанию турнира удаляем текущие значения, и возвращаем прежние.

Сообщение отредактировал Juzzver - 14.8.2014, 11:13


--------------------
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 14.8.2014, 14:36
Сообщение #5


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Почему-то на сфере эта фишка прокатывает, а тут вдруг что-то может случится....

На РанУО форуме тоже никто толком ничего посоветовать не может, прийдётся проявить фантазию...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
StaticZ
сообщение 14.8.2014, 14:58
Сообщение #6


*********

Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009
Группа: Пользователи
Наличность: 0
Из: РФ, Москва
Пользователь №: 11.948



Цитата(Aimed @ 14.8.2014, 5:03) *
И смотри какой прикол выходит, если я обнуляю нетстейт старого мобайла e.Mobile.NetState = null;
Управление вообще не переходит новому мобайлу, но если начать печатать, то текст над головой нового мобайла появится и пейпердол нового мобайла открывается, если нажать кнопку.

Если нетстейт старого мобайла не обнулять, тогда я управляю двумя чарами одновременно!
Пробовал дебагом понять в чем суть - так и не смог, всё вроде правильно, нетстейт передал, а старый обнулил. А потом через какое-то время старый мобайл обратно свой нетстейт имеет, а новый мобайл стоит как вкопанный. Мистика (IMG:style_emoticons/default/biggrin.gif)


Ну во первых вы забыли про Account.NetState и возможно стоит внести новую мобайл в список мобайл аккаунта.

А вообще никакой мистики тут нет, это не поля а свойства. Почитайте код, когда вы пишите Moble.NetState = null, возбуждается событие OnDisconnected(), там запросто может приводиться к вызову чего-то в стиле Moble.NetState.Mobile = null; Вообще тут нужно засесть с дебагером и разбираться что происходит и что приводит к проблеме работы с управлением. Задачка не тривиальная - вряд ли кто-то сможет посоветовать готовое решение, а так тупо гадать - смысла нет... В принципе я тоже хочу сделать нечто похожее для "вселения в мобов", так что если хотите подождите пока сам начну ковыряться. Если будет актуально - с радостью поделюсь нюансами\реализацией.


--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.
Game isn't a dream, it is the reality, reality which is coming while we dream...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 14.8.2014, 16:34
Сообщение #7


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Ждать я не буду, а если сам разберусь, - сразу выложу. (IMG:style_emoticons/default/wink.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 14.8.2014, 19:00
Сообщение #8


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Цитата(StaticZ @ 14.8.2014, 13:58) *

Ну во первых вы забыли про Account.NetState и возможно стоит внести новую мобайл в список мобайл аккаунта.

А вообще никакой мистики тут нет, это не поля а свойства. Почитайте код, когда вы пишите Moble.NetState = null, возбуждается событие OnDisconnected(), там запросто может приводиться к вызову чего-то в стиле Moble.NetState.Mobile = null; Вообще тут нужно засесть с дебагером и разбираться что происходит и что приводит к проблеме работы с управлением. Задачка не тривиальная - вряд ли кто-то сможет посоветовать готовое решение, а так тупо гадать - смысла нет... В принципе я тоже хочу сделать нечто похожее для "вселения в мобов", так что если хотите подождите пока сам начну ковыряться. Если будет актуально - с радостью поделюсь нюансами\реализацией.


Account.NetState не существует.

NetState хранится только у мобайла и сам мобайл хранится в NetState, двойная связь и всё.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 14.8.2014, 19:38
Сообщение #9


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22559
Из: Северная Корея
Пользователь №: 11.273



Цитата
Почему-то на сфере эта фишка прокатывает, а тут вдруг что-то может случится....

На РанУО форуме тоже никто толком ничего посоветовать не может, прийдётся проявить фантазию...

"Вдруг", это если не учитывать. Ведь в данном случае ведется работа не на сфере, да и я лишь призвал обратить внимание.
Поставленную задачу в уме сложно решить, по этому прямого ответа никто естественно не даст.

Цитата
player.NetState = e.Mobile.NetState;
e.Mobile.NetState.Mobile = player;


для такого рода махинаций в свежих свн версиях для Mobile.cs внедрили:
Код
        public NetState RawNetState
        {
            get { return m_NetState; }
        }

возможно его применение и будет решением.

Сообщение отредактировал Juzzver - 14.8.2014, 19:40


--------------------
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 14.8.2014, 20:22
Сообщение #10


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Цитата(Juzzver @ 14.8.2014, 18:38) *

для такого рода махинаций в свежих свн версиях для Mobile.cs внедрили:
Код
        public NetState RawNetState
        {
            get { return m_NetState; }
        }

возможно его применение и будет решением.


Nope (IMG:style_emoticons/default/sad.gif)

Завтра закопаюсь в дебаг пока не пойму в чем дело.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
StaticZ
сообщение 15.8.2014, 16:04
Сообщение #11


*********

Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009
Группа: Пользователи
Наличность: 0
Из: РФ, Москва
Пользователь №: 11.948



Цитата(Aimed @ 14.8.2014, 20:00) *

Account.NetState не существует.

NetState хранится только у мобайла и сам мобайл хранится в NetState, двойная связь и всё.
Хм.... а у меня существует ))) Видать различия версий


--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.
Game isn't a dream, it is the reality, reality which is coming while we dream...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 19.9.2014, 4:22
Сообщение #12


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Вообщем сколько я не пытался, но полностью у меня это сделать так и не вышло. Дебаг будто проскакивает то самое важное место или я невнимательный.
Кто-нибудь уже продвинулся в этой теме?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 19.9.2014, 18:33
Сообщение #13


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8492
Пользователь №: 15.607



Тему можно закрывать)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ЖаК
сообщение 20.9.2014, 12:56
Сообщение #14


*****

Journeyman
Сообщений: 314
Регистрация: 2.1.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.417



и в чем была проблема?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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