注册 | 登录

游侠NETSHOW论坛





查看: 5095|回复: 16
打印 上一主题 下一主题

[原创] 抛砖引玉,简单闪点2任务编辑器LUA脚本使用 [复制链接]

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
跳转到指定楼层
楼主
发表于 2009-10-23 15:07:47 |只看该作者 |倒序浏览
从第一天下载安装好就一直长时间的玩,还是一个不错的游戏,虽然战网和主机部分有不少问题,但也算一款不错的对战游戏了.

狙击手的设定是有点不平衡的,作为对战游戏,希望以后的补丁能解决问题.现在累了,打算放下来休息了.

也粗略的用了一下任务编辑器.有点自己理解的东西就写在这里,算是给初学编辑器的朋友节约点时间吧.

首先任务编辑器有自己的帮助文件,从简单到复杂,绝大部分的指令都有包含,有心思的朋友可以慢慢看,而且在\Mission Editor\Help\Missions里有对应帮助文件的编辑器地图源文件,里面示例脚本一应俱全,值得慢慢观看.

地图自身有一个默认waypoints.lua脚本,这里面决定游戏初始化的一些设定,值只能通过编辑器选项修改,比如修改时间和天气,都能在这个脚本里看见,直接修改是不行的.要加入自己的脚本文件,就要在Create->systems->Scripting里面选择level script,放置在地图上,然后双击编辑.

LUA语言在网上有大把的基础教程,可以打开一些参考.

编辑器有自动完善功能,很实用,记得一些常用的单词就能方便的进行编辑.

下面是我做的CQB地图的level.lua脚本,我在后面写上解释.

function onMissionStart()
--onMissionStart()事件,是在任务启动的时候触发,就是你看见游戏画面后,一般用来游戏初始化.
jieduan                        =0;
--英语不好就用拼音,这个变量表示当前作战阶段,用来让自己思路清晰一点.
EnemySpawnone        =0;
--1号出生配置控制值,一个出生配置刷新后,将返回一个值,这个值可以用来销毁这个出生配置的实体.
EnemySpawnusa        =0;
EnemySpawnpla        =0;
EnemySpawnfin        =0;
EnemySpawnplasw        =0;
EnemySpawnusasw        =0;
--如果要做到多个动态的灵活,多个出生配置比较好,也可以防止64单位限制的问题,而且官方任务也是这么实现的.
timechang                =true;
--时间改变的布尔值,真假,因为时间是从0-12的值,为了到12后变成减量,到0后变成增量,就需要一个值来控制.
timeint                        =12;
--初始时间为中午12点.
timetime                =120000;       
--看到这个很可笑,呵呵,时间的时间,作为时间转变的时间,多久在时间上加1或者减1.        毫秒为单位,120000毫秒=2分钟.
bombtime                =120000;
--炸弹时间,多久重复给一次火力增援.这是任务完成后的奖励.
bombuser                =0;
--炸弹用户,谁完成了任务,谁就获得火力支援.

OFP:enableEvent("offboardSuppor0");
--开启事件("offboardSuppor0"),offboardSuppor0为Create->systems->Mission->Artillery and air support(火炮和空中支援)放置在地图上.


OFP:addTimer("changtime",timetime);
--加入时间事件"changtime",时间为timetime,现在timetime=120000,就是说changtime时间触发与2分钟后.

OFP:setObjectiveState("objectiveI3", "IN_PROGRESS");
OFP:setObjectiveState("objectiveI", "IN_PROGRESS");
--设置任务状态为执行中.

end

function onTimerchangtime()
--这个语法让我郁闷了很长时间,因为知道有时间事件,但开始看HELP文件怎么都看不懂示例,最后才恍然大悟,onTime+事件可以作为相应函数,这也是编辑器不能自动完成的部分,比如这里我要相应changtime这个时间事件,就是用function onTimerchangtime().结合上面的OFP:addTimer("changtime",timetime);语句,我们可以知道这个函数将在游戏开始2分钟后运行.

        if timeint == 12 and timechang == true then
--如果现在的时间等于12,并且改变值为真,那么
                        timechang=false
--改变值为假
                elseif         timeint == 12 and timechang ==false then
--如果现在的时间等于12,并且改变值为假,那么
                        timechang=true
--改变值为真
                end       
        if timeint == 0  and timechang == true then
                        timechang=false

                elseif         timeint == 0 and timechang ==false then
                        timechang=true
                end       
--以上的语句,用来进行时间转变的正确反转.
       
        if timechang == true  then
                timeint=timeint-1
                elseif timechang == false then
                timeint=timeint+1
                end
--如果改变值为真,那么timeint等于自身减一,就相当于中午往夜晚走,如果改变值为假,        timeint等于自身加1,相当于夜晚往白天走,这样才能组合成正确的时间流动.

OFP:removeTimer("changtime");
--现在我们相应完了changtime的时间事件,就可以移除这个事件了.
OFP:addTimer("changtime",timetime);
--我们希望不断循环这个事件,所以可以再次加入这个事件,2分钟后再进入这个语句.               
OFP:setTimeOfDay(timeint, 0, 0);
--设置当前游戏的时间为.
OFP:setWeatherCurrent(0);
--设置当前的天气环境为0(0-4的值,对应编辑器上的5个天气.),如果不在这里设置,如果你设置了别的天气,在上面时间改变后,天气会变成晴朗的默认状态,显得很突然.               

end

function onTimergivebomb()
--添加火力支援的时间事件

        if bombuser ==1 then
--如果炸弹用户等于1,那么
        OFP:enableArtilleryStrike(1, "Mortar", "HE", true);
--开启火力支援(PLA,迫击炮,火炮,真)1=pla,0=usa,2=两者.火炮有三种,迫击炮,重型迫击炮,榴弹炮,弹药种类有火炮,烟雾弹,照明弹,在编辑器可以看到对应的英文,我就不写英文了,看见就头疼.
        OFP:setArtilleryStrikeCount(1, "Mortar", 1);
--给PLA增加迫击炮1发
        elseif        bombuser == 2 then
--如果炸弹用户等于2,那么
        OFP:enableAirStrike(0, "Small", true);
--开启空中支援(usa,小型,真)
        OFP:setAirStrikeCount(0, "Small", 1);
--给usa增加小型空中支援一发.

      end

OFP:removeTimer("givebomb");      
OFP:addTimer("givebomb",bombtime);               
--这个就不用解释了吧,进入循环       
end


function onPlaceableKill_usaoil(placeable, attacker)
--相应静态实体毁灭事件,在Create->Props里面有各种静态实体,我选择了一个油罐车作为目标,并且把名字改成usaoil,作为pla的目标,如果被摧毁,pla将获得一定的奖励.
if jieduan==0 then
--如果阶段等于0,那么(就是说这个油罐车是首先被炸的)
                OFP:setObjectiveState("objective", "COMPLETED");
--设置任务目标objective为完成.
                EnemySpawnpla = OFP:activateEntitySet("twopla");
--刷新出生配置twopla的实体,我加入了一些对pla有好处的设置,比如倾向于pla方向攻击的防御工事.EnemySpawnpla为获取这次出生的ID,用来销毁用.
                OFP:enableEvent("plasw");
--刷新出生配置plasw,这里配置了PLA的优待出生点.
                OFP:enableEvent("Supportpla");
--开启pla的火力支援奖励.
                OFP:enableArtilleryStrike(1, "HeavyMortar", "HE", true);
--重型迫击炮
                OFP:setArtilleryStrikeCount(1, "HeavyMortar", 2);
--2发
                bombuser=1;
--定位炸弹用户为1,这样在每两分钟的循环中,都会给PLA赋予1发迫击炮.

                OFP:addTimer("givebomb",bombtime);
--开启炸弹循环时间事件
                jieduan=jieduan+1;
-进入下一阶段.

elseif jieduan==1 then
--如果阶段等于1,也就是说这辆车是第二辆被炸的.
OFP:removeTimer("givebomb");
--终止对方获得的火力支援循环,这样防止己方一直被炸.

OFP:destroyEntitySet(EnemySpawnusa);
--销毁usa的优待出生点.

OFP:setObjectiveState("objective", "COMPLETED");
--设置任务"objective"为完成

EnemySpawnfin = OFP:activateEntitySet("final");
--因为是最后一辆车被炸,所以进入最后阶段,也就是出生点都相近的火拼阶段.final出生配置为面对面防御的几个掩体.

EnemySpawnplasw=OFP:enableEvent("Supportpla");
--开启pla的火炮支援,就算是在对方后玩成任务,也应该得到奖励.
OFP:enableEvent("Supportfinal");
OFP:enableAirStrike(0, "Large", true);
OFP:enableArtilleryStrike(1, "HeavyMortar", "HE", true);
OFP:setArtilleryStrikeCount(1, "HeavyMortar", 2);
OFP:setAirStrikeCount(0, "Large", 2);
--这里有点乱,有几个无用语句,不影响运行,我也懒得修改了,免得改出什么新的问题出来.
jieduan=jieduan+1;
--进入下一阶段,其实也没有了,都开始火拼了,除非想做很多阶段.

end
OFP:disableEvent("onPlaceableKill_usaoil");
--关闭这个相应事件,学的例程里的,加上也许有好处吧,就是让这个函数不在相应.
end

function onPlaceableKill_plaoil(placeable, attacker)
--这个是usa的任务完成判断,与上差不多.
if jieduan==0 then
       
                EnemySpawnusa = OFP:activateEntitySet("twousa");
                OFP:setObjectiveState("objectiveI3", "COMPLETED");
                OFP:enableEvent("usasw");
                OFP:enableEvent("Supportusa");
        OFP:enableAirStrike(0, "Large", true);
        OFP:setAirStrikeCount(0, "Large", 2);
        bombuser=2;
                OFP:addTimer("givebomb",bombtime);
                jieduan=jieduan+1;
        elseif        jieduan==1 then
                --OFP:disableEvent("Supportpla");
                OFP:removeTimer("givebomb");
                OFP:destroyEntitySet(EnemySpawnpla);
               
                OFP:setObjectiveState("objectiveI3", "COMPLETED");
               
                EnemySpawnfin = OFP:activateEntitySet("final");
               
                EnemySpawnusasw=OFP:enableEvent("Supportusa");
                OFP:enableEvent("Supportfinal");
                OFP:enableEvent("Supportusa");
                OFP:enableAirStrike(0, "Large", true);
                OFP:setArtilleryStrikeCount(1, "HeavyMortar", 2);
                OFP:setAirStrikeCount(0, "Large", 2);
                jieduan=jieduan+1;
end

OFP:disableEvent("onPlaceableKill_plaoil");
end

--------------------------------------------------------------------------------------



下面是几个常用的函数
onMissionStart()
游戏开始启动的函数.
OFP:destroyVehicle("Vehiclename");
摧毁载具,Vehiclename为载具的名字,记得值为字符,所以要用""引起来,除非你构造字符变量.
OFP:destroyEntitySet (setID)
销毁此出生配置的实体,
setID= OFP:activateEntitySet("SpawnEntity");
刷新的时候就获得这个返回值,这样可以用来销毁,出生点是可以刷新多次多个实体的.
addTimer("DetonateBomb", 10000);
加入时间时间,后面的为毫秒单位,相应函数为onTimerDetonateBomb

唉,写不下去了,懒病发作了,先到这吧.多看看帮助文件可以获得很多,运行一下帮助里的例程也能学到不少东西,最容易掌握的可能算是地点触发,我就没写,地点触发加上时间事件,可以做出很多灵活的动作出来,控制整个战场.比如抢旗,进入地点onEnter(zoneName, unitName) 触发事件时间addTimer(timerName, timeInMilliSeconds),到一定时间后,onTimertimerName完成占领地点,并可以赋予弹药,或者炮火支援之类的奖励,如果此时死亡或者脱离地点,就退出removeTimer(timerName),如果做的细致点,就可以用变量和一秒时间事件做占领累积记录,退出占领后再次进入这个地点可以延续前次的值.

有几个朋友说火炮支援不好什么的,其实在战争游戏中,火炮是最有战场气氛的,利用好了,会让玩家很兴奋,另外火炮需要目视定位,这一定程度上限制了火炮的作用,是个不错的设定.另外,虽然火炮和空中支援两方都能使用,但是只赋予中国炮火支援和美国空中支援,这样比较符合现实点.

地图的源文件CQB.mssn我放在5050283 和 52266832 这两个群的群共享里面,有想要的可以直接下载.
单机游戏群
89796927

使用道具 举报

帖子
10169
精华
0
积分
5280
金钱
11323
荣誉
18
人气
30
评议
0
沙发
发表于 2009-10-23 15:12:56 |只看该作者
任务简报 OFP:showPopup("XX","XX" )

使用道具 举报

帖子
13025
精华
3
积分
7549
金钱
9304
荣誉
43
人气
62
评议
0

板凳
发表于 2009-10-23 15:19:01 |只看该作者
LZ是lua高手,我都是才入门,很多关于变量的设置都还没搞清楚,还有关于时间的控制等,LZ这篇文章给了我很好的教程,希望 BZ对这么有营养的东西能高亮或加精!!!!!

使用道具 举报

帖子
13025
精华
3
积分
7549
金钱
9304
荣誉
43
人气
62
评议
0

地板
发表于 2009-10-23 15:26:55 |只看该作者
希望有更多朋友投入到研究制作任务等等 MOD的行列中来!!!!!

使用道具 举报

帖子
146
精华
0
积分
74
金钱
732
荣誉
0
人气
0
评议
0
5#
发表于 2009-10-23 15:35:36 |只看该作者
好帖子。向高手学习。
自编任务是一大乐趣,特别是dragon rising这个平台不错。目前正在缓慢学习中,只是太慢了,需要大量时间。

使用道具 举报

帖子
10169
精华
0
积分
5280
金钱
11323
荣誉
18
人气
30
评议
0
6#
发表于 2009-10-23 16:47:39 |只看该作者
恩 OFP2编辑器很多都需要靠LUA来实现 真正了解和熟悉了LUA才能算入门了

使用道具 举报

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
7#
发表于 2009-10-23 17:48:58 |只看该作者
原帖由 tyrunner 于 2009-10-23 15:12 发表
任务简报 OFP:showPopup("XX","XX" )


showPopup这个功能超级恶心,你想想游戏中弹出一个会终止你操作的提示,强制你选择,是多么的让人讨厌啊,所以我只是用来作为函数作用的提示,测试用,游戏中是绝对不敢用的.当然,coop可以少量用用
单机游戏群
89796927

使用道具 举报

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
8#
发表于 2009-10-23 17:53:00 |只看该作者
原帖由 snakeLK2 于 2009-10-23 15:19 发表
LZ是lua高手,我都是才入门,很多关于变量的设置都还没搞清楚,还有关于时间的控制等,LZ这篇文章给了我很好的教程,希望 BZ对这么有营养的东西能高亮或加精!!!!! ...


其实,我一点都不懂lua,嘿嘿,真的,不过作为脚本语言,lua倒是很简单的,语句也和别的编程语言差不多,在网上找了点简单的入门,对于地图编辑来说,也够用了,所以想学这个编辑器的朋友别怕难学.

另外,这个编辑器并不支持所有的Lua功能的,至少我测试了tostring的数字转换为字符是无效的.
单机游戏群
89796927

使用道具 举报

帖子
13025
精华
3
积分
7549
金钱
9304
荣誉
43
人气
62
评议
0

9#
发表于 2009-10-23 18:39:37 |只看该作者

回复 #8 caoping 的帖子

恩,我目前就是在定义和应用变量上面逻辑搞的有点晕,而且从你这个教程我有学到一招就是,如果让触发器只触发一次(我以前一直都在抱怨DR编辑器里的触发器为什么不能加个只触发一次的选项,就想sandbox2里面一样多好)。现在知道了可以用OFP:disableEvent("onEnter_xxxx");来实现触发器的一次触发!!!!!!!!

使用道具 举报

帖子
3256
精华
0
积分
1764
金钱
4799
荣誉
13
人气
24
评议
0
10#
发表于 2009-10-23 20:24:59 |只看该作者
caoping 我爱你.....我是ccp

使用道具 举报

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
11#
发表于 2009-10-23 22:04:54 |只看该作者
原帖由 pokemon36 于 2009-10-23 20:24 发表
caoping 我爱你.....我是ccp


吓死我了,我的取向很正常的.

另外,我的名字首字母是cpp,跟你的很相近,呵呵
单机游戏群
89796927

使用道具 举报

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
12#
发表于 2009-10-23 22:07:58 |只看该作者
原帖由 snakeLK2 于 2009-10-23 18:39 发表
恩,我目前就是在定义和应用变量上面逻辑搞的有点晕,而且从你这个教程我有学到一招就是,如果让触发器只触发一次(我以前一直都在抱怨DR编辑器里的触发器为什么不能加个只触发一次的选项,就想sandbox2里面一样多好)。现在知道 ...


实际上也可以加入一个变量,初始化为0,然后触发一次加一,然后在函数里检测就可以了,这样自己可以控制触发多少次,LUA里面除了特别声明的外,都是全局变量,数据互访很简单,之所以使用关闭事件,编辑器说明里面只是说为了防止意外情况.
单机游戏群
89796927

使用道具 举报

帖子
3256
精华
0
积分
1764
金钱
4799
荣誉
13
人气
24
评议
0
13#
发表于 2009-10-23 22:24:14 |只看该作者
大水管caoping咋退群啦[害怕] [害怕] [害怕]

使用道具 举报

帖子
634
精华
0
积分
317
金钱
2833
荣誉
0
人气
0
评议
0
14#
发表于 2009-10-23 23:55:38 |只看该作者
大水管caoping咋退群啦·······························

使用道具 举报

帖子
1042
精华
0
积分
521
金钱
1119
荣誉
0
人气
0
评议
0
15#
发表于 2009-10-24 16:45:11 |只看该作者
原帖由 pokemon36 于 2009-10-23 22:24 发表
大水管caoping咋退群啦[害怕] [害怕] [害怕]


呵呵,闪点2已经品味的差不多了,再玩下去也不会有什么新鲜感了,当然要脱离出来做点事呗,不然天天从中午12点开始一直打到晚上12点,身体也受不了啊.

再说群里刷屏厉害,退了清净点,呵呵

多谢挂心了.
单机游戏群
89796927

使用道具 举报

帖子
381
精华
0
积分
191
金钱
403
荣誉
0
人气
0
评议
0
16#
发表于 2009-10-24 17:22:44 |只看该作者
搬凳子来慢慢揣摩……
                    
打个20字真不容易
沉睡的zhugoldman,终有一天会苏醒,而那时,天地将为之动容。

使用道具 举报

帖子
3256
精华
0
积分
1764
金钱
4799
荣誉
13
人气
24
评议
0
17#
发表于 2009-10-25 12:51:39 |只看该作者

回复 #15 caoping 的帖子

可惜了~ 加下你QQ 有时候还要请教你问题呢

使用道具 举报

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

手机版|Archiver|游侠NETSHOW论坛 ( 苏ICP备2023007791号 )

GMT+8, 2025-6-6 19:25 , Processed in 0.348221 second(s), 12 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到