遊戲伺服器設計之NPC系統

2022-02-07 11:36:18 字數 2170 閱讀 7206

npc系統是遊戲中非常重要的系統,設計的好壞很大程度上影響遊戲的體驗。npc在遊戲中有如下作用:

引導玩家體驗遊戲內容,一般遊戲內有很多主線、支線任務,而任務的介紹、接取、領取獎勵等操作都是通過npc的操作,一般會有幾個核心npc,再不停的任務引導中,玩家會對核心npc印象深刻,強化了遊戲代入感。

核心功能的展示和操作。遊戲大部分功能都會放到遊戲主介面,但是全部功能都放進去是不現實的,其他功能則以npc的方式提供,比如進入某副本的入口等。

一些運營活動,比如道具秒殺,打折**等,過年過節也可以製作一些應景的npc形象。

npc跟角色怪物等相似是乙個實體,所謂實體指的是必須有唯一id,可通過id索引到且可以在地圖動態新增,本文實現的npc的id由配置檔案指定,其他基本屬性如名字、地圖座標、外形、朝向等都可配置。

當與npc對話時一般都是顯示文字和一些引導操作的按鈕。這些都是需要可配置。另外npc的文字除了靜態描述文字,還需要一些動態資料,比如顯示玩家活動分數,排名次序等。如何定義伺服器和客戶端的協議才能滿足上述要求呢?首先必須是文字協議並且可擴充套件,這樣才對配置友好,json是一種,但是json夠緊湊但是對配置不是很友好尤其是對文字描述這種。xml相比更好一點,擴充套件性強,可讀性也好,在文字長度不大的情況下效率也可以接受。本人推薦用xml的格式npc的顯示協議。npc至少有兩個元素文字和按鈕,怎麼用xml來表示呢?我首先想到了html。常規文字顯示就參考html的格式,特殊的ui元件,擴充套件一下xml就可以了,這種情況甚至不需要重啟伺服器。為了客戶端解析方便,我們只需要使用html的子集即可,比如:

過年好!

狗年大吉!

旺旺旺ok

使用html格式的配置有如下好處:

html大家都比較熟悉,無論是伺服器客戶端都對html有一定了解,甚至策劃也不陌生,接受起來非常容易。

上圖顯示了乙個有超鏈和按鈕的npc面板,那麼點選了超鏈和按鈕後程式如何處理呢?這時正時指令碼排上用場的地方了。乙個超鏈或按鈕對應乙個指令碼的函式,而整個指令碼正好是對應了指令碼的全部功能。另外超鏈是可以傳引數的,那麼引數會被帶到指令碼函式中,如下例所示:

檢視成績

def showscore(player, npcid, param):

sortcondition = param['sort']

#do something

return

第一次點選npc因為沒有指定超鏈,那麼預設呼叫指令碼的main函式。時序圖如下:

def main(player, npcid):

msg = '''

過年好!

狗年大吉!

旺旺旺ok

''' return msg

思考下如果有外掛程式沒有點選main直接發訊息點選showscore會怎麼樣?正常情況下角色必須點選當前看到的頁面包含的超鏈,否則會出現安全性問題,必須加以限制。npc系統每次傳送npc面板內容給客戶端時,都會記錄下當前的npc面板內容,當玩家點選超鏈,首先驗證一下是否是本次面板內的超鏈,否則拒絕,安全性大大提高。時序圖如下:

xml作為npc顯示協議具有非常強的擴充套件性,比如顯示文字,控制文字大小,顯示圖示等都可以通過擴充套件xml標記實現。

xml與指令碼結合實現npc的功能,會大大利用指令碼的已修改、熱更新的優勢,一些運營活動不停機上線這是最基本的要求了,如果有bug,可以下發正確的指令碼覆蓋後重新載入指令碼即可。

這種格式易理解,好配置,對於策劃這種弱程式的也是可以接受,當然基於html做個配置工具也是非常的容易。

實現顯示協議後,npc的外放、刪除,外形配置、文字配置等,都是策劃可以搞定的,這也是團隊都希望的。

再考慮到擴充套件性前提下,保證了npc的安全性,有的時候寫**的人經常會寫這樣的**,如判斷乙個人可以領獎,然後顯示可以領按鈕,點選了領取按鈕的對應函式有可能忘了判斷有效性,在這種npc的方式下,就不太會出現重複領獎的bug,因為每次領獎,都會npc提示領獎成功,然後把player上的當前npc文字沖掉,這樣假如外掛程式再發領獎請求會被npc系統自動攔調,大大提高系統安全性。

npc的點選頻率限制,npc距離限制,這寫基本的安全性邏輯也要有,這個不在贅述,詳情看github**。

關於屬性管理器:

關於遊戲伺服器引擎h2engine:

遊戲伺服器設計之任務系統

任務系統是遊戲中最重要的系統之一,本文旨在設計乙個輕量清晰的任務系統。通用易擴充套件是本系統關注的重點。任務系統中當角色的條件滿足時,自動觸發每一型別的任務,每個任務有其所需的完成條件,當角色完成了指定的操作後,則會觸發任務自動完成,任務完成後一般玩家會領取對應的獎勵,結束任務,此任務的生命週期結束...

遊戲伺服器設計之屬性管理器

遊戲中角色擁有的屬性值很多,運營多年的遊戲,往往會有很多個成長線,每個屬性都有可能被n個成長線模組增減數值。舉例當角色戴上 時候hp 100點,卸下 時hp 100點,這樣加減邏輯只有一處還比較好控制,如果某天有個特殊功能當被某技能攻擊時,角色 會被擊落,這樣就會出現減數值的操作不止一處。如果邏輯處...

遊戲伺服器架構設計

一 棋牌類伺服器的特點 1,棋牌類不分割槽不分服 一般來說,棋牌遊戲都是不分割槽不分服的。所以棋牌類伺服器要滿足隨著使用者量的增加而擴充套件的需要。2,房間模式 即在同一局遊戲中就是在同乙個房間中,同乙個房間中的人可以接收到其他人的訊息。3,每個房間的操作必須是順 序性 這個特性類似與一般遊戲的回合...