Зайти - не заходит, сервер перезапускается при каждом входе. Понял.., через 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" в названии любого предмета, правда есть некоторые, которые отображаются нормально.