🍎Sourcepawn脚本入门(二)命令与事件监听
(控制台)命令是常用的插件形式,eg. noclip …等都是常用的命令,在游戏中使用也很容易,souremod可以注册自己的命令。
事件的监听则需要考虑到不同的起源游戏支持的事件不同,具体可以参考如下:Game Events (Source) - AlliedModders Wiki (alliedmods.net)
1.注册控制台命令
使用RegConsoleCmd注册控制台命令
#include <sdkhooks>
#include <sdktools>
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1
public Plugin myinfo =
{
name = "pluginOne",
author = "",
description = "",
version = "1.0.0",
url = "https://github.com//pluginOne"
};
public void OnPluginStart()
{
PrintToChatAll("这是第一个测试");
//注册控制台命令
RegConsoleCmd("sm_sayhellow",SayHellowToAll,"这是一个测试测试的控制台命令");
}
//命令第二个参数为CallBack函数,参数固定为两个int变量(名字随便起)
//但分别代表客服端id和该命令参数的个数
public Action SayHellowToAll(int client,int args)
{
//向所有人发送信息
PrintToChatAll("WDNMD");
//Plugin_Handled是Action的返回值,代表执行的结果
//如果执行成功则为Plugin_Handled,失败则可以为Plugin_Error等
//当然也可以不返回,但不利于调试
return Plugin_Handled;
}
编译部署到服务器的执行结果:
获取参数信息和客户端信息
#include <sdkhooks>
#include <sdktools>
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1
public Plugin myinfo =
{
name = "pluginOne",
author = "",
description = "",
version = "1.0.0",
url = "https://github.com//pluginOne"
};
public void OnPluginStart()
{
PrintToChatAll("这是第一个测试");
//注册控制台命令
RegConsoleCmd("sm_sayhellow",SayHellowToAll,"这是一个测试测试的控制台命令");
RegConsoleCmd("sm_everyone",SaySthSeveralTimes,"这是一个测试测试的控制台命令");
}
public Action SayHellowToAll(int client,int args)
{
//向所有人发送信息
PrintToChatAll("WDNMD");
return Plugin_Handled;
}
public Action SaySthSeveralTimes(int client,int args){
char clientname[36],args1[64],args2[10];
//根据需要,限制参数的个数
if(args!=2){
PrintToChat(client,"此命令需要两个参数,1为内容,2为要重复的次数");
return Plugin_Handled;
}
//利用参数和client的API获取信息
GetClientName(client,clientname,sizeof(clientname));
GetCmdArg(1,args1,sizeof(args1));
GetCmdArg(2,args2,sizeof(args2));
int times = StringToInt(args2);
if(times<1||times>=10){
PrintToChat(client,"次数必须在10以内!");
return Plugin_Handled;
}
//循环输出
for(int i =0;i<times;i++){
PrintToChatAll("| %s | say %s To EveryOne",clientname,args1);
}
return Plugin_Handled;
}
2.监听游戏事件
游戏事件在具体游戏上会有一些差别,所以在此处请参考文档
Game Events (Source) - AlliedModders Wiki (alliedmods.net)
此处以Player_death为例:
列表中提供的参数里事件中可以获取到的参数。
#include <sdkhooks>
#include <sdktools>
#include <sourcemod>
#pragma newdecls required
#pragma semicolon 1
public Plugin myinfo =
{
name = "pluginOne",
author = "",
description = "",
version = "1.0.0",
url = "https://github.com//pluginOne"
};
public void OnPluginStart()
{
PrintToChatAll("这是第一个测试");
//绑定事件和它的触发函数
HookEvent("player_death",OnPlayerDeathFunction);
}
//事件触发函数,同上参数类型固定,变量名不固定
public void OnPlayerDeathFunction(Event event, const char[] name, bool dontBroadcast){
//找到文档中可以参照的属性
//short userid user ID who died
//short attacker user ID who killed
//string weapon weapon name killer used
//bool headshot singals a headshot
//获取被打人的userid
int userid = event.GetInt("userid");
//获取攻击者的id
int attacker = event.GetInt("attacker");
//获取是否爆头
bool isHeadshot = event.GetBool("headshot");
//通过事件ID获取ClientID
int clientid = GetClientOfUserId(userid);
int attackerid = GetClientOfUserId(attacker);
char victim_name[36],attacker_name[36];
GetClientName(clientid,victim_name,sizeof(victim_name));
GetClientName(attackerid,attacker_name,sizeof(attacker_name));
//广播通知信息
if(isHeadshot){
PrintToChatAll(" | %s | kill | %s | in headshot ",attacker_name,victim_name);
}else{
PrintToChatAll(" | %s | kill | %s | ",attacker_name,victim_name);
}
}