[测试用途] 尝试修改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