製作遊戲的兩三事【40】不要輕易相信客戶端送來的資料

在遊戲開發的工作上,通常會劃分為成企劃、程式以及美術這三大項目,不過在線上遊戲的領域裡,程式這個部份會再細分為伺服器﹝Server﹞以及客戶端﹝Client﹞這兩個領域。在某些遊戲公司裡,程式會依負責的部份不同作出以上的區分;而有些遊戲公司則是不做這麼仔細的劃分。

在有劃分工作執掌的狀況下,伺服器的工程師負責的是伺服器這一端的相關工作。這些工作包含了程式的撰寫以及伺服器維護的相關工作;而客戶端的程式則是負責玩家用來安裝到個人電腦上的程式。線上遊戲就是由伺服器端和客戶端這兩方面的程式合作,資料經由網路在客戶端和伺服器之間傳送。

當玩家在客戶端操作後,這個操作的指令就會透過線入傳送到伺服器,然後在伺服器確認過相關的操作沒有問題後,就會將確認的指令傳回到客戶端,讓客戶端執行相關的動作。而同時伺服器則會把這個動作傳送給在這個玩家週圍需要看到這個操作的其他玩家,讓其他的玩家也能看到相對的操作。一般來說,標準的線上遊戲在執行一個簡單的動作時就是這樣。

在我們開發線上遊戲的時候,有一句『不要輕易相信客戶端送來的資料』的警語。這句話並不是說擔任客戶端的工程師不可信任,而是提醒擔任伺服器的工程師,要注意所有從客戶端送來的資料。由於客戶端是安裝在玩家的電腦上,從那裡送來的資料很有可能是被動過手腳修改後的資料,如果不檢查這些資料的可信度,很有可能就會被這些修改過的資料所騙。以下簡單舉個例子來說明:

在某個線上遊戲中,工作系統的材料可以透過不斷的合成變成更上一階的材料,然後玩家使用越高階的材料就可以做出更強的裝備。合成的規則是玩家可以將三~五個同樣的材料放到合成寶盒中,然後遊戲會根據玩家放入合成寶盒的材料數量,決定合成的成功率。三個同樣的材料合成上一階的機率是60%、四個則是80%、五個則是100%。根據這個規則,一階木材可以合成為二階木材,二階木材可以合成為三階木材以此類推。

如果有位玩家要將手中的三個一階木材合成為二階木材,會是以下的流程:

(1)玩家將三個一階木材放入合成寶盒送出﹝資料從客戶端傳往伺服器
(2)伺服器收到資料依合成機率60%決定成功與否﹝伺服器進行運算
(3)將合成是否成功的結果傳回客戶端﹝資料從伺服器傳回客戶端
(4)客戶端收到資料進行處理﹝客戶端進行相關程序

在客戶端接到伺服器傳來合成成功/失敗的結果後,如果合成是成功的,那麼玩家會獲得一個二階木材;如果合成是失敗的,那麼玩家什麼都不會獲得。還記得這篇文章的主題嗎?萬一伺服器收到的資料是被玩家修改過的呢?在以上的流程中並沒有檢查玩家身上是否真的有三個一階木材,萬一玩家身上其實沒有三個一階木材;或是玩家身上只有三個一階木材,結果送過來的資料是五個一階木材進行100%成功的合成。如果發生這樣的狀況那就糟糕了。

所以這個流程應該修改為:

(1)玩家將三個一階木材放入合成寶盒送出﹝資料從客戶端傳往伺服器
(2)伺服器判斷玩家身上是否有三個一階木材並且扣除﹝伺服器判斷及處理
(3)伺服器收到資料依合成機率60%決定成功與否﹝伺服器進行運算
(4)將合成是否成功的結果傳回客戶端﹝資料從伺服器傳回客戶端
(5)客戶端收到資料進行處理﹝客戶端進行相關程序

這個第二步驟的動作,就是檢查玩家身上是否有足夠的物品,然後先將它扣掉。如果各位有看過『製作遊戲的兩三事【37】開寶箱設計常見的大漏洞』這篇文章,就會知道銀狐曾經說過在線上遊戲的程式撰寫時,為了避免不可預期的程式被中斷,所以各種系統中的物品產生和消失要遵守『先扣再給』的這個原則。在這個流程中為了避免複雜化,銀狐將判斷背包空間是否足夠的判斷先省掉,我們就假設玩家的背包是有足夠空間的。

或許有人會懷疑,這麼簡單加個檢查就可以做到的事,為什麼會有遊戲不願意這樣做。一個原因是工程師在撰寫程式時候的疏忽,而另一個原因﹝也是最重要的原因﹞是因為什麼都要伺服器檢查確認會加重伺服器的負擔,同時拖慢遊戲執行時的效率。在這裡指的所有動作包含了線上遊戲中大大小小的各種動作,像是角色移動、攻擊敵人以及各式各樣的動作。光以角色移動這一項來說,在一個遊戲的伺服器中同時會有多少玩家的角色在移動,如果每一個移動都要檢查和判斷,會是多大的負擔?

也因為這樣,有許多的遊戲會將一些會造成伺服器負擔較重的動作交給客戶端來判斷,而這些由客戶端判斷的項目若是被玩家給破解了,就可以做出原本應該做不到的動作。像是某些強調動作性的韓國線上遊戲中,總是會出現『瞬移』的外掛就是因為這樣的原因。而某些遊戲中出現不正常的『穿牆』、或是某些玩家的角色具有超過正常攻擊距離的攻擊,也是因為這些由客戶端來進行判斷的動作被玩家破解的結果。

提到客戶端送來的資料是不可信任的這件事,就不得不提起《夢幻之星網路版》這款遊戲。這款從遊樂器平台移植到電腦的遊戲,犯了一個相當致命的錯誤,那就是它將玩家的存檔資料放在玩家的電腦中。遊樂器算是半封閉的系統,做出這樣的設計並不奇怪。但是移植到個人電腦上還是將資料放在客戶端,等於是給了想要修改資料的玩家許多的機會。果然這款遊戲後來出現了許多修改資料的『超強角色』,也讓這個遊戲很快的因為營運上的各種問題而消失在市場上。

 

 

效能和安全性是無法兼得的,對於越是強調『動作性』和『打擊感』的線上遊戲來說,如果玩家的每一個動作都要送到伺服器來檢查和判斷,那麼遊戲所想要給玩家的感覺就會變得不是很流暢。當這兩者無法兼得時,遊戲設計者就必須要兩者之間做出取捨,而這個取捨則會引發不同程度的後果。至於各位在製作遊戲時該如何選擇,也只能依每個遊戲的設計來作出最適當的取捨吧。