- UID
- 1548622
- 主题
- 1
- 阅读权限
- 40
- 帖子
- 1042
- 精华
- 0
- 积分
- 521
- 金钱
- 1119
- 荣誉
- 0
- 人气
- 0
- 在线时间
- 12 小时
- 评议
- 0
- 帖子
- 1042
- 精华
- 0
- 积分
- 521
- 金钱
- 1119
- 荣誉
- 0
- 人气
- 0
- 评议
- 0
|
从第一天下载安装好就一直长时间的玩,还是一个不错的游戏,虽然战网和主机部分有不少问题,但也算一款不错的对战游戏了.
狙击手的设定是有点不平衡的,作为对战游戏,希望以后的补丁能解决问题.现在累了,打算放下来休息了.
也粗略的用了一下任务编辑器.有点自己理解的东西就写在这里,算是给初学编辑器的朋友节约点时间吧.
首先任务编辑器有自己的帮助文件,从简单到复杂,绝大部分的指令都有包含,有心思的朋友可以慢慢看,而且在\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 这两个群的群共享里面,有想要的可以直接下载. |
|