用于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来做到
