metahook吧 关注:756贴子:11,755
  • 16回复贴,共1

[钻石星辰拳]解除客户端资源数量限制

只看楼主收藏回复

如果我们在服务端不用 precache_model 然后直接在客户端缓存
那么就不大会收到 512 资源列表上限 的影响
但是客户端加载模型 即使用 Mod_ForName
加载的模型无法添加到资源列表进去
那么 由于无法在资源列表中查找到你在客户端加载模型
将导致 gEngfuncs.pEventAPI->EV_FindModelIndex( 客户端加载的模型的名字 ) 返回0
如何解决这个问题呢?
首先 Hook gEngfuncs.pEventAPI->EV_FindModelIndex
将其地址改到一个新函数去 EV_FindModelIndex
在 EV_FindModelIndex 这个函数中
调用原来的 gEngfuncs.pEventAPI->EV_FindModelIndex 的地址
如果 gEngfuncs.pEventAPI->EV_FindModelIndex 返回 0
那么我们就将所请求获得索引值的那个模型添加到我们新建的一个列表进去
然后返回一个很大的数字 9999 以上, 作为索引值


1楼2015-02-06 18:24回复
    但是这样子还没完, 因为那个返回的索引值 是我们伪造的, 肯定不能用
    那么如何使他可用呢?
    首先 我们需要了解 索引值是用来干嘛的
    例如我们创建一个 temp ent 我们可以调用
    R_TempModel (float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype)
    这个函数倒数第二个参数要求我们输入模型的索引值
    而这个索引值是通过 gEngfuncs.pEventAPI->EV_FindModelIndex(模型名称) 的到的
    而我们客户端加载的模型 通过 gEngfuncs.pEventAPI->EV_FindModelIndex(模型名称)
    得到的索引值是一个伪造的, 我们自己给出来的一个索引值


    2楼2015-02-06 18:28
    回复
      那么如何使这个索引值生效?
      我们需要了解 R_TempModel 怎么去运用模型的索引值
      下面是 Nagist 逆出来的引擎源码的一个小小部分:
      http://codepad.org/nabrdWug
      我们可以看出他是用 CL_GetModelByIndex(模型索引值) 返回值得到一个模型
      那么我们可以勾住 CL_GetModelByIndex
      http://codepad.org/hYIlqXJa
      然后修改 CL_GetModelByIndex , 让这个函数能够识别我们的伪造的索引值
      识别以后 就从我们自己创建的列表中 找出对应的模型, 然后返回即可


      3楼2015-02-06 18:33
      回复
        最终源码 http://pan.baidu.com/s/1gdhB7lp


        4楼2015-02-06 18:33
        收起回复
          厉害


          IP属地:广东来自Android客户端5楼2015-02-06 20:02
          回复
            写的好像别人看得懂一样


            IP属地:江苏6楼2015-02-06 20:35
            收起回复
              链接挂了,补档啊


              IP属地:广东8楼2015-02-12 23:35
              收起回复
                你的罗嗦我看懂了


                IP属地:广东9楼2015-02-14 11:42
                回复