首页 > 代码库 > [KF2][Mut&Gm Tutorial]Modding第二步:开始制作你的第一个简易Mutator

[KF2][Mut&Gm Tutorial]Modding第二步:开始制作你的第一个简易Mutator

在这之前请确保

[KF2][Mut&Gm Tutorial]Modding第一步:设置好KF2的UnrealScript编译环境

如果你是一个电脑爱好者但是没有编程基础,请打开记事本或者npp跟着学习(下文统称初级玩家);如果你是一个编程爱好者或者Experienced Programmer(高级玩家),请按照以上文章配置好UsIDE跟着学习

 

注意:此教程制作出来的插件只适用于单人单机SOLO模式

 

涉及到服务器以及多人的插件

因为涉及到PRI和GRI等网络流对象(玩家网络复制信息 游戏网络复制信息),所有教程将不会讲解,请自行学习

在此,我将会根据一个实例来讲解Mutator的基本结构,包括:

1.类继承以及基本命名

2.工作原理

3.基本框架

4.常用函数以及用法

开始吧,我们首先从一个最基本的插件开始讲,我将这个插件命名为BBMut,效果为每隔5秒钟自动BB一句自定义的话,如图所示:

技术分享

 

 

工作原理以及基本命名

UnrealScript中,所有函数都是虚函数,这意味着每个函数都能够通过重写来实现自己想要的功能,这也决定了整个US内容皆以 类(Class)来包装

在US中,类的声明如下

class ClassName extends FatherClass;

其中ClassName是你写的这个类的类名,FatherClass是这个类的父类,也就是所继承的类

继承出来的类包含了父类的所有功能,并且能够独立的在父类的基础上增加一些自定功能,这也是KF2中插件编写及运行的基本靠山

 

对于Mutator来说,它是一个独立的类,继承(扩展)自Object,而KF2因为有自己的独立特性,所以有一个自己的KFMutator类,继承自Mutator,专门容纳KF2中Mutator的特性及功能

我们的目的就是通过重写(新手可以理解成覆盖原先的内容)KFMutator里面的函数来实现自己的功能,但是又不能丢掉官方自己的一些东西,所以有必要引入Super这一概念

Super:可以笼统的理解为父级的意思,没有大碍

在重写非自己创建的函数的时候,如果不是全部重写,而是想在官方的基础上加一些功能或者更改部分功能(比如说更改401回血一针100,或者给401增加一个新功能),请使用Super.function(parameter)来调用父级函数!

_>STEP-ONE

我将这个插件的包名取名为ArTest(我昵称的缩写Ar+Test),也就是说以后我在教程里面制作的插件将会放到这个包里面;

我将这个插件命名为BBMut,也就是这个插件的类名

 

1.建立好插件的文件夹结构(详见 [KF2][Mut&Gm Tutorial]Modding第一步),如图所示(注意此时文件夹内没有BBMut.uc)

技术分享

2.建立BBMut.uc:对于初级玩家,请直接右键新建文本文档,重命名为BBMut.uc;对于高级玩家,请依照下列方式在UsIDE建立uc文件并命名为BBMut.uc

技术分享

3.写入基本内容:对于高级玩家,在UsIDE新建uc文件过后IDE会自动填充以下代码

class Class extends Object;

defaultproperties
{
}

如前文所说,这个插件的类名我命名为BBMut,这个插件类型是Mutator,所以请将class后面的Class替换为BBMut(uc文件同名),extends后面的Object改为KFMutator,如下

class BBMut extends KFMutator;

defaultproperties
{
}

对于初级玩家,请直接将上述代码复制粘贴进入记事本并保存

 

4.写入基本框架

我们想一想,如果要写一个MUT,那么首先必须要这个MUT能和其他MUT兼容,也就是说使用自己这个MUT的时候其他的MUT也能够一起运行并且不会出错,那么我们就引入一个函数如下:

function InitMutator(string Options, out string ErrorMessage)

这个函数的作用是初始化MUT并且检查MUT队列,看看是否有下一个MUT,有的话就继续初始化下一个,一直循环;

 

其次,我们需要设置一个计时器,以便每5秒钟调用一次BB函数来说话——那么这个计时器设置在哪儿呢?很明显,如果我们要让它精确运行的话必须设置在我们出生(或者重生)的那一刻,所以有必要引入另一个函数如下:

function ModifyPlayer(Pawn Other)

这个函数被另外一个函数RestartPlayer(...)调用,而RestartPlayer(...)会在玩家重生或者出生的时候被调用,所以我们借此间接地来设置一个计时器来实现这个功能(为什么不能直接设置?这涉及到更高深的内容,以后会讲解)

 

然后就是计时器函数

/**
 * Sets a timer to call the given function at a set
 * interval.  Defaults to calling the ‘Timer‘ event if
 * no function is specified.  If InRate is set to
 * 0.f it will effectively disable the previous timer.
 *
 * NOTE: Functions with parameters are not supported!
 *
 * @param InRate the amount of time to pass between firing
 * @param inbLoop whether to keep firing or only fire once
 * @param inTimerFunc the name of the function to call when the timer fires
 */
native(280) final function SetTimer(float InRate, optional bool inbLoop, optional Name inTimerFunc=‘Timer‘, optional Object inObj);

不要被这么大一堆参数困住了,其实用法很简单,第一个参数是计数时间,第二个参数是是否循环,第三个参数是想调用的函数的名称,后面参数超出本教程范围所以不用管

那么我们现在明确了,如果要每隔5秒BB一次,那么时间要设置成5s,计时器要循环,调用的函数名称就是我们的BB函数!如下:

SetTimer(5, True, "BBFunction");

然后参考上面的 工作原理以及基本命名 ,写好基本框架之后的代码如下:

 

class BBMut extends KFMutator;


function InitMutator(string Options, string ErrorMessage)
{
    super.InitMutator(Options, ErrorMessage);    
}

function ModifyPlayer(Pawn Other)
{
    SetTimer(5, True, "BBFunction");
    super.ModifyPlayer(Other);
}

defaultproperties
{
}

 

5.编写BB函数

计时器写好了,那么就开始BB啦!

KF2里面BB的原理是这样的:

每个玩家进入游戏的时候,UE3会给你分配一个 棋子(Pawn),这个棋子包含了你选择的所有信息(职业、等级、武器、饰品等等等....)

然后UE3会给这个棋子分配一个 KF2玩家控制器(KFPlayerController),这个控制器包含了所有“这个棋子应该怎么反应你做出的动作”的所有信息和函数,而我们所需要的BB函数就在里面,如下

reliable client event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type, optional float MsgLifeTime  ) : KFPlayerController

也不要因为这么一长串就头晕了,你大可只复制我下面给出的代码就行,如果你想知道原理的话我下面也会详细讲解;

写好的如下:

class BBMut extends KFMutator;

var Pawn KFP;
var KFPlayerController KFPC;

function InitMutator(string Options, string ErrorMessage)
{
    super.InitMutator(Options, ErrorMessage);    
}

function ModifyPlayer(Pawn Other)
{
    KFP=Other;
    SetTimer(5, True, "BBFunction");
    super.ModifyPlayer(Other);
}

function BBFunction()
{
    KFPC=KFPlayerController(KFP.Controller);
    KFPC.TeamMessage(KFPC.PlayerReplicationInfo, "I Love FCY!", ‘TeamSay‘);
}

defaultproperties
{
}

原理:

首先我们要获取重生或者复活的这个玩家的棋子,然后获取他的KF2玩家控制器,然后利用里面的TeamMessage(团队消息)函数来BB

我们在开头声明两个变量,一个是KFP(类型Pawn),一个是KFPC(类型KFPlayerController),然后在ModifyPlayer中将传入的Other赋值给KFP,然后获取KFP中的KFPlayerController赋值给KFPC,这样就成功了

然后调用KFPlayerController中的方法TeamMessage开始BB,参数为

1.KFPRI(KF2玩家网络复制信息,高级进阶用法,涉及到网络流,所有教程不做讲解,请自行学习,在此你只需要看看就好,撰写请记住套路复制粘贴: KFPC.PlayerReplicationInfo

2.要说的话

3.说话类型:TeamSay 团队消息(效果是 自己说出来一句话) Event(效果和CD的每波总结一样,是系统消息)

_>STEP-TWO

开始编译吧!

技术分享

 编译成功后, 你在

\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script 中找到一个 (你自己的包名).u

比如说我这个就是ArTest.u

技术分享

_>STEP-TWO

此步当然是运行试试看啦

命令行:

Open MapName?Mutator=PackageName.ClassName

对于此教程,如果你是完全按照步骤来的话命令行应该是:

Open KF-Outpost?Mutator=ArTest.BBMut (其中地图请随意)

注意:此教程制作出来的插件只适用于单人单机SOLO模式

涉及到服务器以及多人的插件

因为涉及到PRI和GRI等网络流对象(玩家网络复制信息 游戏网络复制信息),所有教程将不会讲解,请自行学习

 

[KF2][Mut&Gm Tutorial]Modding第二步:开始制作你的第一个简易Mutator