在这之前请确保
[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等网络流对象(玩家网络复制信息 游戏网络复制信息),所有教程将不会讲解,请自行学习