[測試用途] 嘗試修改CStrike模塊

Home Home
引用 | 編輯 11922911
2013-04-27 23:20
樓主
推文 x0
【插件資訊】

插件來源:原創
使用指令:cs_set_user_model
安裝路徑:addons/amxmodx/modules/

【插件介紹】

本文針對 CStrike 模塊裡的一個 native 函數嘗試作出一些簡單修正

複製程式
static cell AMX_NATIVE_CALL cs_set_user_model(AMX *amx, cell *params) // cs_set_user_model(index, const model[]); = 2 params

cs_set_user_model 這個函數也許你已經很熟悉, 它讓插件可以給玩家定義一個新的模型.
但有時候, 當你給大量玩家調用這函數時可能會產生一些問題, 最常見是當每局開始時一些玩家會從伺服器中被踢出, 此類錯誤通常被稱為SVC_BAD錯誤.
在這情況下, 發生錯誤的原因往往是因為它在同一刻裡改變大量玩家的模型所造成的. 而在模塊中所用改變模型的方法亦可能也是原因之一.


以下為 CStrike 模塊的一些 C++ 源碼

複製程式
static cell AMX_NATIVE_CALL cs_set_user_model(AMX *amx, cell *params)
{
       // ... ...

       strcpy(model, MF_GetAmxString(amx, params[2], 0, &len));
       
       g_players[params[1]].SetModel(model);
       g_players[params[1]].SetModelled(true);

       SETCLIENTKEYVALUE(params[1], GETINFOKEYBUFFER(pPlayer), "model", (char*)g_players[params[1]].GetModel());

       return 1;
}
它通過SETCLIENTKEYVALUE去改變玩家的模型, 情況就像你在插件裡使用 set_user_info( player, "model", "xxx" ) 或在遊戲中使用指令 model "xxx" 一樣, 但只是這樣做是不足夠的, 因為幾乎立即就會被 CS 重置成原來的模型.

複製程式
void PlayerPostThink(edict_t* pPlayer) {
       int entityIndex = ENTINDEX(pPlayer);

       if(g_players[entityIndex].GetModelled()) {
              if (g_players[entityIndex].GetInspectModel() && strcmp(g_players[entityIndex].GetModel(), GETCLIENTKEYVALUE(GETINFOKEYBUFFER(pPlayer), "model")) != 0) {
                     SETCLIENTKEYVALUE(entityIndex, GETINFOKEYBUFFER(pPlayer), "model", (char*)g_players[entityIndex].GetModel());
                     g_players[entityIndex].SetInspectModel(false);
              }
       }
       RETURN_META(MRES_IGNORED);
}
問題就在這裡, 為了防止CS重置玩家的模型, 它所使用的對策是在玩家的每個 PostThink 事件中檢查模型是否被改變, 如果被 CS 改變了就立即設回新的模型. 但不是上策, 更可能會令到問題惡化.



就此我對源碼作了一些修改, 並移除了使用 PostThink, 改用一些更可行的做法, 詳細不多解釋.

這個版本(也許)能減少此類問題的發生, 但我不能保證(畢竟我找不到32個玩家來測試)

目前只編譯 Windows 的版本
建議預先備份原始的 cstrike_amxx.dll 否則後果自負

[此文章售價 1 雅幣已有 31 人購買]
若發現會員採用欺騙的方法獲取財富,請立刻舉報,我們會對會員處以2-N倍的罰金,嚴重者封掉ID!



獻花 x4
引用 | 編輯 e1242656
2013-04-28 07:51
1樓
  
這跟ZP武器在下回合會變回原形有關嗎?

獻花 x0
引用 | 編輯 a7811311622
2013-04-28 18:57
2樓
  
下面是引用 e1242656 於 2013-04-28 07:51 發表的 : 到引言文
這跟ZP武器在下回合會變回原形有關嗎?
ZP武器不是人物吧…
我用的ZP武器下回合也不會有什麼變回原形的問題…
表情

獻花 x0
引用 | 編輯 弒血
2013-04-30 08:38
3樓
  
他這個應該是用模塊說明比插件還要少BUG
有的時候 人物太多 同時間 轉換模組時 會出現 重疊
也可能導致整的死當或跳離
這個應該是彌補所說的缺點 表情 表情

獻花 x0
引用 | 編輯 aa123zzzz
2013-04-30 11:07
4樓
  
感激樓主 我會仔細看看這些指令

獻花 x0
引用 | 編輯 xuqiang52133
2013-05-31 13:12
5樓
  
这个插件的模块你要是能改成支持CS1.5的就牛了。

獻花 x0
引用 | 編輯 Marchillus
2013-06-12 17:12
6樓
  
難怪我的伺服器有12人的時候就開始會刷新回合就跳離...

獻花 x0
引用 | 編輯 z2352671213
2017-01-22 16:19
7樓
  
很棒啊,不過我覺得要防止SVC_BAD的話只要避免所有模型都在近乎同一時間裏改變就行了,也就是,大幅度地延長不同玩家之間的模型改變的間隔時間。

獻花 x0
引用 | 編輯 陳冠冠
2024-01-10 15:47
8樓
  
這個我略過 我很少亂用CStrike
放插件.模組.地圖.為啥要改? 表情 表情

獻花 x0