【菜单开发】按下F3打开菜单

我不当学长 管理员组 2022-5-1 3322

需求背景

很多时候,服务器内的玩家打开菜单需要在聊天框输入命令(比如!menu),才能够打开选择菜单。有没有方法可以简化打开菜单的方式呢?答案是有的,只需要绑定对应按键就可以快速打开!

O92SsO.png

如何绑定?

第一种:

玩家自行绑定。在控制台输入bind p "say !menu",这种方式的逻辑,还是基于玩家的客户端,将按键p绑定为在聊天框输入!menu。这种方案,需要玩家自己主动去绑定,对于一些比较懒的,或者是不完全不知道绑定代码的玩家来说,这种需要自己操作的工作,简直是要了他们的老命。一句话,太烦,不干!、

第二种:

服务器利用插件编程,替玩家直接在服务器层面完成按键绑定(之际上是重写了对应按键的实际功能,这个涉及到了override的知识)。这种方式的逻辑,就是将原本的按键,帮玩家在服务器上完成了功能重定义(也就是定义到了“打开菜单”的这个功能)。

下面我给出一个代码例子,可供有需要的开发者参考。

public void OnPluginStart()
{
       //这里的autobuy就是对应的F3按键,具体的定义,可以在\steamapps\common\Counter-Strike Global Offensive\csgo\cfg\config-default.cfg文件中找到
	RegConsoleCmd("autobuy", Command_Info);
}

public Action Command_Info(int client, int args)
{
	ShowQuickMenu(client);
	return Plugin_Handled;
}

public void ShowQuickMenu(int client)
{
	Menu menu = new Menu(ShowQuickMenuHandler, MENU_ACTIONS_ALL); //创建MenuHandler
	menu.SetTitle("菜单”);
	menu.AddItem(“info”, "信息显示1");
	menu.ExitButton = true;
	menu.Display(client, 12);
}

public int ShowQuickMenuHandler(Menu menu, MenuAction action, int param1, int param2)
{
        char szInfo[10];
	switch(action)
	{
		case MenuAction_Select:
		{
                        menu.GetItem(param2, szInfo, sizeof(szInfo));
			ClientCommand(param1, "%s", szInfo);
		}
		case MenuAction_End:
			delete menu;
	}
}

关于MenuHandler的原型,参考menu.inc

/**
 * Called when a menu action is completed.
 *
 * @param menu              The menu being acted upon.
 * @param action            The action of the menu.
 * @param param1            First action parameter (usually the client).
 * @param param2            Second action parameter (usually the item).
 */
typedef MenuHandler = function int (Menu menu, MenuAction action, int param1, int param2);

参考:


更多菜单开发技巧,可参考:

上传的附件:

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