cs插件吧 关注:8,235贴子:88,337
  • 7回复贴,共1

Orpheu: 结束回合/阻止回合结束

取消只看楼主收藏回复

首先需要下载orpheu模块:
https://forums.alliedmods.net/showthread.php?t=299492
然后在这里下载一个叫做CGameRules的signature包:
(待补)
至于什么是signature...就不用管了,
只要把它放到cstrike/addons/amxmodx/configs里面就可以了
(已测试3266、6153、7561的mp.dll)


IP属地:广东1楼2017-08-09 16:40回复
    【第一步】我们首先需要获得一个叫做g_pGameRules的(指针)变量。你也别管它是干什么用的,因为我们接下来会用到它。这个变量是一个叫做InstallGameRules的函数(mp.dll里面)的返回值,就像这样子就可以得到了。
    #include <amxmodx>
    #include <orpheu>
    new g_pGameRules
    public plugin_precache()
    {
    OrpheuRegisterHook( OrpheuGetFunction( "InstallGameRules" ), "OnInstallGameRules", OrpheuHookPost );
    }
    public OrpheuHookReturn:OnInstallGameRules()
    {
    g_pGameRules = OrpheuGetReturn();
    }


    IP属地:广东2楼2017-08-09 16:43
    回复
      接下来我就可以告诉你怎么结束回合了。
      stock TerminateRound(this, iWinStatus, Float:flDelay )
      {
      OrpheuMemorySetAtAddress(this, "m_iRoundWinStatus", 1, iWinStatus);
      OrpheuMemorySetAtAddress(this, "m_fTeamCount", 1, get_gametime() + flDelay);
      OrpheuMemorySetAtAddress(this, "m_bRoundTerminating", 1, 1);
      return true
      }
      我们只需要执行这个东西就可以强行结束回合。
      具体使用方法:
      this填那个g_pGameRules
      iWinStatus有以下取值:
      enum
      {
      WINSTATUS_CT = 1,
      WINSTATUS_TERRORIST,
      WINSTATUS_DRAW
      }
      随便选一个就可以了。
      flDelay表示执行这条命令以后过多久切换到下个回合,一般是填5.0吧。


      IP属地:广东3楼2017-08-09 16:47
      回复
        补充:
        1.记得判断可以结束回合时,获取OrpheuMemoryGetAtAddress(this, "m_bRoundTerminating"),假如为真的话说明已经结束过回合了,不需要再判断(或者你自己加一个变量记录也可以)比如
        if(TeamCount(CS_TEAM_CT) == 0 && !OrpheuMemoryGetAtAddress(this, "m_bRoundTerminating"))
        {
        TerminateRound(g_pGameRules, WINSTATUS_TERRORIST, 5.0 );
        }
        2.需要#include <orpheu_memory>


        IP属地:广东4楼2017-08-09 16:50
        回复
          【第二步】如何阻止CS自带的回合结束?
          mp.dll里面使用一个叫做CheckWinConditions的函数来判断是否应该结束回合,如果是的话就结束,也就是说阻止这个函数执行就可以解决问题。
          我们可以在获得到g_pGameRules以后直接hook这个函数,并且阻止它。
          注意到这个函数是CGameRules类的虚函数,用这种方法就可以了。
          public OrpheuHookReturn:OnInstallGameRules()
          {
          g_pGameRules = OrpheuGetReturn();
          OrpheuRegisterHook(OrpheuGetFunctionFromObject(g_pGameRules, "CheckWinConditions", "CGameRules"), "OnCheckWinConditions");
          }
          public OrpheuHookReturn:OnCheckWinConditions(this)
          {
          return OrpheuSupercede;
          }


          IP属地:广东5楼2017-08-09 16:53
          回复
            补充:
            1.这种阻止回合结束可以阻止大部分情况,如某队最后一个人被杀死或者退出、玩家足够时开始游戏、VIP逃跑、C4爆炸/被拆、人质被救完、逃跑模式里面T逃走(好像并没有对应地图)等情况
            2.不可以阻止:sv_roundstart 1刷服、和刚才介绍的用插件强行结束回合


            IP属地:广东6楼2017-08-09 16:56
            回复
              (完)


              IP属地:广东7楼2017-08-09 16:57
              收起回复
                补上一楼缺的那个东西
                http://pan.baidu.com/s/1i48Zwwd
                放到cstrike/addons/amxmodx/configs


                IP属地:广东9楼2017-08-09 17:12
                回复