熱血傳奇服務端源代碼分析筆記

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代碼









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