RunUO代码研究(一)

来源:互联网 发布:dj软件下载中文版 编辑:程序博客网 时间:2024/05/17 09:36

     最近做梦常常梦到自己以前在UO中的往事...呵呵,虽然以前玩的不是很厉害,但是迷恋程度可是不低.最近弄到了一份RUNUO的源代码.忍不住想看看这么精彩的代码是如何写的.自己虽然是个小小的程序员(马上就不干这行了),但是却无论如何和达不到这样高的程度...于是仰慕之余就开始了我的第2次UO之旅.

    首先声明一点,由于小弟C#并不是很NB,所以分析出来的东西可能不是很专业,如果能看明白,或者能从我写的东西里得到益处,本人就感到非常欣慰了.哈哈...一句话,对UO还怀念的朋友或者希望一起研究RUNUO代码的朋友,大家多多交流,一起进步.可以联系本人.QQ:1570147  说研究RUNUO代码就可以了.

    我用了几天的代码,熟悉了一下全部的类以及他们的继承关系。发现。。。真的是博大精深啊。。。汗都要出来了。。。写的真是@#^&@#看都看不懂。不过不急,饭是一口一口吃的嘛。慢慢来。首先我们找到Main.cs这个文件,找到Main()方法。咱们一点一点看下去就可以发现启动的时候可以选择3种参数-debug,-service,-profile。如果以-service方式启动后,系统将自动建立Logs目录,我们可以分析Logs/Console.log这个文件。中间略过。。。略过。。。重点的东西出来了"while ( !ScriptCompiler.Compile( debug ) )" debug这个参数是你一开始启动时用-debug设置的,默认为false。我没有设置过这个参数,估计是用来调试Script目录里的代码用的。赶快跟踪进去,ScriptCompiler.cs文件里的Compile()这个函数里。同时编译了Scripts/和Scripts/Output/目录中的*.cs和*.vb类。查找所有文件名的代码在GetScripts()这个函数中。我一开始以为编译采用外部调用csc.exe文件。没想到。。采用的方式如此高级。呵呵。。。.CS文件编译完成后开始编译.vb文件CompileVBScripts();  当没有返回错误以后,开始调用Core.VerifySerialization();验正代码的正确性(本人不确定,还没看Core里的代码)
下面一段代码:
    ArrayList invoke = new ArrayList();

    for (a=0;a<m_Assemblies.Length;++a)
    {
     Type[] types = m_Assemblies[a].GetTypes();

     for ( int i = 0; i < types.Length; ++i )
     {
      MethodInfo m = types[i].GetMethod( "Configure",

BindingFlags.Static | BindingFlags.Public );

      if ( m != null )
       invoke.Add( m );
       //m.Invoke( null, null );
     }
    }

    invoke.Sort( new CallPriorityComparer() );

    for ( int i = 0; i < invoke.Count; ++i )
     ((MethodInfo)invoke[i]).Invoke( null, null );

    invoke.Clear();

是通过反射功能调用运行Script/目录中所有文件中的Configure()函数。。我对反射不了解。暂时只能了解到这里。
查找下整个项目,我们能发现一共有:
 Scripts/Accounting/Accounts.cs  public static void Configure()
 Scripts/Engines/Factions/Core/Reflector.cs  public static void Configure()
 Scripts/Engines/Pathing/Movement.cs  public static void Configure()
 Scripts/Engines/Plants/PlantSystem.cs  public static void Configure()
 Scripts/Engines/RemoteAdmin/Network.cs  public static void Configure()
 Scripts/Misc/AOS.cs  public static void Configure()
 Scripts/Misc/DataPath.cs public static void Configure()
 Scripts/Misc/Email.cs  public static void Configure()
 Scripts/Misc/Gifts/GiftGiving.cs public static void Configure()
 Scripts/Misc/Guild.cs  public static void Configure()
 Scripts/Misc/MapDefinitions.cs  public static void Configure()
 Scripts/Misc/Poison.cs public static void Configure()
 Scripts/Misc/RegenRates.cs  public static void Configure()
 Scripts/Misc/SE.cs public static void Configure()
 Scripts/Multis/BaseHouse.cs  public static void Configure()
 Scripts/Skills/Snooping.cs  public static void Configure()
这些都是初始调用的函数。如果以后你的代码中也有开始就要调用的功能,不妨写入到myClass.Configure()中去。

    Configure()函数我分析了几个。。。象DataPath.cs 用来找到你的UO目录.大部分的是类试EventSink.Login += new LoginEventHandler( EventSink_Login );好象是抓事件用的???我不太清楚,看不太懂。。有哪个大大教教我就好了。。象MapDefinitions.cs中是加载地图用的;SE.cs中好象是用来开启武士帝国功能的。不想开就设置Core.SE = False吧;
    目前暂时分析到次。。。偶还在看。哎C#刚入门,看的实在是痛苦。如果大家喜欢的话给点鼓励吧。:)