遊戲中防止加速的一種方法

關鍵字:遊戲 服務器 客戶端 防外掛加速


遊戲當中有些動作要求必須間隔一定時間才能執行,比如跑步等動作。如果僅在客戶端限制的話往往都被加速器(外掛)所破壞。本文假定客戶端必須間隔400毫秒的數據包傳輸,提出服務器端解決加速問題的一種方法。


一、客戶端發送若干數據包

t1=tc;

Send(…);

t2=tc;

Send(…);

t6=tc;

Send(…);

 

t1-6:每個數據包必須包含的發送時客戶端當前時間值

Tc:客戶端當前時間

 

二、服務器端接收若干數據包

Void OnConnect(void)
{
    IsFirstData = True;
}
 
Void OnReceive(…)
{
    ......
    T=DataPack.ClientTime; //T當前數據包內的時間值
    if(IsFirstData) //第一次接收?
    {
        IsFirstData = False;
        Tsf=Ts;  //記錄當前服務器時間
        Tcf=T;  //記錄數據包內的客戶端的時間值,T=t1
        Tlst=T; //保存當次數據包中的時間值
    }else
    {
          if(T - Tlst < 400)  //時間間隔驗證
                OnError();
          if((T-Tcf) - (Ts-Tsf ) > Tnd+ Tx)  //時長驗證
                OnError();
        if (Ts-Tsf) > MaxLong //每十分鐘初始一次Tsf、Tcf,防止兩端時間誤差累加放大
        {
            Tsf = ts;
            Tcf=T;
        }
        Tlst=T; //保存當次數據包中的時間值
    }
    ……
}

Tsf:服務器收第一個數據包時的當前時間

Ts:服務器當前時間

Tcf:客戶端第一個數據包裏面的時間值

T:當前接收到數據包內的客戶端時間值

Tlst:上次接收到的數據包的時間值

Tnd:網絡傳輸延時時間的最大允許值,常量

Tx:客戶端和服務器端的在最大計時週期內(MaxLong)的最大允許的時間累計誤差,常量

(T-Tcf):當前數據包和第一個數據包間隔時長

(Ts-Tsf ):當前服務器時間和接收第一個數據包時的間隔時長

MaxLong:最大計時週期:10分鐘,常量,適當調整

 

正常情況下(圖一),數據包間隔時間和兩端時間是符合規則的。但如果外掛要想插入兩個數據包(圖二)t7和t8,那麼t7必須等於2400,t8必須等於2800才能滿足(T - Tlst >= 400)條件,這樣在接收到t8的時候(T-Tcf) - (Ts-Tsf )就有800毫秒的誤差,當插入的數據包超過一定數量的時候(假定Tnd + Tx=1000)就會觸發閥門((T-Tcf) - (Ts-Tsf ) > Tnd + Tx)打開,將該用戶列入黑名單並斷線。

 

實際遊戲中,有效數據包需要限時,有些遊戲不需要,應用起來可能還要複雜些。外掛也可能還有更多的應對策略,但此法可以參考來完善遊戲中的防護機制。




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