UoKit.com Форумы > Ultima Online : Dev > RunUO Server > Вопросы по RunUO
Страницы: 1, 2, 3, 4
Александр Needle™
Доброй ночи, начал ковырять различные версии RunUO с целью найти оптимальный вариант (рабочий!) для поддержки обычного клиента Ultima Online: Reinessainse, он же 2.0.3. Начал конечно же с последней версии доступной на официальном сайте RunUO, установил клиент, поставил эмулятор. И.. не запускается, точней ругается на IPv6, ну хорошо, отключил интернет, не горит.

Зайти - не заходит, сервер перезапускается при каждом входе. Понял.., через Expansion выставил None, а затем и LBR, и UOR, и все остальные перепробовал на всякий. И ситуация складывается следующая, ставлю версию в Expansion младше AOS, зайти могу, НО:
- ни с кем поговорить невозможно (купить/продать) в VendorAI разбирался, все прописано, но не работает
- вещи не имеют названий (просто кусочек окна без каких-либо надписей)
- "error [TIP]: null string: 145903" при пересечении с npc (на сервере ошибок нет, сам клиент пишет)
- при открытии книги, валится клиент

И такие пляски с бубмном вплоть до RunUO-1.0 RC0, которая вообще отказалась даже устанавливается, так как ей именно .NET Framework старой версии нужно (1.х.х) тогда как у меня последняя стоит, это ее не волнует и плевать она на это хотела.

Единственная версия, которая кое-как работала (относительно) - RunUO Beta 16 но она настолько сырая, что и говорить не приходится. Но на ней остались прежние следующие ошибки:
- "error [TIP]: null string: 145903" при пересечении с npc (на сервере ошибок нет, сам клиент пишет)
- "error [TIP]: null string: 145903 : 5" в названии любого предмета, правда есть некоторые, которые отображаются нормально.
- ни с кем поговорить невозможно
- при открытии книги, валится клиент

За столько лет, не было попыток создать нормальную версию, которая бы поддерживала полностью старые клиенты? Какой смысл от Expansion, если эта функция не работает? Да и вообще какой смысл пилить поддержку последних клиентов, если эмулятор не в состоянии поддержать рание версии, это как не доделав что-то, браться за другую работу.
Накипело, весь день потратил на это и в итоге ничего не добился


UPD: Использую RunUO 2.0 RC1 Expansion.None

Решил этот вопрос с NPC, которые проваливались

Такое решение в DataPath.cs, почему-то сервер не устраивало:
Код
private static string CustomPath = @"C:\UO";

Решил такой строкой, и вписал в ручную при запуске сервера.
Код
private static string CustomPath = null;

Решил вопрос с такой проблемой: System.Net.Sockets.SocketException: Предпринятая операция не поддерживается для выбранного типа объекта

Изменил ServerList.cs, полностью вариант ниже:
Код
using System;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using Server;
using Server.Network;

namespace Server.Misc
{
    public class ServerList
    {
        public static readonly string Address = null;
        public static readonly string ServerName = "RunUO TC";

        public static readonly bool AutoDetect = true;

        public static void Initialize()
        {
            if ( Address == null ) {
                if ( AutoDetect )
                    AutoDetection();
            }
            else {
                Resolve( Address, out m_PublicAddress );
            }

            EventSink.ServerList += new ServerListEventHandler( EventSink_ServerList );
        }

        private static IPAddress m_PublicAddress;

        private static void EventSink_ServerList( ServerListEventArgs e )
        {
            try
            {
                NetState ns = e.State;
                Socket s = ns.Socket;

                IPEndPoint ipep = (IPEndPoint)s.LocalEndPoint;

                IPAddress localAddress = ipep.Address;
                int localPort = ipep.Port;

                if ( IsPrivateNetwork( localAddress ) ) {
                    ipep = (IPEndPoint)s.RemoteEndPoint;
                    if ( !IsPrivateNetwork( ipep.Address ) && m_PublicAddress != null )
                        localAddress = m_PublicAddress;
                }

                e.AddServer( ServerName, new IPEndPoint( localAddress, localPort ) );
            }
            catch
            {
                e.Rejected = true;
            }
        }

        private static void AutoDetection()
        {
            if ( !HasPublicIPAddress() ) {
                Console.Write( "ServerList: Auto-detecting public IP address..." );
                m_PublicAddress = FindPublicAddress();

                if ( m_PublicAddress != null )
                    Console.WriteLine( "done ({0})", m_PublicAddress.ToString() );
                else
                    Console.WriteLine( "failed" );
            }
        }

        private static void Resolve( string addr, out IPAddress outValue )
        {
            if ( IPAddress.TryParse( addr, out outValue ) )
                return;

            try {
                IPHostEntry iphe = Dns.GetHostEntry( addr );

                if ( iphe.AddressList.Length > 0 )
                    outValue = iphe.AddressList[iphe.AddressList.Length - 1];
            }
            catch {
            }
        }

        private static bool HasPublicIPAddress()
        {
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();

            foreach ( NetworkInterface adapter in adapters ) {
                IPInterfaceProperties properties = adapter.GetIPProperties();

                foreach ( IPAddressInformation unicast in properties.UnicastAddresses ) {
                    IPAddress ip = unicast.Address;

                    if ( !IPAddress.IsLoopback( ip ) && ip.AddressFamily != AddressFamily.InterNetworkV6 && !IsPrivateNetwork( ip ) )
                        return true;
                }
            }

            return false;


            /*
            IPHostEntry iphe = Dns.GetHostEntry( Dns.GetHostName() );

            IPAddress[] ips = iphe.AddressList;

            for ( int i = 0; i < ips.Length; ++i )
            {
                if ( ips[i].AddressFamily != AddressFamily.InterNetworkV6 && !IsPrivateNetwork( ips[i] ) )
                    return true;
            }

            return false;
            */
        }

        private static bool IsPrivateNetwork( IPAddress ip )
        {
            // 10.0.0.0/8
            // 172.16.0.0/12
            // 192.168.0.0/16

            if ( ip.AddressFamily == AddressFamily.InterNetworkV6 )
                return false;

            if ( Utility.IPMatch( "192.168.*", ip ) )
                return true;
            else if ( Utility.IPMatch( "10.*", ip ) )
                return true;
            else if ( Utility.IPMatch( "172.16-31.*", ip ) )
                return true;
            else
                return false;
        }

        private static IPAddress FindPublicAddress()
        {
            try {
                WebRequest req = HttpWebRequest.Create( "http://www.runuo.com/ip.php" );
                req.Timeout = 15000;

                WebResponse res = req.GetResponse();

                Stream s = res.GetResponseStream();

                StreamReader sr = new StreamReader( s );

                IPAddress ip = IPAddress.Parse( sr.ReadLine() );

                sr.Close();
                s.Close();
                res.Close();

                return ip;
            } catch {
                return null;
            }
        }
    }
}


Решил проблему с NPC, которые не реагируют на команды BUY/SELL

Код
        
public override void OnSpeech( SpeechEventArgs e )
        {
            base.OnSpeech( e );
            Mobile from = e.Mobile;
            string speech = e.Speech.ToLower();

            if ( m_Mobile is BaseVendor && from.InRange( m_Mobile, Core.AOS ? 1 : 4 ) && !e.Handled )
            {
                if ( e.HasKeyword( 0x014D ) || speech == "sell" )  // *vendor sell*
                {
                    e.Handled = true;

                    ((BaseVendor)m_Mobile).VendorSell( from );
                    m_Mobile.FocusMob = from;
                }
                else if ( e.HasKeyword( 0x003C ) || speech == "buy" ) // *vendor buy*
                {
                    e.Handled = true;

                    ((BaseVendor)m_Mobile).VendorBuy( from );
                    m_Mobile.FocusMob = from;
                }
                else if ( WasNamed( e.Speech ) )
                {
                    e.Handled = true;

                    if ( e.HasKeyword( 0x0177 ) || speech == "sell" ) // *sell*
                        ((BaseVendor)m_Mobile).VendorSell( from );
                    else if ( e.HasKeyword( 0x0171 ) || speech == "buy" ) // *buy*
                        ((BaseVendor)m_Mobile).VendorBuy( from );

                    m_Mobile.FocusMob = from;
                }
            }
        }

Само решилось при переходе на более новую версию RunUO
- "error [TIP]: null string: 145903" при пересечении с npc (на сервере ошибок нет, сам клиент пишет)

НЕ РЕШЕНО

- при открытии меню покупки/продажи зависает клиент, но спокойно реагирует на команды, то есть если продать нечего, меню не появляется и клиент не зависает
- вещи не имеют названий (просто кусочек окна без каких-либо надписей)
- при открытии книги (обычная книга), валится клиент
- "error [TIP]: null string: 145903 : 5" в названии любого предмета, правда есть некоторые, которые отображаются нормально.

Вверх
Mirage
Берешь последнюю ранку или sunuo и меняешь в паре файлов эру на до аосную. То что error всего скорее отсутствия в клилоке клиента надписи. Там по дефолту всякие окошки с хелпами лезут для новых клиентов, свойства резистов... Вырубать надо для старого.
Я делал для 203 клиента, день протрахался, завел, и удалил. Многие интересные и нужные вещи из новых клиентов в ренесансе отсутствуют. И ранка оптимизированней работает с 4-7 клиентами. Оптимальнее всего 6 и 7 до uop клиенты. Там и новые мобы, и резисты, и всякие удачи, новые монстры и боссы.

Насчет buy - нпс по дефолту настроены на клик. Что бы включить голосовое управление надо либо эру опускать либо файл НПС править. Мне кажется проще сделать через даблклик по НПС открытие списка торговли или гампа окна.

Цитата
Да и вообще какой смысл пилить поддержку последних клиентов, если эмулятор не в состоянии поддержать рание версии

Ты никогда не пробовал на ssd/Core i7/GF1070 ставить windows 3.11 ? Зафига компьютеру поддержка десятки если он так хреново со старыми операционками работает?
Вверх
Александр Needle™
Цитата(Mirage @ 26.7.2017, 9:33)

Берешь последнюю ранку или sunuo и меняешь в паре файлов эру на до аосную. То что error всего скорее отсутствия в клилоке клиента надписи. Там по дефолту всякие окошки с хелпами лезут для новых клиентов, свойства резистов... Вырубать надо для старого.
Я делал для 203 клиента, день протрахался, завел, и удалил. Многие интересные и нужные вещи из новых клиентов в ренесансе отсутствуют. И ранка оптимизированней работает с 4-7 клиентами. Оптимальнее всего 6 и 7 до uop клиенты. Там и новые мобы, и резисты, и всякие удачи, новые монстры и боссы.

Насчет buy - нпс по дефолту настроены на клик. Что бы включить голосовое управление надо либо эру опускать либо файл НПС править. Мне кажется проще сделать через даблклик по НПС открытие списка торговли или гампа окна.
Ты никогда не пробовал на ssd/Core i7/GF1070 ставить windows 3.11 ? Зафига компьютеру поддержка десятки если он так хреново со старыми операционками работает?

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

Эру уже опускал, в файле НПС прописано голосовое управление, но оно не реагирует. Про дабл-клик запишу, хорошая идея.

Ты кое что перепутал, я намекаю на связь старый компьютер - старый Windows, никак иначе
Почему трудно было догадаться сделать например так, взять клиент Renaissance, оптимизировать RunUO полностью, все доделать, понятное дело баги останутся, но хотя бы 90% сделать и закрыть эту разработку финальной версией. И написать, эта версия поддерживает 90% клиент с [ 2.0.0 - 3.0.0] Renaissance, и дальше продолжить разработку уже с максимально возможной поддержкой клиента [ 3.0.0 - 3.0.7b] Third Dawn. То есть, оптимизировал, закрепил, стабильности добились и тогда выпустили версию.

Я понимаю, разработчики RunUO хотели как лучше, аля менять эпохи в пару кликов, но это ни черта не работает, в случае с вещами/нпц тянет ошибки. Может им и не нужна поддержка старых клиентов, а мне вот нужна

VendorAI.cs

Код
// Temporary 
        public override void OnSpeech( SpeechEventArgs e )
        {
            base.OnSpeech( e );

            Mobile from = e.Mobile;

            if ( m_Mobile is BaseVendor && from.InRange( m_Mobile, Core.AOS ? 1 : 4 ) && !e.Handled )
            {
                if ( e.HasKeyword( 0x14D ) ) // *vendor sell*
                {
                    e.Handled = true;

                    ((BaseVendor)m_Mobile).VendorSell( from );
                    m_Mobile.FocusMob = from;
                }
                else if ( e.HasKeyword( 0x3C ) )
                {
                    e.Handled = true;

                    ((BaseVendor)m_Mobile).VendorBuy( from );
                    m_Mobile.FocusMob = from;
                }
                else if ( WasNamed( e.Speech ) )
                {
                    e.Handled = true;

                    if ( e.HasKeyword( 0x177 ) ) // *sell*
                        ((BaseVendor)m_Mobile).VendorSell( from );
                    else if ( e.HasKeyword( 0x171 ) ) // *buy*
                        ((BaseVendor)m_Mobile).VendorBuy( from );

                    m_Mobile.FocusMob = from;
                }
            }
        }


Вверх
Juzzver
Цитата
Я понимаю, разработчики RunUO хотели как лучше, аля менять эпохи в пару кликов, но это ни черта не работает, в случае с вещами/нпц тянет ошибки. Может им и не нужна поддержка старых клиентов, а мне вот нужна smile.gif

Эпохи меняются в один клик, но причем тут клиенты? Ставь хоть 7й клиент себе и меняй эпохи.

По поводу прочих вопросов, ты их уже подымал в мае и был дан ответ.
Возможно попросту в 2.0.3 версии отсутствуют speech кейворды:
Код
if ( e.HasKeyword( 0x14D ) ) // *vendor sell*

попробуй просто переписать их под стринговые
Вверх
Александр Needle™
Цитата(Juzzver @ 26.7.2017, 20:17)

Эпохи меняются в один клик, но причем тут клиенты? Ставь хоть 7й клиент себе и меняй эпохи.
По поводу прочих вопросов, ты их уже подымал в мае и был дан ответ.
Возможно попросту в 2.0.3 версии отсутствуют speech кейворды: попробуй просто переписать их под стринговые

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

Теперь новый баг, при открытии меню покупки/продажи зависает клиент, но спокойно реагирует на команды, то есть если продать нечего, меню не появляется и клиент не зависает.
Вверх
Wap
А смысл в этих извращениях? Мейнстрим в рунете уже давно перешел на 6-7 клиенты, UORPG на 7.0.23.1 HS, Антарес на 6 клиенте (ML), UoGames на 7 клиентах (ну там конечно без вопросов, там OSI-Style).
Вверх
Александр Needle™
Цитата(Wap @ 27.7.2017, 0:32)

А смысл в этих извращениях? Мейнстрим в рунете уже давно перешел на 6-7 клиенты, UORPG на 7.0.23.1 HS, Антарес на 6 клиенте (ML), UoGames на 7 клиентах (ну там конечно без вопросов, там OSI-Style).

Ну вот такой я извращенец
Хочу начать с низов, так мне кажется проще, да и просто люблю старый Renaissance клиент.
Вверх
Mirage
Если взять 6 клиент и опустить эпоху то разницы ты не почуешь. Не будет ни самураев ни вампиров ни дополнительных миров, тултипы минимальны либо вообще отсутствуют. Зато нормальная карта и возможность все вернуть взад.
заморачиваться со старым клиентом имеет место быть только если у тебя какой то неепически наполненныый клиент с артами гампами и мапами и тебе лома все переделывать на новый. Если ты более менее дефолтный клиент используешь то это вода в решете.
PS по мне перенести необходимое с клиента на клиент все таки проще чем переписывать треть кода сервера что бы было ощущения 51-55 сферы с блжкджеком и багами. Теряется смысл действа.
Вверх
Александр Needle™
Цитата(Mirage @ 27.7.2017, 1:43)

Если взять 6 клиент и опустить эпоху то разницы ты не почуешь. Не будет ни самураев ни вампиров ни дополнительных миров, тултипы минимальны либо вообще отсутствуют. Зато нормальная карта и возможность все вернуть взад.
заморачиваться со старым клиентом имеет место быть только если у тебя какой то неепически наполненныый клиент с артами гампами и мапами и тебе лома все переделывать на новый. Если ты более менее дефолтный клиент используешь то это вода в решете.
PS по мне перенести необходимое с клиента на клиент все таки проще чем переписывать треть кода сервера что бы было ощущения 51-55 сферы с блжкджеком и багами. Теряется смысл действа.

Только что установил последнюю версию ML, на сервере менял эпоху на UOR, UOTD, T2A все как было так и осталось. Меню все остались, в самом начале, при создании персонажа мне предложили выбрать нинзю, самурая, некромансера и паладина, очень похоже на клиент эпохи Ренессанса. Большое меню характеристик персонажа, добавилось меню сверху, и многое другое. А так все остальное похоже обычный старый клиент, хехе, сарказм

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

Лучше уже начать со старой версией клиента, а когда потребуется, все включу и обновлю клиент. А карта, пфф, не столько сейчас онлайна на серверах, что им мало места будет на одной Felucce.
Вверх
Juzzver
Цитата
Меню все остались, в самом начале, при создании персонажа мне предложили выбрать нинзю, самурая, некромансера и паладина, очень похоже на клиент эпохи Ренессанса.

Эти гампы вшиты в клиент, но сервер не даст выбрать профессии или расы и т.д., которых нет в выбранной эре. Так же и с особенностями, типа резистов, абилок, тултипов и т.д. - все эти пакеты будут отключены.
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.