〓喧嘩的世界_ 发表于 2022-2-22 14:26

求生之路2插件教程,学会简单的插件制作(编辑中)

本帖最后由 〓喧嘩的世界_ 于 2022-2-22 15:31 编辑

首先要去两个网站下载插件整合包,不然无法编译插件跟运行插件。
1.http://www.sourcemm.net/downloads.php?branch=stable 下载mmsource进入网站后点击红色框进行下载


2.https://www.sourcemod.net/ 下载 sourcemod
进入网站向下滑动至Other后点击红色框,将跳转到下载页面,点击windows下载

因为插件编译一般都是在windows系统下进行编译。
它们既是插件的运行环境,又是插件编译的环境。如果是liunx搭建插件运行环境的话,也可以下载一个liunx版本的。后期搭建liunx服务器用的到。

3.将两个下载的压缩包进行解压到同一个目录。

4.如果你已经有插件,则只需要将得到的addons文件夹与cfg文件夹放置游戏目录G:\Steam\steamapps\common\Left 4 Dead 2\left4dead2中(这是我的游戏目录),addons存放玩家的vpk(mod)等资源,cfg存放玩家的配置信息(包括按键绑定)等
一般情况不会存在需要覆盖等情况


/***************************************************************/
下面开始简单的插件教程。
我们需要\sourcemod-1.10.0-git6528-windows\addons\sourcemod 中的scripting这个文件夹,里面有插件代码的引用接口,包括编译插件的spcomp.exe文件插件使用.sp后面文件进行编辑,推荐使用Visual Studio Code文件进行编辑。里面可以下载到SourcePawn语言的扩展


插件的编辑步骤:
可以先在桌面创建一个txt文件,然后后缀修改成.sp
然后使用Visual Studio Code打开这个文件
在文件开头我们先加上
#pragma semicolon 1
#pragma newdecls required
因为这个语言进行过一个大更新。语言的格式进行了更换(当然老的语言格式依然支持)

做好的插件怎么进行编译: compile.exe // 类似插件检查
spcomp.exe// 编译插件
将保存好的.sp文件用鼠标拖到compile.exe文件上面,就会自动进行编译。(显示的cmd窗口会显示是否编译成功,包括错误的行数等信息)

然后再加上下面的这个
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <sdktools_functions>
#include <geoip>




#include的作用,就是引用某个接口,然后可以使用它自带的方法
有过语言基础的应该是懂得


然后最重要的就是这个插件的基础信息
public Plugin myinfo =
{
    name      = "",// 插件的名称
    author      = "",// 插件的作者
    description = "",// 插件简介
    version   = "",// 插件的版本
    url         = "N/A" // 插件的网站   N/A用来表示没有,空白的也行
}




这个时候完成了插件的开头。。。。。。。。。。。。


/***************************************************************/


在进行插件编写之前可以加一个游戏判断
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    if (!L4D_IsEngineLeft4Dead2()) {
      strcopy(error, err_max, "Plugin only supports Left 4 Dead 2.");
      return APLRes_Failure;
    }
    return APLRes_Success;
}




我就简单介绍下这段的意思,就是判断游戏是不是求生之路2,不是的话,直接阻止这个插件运行




下面介绍一些用的到的代码解释:方法来源#include <sourcemod>
1. forward void OnPluginStart(); // 这个方法的介绍是:当插件完全初始化并且所有已知的外部引用都被解析时调用。 这仅在插件的生命周期中调用一次,并与 OnPluginEnd() 配对
这个方法里面可以配置仅在地图完成创建后,只运行一次的配置,例如: 房间名称,cfg配置,游戏指令, 游戏事件等。(就是游戏运行后,不会再次更改的信息)

例子:
public void OnPluginStart()
{
    ServerCommand("hostname \"这是我的房间\"");
}

这就完成了在你的地图创建后,房间名就是:这是我的房间
在游戏中如何看见房间名:打开控制台~,输入status就可以看到房间名,房间IP,房间人数(这个人数包括电脑人/真实玩家/特感)


2. 介绍事件的方法使用
https://wiki.alliedmods.net/Left_4_Dead_2_Events    // 游戏里面发生的事件
1.native void HookEvent(const char[] name, EventHook callback, EventHookMode mode=EventHookMode_Post); // 当一个游戏事件被触发时创建一个钩子
   const char[] name // 事件的名称 (这个是固定的哦, 上面的网站有事件的代码)
   EventHook callback // 就是一个函数指针 (当这个事件发生后,你想怎么去修改它)
   EventHookMode mode=EventHookMode_Post
   //EventHookMode mode 有三个变量可以调用EventHookMode_Pre, EventHookMode_Post, EventHookMode_PostNoCopy,一般情况比较少用到,默认EventHookMode_Post就行了

函数指针分为两种
function Action (Event event, const char[] name, bool dontBroadcast); //带return返回值,允许Plugin_Continue, Plugin_Changed, Plugin_Handled, Plugin_Stop这个返回值

Plugin_Continue // 代码继续运行不做更改
Plugin_Changed // 将发生的事件的某些效果进行修改,例如玩家伤害等
Plugin_Handled // 将代码不匹配部分进行跳过,结束继续的判断
Plugin_Stop    // 这个一般都是用到计时器里面的

function void (Event event, const char[] name, bool dontBroadcast); // 不带返回值 return后就直接结束了

例子:
HookEvent("round_start", Event_Round_Start);

这是一个回合开始的事件
然后指针指向Event_Round_Start这个方法


public Action Event_Round_Start(Event event, const char[] name, bool dontBroadcast)
{
    return Plugin_Continue;
}




这个就相当于建立了这个事件发生后要进行处理的方法部分


完整的代码展现(一个回合开始告知)


#pragma semicolon 1
#pragma newdecls required


#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <sdktools_functions>
#include <geoip>


public Plugin myinfo =
{
    name      = "",// 插件的名称
    author      = "",// 插件的作者
    description = "",// 插件简介
    version   = "",// 插件的版本
    url         = "N/A" // 插件的网站   N/A用来表示没有,空白的也行
}


public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    if (!L4D_IsEngineLeft4Dead2()) {
      strcopy(error, err_max, "Plugin only supports Left 4 Dead 2.");
      return APLRes_Failure;
    }
    return APLRes_Success;
}




public void OnPluginStart()
{
    ServerCommand("hostname \"这是我的房间\"");
    HookEvent("round_start", Event_Round_Start);
}


public Action Event_Round_Start(Event event, const char[] name, bool dontBroadcast)
{
    CPrintToChatAll("这个地图开始了");
    return Plugin_Continue;
}


然后保存.sp文件
对编写的插件放心的直接拖到spcomp.exe运行,会在当前.sp文件下创建一个.smx文件
不然可一个拖到compile.exe上运行,如果运行无保存,会在scripting文件夹的compiled文件内创建一个.smx







shzhxz520 发表于 2022-12-4 16:39

大佬牛BBBBBB啊,这个太硬核了{:3_121:}
页: [1]
查看完整版本: 求生之路2插件教程,学会简单的插件制作(编辑中)