谁能帮我写武装突袭2武器代码3重生点代码并告诉我怎么设重生点,别人邮箱2985912463@qq.com,代码发给我

查看: 2843|回复: 4
武装突袭3更新1.54
签到天数: 119 天连续签到: 1 天[LV.6]常住居民II
本帖最后由 Kelvin_TLG 于
11:24 编辑
& S/ U! B2 {3 B
第一次翻译这么长复杂的更新日志,BI开发AMRA3的也都是有典型的程序员综合征,所以最后我直接把不重要的都给省略了,不然要翻译到猴年马月去。做的不好的还请各位多多包涵!( e& }5 }+ U9 i9 T! @0 g
; E; i5 u: Q, F3 X: W; W5 T% R
来自:波西米亚ARMA3 DEV团队% X0 z&&\5 R! d' [
对象:武装突袭3用户+ e4 n* F, G# x2 \+ v( s. A) C: _5 q7 C' E
单位:主分支(Windows系统)5 K' v" V' u* `0 R
活动:游戏更新:1.54(Nexus补丁更新,End Gmae模式更新,观众模式,个人防护装备,耐力,游戏启动器模组更新)
补丁大小:2.2 GB/639 MB
9 l' k9 C, g/ ~" m&&P/ f6 [
NOTES0 R4 d&&}$ [7 n0 {9 ?* t& |- C, [
建议使用Steam客户端选项来验证本地游戏缓存的完整性,避免下载此更新后数据损坏。' V8 w8 _$ E& j7 ?
考虑下载大量更新后,将你的硬盘进行碎片整理。
一个还原游戏版本的系统现在可供STEAM的高级用户使用,它包含以前版本(1.52)。它可以用来比较重要的版本之间的具体变化。此分支的接入码为:Arma3Legacy152。&&m: V6 `$ E&&Q: B8 j2 t
在写本新闻时,此更新并不适用于实验Linux和Mac移植测试版。我们将尽快更新Linux和Mac版本的1.54。9 C&&^+ @3 y: N5 q& e7 y
您可以在STEAM库-工具-ARMA3服务器 找到 “武装突袭3服务器端”(根据您的操作系统,它会下载Windows或Linux版本)。
管理员还可以使用命令行SteamCMD工具。该应用程序ID为233780。4 [( e, K' o&&k- x
来自NVIDIA公司的许可NVIDIA GameWorks™技术提供。版权所有© NVIDIA公司。版权所有。
如有问题,请检查波希米亚互动工作室的支持帮助,武装突袭3常见问题解答或BattlEye F.A.Q.
你可以帮助我们通过对反馈跟踪发布您的反馈意见进一步完善游戏。. _/ R: t' f# ?/ Z$ n
数据:+ x# P&&[8 p5 v
补充:End Game 模式新作战地区:扎罗斯地区(Zaros)
补充:End Game 模式新作战地区:费雷什地区(Feres)
补充:观众(一场比赛会有4个观众位置)
补充:上传终端
补充:军用平板电脑# w. C, y$ j9 X& R" C& @5 w
补充:个人防护装备的新版本2 y, P/ `; @- v% R% E# y
补充:新耐力系统(带有可选的耐力)
补充:枪械下挂物件加入到装备栏中
补充:枪械下挂榴弹新换弹动作&&~6 a& h( J0 j: G- T" Z& q" r
补充:新的爆炸音频样本
补充:Nexus的更新:欢迎屏幕* W- x) ?9 r- I
补充:防御指南学习&社区指南&&D2 E* a/ r. j' ]! a. k+ r
补充:新FFV限制技术是在Hummingbird, Mohawk, Hellcat, Taru 和 Huron上甚至比以前更好。
补充:新FFV限制技术在皮卡(Offroad)上
补充:在皮卡(Offroad)上枪手都能够使用发射器% e0 H1 C5 a, n& m0 `
补充:在皮卡(Offroad)上前炮手能够站起来开火
补充:根据人物体力值消耗的不同程度,音频会改变% A* V- J9 Q& B& g
补充:缺少船只的土地接触点,因为LOD几何使用时土地的联系却没有界定,它阻碍了性能. M( P9 c& e7 b/ M! @5 E* j. q+ o
补充:isGlobal参数,使paramViewDistance函数实际上在MP模式下正常工作(之前它只是在服务器上改变ViewDistance)& R4 {! L; U' y' b1 s9 C& U
补充:能够防止动画来源复位功能BIS_fnc_initVehicle! b2 p4 [9 N0 o, a4 N; t
补充:BIS_fnc_initVehicle现在支持在纹理源和场景配置文件定义的自定义材料
补充:船只向后移动时水流的新音频# t3 }5 i7 ~! v# _; r6 A: g& m&&q
补充:BIS_fnc_unitHeadgear,为活动配置文件的支持
补充:MK20 GL重装动画
补充:UGL重装动画会有新的声音1 [/ S) F; K8 V* s$ o&&_, {
补充:由于战队要求增加脸部装备的迷彩选择所以添加了( X, g" g( s8 K0 O4 I, Y/ h. y( L
补充:2功能的二进制标志编码和解码' N2 [, D1 B. ?0 `5 L
补充:共同目标现在支持在一个场景中的description.ext定义自定义任务类型; C1 p) P" g- ?. z8 Q" B- z' {
补充:路锥和障碍,现在有适当地与地面接触# k$ u0 c# j4 ?% h) ~7 f! G6 \
补充:对于平板对象默认屏幕, h* a( H2 e&&Q- V5 k( I&&p# F
补充:turnOffset属性越野FFV位置让AI实际上与转出工作
补充:BIS_fnc_lerp - 线性浮点插值
增加:运动配置文件以及功能的各种小优化,基本支持BIS_fnc_initVehicle9 Q- S; A) j. j# t/ H' T; \
补充:BIS_fnc_getVehicleCustomization,返回在车辆当前选定的组件和纹理: ^+ `) w5 I6 r' W
补充:BIS_fnc_getAngleDelta返回度2角之间的最小差异
补充:默认军火库相机的位置,现在可以在本地设置改变
新增:宙斯弹药箱现在可以浏览武器名字来加入武器弹药+ _9 n+ @9 w1 o
补充:服务器参数“重生票数”和“倒计时”没有一个“禁用”项修改。如果你总是需要有重生的机票/倒计时集这是非常有用的。1 L( @4 c7 e- ?/ @, X; F6 R
补充:参数terrainSpeedCoef,处理以前硬编码地形坡度放缓8 M" L) L8 w6 A/ O) {$ N
补充:现在切换对角线的人物姿态时会有新动画出现3 o3 ]# x' e$ E) L6 e& K$ m
修正:有些载具在虚拟军火库中会有损坏的车辆人员预览/ S. s! ]+ D7 X1 m
修正:Huron运代理指标
修正:问题连接到setOwner被称为对直升机坠毁时,也有一些AI士兵还在里面(支持MP)
修正:在进行保卫任务的攻击波结束时没有新的装备和火力支援解锁$ I3 n6 @: S. A5 f% j. L. F
修正:在防守Kamino任务中,OPFOR被盗车辆有无限弹药; N$ T. w1 A+ `2 k+ p
修正:在保卫任务中,当然撤离直升机到达前就可以将它击毁3 J! V$ S2 n+ K) @' k
修正:在宙斯保卫任务中的错误简报
修正:CSAT和AAF即使飞行员已经学会了如何在他们的培训课程中使用曳光弹3 F! S# X8 `* A+ e
修正:当玩家在等待重生没有进入装车选择菜单,他们能够使用没有预先选择的装备重生1 l3 Q1 a8 P1 E1 h
修正:在虚拟军火库中,切换主要武器为空,然后选择一个导致玩家切换关闭军火库后自动切换手枪
修正:在展示管卡的晚上,AI反应很慢
修正:将虚拟军火库中的玩家阵营改为平民
修正:武器附件并没有反映在阿森纳的虚拟实体&&M4 C3 U" h! v9 _& G0 {4 a
修正:衰减皮卡(Offroads)& h. F0 A3 j8 s' o
修正:视频选项之间进行切换时不正确的对焦% ^6 S( K. T& r
修正:消息“发现了一个地雷”和“发现了一个炸弹”在隐匿模式下被擦除
修正:玩家趴下时放下武器,人物会自动站起
修正:当玩家背着武器跑步时,武器不会和身体卡在一起(/view.php?id=24354)
修正:使用正确的材料随机重生动物,为了山羊!5 @2 H5 k8 m& Q2 O% p. |
修正:在玩家趴下时,用望远镜观察时筒子会挡住玩家视野
修正:当玩家跑步时筒子会和玩家身体卡在一起' Z* R7 e0 ]$ R&&T* M% f0 x
修正:从VR训练中,移除一箱不必要的背包
修正:链接在AAF的展示任务中被覆盖
修正:BIS_fnc_kbtell被忽略_disableRadio参数和句子在通话过程中总是被禁用
修正:在AAF的展示任务中迷彩网是坚不可摧
修正:红外闪光灯没有无限的变体,但是烟雾弹和化学灯有
修正:M134机枪现在在脚本上正确的识别载具2 L( v. Z' }1 E$ q0 b& i: C) D
修正:在COOP 05 Support Stratis任务中有一块空的位置
修正:新的不持有武器时:(站立/下跪)动画现在有正确配置的声音; x/ h: k* I. m+ F" R8 S* \3 G
修正:造成失败remoteExec尝试错误,设置_jipID为零* _, Z9 `&&~! r3 C0 m) S' {
修正:小写现在不得不为任务ID,以使代码更适应输入错误
修正:一个在BIS_fnc_setTaskLocal那里的任务有时不正确创建的问题
修正:在单人战役开始使用模组时可能出现的错误的情况
修正:支援请求模块链接到一个平民目标或者逻辑模块上的错误9 g&&\1 ^. |: I6 F, p$ _3 A
修正:丢失的音频样本当泰坦导弹锁定目标时% F+ U3 D$ Q% F0 _4 I
修正:红色,黄色和绿色的驾驶连身衣现在在编辑器中正常工作
修正:用孩子的任务时发生脚本错误
修正:非常巨大的小翻译问题7 Q' n- L&&}. {" s- Y% A9 Y/ Q
修正:多个任务描述,标题和标记文本的问题
修正:调整的35毫米火炮伤害
修正:机枪Navid的机械瞄具在重装弹盒时会卡贴图3 h2 d+ A2 ]! X5 n( i/ s
修正:无法在调整俯卧姿势使用瞄具
修正:理顺人物旋转时的抽搐和颤抖$ C+ V7 K; l&&r) S3 R# {4 l
修正:潜水衣和吉利服的损坏行为(贴图?)
修正:绊线地雷的错误链接" v1 r. G1 f% i&&y0 K: C9 ]
修正:即使在陆地上船舶也有水的声音,
修正:根据新的角色保护数据,调整车辆内部的损害
修正:人物蹲着跑动时,不再碰撞物品* X* g5 a0 t# [1 B/ `. G8 R
修正:在Altis和Stratis各种小问题,主要是关于岩石
修正:直升机坠毁时吊带装TARU的错误0 c! D' M! _/ G0 I( X6 y% b
修正:对于大多数汽车调整乘员碰撞保护
修正:对于一些光学新增伪后期处理特效返回行为默认" U; l# R&&`0 k5 E&&X. J; I( b
修正:本地化游戏管理员,并在角色指派显示游戏主持人的名字
修正:在毯面外的声效种类(在里面); p4 E, q4 a3 G
修正:激光电池打开装备后消失% Q# V6 ?- @& k2 S8 ?& w% G
修正:这是不可能再使用9毫米手枪射穿与在VR渗透课程中的障碍
修正:在Altis的几个小问题
修正:另外几个在Altis上的小错误
修正:Sea_Wall_F.p3d模型的PhysX物理几何损坏问题$ E8 Q4 w5 O: o7 @7 R
修正:各种在Stratis和Altis的环境问题
修正:在虚拟军火库的暂停菜单有时会出现退出按钮,而不是返回军火库的按钮
修正:改进计算车辆重生位置模块(避免碰撞)2 \# S* H2 h, |- o&&L# M: |0 I
修正:随机“未定义的变量”,在高级提示错误' C3 n/ n$ V* k( b& S
修正:本地化工具提示在PCB编辑器的吊带加载助手
修正:本地化在PCB编辑器工具提示调整提示5 m' M. h- B2 A1 @* g7 N&&L9 m) {
修正:当玩家退出End Game模式之后军火库的摄像机位置错误$ [; Q; N2 y8 Q# x/ n
3 j( L9 P2 b2 J* G% ]( z) N
===以下内容将截取重要的更新条目(不重要的会被省略)===
修正:一些陡峭的地形甚至可以蹲着上
修正:NLAW的手持方式
修正:军火库摄像机有时会切到地图边界& B9 r4 [% t6 @9 ]3 r* n/ Y
修正:A-134上的武器代用点
修正:当在军火库中载具被摧毁玩家无法再次打开Garage浏览载具4 t* [7 z6 K% J. Q: }: E7 m3 k0 m
修正:有些HEMTT卡车在军火库中会被展示太多的乘员& Z) D* P9 s1 }8 Y5 C6 l4 G. z! z
修正:在ARMA3战术指导手册中修复体力值(Stamina)说明, j4 S; O. ^& Q/ u# o$ d" n' ~0 q4 Y
修正:VR虚拟实境地面现在有了新声效
调整:人物被打中的反应% Y5 @: r" O3 T$ W
调整:80mm和60mmm非引导火箭伤害增加,杀伤范围减少& B0 p: J" p2 I! s&&@1 z
调整:GL carrier rigs的物理模型
调整:20mm和40mm榴弹性能(降低40mm榴弹的冲击力;降低20mm榴弹50%的冲击力增加50%的杀伤范围;HEDP伤害降低到更合理的范围,杀伤距离不变)/ m. K" p, M7 B$ p. p$ p
调整:ABR装弹动画
调整:Katiba趴姿
调整:所有补给卡车可以装卸弹药补给箱,油料补给箱等" j- U1 p- W' I&&M. o) z
调整:APERS反人员地雷声效
调整:腿部受伤影响变小5 B" S, `" {" U/ Y3 t. G1 S$ `
调整:优化榴弹兵背心防护值
调整:优化OPFOR制服防护值5 N0 k, E$ U8 h
调整:35mm防空弹药性能(减少直接命中这样它就不能轻易摧毁重装甲载具;增加溅射范围的同时减少空气阻力和打歪可能性); U; F" k- L1 C! `
调整:防空导弹的性能- b4 k9 r" Z" y6 z: m$ l
调整:人物坐下的动画# K3 J# ?( f9 s% F$ Z
调整:兔子现在跳的更加频繁了. E' {! ^7 D0 o: I& f5 e0 ^
调整:提升血液影响
调整:PDW2000现在有了新的换弹动作
调整:120mm和125mm高爆弹减少直接打击伤害(因为他们对重型载具威力太大了)* `. _$ F% ^. P$ O&&h$ Z. c
调整:当飞机在空中被导弹锁定时的声效
调整:增加数种重型枪械和弹匣的重量: F0 D; p- P+ {# T2 a
调整:大多数武器较短的换弹声效
调整:枪械下挂武器展示在装备栏中
调整:降低载具的引擎响度
调整:疲劳的声效和被击中的声效# b# l" f3 s8 v8 k& \
调整:TRG21 GL换弹动画
删除:过时的Huron仓库代用
% e3 [4 T( w& u! w) U- e
=以下为End Game模式以及游戏自带Launcher还有ARMA3 Server的更新日志(保留原文)=7 R% H6 `; f, X' s3 V- Z
/post/spotrep-00049
签到天数: 627 天连续签到: 17 天[LV.9]以坛为家II
不错啊 加油
签到天数: 340 天连续签到: 21 天[LV.8]以坛为家III
签到天数: 674 天连续签到: 17 天[LV.9]以坛为家II
签到天数: 370 天连续签到: 43 天[LV.9]以坛为家II
Powered by=SAGA=武装突袭3服务器=SAGA=武装突袭3服务器2
16 / 19 页
《武装突袭3》脚本编写高级教程【255楼,武装突袭3——疯狂的戴夫和他的重量】
218楼,《武装突袭3》——MP教程及废弃代码追加
精品教程,期待版主继续更新
本帖最后由 FFUR2007SLX2_5 于
11:22 编辑
227楼,《武装突袭3》——MP教程及废弃代码追加3
继续我们MP函数安全框架的教程,如果需要我们甚至可以为我们的函数加上一道铁门,具体请看:
fnc_WHITELIST = compileFinal &
& & _this in [
& && &&&&&Script_blabla&&,
& && &&&&&function2&&,
& && &&&&&function3&&
& & ]
&;
fnc_ERROR = compileFinal &
& & diag_log (format [
& && &&&&&ERROR! Call to non-existent function '%1' (Passed params: %2)&&,
& && &&&_this select 0,
& && &&&_this
& & ])
&;
fnc_hallo = compileFinal &
& & private [&&_fnc&&,&&_code&&];
& & _fnc = _this select 0;
& & if (_fnc call fnc_WHITELIST) then {
& && &&&_code = missionNamespace getVariable [
& && && && &format [&&%1&&, _fnc],
& && && && &fnc_ERROR
& && &&&];
& && &&&if ((_this select 2) == &&call&&) then [{
& && && && &_this call _
& && &&&},{
& && && && &_nul = _this spawn _
& && &&&}];
& & }
&;
Script_blabla = compileFinal &
& & hint (_this select 1);
&;复制代码
我们继续对所有函数compileFinal,只不过这次在开头我们添加了白名单,这样的双保险甚至使黑客没有任何办法来发布自己含有恶意代码的参数,也没有办法通过截获我们的函数名进行篡改,现在黑客们唯一能做的就是另辟蹊径。
当然许多时候我们并不是使用这种方式来直接汇编函数,因为这样太麻烦,所以我们一般都会选择专门的一个文件来集中汇编这些函数:
function1 = compileFinal preprocessFileLineNumbers &myfunction1.sqf&
function2 = compileFinal preprocessFileLineNumbers &myfunction2.sqf&复制代码
compileFinal与compile唯一不同的是我们必须先汇编一次随后再能调用,如果在调用的同时去汇编函数实际上并没有给函数上锁,想这些就是有问题的调用方式:
call compileFinal preprocessFileLineNumbers &myfile.sqf&;复制代码
functions = compileFinal preprocessFileLineNumbers &myfile.sqf&;
复制代码
MP的函数安全性框架设计,这仅仅是非常小的一部分。就好比设计这种安全方式的人也有办法反编译,代码的编写方式才得以不断进步,不断完善。有些黑客甚至连续PV空代码,破解BIS_fnc_MP或使用createUnit来进行作弊确实给服务器带来了不少麻烦,许多脚本者甚至要求BI取消客户端向服务器或其他客户端PV的功能,但这显然不可行并且会给MP编写带来极大的不便。不过从我个人推测,随着Global系即EG属性的命令不断扩建PV很有可能被取而代之,不过这仅是猜测。
了解了MP的基本编写原则后我们才能更好的理解为什么那些代码会被ban?作弊者们是如何通过这些代码作弊的?围绕着这个问题我们又可以牵涉出一大串历史性问题,接着killZone_kid,defunkt和Radioman等一群代码猿又开始了充满枪药味的讨论了,还记得在OA时代的call RE吗?很多人看到这些东西不明觉厉,甚至求教程的,我只想说当时的RE是BI的官方MP函数,现在已经被BIS_fnc_MP所代替了,当时我不会去写RE的教程,为什么?因为第一,介绍RE根本没有用,它属于整个MP编写的一部分;第二,黑客同样可以通过RE来作弊。所以RE取消了,紧接着BI逐步取消了setVehicleInit,clearVehicleInit和processInitCommands。finishMissionInit作为一个毫无用处的代码我们在此将其剔除。
还记得大量无脑玩家使用UPS城市巡逻脚本吗?很抱歉的是至少在我看来这得重新做一遍,现存的community相当多的老脚本有必要清理一遍所有之前所使用过的setVehicleInit代码段。
这里RE的作弊方法我已经不想再说了,毕竟现在是A3了,黑客通过createVehicle产生EG效应随后立马附上setVehicleInit+恶意代码+processInitCommands进行作弊,黑客可以做他任何他想做的事并且服务器很难找到到底谁干的这事,因为服务器根本就没有办法发现黑客使用过的变量。发现问题后BI立马封掉了这几个命令并且开始逐步完善PV的功能,为什么是PV?有人问PV不是照样可以作弊?但难度明显加大,黑客被发现的概率变得极高,服务器可以有效侦测含有恶意代码的PV变量,服务器又可以有权阻止使用代码的发布。所以BI便在A3使用含有PV代码的BIS_fnc_MP作为框架来代替RE升级MP环境下的安全性。
好了,现在的问题又出现了,新型黑客的出现可以直接破坏BIS_fnc_MP的结构抑或是使用createUnit来进行作弊。Biwiki不会告诉你连它也可以用来作弊但我这里不得不提一下,为什么?createUnit array中的init就是一个漏洞,现在你明白了为什么微软每天都在打补丁补漏洞?createUnit该不该被禁止?这是一个非常严肃的抉择,否则又有一大堆脚本任务彻底报废,几乎所有关于刷兵的内容都将大改,显然BI是不愿意的。
说到了这里我们要开始彻底引入BIS_fnc_MP及其家族函数了:
相比于A2的函数库A3的可谓是做了相当大的改进,这得归功于Karel Moricky,但是自从当BIS_fnc_MP被不断攻击后,这也成了社区的一大焦点。BIS_fnc_MP作为MP框架的唯一核心,它的作用是调用个客户端函数并执行,它并不用于PV整套代码,但却允许这样的功能,这也是其成为被吐槽的对象。
首先明确一点的是BIS_fnc_MP并不支持将你自己的函数PV,就是说无论是服务器还是客户端都不行,除非你先让所有人下载你的函数或是使用已定义好的函数,官方函数或加载的ADDON。问题是黑客照样可以通过官方函数外加含有代码的参数来进行作弊或搞破坏。
[&{player setdamage 1;}&,&BIS_fnc_spawn&,true,true] spawn BIS_fnc_MP;
这该如何解释?在这里我想在申明一下,不要试图以这篇教程学习到的能力从事违反游戏规则的任何活动,否则造成的一切后果自负!
我们先不谈这些,先来看看如何正确使用BIS_fnc_MP,其实非常简单,跟随wiki的一步步来即可,killzone_kid也解释的非常清楚,作为第三和第四个值我们可以考虑直接省略是代码看起来更简洁。
当然这里还有更高级的用法,除了wiki所列出的:
[&{hint ‘hallo’;}&,&BIS_fnc_spawn&,“var“] spawn BIS_fnc_MP; 这里我们可以使用变量名来进行限制,只有当该变量名在该客户端上为local时方可运行脚本。
[&{hint ‘hallo’;}&,&BIS_fnc_spawn&,obj] spawn BIS_fnc_MP; 这里我们可以使用实体来进行限制,只有当该实体在该客户端上为local时方可运行脚本。
[&{hint ‘hallo’;}&,&BIS_fnc_spawn&,grpName] spawn BIS_fnc_MP; 这里我们可以使用组来进行限制,只有当该客户端玩家属于改组成员时该客户端方方可运行脚本。
好了,现在是到进行MP编辑小结的时候了,MP编辑并非我们想象中的那么难,在编辑MP任务或脚本时我们必须要按照以下步骤进行:
1、& & & & 充分利用init.sqf,我们必须先将设计好的所有所需要的函数写入其中并且compilefinal进行保护。
2、& & & & 考虑是使用自己的一套PV安全函数调用框架还是选用官方的MP框架。
& && && &如果是自己的PV框架,则需要自行设定框架结构和PVEH。框架可以保存在自己的server文件夹中不被下载作为核心控制文件。服务器对客户端的控制就是服务器不断发出PVEH的函数调用指令随后客户端运行。
& && && &如果使用官方MP框架则可以省去自建框架的步骤,所有服务器指令则可以直接通过BIS_FNC_MP发出。
3、& & & & 细分到函数的写法,我们要用到之前所学的代码四属性,一旦函数指令被PV至个客户端。我们先考虑AL或AG问题,对于AL的被运行实体我们先判断是否local,这很简单,因为PV的函数所有人都执行一遍,所以不怕找不到owner。AG则无所谓。随后是判断作用EL还是GL,如果是EL我们则还需PV一次EL代码的作用,GL则不用。其它问题全部不用管了,JIP玩家也不必担心,如果你用的是官方MP框架它是JIP兼容的。这么一来你就再也不必为MP编辑而烦恼了。
光说不练没把戏,在此我推荐给大家killzone_kid的一款专用服务器的MP任务编辑debug console。
Debug console必须在dedicated server运行,那为什么是dedicated server?因为相比于普通服务器,dedicated server拥有更大的带宽使用率,所以大型的MP对战都使用dedicated server。这个debug console最好是能够有两台机器上进行测试这样MP的各种问题才能更加直观的表现出来。
说到dedicated server我们还有专门的参数设置,关于参数设置我会在下一篇教程中详解。
Debug console的下载地址在这里:
其作用是是可以进行客户端与服务器的变量进行监控并且分别显示个变量的locality状态。使用时先将文件夹放入MP mission中,随后确保description.ext含有#include &KKSB\KKSB.ext&头文件和init.sqf含有#include &KKSB\KKSB.sqf&。
随后我们以专用服务器的身份进入游戏,按两下esc调出debug console。我们在使用debugconsole时还有一个小贴士就是tab和f1键,它们可以帮助我们更快的输入代码。(我们在建立专用服务器时需要参数设置,这里我们使用killzone_kid的参数来设置服务器:,将所有内容放入MP mission中并运行批处理文件。
进入专用服务器后进行如上设置,如果我们需要多个玩家则需要两台机器,进入kkserver输入密码abc123,这些设置都可以在cfg中进行调整)
当我们打开debug console后在服务器栏中输入isdedicated返回true时,那么就说明我们已经进入专用服务器模式进行MP编辑了。
为什么我们需要这样的工具?因为它可以帮助我们更快的进行MP调试,事半功倍,节约时间。
下一篇我们继续教程,228楼,《武装突袭3》——MP教程4及服务器设置
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 FFUR2007SLX2_5 于
15:26 编辑
228楼,《武装突袭3》——MP教程4及服务器设置
作为对kk MP debug console的补充说一下netID,ObjectFromNetId和groupFromNetId。
这个家族是截取实体单位或小组最为直观的方式,netID支持objNull和grpNull,返回id类型为科学计数法的浮点数,随后通过相对应的ObjectFromNetId和groupFromNetId获取id并返还objNull或grpNull。相对于只能够返还玩家id的getPlayerUID,ArmA3新增的家族可以返还所有objNull或grpNull的id,换言之ArmA2的getPlayerUID已经相当鸡肋甚至可以剔除了。
在kk的MP debug console中他通过本地获取玩家id随后pvServer从而使dedicated server获取玩家实体。
netId objN
ObjectFromNetI
groupFromNetI复制代码
对于我们之前提到的AddStackedEH onPlayerConnected和onPlayerDisconnected。它们的主要作用是JIP和中途退出玩家。特殊私用变量_id,_uid和_name,_uid其返还的浮点数与netId相同,_id返还的数来自#userlist,在专用服务器设置上我会讲,不过它们的具体作用还是不一样的,在init.sqf中我们同样需要将OPC和OPD分配到每个客户端上去:
[&BIS_id&, &onPlayerConnected&, “fn_onPlayerConnected”] call BIS_fnc_addStackedEventH
[&BIS_id&, &onPlayerDisconnected&, “fn_onPlayerDisconnected”] call BIS_fnc_addStackedEventH复制代码
理清了逻辑,现在开始专用服务器设置,这里已经有一片中文教程:
作为该教程的补充,我将对其所没介绍到的在做一下详细的梳理:
专用服务器的优势相比不用再复述,自BI提供了arma3server.exe之后我们不必再在目标栏中添加-server参数了。
首先我们先来看看专用服务器是什么:
1、& & & & Armaholic有一些傻瓜式专用服务器加载器,不过已经相当老旧无法跟上新时代的步伐,所以我们需要手动配置服务器,其优势不言而喻;
2、& & & & 所有ArmA3服务器文件的安装全部使用steamCMD进行,使用steamCMD时我们就无需在服务器上安装steam客户端。
3、& & & & ArmA3server.exe与绝大多数游戏不一样,它是一个空项目并且显示waiting,在这过程中没有任务加载也没有玩家进行游戏,当我们在description.ext中定义maxPlayers的数量时,它只会显示这个数。
4、& & & & 当有玩家接入你的专用服务器后,它会显示playing,任务开始加载。
5、& & & & 当专用服务器没有任何玩家后其返回waiting状态。
6、& & & & 如果说管理员想要让专用服务器在无玩家的情况下继续保持任务进行,你则需要在server.cfg中添加persistent=1; 只有在description.ext定义重生项目的任务才能允许这种模式,如果脚本控制任务结束则强制结束。
7、& & & & 服务器进行时管理员不能中途修改配置参数。
8、& & & & 任务列表的更新可以随时刷新。
开始服务器配置:
1、& & & & 手动写配置文件太麻烦,所以我们需要steamCMD批处理文件进行配置文件的生成,事半功倍。下载:
2、& & & & 我们新建一个文件夹并在这个文件夹内开始工作,新建A3_serverOne.bat(名字自定),随后在其中输入:
steamcmd.exe +runscript A3_serverOne.txt复制代码
3、& & & & 接着在该文件夹内建立A3_serverOne.txt,输入:
& & login USER PASS
force_install_dir C:\Arma3ServerOne
app_update 107410 -beta development validate
exit复制代码
4、& & & & 随后运行A3_serverOne.bat。这里我们成功设置了一个专用服务器,如果需要多个服务器,以此类推,不过不同的服务器我们需要在server.cfg中定义不同的端口。
开始server.cfg配置:
这里的许多细节内容fromz的教程已经翻译了,所以这里我就直接提供一个样板:
passwordAdmin = &mypassword&;
steamPort=8766;
steamQueryPort=27016;
hostname=&My Server Name&;
motd[]=
{
&Welcome to my server name&,
&hello world&,
};
motdInterval=50;
voteThreshold=0.25;
maxPlayers=80;
reportingIP=&arma2pc.&;
logfile=&myserver.log&;&&
class Missions
{
class Mission_01& &
{
template = mymission.S
difficulty = &regular&;& &
param1 =& &
param2 =
};
class Mission_02
{
template = anothermission.S
difficulty = &veteran&;
param1 =& &
param2 =
};
};
voteMissionPlayers=1;
kickduplicate=1;
equalModRequired=0;
disableVoN=0;
vonCodecQuality=7;
timeStampFormat=
persistent=1;
verifySignatures=2;
regularcheck=&&;
localClient[]={127.0.0.1};
onDifferentData = &&;复制代码& & & & & & & &
下面是arma3.cfg,这里我也只提供一个样板:
MinBandwidth=2097152;
MaxBandwidth=;
MaxMsgSend = 1024;
MaxSizeGuaranteed = 512;
MaxSizeNonguaranteed = 256;
MinErrorToSend = 0.001;
MinErrorToSendNear=0.01;
MaxCustomFileSize=0;复制代码
下面是default.arma3profile,这个文件定义了游戏性内容,游戏在进行时最高fps不会超过50,如果低于15则可能任务过于复杂,PV过多或优化有问题:
class Difficulties
{
class Recruit
{
class Flags
{
Armor=1;& & & & & & & &
FriendlyTag=1;& & & & & & & &
EnemyTag=1;& & & & & & & &
HUD=1;& & & & & & & & & & & &
HUDPerm=1;& & & & & & & &
HUDWp=1;& & & & & & & &
HUDWpPerm=1;& & & & & & & &
WeaponCursor=1;& & & & & & & &
AutoAim=1;& & & & & & & &
AutoGuideAT=1;& & & & & & & &
3rdPersonView=1;& & & &
ClockIndicator=1;& & & &
Map=1;& & & & & & & & & & & &
Tracers=1;& & & & & & & &
AutoSpot=1;& & & & & & & &
UltraAI=0;& & & & & & & &
DeathMessages=1;& & & &
NetStats=1;& & & & & & & &
VonID=1;& & & & & & & &
};
skillFriendly=0.;
skillEnemy=0.;
precisionFriendly=0.20;
precisionEnemy=0.20;
};
class Regular
{
class Flags
{
Armor=1;
FriendlyTag=1;
EnemyTag=0;
HUD=1;
HUDPerm=0;
HUDWp=1;
HUDWpPerm=1;
WeaponCursor=1;
AutoAim=0;
AutoGuideAT=0;
3rdPersonView=1;
ClockIndicator=1;
Map=1;
Tracers=1;
AutoSpot=0;
UltraAI=0;
DeathMessages=1;& & & &
NetStats=1;& & & & & & & &
VonID=1;& & & & & & & &
};
skillFriendly=0.;
skillEnemy=0.;
precisionFriendly=0.35;
precisionEnemy=0.35;
};
class Veteran
{
class Flags
{
Armor=0;
FriendlyTag=0;
EnemyTag=0;
HUD=1;
HUDPerm=0;
HUDWp=1;
HUDWpPerm=1;
WeaponCursor=0;
AutoAim=0;
AutoGuideAT=0;
3rdPersonView=0;
ClockIndicator=1;
Map=0;
Tracers=1;
AutoSpot=0;
UltraAI=0;
DeathMessages=0;& & & &
NetStats=0;& & & &
VonID=1;& & & & & & & &
};
skillFriendly=0.;
skillEnemy=0.;
precisionFriendly=0.75;
precisionEnemy=0.75;
};
class Expert
{
class Flags
{
Armor=0;
FriendlyTag=0;
EnemyTag=0;
HUD=1;
HUDPerm=0;
HUDWp=1;
HUDWpPerm=1;
WeaponCursor=0;
AutoAim=0;
AutoGuideAT=0;
3rdPersonView=0;
ClockIndicator=1;
Map=0;
Tracers=1;
AutoSpot=0;
UltraAI=0;
DeathMessages=0;& & & &
NetStats=0;& & & & & & & &
VonID=0;& & & & & & & &
};
skillFriendly=0.;
skillEnemy=0.;
precisionFriendly=0.95;
precisionEnemy=0.95;
};
};
viewDistance=2000;
terrainGrid=25;复制代码
配置完成后我们来看看端口:
•port& && && & 2302& && &&&UDP& && && &ArmA3 网络
•port+1& && &2303& && &&&UDP& && && &Gamespy 公共服务器
•port+3& && &2305& && &&&UDP& && && &VON网络
•port& && && & 8766& && &&&UDP& && && &STEAM服务网络
•port& && && & 27016& && &UDP& && && &STEAM query
最后我们就可以开始运行arma3server.exe了,当然我们使用和运行游戏相同的办法来开始专用服务器,我们需要快捷方式和开始参数:
-port=2302 -name=default -config=default\server.cfg -cfg=default\Arma3.cfg -profiles=default复制代码
开始参数的更多内容请看:
如果说想要升级自己的专用服务器请运行我们的批处理文件。现在你的长航时专用服务器就可以开始工作了,加上fromz的无人服务器自动重启的设置和我们的MP脚本编写知识,给社区带来全新形式的MP任务从这里开始。
当然不要忘记我们之前所学的函数安全调用框架,如果仍然不放心我们则需要对任务进行监控并及时发作弊者,管理员的服务器命令在这里:
下一篇教程中我将对服务器的安全性做更进一步的介绍:《武装突袭3——MP全教程5及安全性》
230楼继续教程:《武装突袭3——MP全教程5及专用服务器安全性》
本帖子中包含更多资源
才可以下载或查看,没有帐号?
一如既往地支持
本帖最后由 FFUR2007SLX2_5 于
15:31 编辑
230楼,《武装突袭3——再见MP》
有了专用服务器,有了专业的函数编写技能,接下来就看Dwarden的了,自从V1被破解后V2与pbohider之间的战斗又开始了,反作弊的第一步在V2,第二步是BE,最后是我们的服务器端脚本。在我们的server.cfg中我们有必要使用最新的verifySignatures=2; 首先这是确保了防止作弊者使用与本服务器无关的插件进入游戏。但这并不意味着这道门可以拒所有作弊者于门外,一些强悍的黑客们也在不断升级他们的pbohider直到有一天彻底攻破V2的防线,管理员在选择插件是也必须谨慎,即使选择了信任度极高的插件作为服务器信任插件但我们没有办法保证原作者私用签名外泄而导致黑客重新修改插件混入服务器。
如果说管理员既不打开BE也不打开V2,那么只有两种可能,1、盗版服务器。2、如果只打开BE却没有V2,事实是BE根本就不检查addon,V2才会。
作为MP教程的终结篇,我想说为什么这是一片“毫无逻辑可言的雷池”,第一,涉及MP必须要有扎实的SP基本功;第二,设计MP不仅要重新了解所有SP代码的四属性(AL,AG,EL,EG)、PV的运用、带宽优化所需要建立的函数调用框架、服务器的建立、反作弊和服务器端代码、函数调用框架安全性的考虑、ARMA本身存在的bug、代码测试在适当的环境下(即dedicated模式,非server)和一些基本常识。
所以这确实让足够一批数量的玩家不断受挫最终放弃脚本的原因。这就好比看似操作简单的iPhone其实其内芯的复杂程度是常人无法想象的,好比当我们开心的玩着BattleField时却永远无法想象Devs为了达到完美要进行如何复杂的设计!
这也就印证了这个理论,精英的排他性,注定众多终端的使用客户将沦为未来IT发展的最底层人。
言归正传,作为MP的最后一篇教程,我先来介绍一下服务器端代码,这类代码独立编译,虽然它们可以与引擎脚本sqf共同使用但是目前暂不支持运算和其他类型功能,是仅限于服务器端的踢人,禁止IP或作弊检查等功能。这些服务器端代码需要与server.cfg的eh配合来产生效果,我们先来细讲一下这些eh,一般的玩家还没有注意到这些功能,在本篇中我将介绍一下:
doubleIdDetected = &command&;
onUserConnected = &command&;
onUserDisconnected = &command&;
onHackedData = &command&;
onDifferentData = &command&;
onUnsignedData = &command&;
regularCheck = &command&;复制代码
在这7个server.cfg eh中都包含特殊私用变量_this.
而配合这些变量的可用代码为users,ban,kick,checkFile和numberOfFiles。
Users指令返还数组【id,name】,玩家#userlist中的id和名称。Ban为将玩家禁止,kick为踢出玩家,0 checkFile [id, index]检查制定客户端上的签名文件,1为深度检查。numberOfFiles id为检查指定客户端所挂载插件的数量。
onHackedData,onDifferentData,onUnsignedData和regularCheck中的变量_this包含_this select 0玩家id和_this select 1签名文件;而doubleIdDetected,onUserConnected和onUserDisconnected中_this只包含_this select 0玩家id。因此在配对使用时我们可以这样做:
doubleIdDetected = &ban _this&; //禁止使用相同id号的那个玩家
onUserConnected = &users _this&;//检查连入玩家的信息
onHackedData = &0 checkFile _this&; //检查篡改addon者的文件信息
onUnsignedData = &kick (_this select 0)&;//踢出使用未签名addon的玩家
当然服务器端的命令也就此结束了,在server.cfg的eh里我们没有办法是用其他脚本代码,比如onUnsignedData = &(_this select 0) globalchat &&&download unsigned addon &&& &;复制代码
Wiki解释我们可以在这里找到:
接下来我想讲一下MP编写的一些小贴士,虽然我们在MP的编写上已经没有障碍了,但是了解这些小技巧往往能使我们显得更为专业:除了我之前所讲过的MP脚本编写的基本步骤外,还有那些东西会是代码员头疼。
1、& & & & 关于常量的变化,在SP中常量是可控的但是在MP中却不同,并不是每个变量在每个客户端上都是一样的,比如说实体单位,位置,矢量等等。这就是为什么我们需要PV。
2、& & & & 每个客户端分配到的含有延时代码的脚本也会发生不同步,sleep后导致各个客户端的time不同。
3、& & & & EH存在AL和EL问题,需要进行local检查和PV。
4、& & & & BIS_fnc_random造成个客户端随机运行的结果不同,导致这类脚本需要服务器PV而非客户端PV。
5、& & & & 其他可能出现的问题,譬如玩家夺取旗帜等等。
我们知道如果我们只以SP的思考方式赋值变量并运行脚本,那么一旦分配到每个客户端就会发生各种意想不到结果,这些例子我已经讲过了。
所以在你开始磨拳霍霍准备对准MP大干一场时,我想将你们可能会遇到的问题集中做一个最后的示范,为各位今后的MP脚本编写之路铺平一条道路,不受阻碍!
我们知道所有SQM上的GameLogic全部local于服务器,换言之如果是客户端脚本创建出的GameLogic是非Local于服务器的,所以我们可以通过判断GameLogic是否Local来判断脚本是否应该由服务器执行,等同于isServer
If (local GameLogic) then {call fn};复制代码
服务器所需要运行的脚本与客户端所需运行的脚本是不一样的,相对于服务器,客户端没有必要全程脚本监控所有任务的变量,客户端更多的往往是静候指令的姿态,服务器则需纵览全局适时PV变量让客户端执行。就好象任务开始时服务器要发给每个客户端各种各样的篮子(我们称他们为需要调用的函数),随后服务器开始不断的扔苹果,扔香蕉(我们称之为PV),客户端要用服务器发给他们的各种篮子去接住各种水果(我们称之为调用)。这样的MP就不会出错而且有条不紊。
多数人出错的地方往往在,不给客户端发篮子(从来不写函数),结果是客户端徒手接消耗体能(带宽利用率低);或者是服务器发不来苹果(不会PV),结果是服务器自娱自乐(变量发不出去);或者是服务器二大爷的,发筐子时附带送香蕉苹果的(不应该由客户端PV的变量却让客户端做了),真正发苹果是发现怎么客户端筐里有那么多水果?(变量失控);又或者是服务器二奶奶的,发筐子时自己都不知道里面有没有猕猴桃儿什么的(EL和EG混淆),等到发水果时发现怎么每个客户端筐里的水果都不一样而且五花八门(变量失控造成各客户端不同步)。
和SP一样,在MP中任何未被定义的变量默认为false。
MP的测试环境
正如我之前讲过的isdedicated,相对于普通client server,dedicated的测试环境更加稳定,而且兼容普通客户端服务器,并且大多是公共服务器都是dedicated,所以MP的测试环境一般选择为专用服务器和至少一台客户端。(相信看到这里你一台机子也能搞定)
JIP玩家的允许与否取决于description.ext对respawn的定义和管理员对disableAI的设置。如果服务器允许JIP那么任何玩家都可以在任何时候退出或重回游戏,重生,中途加入。在这点上我们不必过于纠结,因为前面的教程中我已近详述了OPC和OPD的AddStackedEH,BIS_fnc_MP对JIP的兼容,所以,这只是浮云。
有非常多的国内玩家问我关于复活的问题,各种帖子以至于我都懒的回答了,倘若以后再有这种脑残问题,请直接引用这里的回答:
如果还有人在使用EH “Killed”,”Respawn”遇到问题,我只想说回家睡去吧,EH “killed”在MP中的表现为AL+EL,EH “Respawn”在MP的表现为AG+EL。所以,请全部使用MPEH “MPKilled”,”MPHit”和”MPRespawn”,只有它们才是AG+EG!
onPlayerKilled.sqf和onPlayerRespawn.sqf
它们同是引擎内设的默认文件,拥有各自的特殊私用变量。
onPlayerKilled.sqf将会与当客户端被杀掉的那一刻时触发,相当于一个MPEH “onPlayerKilled”, onPlayerRespawn.sqf同理,和MPEH “MPkilled”和”MPRespawn”不同的是它们都含有重生方式和重生延迟的参数设定,相当于玩家免去了写description.ext和MPEH的步骤。
这里wiki拥有详细的解释以及它们各自支持何种模式的重生:
它们本身不需要进行参数的传递,在脚本中的私用变量就可以直接使用:
//onPlayerKilled.sqf
Private [“_type”];
_type = [_this,2] call bis_fnc_
_dely = [_this,3] call bis_fnc_
_type = 3;
_dely = 10;复制代码
阵营复活的预设函数
MP复活是众多玩家的硬伤,不是因为它真的难,而是因为中国玩家的“懒”。各种关于复活的脑残求助帖我已近不想多提了,还有人将各种低级的复活脚本当宝似的用于自己的服务器或做为回复,什么VAS,什么norrin的复活脚本。估计玩了ARMA那么多年还未闻Karel的大名,在此如果再遇到这种低级问题可以引用这里最为最后的回复:
我怎么样让不同的阵营采用不同的复活方式?我想说请回到description.ext
respawnTemplatesWest[] = {};
respawnTemplatesEast[] = {};
respawnTemplatesGuer[] = {};
respawnTemplatesCiv[] = {};
respawnTemplatesLogic[] = {};复制代码
在这里你可以选择自己想要的阵营复活方式,karel预设的复活函数我在此不想多讲,请翻看function viewer && Respawn或
关于限制复活次数
这又是一个提问的重灾区,如果还有这种问题,这里将给出“关门”回复:
BIS_fnc_RespawnTickets 。首先我们得配合respawnTemplates[] = {&Tickets&};复制代码或respawnTemplates[] = {“EndMission”};复制代码由于BIS_fnc_RespawnTickets拥有EG属性所以我们可以不必PV并且可以不断覆盖或更新之前的Tickets。当Tickets耗完后玩家就再也没有办法重生了。其强大的功能作用于所有可复活的单位身上,无论AI还是玩家,也可以设置组队的复活次数,配合respawnTemplates[]完全可以达到阵营间不同的复活次数或在任务进行中更改。
给所有CAST玩家提供5次重生次数
[east, 5] call BIS_fnc_respawnT复制代码
返还所有玩家复活次数
[missionNamespace] call BIS_fnc_respawnT复制代码
返还玩家剩余复活次数
[player,nil,true] call BIS_fnc_respawnT复制代码
设置玩家的复活次数为10
[player,10] call BIS_fnc_respawnT复制代码
除了使用BIS_fnc_RespawnTickets,我们还可以用更加简单的respawnVehicle
来设置车辆的重生延迟和重生次数,但这里只限于车辆,而且其所有重生地点仅限于SQM中的特殊marker,重生间隔无法篡改,所以BI肯定会随着发展的需要将该代码扩展VehicleRespawnTime, setVehicleRespawnTime等等
关于复活显示倒计时
确保respawnTemplates[]含有counter计时器
respawnTemplates[] = {& EndMission &,& Counter &};复制代码随后使用BIS_fnc_respawnCounter对计时器进行设置:
倒计时显示Respawn Countdown,第二个参数为字体颜色,为0,1,2
[“Respawn Countdown”,2] call BIS_fnc_respawnC复制代码
这里我们有 playerRespawnTime
来返回玩家复活剩余时间,BIS_fnc_respawnCounter当然是对playerRespawnTime的可视化表达,我们还有setPlayerRespawnTime
作为一个EL代码会不会对函数造成影响?当然会,同时它也可以覆盖description.ext中RespawnDely的内容。
关于观察员视角的开启与限制
首先确保respawnTemplates[]含有Spectator观察员,关于观察员的控制在这里:
那如果我们要限制哪些队可以被观察,哪些不可以则:
讲可观察对象限制在Mygrp0和Mygrp1中
Missionnamespace setvariable [“RscSpectator_allowedGroups”,[Mygrp0,Mygrp1]];
限制自由摄像机的使用而只能使用人称切换观察:
Missionnamespace setvariable [“RscSpectator_allowFreeCam”,false];
关于让玩家自由选择复活地点,添加删除和移动复活地点的方法:
又是一个提问重灾区,如果再看到类似提问可以直接拿该贴枪毙。有些人以为description.ext都知道就开始吹牛皮了,我想说回井里待去吧。
首先确保你有MenuPosition,这不稀奇,关键看你会不会控制这些复活点,有些任务随着战场的不断移动复活点也随之改变,如果要添加一个可供玩家选择的复活点请使用BIS_fnc_addRespawnPosition
这是个EG的函数。该函数同样区分对待不同的被复活对象:
给所有玩家新建一个可选择的复活点,位置为markerpos:
MyArena = [missionNamespace,&arena&] call BIS_fnc_addRespawnP复制代码
给BLUFOR玩家新建一个可选择复活点,位置在一辆APC上:
[west, APC] call BIS_fnc_addRespawnP复制代码
移除可选择复活点请使用BIS_fnc_removeRespawnPosition
移除刚才新建的MyArena可选择式复活点:
myArena call BIS_fnc_removeRespawnP复制代码
接着是如何将一个单位强制移动到新建可选择式复活点上请使用:BIS_fnc_moveToRespawnPosition
[player,APC] call BIS_fnc_moveToRespawnP复制代码
关于复活后装备问题:
又是一个提问重灾区,如果有人还在用VAS等等第三方插件,好吧,菜鸟一个。首先确保你有MenuInventory,这没什么,关键是你会不会控制它们。还有些人想要知道如何将现存武器继续留到复活后使用,这类属于初级脚本编写,不予答复。我们现在要看的是如何让玩家复活后进入可视化武器选择菜单进行挑选后再复活,我们要在description.ext中包含类似定义:
class CfgRespawnInventory
& & & & class WEST1
& & & & & & & & displayName = &Light&; // Name visible in the menu
& & & & & & & & icon = &\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa&; // 玩家姓名旁显示的标记图案
& & & & & & & & // 这里使用与CfgVehicles相同结构的武器定义
& & & & & & & & weapons[] = {
& & & & & & & & & & & & &arifle_MXC_F&,
& & & & & & & & & & & & &Binocular&
& & & & & & & & };
& & & & & & & & magazines[] = {
& & & & & & & & & & & & &30Rnd_65x39_caseless_mag&,
& & & & & & & & & & & & &30Rnd_65x39_caseless_mag&,
& & & & & & & & & & & & &SmokeShell&
& & & & & & & & };
& & & & & & & & items[] = {
& & & & & & & & & & & & &FirstAidKit&
& & & & & & & & };
& & & & & & & & linkedItems[] = {
& & & & & & & & & & & & &V_Chestrig_khk&,
& & & & & & & & & & & & &H_Watchcap_blk&,
& & & & & & & & & & & & &optic_Aco&,
& & & & & & & & & & & & &acc_flashlight&,
& & & & & & & & & & & & &ItemMap&,
& & & & & & & & & & & & &ItemCompass&,
& & & & & & & & & & & & &ItemWatch&,
& & & & & & & & & & & & &ItemRadio&
& & & & & & & & };
& & & & & & & & uniformClass = &U_B_CombatUniform_mcam_tshirt&;
& & & & & & & & backpack = &B_AssaultPack_mcamo&;
& & & & };
& & & & class WEST2
& & & & & & & & // 第二套可选装备,以此类推
& & & & & & & & vehicle = &B_soldier_AR_F&
& & & & };
现在我们如果给玩家使用这套功能需要BIS_fnc_addRespawnInventory
将配置添加给所需单位,作为EG的函数同样有区分对待的功能:
给BLUFOR添加WEST1配置的可视化武器选择菜单
Myequip = [west, &WEST1&] call BIS_fnc_addRespawnI复制代码
删除则使用
BIS_fnc_removeRespawnInventory
Myequip call BIS_fnc_removeRespawnI复制代码
Time与diag_tickTime
时间是MP中必须改过来的一个习惯,正如我之前所提到过的,由于存在JIP所以每个客户端的time肯定不同,所以_time = waituntil {time - _time & 1};肯定会造成JIP的不同步,所以我们必须要使用_time = diag_tickT waituntil { diag_tickTime - _time & 1};来替代time。
CreateVehicle
CreateVehicle作为一个EG属性的代码,一定保证其在服务器端代码执行,或者单独一个客户端上执行,否则一台64人的服务器将同时产生64个单位而非一个单位。
在任何一台客户端上运行的BIS_fnc_random都会造成网络的无法同步,所以请确保随机变量全部由服务器端负责PV而非客户端运行。
触发器完全可以另设篇幅新开一篇以颠覆大家对触发器浅显的认识,在MP中,SQM触发器是公共资源,所有客户端与服务器共享。触发器可以由客户端后续生成但不建议这么做,关于这个我会另外讲。
随着MP教程的结束,我想说的是一条踏上MP的道路就此开始,欢迎来到武装突袭3的MP世界,我就送到这里,祝各位一路走好!
233楼继续教程,《武装突袭3——Intersect,MEH及其他》
本帖子中包含更多资源
才可以下载或查看,没有帐号?
看看!!!
本帖最后由 烈焰碧空 于
19:47 编辑
版主大好人呐,看了教程我豁然开朗了,原来MP任务是酱紫编出来的~~
我也去编一个
支持斑竹,感谢版主,期待触发器专刊
本帖最后由 FFUR2007SLX2_5 于
23:13 编辑
233楼,《武装突袭3——Intersect,MEH及其他》
在本片开始之前,先表达本人对于此次马航失联航班的深切关注,以及目前复杂国际形势的担忧之情。 - ffur
Intersect 家族或许我们对它们比较生疏,那今天我们就来看看其具体表现。先看ArmA 于2005年引进的Intersect,如果wiki的解释始终看不明白那么请看这里的解释:先明白建模时的Lod层,如果在ARMA中建立过自己模型的朋友都应该知道Lod层,这些Lod层的作用是用来供引擎识别,比如说Geom层是模型的碰撞层,它并没有视觉效果但没有碰撞层物体就可以穿过;Mass是用来设定物体的重量,没有它物体则会飞起来;贴图层提供最直观的视觉效果,没有它物体则是隐形的;fire层是物体承受物理伤害的层,没有它子弹则会直接穿过并不造成杀伤。
所有的这些层都是三维建模,也就是说我可以画任何一根直线随后穿过这些Lod层,Interesct判断一旦在游戏环境下模型的Lod被两个3D坐标所画出的直线穿过便会触发并返还被穿透部分的细节内容。
在ArmA和OA的时候想要做成这个实验还是相当的困难,因为这时的引擎并不支持可视3D线,但在ArmA3就不同了,我们通过DrawLine3D来完成这个实验。(DrawLine3D和DrawIcon3D都需要FPH,这里我就偷懒用FPH,其实MEH也可以)
Fn_DrawLine = {
oneachframe {drawLine3D [[position m0 select 0,position m0 select 1,1.75],[position m1 select 0,position m1 select 1,1.75],[0,1,1,1]];};
};
Fn_Call = {
[player,&fire&] intersect [[position m0 select 0,position m0 select 1,1.75],[position m1 select 0,position m1 select 1,1.75]];
};复制代码
这样当我们把身体的任何一个部位传入这条线便可以触发Intersect并返回数组:
[[&head&,2.63243]];这里我们可以看到头被穿了。当然你可以做更多的实验并且Intersect会返还不同的结果。通过这个代码我们又可以充分发挥我们的创造力了,比如判断一群人是不是排成直线了?两点之间是否被某个物体挡住了?等等。
接着我们再来看看lineIntersects,作为OA于2010年引进的代码,lineIntersects并不会返回被穿透的具体Lod位置,而是返还是否有物体作为遮挡物出现,返还布尔值。 与Intersect的坐标截取不同,lineIntersects需要海拔坐标,即GetPosASL,EyePos及AimPos,这些代码返还的都是海拔高度,海拔高度的作用不是用来判断水平面上是否有物体遮挡了,而是判断线上是否有物体遮挡,看下实际效果,只要线上拥有物体遮挡,LineIntersects便会返回true。(在这里按照ASL画出的线是在空中的,这就意味着Intersect与LineIntersects坐标处理上的不同,这也就为什么引进了ATLtoASL和ASLtoATL的转换代码)
了解完LineIntersects,我们再来看看LineIntersectsWith,作为OA 2010年引进的代码,它与前两个有什么不同: 和LineInterescts相似,该代码依旧使用ASL坐标用于线上遮蔽的物体,但并不返还布尔值而是直接返还遮蔽物体。Wiki上描述了5个参数,我们看一下其实际效果:
我们通过ATL画线:
oneachframe {drawLine3D [getpos player,screenToWorld [0.5,0.5],[0,1,1,1]];}复制代码
随后使用LineIntersectsWith判断,凡是穿过的物体都会返回:
lineIntersectsWith [eyePos player, ATLtoASL screenToWorld [0.5,0.5]]复制代码
返回:[B Alpha 1-1:2]
接下来是terrainIntersect和terrainIntersectASL,它们的不同之处在于BI直接提供了两套坐标,这样我们就不必转换了,相同的是它们都用来判断线上是否穿透地表,返还布尔值:
terrainIntersect [position player, position car0] 返还true
最后一个则是lineIntersectsObjs,它是BI于2014年新增的一个ZEUS代码,采用ASL坐标,与lineIntersectsWith相似不过新增flag参数允许筛选。 首先我们先画条线,这次用MEH:
addMissionEventHandler [&draw3d&,{drawLine3D [(ASLToATL (eyepos player)),screenToWorld [0.5,0.5],[1,0,0,1]];}];复制代码
接着直接上代码:
addMissionEventHandler [&draw3d&,{hintSilent format [&%1&,lineIntersectsObjs [(eyepos player),ATLToASL (screenToWorld [0.5,0.5]),objNull,objNull,false,2]];}];复制代码
这也是一个相当强悍的功能,比起只能返还static_obj的cursortarget强多了,在这个例子中你可以看到视线所指向的第一个物体。
依次介绍完它们后我们看看在实际中能有哪些作用,这里有无限可能就看你能否想得到了,比如我们可以来一个特工任务,好莱坞里博物馆的激光探测器是不是很带感?
private [&_b&,&_bpa&,&_pa&,&_z&,&_l&];
Globle_Arr = [];
_b = [_this,0,objNull,[objNull]] call BIS_fnc_
_l = [_this,1,1,[0]] call bis_fnc_
_bpa = _b buildingpos 0;
if (_bpa distance [0,0,0] & 0) exitwith {
_pa = _b call BIS_fnc_boundingBoxC
_z = ((boundingboxreal _b) select 1) select 2;
for &_i& from 0 to ((floor _l) - 1) do {
&&private [&_begP&,&_endP&];
&&_begP = _pa call bis_fnc_
&&_endP = _pa call bis_fnc_
&&_begP = [_begP select 0,_begP select 1, random _z];
&&_endP = [_endP select 0,_endP select 1, random _z];
&&Globle_Arr set [_i,[_begP,_endP]];
addmissioneventhandler [&draw3d&,
&&{
& &{
& & drawline3d [_x select 0,_x select 1,[1,0,0,1]];
& &} foreach Globle_A
&&}
waitUntil {
&&(
&&{
&&lineintersects [_x select 0,_x select 1,_b];
&&} count Globle_Arr
&&) &= 1
hint &Activated!&;
};复制代码
小贴士:BIS_fnc_boundingBoxCorner可以返还obj的四个点坐标,当然我认为Moricky还有改进的空间让计算更精确;BoundingBox和BoundingBoxReal之间我选择了后者,因为前者已经淘汰;这里的DrawLine3D我选用MEH载体来代替FPH,Draw3D也是一个每帧类的,和FPH或FSM相同,举个例子:addMissionEventHandler [&draw3d&,{hintSilent str diag_tickTime}];(相当强大的一个命令,某种意义上可以代替addStackedEH OnEachFrame并且支持分离码,只不过在特定事件上的移除没有addStackedEH来的方便,所以函数部分以得以保存下来并且在Dev1.12中得到了改进);最后是所有EH都不支持私用变量的传递,它们只支持全局变量。
再来一个实例,如何通过Intersect找到物体所有的LOD层?A3依旧有许多模型是加密并且我们不可能打开它们看到其所有MLOD层,不过至少通过Intersect家族我们能了解MLOD层的名称。
开始前我先介绍一下
selectionPosition 它可以很方便的定位LOD层在模型中的位置:
vehicle player spawn {
& & _box = boundingBoxReal _
& & {
& && &&&_sel = []; _nsel = [];
& && &&&for &_i&
& && &&&from (_box select 0 select 2)
& && &&&to (_box select 1 select 2)
& && &&&step 0.1 do {
& && && && &for &_j&
& && && && &from (_box select 0 select 0)
& && && && &to (_box select 1 select 0)
& && && && &step 0.1 do {& &
& && && && && & {
& && && && && && &&&_s = _x select 0;
& && && && && && &&&if (
& && && && && && && && &_this selectionPosition _s distance [0,0,0] & 0
& && && && && && &&&) then {
& && && && && && && && &_sel = (_sel - [_s]) + [_s];
& && && && && && &&&} else {
& && && && && && && && &_nsel = (_nsel - [_s]) + [_s];
& && && && && && &&&};
& && && && && & } forEach call {
& && && && && && &&&_p1 = _this modeltoWorld [_j,_box select 0 select 1,_i];
& && && && && && &&&_p2 = _this modelToWorld [_j,_box select 1 select 1,_i];
& && && && && && &&&drawLine3D [_p1, _p2, [1,0,0,1]];
& && && && && && &&&[_this, _x] intersect [_p1, _p2]
& && && && && & };
& && && && &};
& && &&&};
& & & & & & & & {diag_log_x;} foreach [_sel,_nsel];
& & } forEach [&VIEW&,&GEOM&,&FIRE&];
};复制代码
显然我们可以得到物体所有的MLOD层名称。
242楼继续教程,《武装突袭3——刷军营与selectbestplaces》
本帖子中包含更多资源
才可以下载或查看,没有帐号?
233楼,《武装突袭3——Intersect,MEH及其他》
看完了版主最新的代码 特地提问一下~版主可否用简单的一句代码来说明一下如何实现如下效果?
判断两个人之间 是否有障碍物(不管是物体还是地形) 返还布尔值
本帖最后由 下网上载 于
17:25 编辑
版主桑~感觉这个判断不太准确呢~
addMissionEventHandler [&draw3d&,{drawLine3D [getposATL player,getposATL p1,[1,0,0,1]];}];&&
addMissionEventHandler [&draw3d&,{hintSilent format [&%1&,terrainIntersect [position player, position p1]];}];&&
玩家和P1在这个时候 中间没有相隔的东西但是返还出fasle。。。。
大概想做出那种潜入类的效果~~修改一下AI的发现机制~~让躲在障碍物里的玩家不被AI敌人发现
怎么获取AI头部所向角度是否能观察到玩家呢~有时候AI会穿过掩体直接看到人。。。。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
嗯,关于AI头部可以试下lineIntersects配合eyepos,接着配合bis_fnc_relativeDirTo与knowsAbout模拟AI头部,当然AI自己的转头属于animation,AI自己无意识。&
恩哼,是这样的,这个terrainIntersect在平地其实就是false,你试试跑到有山丘的地方,或凹凸的地面看看。&
希望楼主将帖子整合一下,搞个完整版的教程,跪谢
斑竹好人,支持斑竹!
16 / 19 页
Powered by

我要回帖

更多关于 武装突袭3无敌代码 的文章

 

随机推荐