|
楼主 |
发表于 2014-2-17 19:41:37
|
显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2014-2-20 12:59 编辑
217楼,《武装突袭3》——MP教程入门及废弃代码
很多人并非从2001年起就开始跟随波米一路走到现在,2005年起武装突袭:女王开场白发布后带来了一些关于初始化代码的优化命令,但随着MP作弊手段的不断进步和反作弊手段的不断增强,至ARMA3发布后便彻底废弃了这些代码,还有些功能虽然保持原有的支持但也逐渐被功能更强大的代码或函数代替而渐渐退出历史的舞台。
BIS_fnc_addStackedEventhandler虽然支持loadingScreen家族但显然没什么大用处,新的mission presentation支持新的loading screen rsc,有机会我会在后面几篇讲,当然,出于对老同志的告别礼,还是介绍一下loadingScreen家族的工作机制:
这里我们用一套wiki提供的示例:
- class RscText
- {
- type = 0;
- idc = -1;
- x = 0;
- y = 0;
- h = 0.037;
- w = 0.3;
- style = 0x100;
- font = Zeppelin32;
- SizeEx = 0.03921;
- colorText[] = {1,1,1,1};
- colorBackground[] = {0, 0, 0, 0};
- linespacing = 1;
- };
- class RscPicture
- {
- access=0;
- type=0;
- idc=-1;
- style=48;
- colorBackground[]={0,0,0,0};
- colorText[]={1,1,1,1};
- font="TahomaB";
- sizeEx=0;
- lineSpacing=0;
- text="";
- };
- class RscLoadingText : RscText
- {
- style = 2;
- x = 0.323532;
- y = 0.666672;
- w = 0.352944;
- h = 0.039216;
- sizeEx = 0.03921;
- colorText[] = {0.543,0.5742,0.4102,1.0};
- };
- class RscProgress
- {
- x = 0.344;
- y = 0.619;
- w = 0.313726;
- h = 0.0261438;
- texture = "#(argb,8,8,3)color(0,0,0,0)";
- colorFrame[] = {0,0,0,0};
- colorBar[] = {1,1,1,1};
- };
- class RscProgressNotFreeze
- {
- idc = -1;
- type = 45;
- style = 0;
- x = 0.022059;
- y = 0.911772;
- w = 0.029412;
- h = 0.039216;
- texture = "#(argb,8,8,3)color(0,0,0,0)";
- };
- class Harrier_loadingScreen
- {
- idd = -1;
- duration = 10e10;
- fadein = 0;
- fadeout = 0;
- name = "loading screen";
- class controlsBackground
- {
- class blackBG : RscText
- {
- x = safezoneX;
- y = safezoneY;
- w = safezoneW;
- h = safezoneH;
- text = "";
- colorText[] = {0,0,0,0};
- colorBackground[] = {0,0,0,1};
- };
- class nicePic : RscPicture
- {
- style = 48 + 0x800;
- x = safezoneX + safezoneW/2 - 0.25;
- y = safezoneY + safezoneH/2 - 0.2;
- w = 0.5;
- h = 0.4;
- text = "#(argb,8,8,3)color(0,0,0,0)";
- };
- };
- class controls
- {
- class Title1 : RscLoadingText
- {
- text = "LOADING";
- };
- class CA_Progress : RscProgress
- {
- idc = 104;
- type = 8;
- style = 0;
- texture = "#(argb,8,8,3)color(0,0,0,0)";
- };
- class CA_Progress2 : RscProgressNotFreeze
- {
- idc = 103;
- };
- class Name2: RscText
- {
- idc = 101;
- x = 0.05;
- y = 0.029412;
- w = 0.9;
- h = 0.04902;
- text = "";
- sizeEx = 0.05;
- colorText[] = {0.543,0.5742,0.4102,1.0};
- };
- };
- };
复制代码
由于其始终存在模块的可定义性所以并未被完全废除,任务发烧友们如果喜欢的话可以试试(注意不要将其定义在rscTitle下,GUI的教程我也会逐个放出)。还有点提醒下,当加载画面出现时不要使用延时语句,否则游戏就会被冻结。第二是在这个过程中我们可以运行脚本,此时游戏处于disableSimulation阶段,所以脚本会全速运行。(当然如果函数写得好的根本就不必要,因为我们的脚本本身就是最佳优化)
现在我们来看看被ban的代码:processInitCommands,setVehicleInit,clearVehicleInit和finishMissionInit。现在我们的问题是黑客们是如何通过这些代码来黑的呢?
这得从MP脚本编写开始,MP的脚本编写是一块大头,高级的代码编写者必须要掌握MP编写的基本技巧。MP的编写及表现形式与SP截然不同,很多人并不懂得基本的编写技巧,上手ARMA3后就直接开始编写MP任务开打,当然BI提供了大量的MP兼容性模组和定义方便我们编写,不过稍微高级点立马各种出错。
开始MP时首先必须搞清楚哪些代码是AG-global,哪些是EG-global,而哪些是EL-Local或AL-Local
在解释它们四个之前我们先要把“本地性”给搞清楚。在MP编写时我们常常会碰到这样的问题,明明我开了一辆坦克但为什么人家看不到我的坦克?明明我生成了一组人马为什么他们无法识别其他玩家,而其他玩家也看不到这群人?明明我把人质救了可为什么其他玩家还显示人质未拯救?果断放弃MP的脚本编写?发现ARMA的世界疯了?还是自己疯了?
好吧,我只想说,既然疯一把,那为什么不彻底?
多人模式有非常多的代码,我们甚至有必要对之前所学的所有代码都重新梳理一遍。ARMA3共有三种形式的“玩家”。
1、 arma3server.exe这是专用服务器,它有自己独立的判断方式isDedicated
2、 arma3.exe当你建房时你是服务器,判断方式isServer
3、 普通玩家为client,判断方式!isserver
他们三个全部是独立判断,别混淆了,isdedicated不是isserver!
在MP中地图上的每一个单位,物体(有生命,无生命的所有东西)都有一个主人,我们通过owner obj判断他们的主人,主人就是每个玩家。(只有当这个东西属于所有玩家时,所有玩家才能看到它并使用它,控制它,比如说在我的PC上脚本刷出来一堆兵准备作弊,我只想说太天真了,这堆兵只属于你却不属于任何其他玩家,虽然你看得到这堆兵但在其他玩家电脑上更本就不存在,这只是幻觉…)
每台游戏的机器都有一个编码,就是id号,通过owner我们就能返回id号从而判断物体属于哪台机器,凡是属于这台机器的全部返回local,玩家正在控制的单位全部属于控制机器,所以永远都是local。
(比如我脚本刷出来的车子神马的只有我看得见,在其他人那儿是不存在的,刨根问底,那如果我开飞机会怎么样?很简单,其他人会看到你腾空而起像超人一样…国内的服务器很少碰到这种情况,第一,目前hacker们还没有泛滥到这种程度,第二,battleEye也不是吃素的,不是脚本高手不想冒着被ban的危险,第三,如果你不幸遇到了,要么踢掉,要么赶紧加好友膜拜学习…)
那接下来你要问为什么菜鸟也能编MP任务,玩得不亦乐乎呢?好问题,第一菜鸟不会MP脚本,他们所作的一切全部是sqm形式的任务,就是全部使用编辑器做出来的,那在编辑器上的所有东西全部属于所有人!也就是说凡是是地图编辑器上的单位是不会出现问题的,出问题的地方就是后期的脚本!
回到“本地性”,虽然player对控制机local,但也是可以变的,比如teamSwitch,遥控,脚本更换玩家等等,这时本地性将发生变化,还有比如说地图上的一辆车属于所有人,我上了它,它就属于我的了,就对我local了,owner就是我的id, owner就属于我,除非等到下一个玩家上了它,owner id才会变成他的, local并不是与owner一个概念,你上了这辆车坐后排,这辆车对你local但owner不是你而是驾驶员,如果你开车开到一半你女友把你电源拔了,那这辆车的owner马上变成了服务器拥有。MP是一个“婊子”,“本地性”的各种变化导致许多人疯掉,(在ARMA3新引入的EH “local”能够每帧侦测实体本地性的变化,一旦owner id发生变化就会fire一次,此乃后话)
现在我们来到最闹心的地方,先来介绍下4个属性中的第一个:
AL-Local:全称叫做Argument Local,神马意思?https://community.bistudio.com/wiki/File:arguments_local.gif
先来讲个故事,那儿有辆车,我想把它setfuel为0,漏油。在SP中很简单,但到了MP各种疯狂,我找到了那辆车随后setfuel了但为什么它TMD根本没有漏油,油箱满满的,其他玩家依旧开着它大摇大摆的开走了,接着我疯狂的写循环脚本甚至OnEachFrame每帧把它setfuel 0但为什么根本不管用!一场游戏下来我写的脚本各种不符合逻辑。
现在记住咯,AL-Local属性的命令首先必须得要找到这辆车的主人!当你找到它的主人后就可以判断这辆车对主人local,你甚至不能找它的副驾驶座是谁,因为副驾驶不是这辆车的主人。找到主人后你必须得在主人的机器上运行setfuel 0,这样这辆车才会彻底没油。
有时候我想把车子setDamage 1直接爆了不得了?奇怪,为什么这个代码不需要找到主人就可以直接弄爆一辆车呢?这里向大家介绍:
AG-Global https://community.bistudio.com/wiki/File:arguments_global.gif
这种属性的代码是不需要找到主人的,你在任何PC上都可以搞定。接下来又碰到问题了,为什么setdamage那么顺利,就一个代码这辆车就爆了而且不需要BIS_fnc_MP公布?
这时我们引入EG-Global概念:
EG-Global https://community.bistudio.com/wiki/File:effects_global.gif
这种属性的代码相当于内置的publicVariable,或相当于内置的SetDamage(Global)MP核心代码,它们不需要公布就能够产生于所有PC的效果,那问题是为什么有些代码要publicvariable呢?
这时我们引入EL-Local概念:https://community.bistudio.com/wiki/File:effects_local.gif
这种属性的代码必须pubilcVariable,这就是为什么我们看到各种MP addon需要使用pubilcvariable,否则它们的效应只能在拥有者上产生效应,对其他人而言根本没有用,这也就是为什么在MP中刷兵要publicVariable。
我们这只是管中窥豹,只见一斑。MP任务的编写对不愿意思考的人来说简直就是地狱,但对于爱动脑子的人来说比SP脚本编写来得更刺激。所以当某些菜鸟们在发帖求助我怎么网速那么慢??我怎么会看到有人在DayZ上作弊??我怎么越玩越卡??等等,我也只能“呵呵“了。
MP的脚本高手既可以造福于社区编写出高质量的MP任务一举夺魁MANW的MP任务设计大奖;同样也可以进入你的房间把你精心组织的一场coop黑得玩不下去,我们只玩到了ARMA的冰山一角,程序员有其双面性我们不能否认,当然我不希望有人看了教程后走火入魔黑别人服务器去了...
Locailty研究将是一个新领域,国内的天空太小了,必须接触那些script guru们,不是说什么我们简单的修改一下脚本,拼凑一下脚本就行了,一些好的函数必须拆开研究!
AI对队长local,车辆对驾驶员local,sqm的小队长对服务器local,刷出来的兵对owner PC local,刷出来的空车对代码执行端的PC local,代码的四个MP属性,locality的改变,玩家的死亡,重生,断线,返回,各种脚本命令moveIndriver,join,selectplayer等等对locailty的干预等等。
欢迎来到武装突袭3 MP的世界。
休息一下,关于废弃代码我还没讲完,下一篇我将继续。
218楼继续教程,《武装突袭3》——MP教程及废弃代码追加 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入VME
x
|