cs插件吧 关注:8,247贴子:88,524
  • 3回复贴,共1

【小白白】无限AllocString解决方案之一...看起来很奇怪

取消只看楼主收藏回复

之前的原贴https://tieba.baidu.com/p/5176972066
小灰灰dalao提出了由于无节制AllocString导致的炸服问题
于是我想了一个办法,在AllocString之前检查一下,
没有见过的东西就塞进容器里面去,有的话直接从容器取出来

效果大致是这样子,图片里面第一次出现weapon_c4的时候就分配...第二次出现weapon_c4直接返回之前分配的


IP属地:湖南1楼2017-07-07 19:26回复
    那么问题来了...假如用fakemeta模块的register_forward(FM_AllocString, "fw_AllocString");这样子的函数
    就会出现只勾住原版mp.dll等调用的AllocString,
    而由engfunc(EngFunc_AllocString, "info_target");这样子的fakemeta模块调用的函数就不会被勾住了
    (engfunc类似于ExecuteHam不会执行钩子,不像ExecuteHamB一样会受到RegisterHam的钩子影响)
    所以,只好使用orpheu大法,请自行下载orpheu模块。
    然后你需要制作一个signature文件,名字叫做AllocString(没有txt什么的扩展名),把它
    放到addons/amxmodx/configs/orpheu/functions
    (以下{}大括号里面的才是需要的内容
    {
    "name" : "AllocString",
    "library" : "engine",
    "arguments" :
    [
    {
    "type" : "const char *"
    }
    ],
    "return" :
    {
    "type" : "int"
    }
    }
    (以上{}大括号里面的才是需要的内容
    实际上AllocString是引擎提供的engfunc函数,不需要特征码什么的所以与游戏版本无关。


    IP属地:湖南2楼2017-07-07 19:33
    回复
      然后把下面的源码保存成x_stringman.sma并且编译放到游戏里面
      #include <amxmodx>
      #include <orpheu_stocks>
      #define PLUGIN "[x] String Manager"
      #define VERSION "1.0"
      #define AUTHOR "Xiaobaibai"
      // 用一个map容器来装这些类似于map["info_target"]=233的东西
      new Trie:g_mapAllocString;
      new OrpheuFunction:g_pfnAllocString;
      public plugin_init()
      {
      register_plugin(PLUGIN, VERSION, AUTHOR)
      }
      public plugin_precache()
      {
      g_mapAllocString = TrieCreate();
      g_pfnAllocString = OrpheuGetEngineFunction("pfnAllocString", "AllocString")
      OrpheuRegisterHook(g_pfnAllocString, "OnAllocString", OrpheuHookPre);
      }
      public OrpheuHookReturn:OnAllocString(const szValue[])
      {
      new iReturn;
      // 已经有的话就不再分配了
      if(TrieGetCell(g_mapAllocString, szValue, iReturn) == true)
      {
      OrpheuSetReturn(iReturn);
      return OrpheuSupercede;
      }
      // 没有的话重新分配
      iReturn = OrpheuCall(g_pfnAllocString, szValue);
      TrieSetCell(g_mapAllocString, szValue, iReturn);
      return OrpheuSupercede;
      }


      IP属地:湖南3楼2017-07-07 19:33
      回复
        涉及到的两个文件可以在这里看
        x_stringman.sma
        http://codepad.org/8nLpTWq6
        AllocString
        http://codepad.org/4WCvL1JV


        IP属地:湖南4楼2017-07-07 19:35
        回复