3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 7109|回复: 1
打印 上一主题 下一主题

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

[复制链接]

13

主题

88

帖子

145

积分

中级玩家

Rank: 3Rank: 3

贡献度
22
金元
565
积分
145
精华
0
注册时间
2013-3-9
跳转到指定楼层
主题
发表于 2022-2-22 14:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 〓喧嘩的世界_ 于 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







下载 (2).png (17.31 KB, 下载次数: 3)

mmsource下载

mmsource下载

下载 (1).png (51.91 KB, 下载次数: 4)

sourcemod下载

sourcemod下载

下载.png (25.06 KB, 下载次数: 1)

文件存放位置

文件存放位置

.sp文件样式.png (39.82 KB, 下载次数: 0)

.sp文件样式

.sp文件样式

QQ截图20220222152724.png (15.24 KB, 下载次数: 0)

这是编译后的插件,无报错的情况下

这是编译后的插件,无报错的情况下
回复

使用道具 举报

37

主题

943

帖子

1094

积分

游戏狂人

Rank: 6Rank: 6

贡献度
42
金元
9256
积分
1094
精华
0
注册时间
2006-12-1
舒服的沙发
发表于 2022-12-4 16:39 | 只看该作者
大佬牛BBBBBB啊,这个太硬核了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-30 01:02 , Processed in 0.029905 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表