热血传奇服务端源代码分析笔记

RunDB.pas 维护DBServer和M2 的数据交换。

RunSock.pas 维护 M2和网关的数据交换。

LocalDB.pas 用于读取标准数据库(物品 技能 怪物)内的数据。

其中可以看到 在读取物品数据库的时候

 StdItem.AC := MakeLong(Round(Query.FieldByName('Ac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('Ac2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
        StdItem.MAC := MakeLong(Round(Query.FieldByName('Mac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('MAc2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
        StdItem.DC := MakeLong(Round(Query.FieldByName('Dc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Dc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
        StdItem.MC := MakeLong(Round(Query.FieldByName('Mc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Mc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
        StdItem.SC := MakeLong(Round(Query.FieldByName('Sc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Sc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
物品的防御、魔法防御 、攻击这种 一个字段内包含了 攻击上限了下限。类型为4字节。 这里也就限制了 物品的属性无法超越2字节限制。 0-65535 。要超过此限制 必须使用8字节数据。

--------------------------------------------------------以上是M2和外部数据交换的操作--------------------------------------------

Magic.pas 内实现了一个魔法管理器 TMagicManager 所有魔法的伤害都在此进行管理和统计。源代码很冗余。相同的代码有太多重复。如果考虑将物品属性改成4字节 那么这里面有很多代码需要重新维护 防止数据溢出。


Guild.pas内 实现 了2个类,TGuild(行会) 和TGuildManager  (行会管理)。那么关于行会的操作都将在此进行。


UsrEngn.pas内是对所有Actor数据的处理。包含处理NPC  人物  怪物 和英雄 的数据


在TUserEngine.ProcessHumans 我发现在处理全局公告的时候的逻辑 也在这里面处理 实在是很不应该。这应该是公告类自身来处理的。主要负责前端  不过职责太混乱 啥都有。

而frnEngn.pas  内 TFrontEngine = class(TThread) 虽然从字面上来理解是前端。。但是做的是后勤工作。。反正这两个类的职责比较混乱!是处理数据的主要类!


Event.pas 内实现的是事件类。安全区的光环 以及地图上的特效 都是以事件来实现的。比如困魔咒。在游戏网络突然中断我们可以看到困魔咒的光环依旧是动态的。这说明。这些地图特效的帧率 是不受服务端控制 的 主要逻辑在客户端 服务端只是告诉客户端 有这么一个事件  什么时候消亡!

TEvent = class(TBaseObject)


Envir.pas 内维护了一个TEnvirmonent  在服务端 如果服务端有1000个地图map  那么会有1000个TEnvirMonent 对象。每个对象维护各自地图内的玩家怪物列表。 而此类并不是线程类的子类。也就就是表示服务端在处理数据并不是并行处理的。而是线性处理。那么随着对象纵深越来越深  效率也是会降低。所以此类应该独立出来 不受M2维护 应该做到自维护。

在加入新土城格式 需要在此单元内做兼容。


DataEngn.pas 此单元与RunDB.pas配合   DataEngn.pas主要是处理底层Socket链接 而RunDB.pas主要负责合适发送者这种高层逻辑。是线程类。


Castle.pas 是城堡处理实现单元内部实现了TCastle 和 TCastleManager。关于城堡的操作 在此单元内。


StorageEngn.pas 仓库实现单元。其保存的为本地文件 并非数据库内。 需要改进


其他以Obj开头的单元是怪物 以及NPC的 AI实现。


ps:源代码为  飞尔20120918代码









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章