【代码分享】CS2 全景投票 Panorama vote代码片段 代码鉴赏 教学 科普 CS2

我不当学长 管理员组 5天前 123

用于CSSharp,from: @花绿青@小书林

var voteController = Utilities.FindAllEntitiesByDesignerName<CVoteController>("vote_controller").Last()!;
for (int i = 0; i < 64; i ++)
{
  voteController.VotesCast[i] = 5;
}

voteController.OnlyTeamToVote = -1;
voteController.PotentialVotes = 1;
voteController.IsYesNoVote = true;
voteController.ActiveIssueIndex = 2;

voteController.VoteOptionCount[0] = 0;
voteController.VoteOptionCount[1] = 0;
voteController.VoteOptionCount[2] = 0;
voteController.VoteOptionCount[3] = 0;
voteController.VoteOptionCount[4] = 0;

UserMessage vote = UserMessage.FromId(346); //CS_UM_VoteStart = 346;
vote.SetInt("team", -1);
vote.SetInt("vote_type", -1);
vote.SetString("disp_str", "#SFUI_vote_surrender");
vote.SetBool("is_yes_no_vote", true);
RecipientFilter players = [];
players.AddAllPlayers();
vote.Recipients.AddAllPlayers();
vote.Send(players);

EventVoteChanged e = new(true);
e.VoteOption1 = 0;
e.VoteOption2 = 0;
e.VoteOption3 = 0;
e.VoteOption4 = 0;
e.VoteOption5 = 0;
e.Potentialvotes = 1;
e.FireEvent(false);

或者@Ambr0se

        [ConsoleCommand("css_test")]
        public void OnCommandTest(CCSPlayerController? player, CommandInfo info) {
            if (player == null)
                return;

            RecipientFilter filter = [];
            filter.AddAllPlayers();

            nint hVoteController = 0;
            unsafe {
                Process currentProcess = Process.GetCurrentProcess();
                nint serverDllBaseAddress = currentProcess.Modules.Cast<ProcessModule>().LastOrDefault(m => string.Equals(m.ModuleName, "server.dll", StringComparison.OrdinalIgnoreCase))?.BaseAddress ?? throw new InvalidOperationException("找不到server.dll");
                hVoteController = Unsafe.Read<IntPtr>((void*)(serverDllBaseAddress + 0x1502AA8));
                Console.WriteLine($"VoteController的内存基地址是: {hVoteController}");
            }

            CVoteController? pVoteController = new CVoteController(hVoteController);
            if (pVoteController == null || pVoteController.Handle == IntPtr.Zero)
                return;
            pVoteController.PotentialVotes = filter.Count;
            pVoteController.IsYesNoVote = true;
            pVoteController.ActiveIssueIndex = -1;
            pVoteController.OnlyTeamToVote = -1;

            if (sub_18012C5B0.Invoke(pVoteController.Handle, (uint)player.Slot, "ChangeLevel", "de_inferno", -1)) {
                Server.PrintToChatAll($"测试成功 {pVoteController.Handle}");
                Console.WriteLine($"测试成功 {pVoteController.Handle}");
            }
        }

效果:(需要额外配合 platform_schinese.txt或者platform_english.txt)

基于此应该可以实现全景投票功能(需要自行额外补充一些投票结果的回调处理)


玩家投票结果可以通过hook votecast来做到


CSGO插件分享-申明 1、本网站名称:CSGO插件分享-中文站  网址:https://bbs.csgocn.net
2、本站的宗旨在于为CSGO玩家提供一个插件分享的中文资源平台,多数插件来源于SourceMod论坛,并配以中文介绍和安装教程。
3、欢迎有能力的朋友共享有趣的CSGO插件资源。
4、本站资源大多为百度网盘,如发现链接失效,可以点: 这里进行反馈,我们会第一时间更新。
最新回复 (4)
  • 小书林 一级用户组@Ta 4天前 2
    引用 2

    这里需要注意一下disp_str所指向的内容必须以#SFUI_vote_开头  否则会不提示的哦!
    另外非csgo_schinese.txt存在的可以只写一个platform_english.txt  它如果找不到会默认读英语哒!
    非常感谢花花老师的指导 这篇帖子只写了如何实现全景投票的功能  但是关于后续的票数处理  还是需要大家自行摸索一下哒  如果有更好的创意也可以在这里分享一下呢!

  • 小书林 一级用户组@Ta 4天前 2
    引用 3

    补充:一定要在投票发送后使用eventvotechanged去将投票计数清零!

    EventVoteChanged e = new(true);
    e.VoteOption1 = 0;
    e.VoteOption2 = 0;
    e.VoteOption3 = 0;
    e.VoteOption4 = 0;
    e.VoteOption5 = 0;
    e.Potentialvotes = 1;
    e.FireEvent(false);

    个人踩过这个坑 导致我强迫症发作想改过来 最后我没吃到仅剩的最后一个鸡腿(为我花生TAT)

  • 我不当学长 楼主 管理员组@Ta 4天前 2
    引用 4
    重要补充:修改完插件或者platform_schinese.txt或platform_english.txt之后,一定要重启客户端和服务器,否则看不到效果。
  • Ambr0se 一级用户组@Ta 16小时前 0
    引用 5
    补充方法2:
    private  MemoryFunctionWithReturn<nint,  uint,  string,  string,  int,  bool>  sub_18012C5B0  =  new("48  89  5C  24  ?  4C  89  4C  24  ?  89  54  24  ?  55");
    server.dll  +  0x1502AA8  为windows平台  全局vote_controller实体  的内存地址

    顺便一说:
    3个vote_controller实体  从first  ->  last分别为  T的vote_controller  CT的vote_controller  全局的vote_controller 
返回