中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
楼主: FFUR2007SLX2_5

[教程] 《武装突袭3》脚本编写高级教程【255楼,武装突袭3——疯狂的戴夫和他的重量】

    [复制链接]
 楼主| 发表于 2013-10-29 21:37:27 | 显示全部楼层
下网上载 发表于 2013-10-29 15:07
uav attachTo [logic1,[600,0,600]];
uav hideobject true;
if !(local gunner uav) then {

hi 下网上载。

如果是这种情况的话我个人感觉可能是客户端的执行效果。

首先可以肯定的是这个uav是由AI控制的,那么不管在什么情况下它对服务器是肯定local的。

客户端就要看了,如果uav不属于任何小队,小队长就是其本身,那么它对其他的客户端就不是local。

换言之就是谁host mission谁就是server(同时也是server client),其他玩家全部都是client。任务建立后其他人连了进来一齐进入briefing,游戏先跑所有单位的eventhandler,再跑任务编辑器中单位的init,等这些跑完后最后跑init.sqf(链接进游戏的人mission都已经下载了,那么每个client都会跑一遍init.sqf,这里跑的init.sqf,如果上手就用local来判断,这个先稍等一下...)

编辑器里放入的所有独立AI,均对server local,那么在server中运行local总是返回true。(换言之独立AI小队所有成员对所有client !local)

如果这些AI是某个client小队的,那么这些AI只对领导他们的client local。(换言之对server !local,对非领导他们的client !local)

空置的车辆只对server local,对client !local

所以说就这架UAV,如果保持现状那么应该一直对server保持local,对所有client !local,如果大家同时执行这一脚本那么server会"wocao",client则继续执行。

这里我还没有办法帮您做测试,但我对您的脚本做了稍许修改:



目前我没有办法保证正确率不过我讲下我的思路:

attchto只能在一个client上执行,所以我选择server。

hideObject这里只对server local,所以我改成_nic = [nil, uav, "per", rHideObject, true] call RE;让所有client看到uav hide。

setdir是local,无法同步其他client,所以我添加了logic1 setPos getPos logic1;同步MP,否则logic只会对server旋转,其他client看不到uav盘旋。

祝愉快 :)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
发表于 2013-10-29 22:00:43 | 显示全部楼层
本帖最后由 下网上载 于 2013-10-29 22:04 编辑
FFUR2007SLX2_5 发表于 2013-10-29 21:37
hi 下网上载。

如果是这种情况的话我个人感觉可能是客户端的执行效果。


首先感谢版主的解释~

其次_nic = [nil, uav, "per", rHideObject, true] call RE;CALL RE 是一个官方的函数吗?
可以让本地的同步到服务器?让所有的玩家客户端都跑一遍HideObject?那个r是啥?
per又是啥?调用的这个东西实在不能理解的说

另外~我的UAV联机测试时~就算是有玩家操控
(local gunner uav)依然无法返还为true

本地的客户端UAV gunner玩家操控gunner~按道理~应该可以返还true了啊
 楼主| 发表于 2013-10-29 23:09:26 | 显示全部楼层
下网上载 发表于 2013-10-29 22:00
首先感谢版主的解释~

其次_nic = [nil, uav, "per", rHideObject, true] call RE;CALL RE 是一个官 ...
其次_nic = [nil, uav, "per", rHideObject, true] call RE;CALL RE 是一个官方的函数吗?
可以让本地的同步到服务器?让所有的玩家客户端都跑一遍HideObject?那个r是啥?
per又是啥?调用的这个东西实在不能理解的说


不好意思,重新考虑了一遍发现A3已经不用RE了。(RE原来是A2的MP框架函数remExWrite.sqf的调用名)

A3不能用了,所以我改成[{player hideObject true},"BIS_fnc_spawn",true,true] spawn BIS_fnc_MP;代替原先错误的。

另外~我的UAV联机测试时~就算是有玩家操控
(local gunner uav)依然无法返还为true

本地的客户端UAV gunner玩家操控gunner~按道理~应该可以返还true了啊


由于我无法判断您的(local gunner uav)是在什么位置,而且有非常多的可能性,如果你的gunner是AI,那么gunner uav对server local,接着有玩家代替了AI gunner做了uav gunner那么gunner uav对这个玩家client local,接着是如果判断写在attachTo的后面,那么AI gunner uav则会对最近运行attachTo的client local,玩家gunner uav保持对玩家client的local。

所以倘若你是server用debug console检查local返回false很正常。locality不是固定不变的。

还有一个方法就是先从AI gunner uav入手,我无法保证attachTo之后的gunner的locality,可以强制将其归入server试试再判断。

(gunner uav) setOwner (getPlayerUID ServerClient);
if (local gunner uav) then {};
发表于 2013-10-30 00:47:57 | 显示全部楼层
.............
发表于 2013-10-30 06:33:05 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-10-29 23:09
不好意思,重新考虑了一遍发现A3已经不用RE了。(RE原来是A2的MP框架函数remExWrite.sqf的调用名)
...

我就是在弄AA2的。。。。。work for fromz
我的(local gunner uav)写在init里
我笔记本建服务器~
台式机当房主~
然后台式机选择为UAV gunner的位置
游戏启动时~自动执行init.sqf~
这时(local gunner uav)并没有返还为true~
甚至连(player == gunner uav) 都无法返还为true。。。。
所有有关UAV的~本地/服务器 判断~我都用尽了~
除了isServer正常的
isServer倒是可以清晰地区分开~服务器和客户端的区别~~但是不能区分客户端与客户端之间的区别。。。。
 楼主| 发表于 2013-10-30 08:36:47 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-30 08:44 编辑
下网上载 发表于 2013-10-30 06:33
我就是在弄AA2的。。。。。work for fromz
我的(local gunner uav)写在init里
我笔记本建服 ...


您的现象我也确实很难解释,这样吧,您在init.sqf只运行这段话:
  1. {diag_log format ["MyClientUID: %1 (UID Num: %4), Object: %2, Object is local to: UID %3 (local to Me? %5)",getPlayerUID player,_x,owner _x,owner player,local _x];} forEach AllUnits
复制代码


分别回到台式机rpt和笔记本rpt看一下所有单位的local情况:
rpt
"MyClientUID: 90071996842377217 (UID Num: 2), Object: B Alpha 1-1:1 (FFUR), Object is local to: UID 2 (local to Me? true)"
"MyClientUID: 90071996842377217 (UID Num: 2), Object: f_uavc, Object is local to: UID 2 (local to Me? true)"
"MyClientUID: 90071996842377217 (UID Num: 2), Object: f_uavg, Object is local to: UID 2 (local to Me? true)"
"MyClientUID: 90071996842377217 (UID Num: 2), Object: f_uavd, Object is local to: UID 2 (local to Me? true)"
"MyClientUID: 90071996842377217 (UID Num: 2), Object: B Alpha 1-3:1, Object is local to: UID 2 (local to Me? true)"
"MyClientUID: 90071996842377217 (UID Num: 2), Object: B Alpha 2-1:1, Object is local to: UID 2 (local to Me? true)"

台机和笔记本显示的是不同的,比较一下Locality到底归属谁,问题究竟出在哪里...

P.S.测试环境先从纯净状态下进行,随后再放入脚本中的任意位置,脚本运行的任何一个阶段都有可能改变locality,一旦觉得有问题就要两个rpt进行比较。

还有是如果您用的是A2那么脚本中的代码必须考虑全局效果还是局部效果。像setdir, hideobject只有局部效果的代码还得要用之前提到的call RE(BIS_fnc_MP不能用)
发表于 2013-10-30 09:01:06 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-10-30 08:36
您的现象我也确实很难解释,这样吧,您在init.sqf只运行这段话:

神奇的事情发生了~~就算是我在台式机上操纵的单位~都依然被返还成false

"MyClientUID:  (UID Num: 0), Object: B 1-1-A:4 REMOTE, Object is local to: UID 0 (local to Me? false)"

四号就是我。。。。在笔记本服务器上~我被判断为服务器的local true~~~我明明是另外一台机来的啊~怎么就被判断到服务上了呢。。。。完全想不通啊
 楼主| 发表于 2013-10-30 09:25:34 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-31 13:46 编辑
下网上载 发表于 2013-10-30 09:01
神奇的事情发生了~~就算是我在台式机上操纵的单位~都依然被返还成false

"MyClientUID:  (UID ...


Object: B 1-1-A:4 REMOTE 应该在这个问题上,您的单位是Remote,遥控。

您在建服时应该用的是NEW,新建到Internet随后用台机链接,步骤和正常的加入服务器一样,而不是选择Remote,输入IP和端口,这样做就成了您所说的情况,Remote直接代替了client。
发表于 2013-10-31 09:30:01 | 显示全部楼层
看上一看
发表于 2013-11-3 09:40:02 | 显示全部楼层
{:soso_e128:} 版主桑~又来提问了:我自定义的 cutRse HUD~能否跟GUI一样 用ctrlSetPosition改变他的位置和大小呢?

我试了一下~~似乎没办法~~~~我只是想做一个能改变位置大小的HUD~~比如HUD进度条什么的。。。。{:soso_e149:}
 楼主| 发表于 2013-11-5 08:25:41 | 显示全部楼层
下网上载 发表于 2013-11-3 09:40
版主桑~又来提问了:我自定义的 cutRse HUD~能否跟GUI一样 用ctrlSetPosition改变他的位置和 ...

Hi

可以的,cutRsc除了某些types不能用之外,其他的控制方式和dialog完全一样。

进度条也可以用layer调出,改变大小可以使用ctrlSetScale。
发表于 2013-11-5 08:31:01 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-11-5 08:25
Hi

可以的,cutRsc除了某些types不能用之外,其他的控制方式和dialog完全一样。

但是我cutrse叫出定义好的HUD以后使用ctrlSetPosition和ctrlSetScale 都无效啊~位置和大小都无法改变。。。。。。。。
 楼主| 发表于 2013-11-5 09:37:16 | 显示全部楼层
下网上载 发表于 2013-11-5 08:31
但是我cutrse叫出定义好的HUD以后使用ctrlSetPosition和ctrlSetScale 都无效啊~位置和大小都无法改变。。 ...

可以的,有很多方法可以改变位置,我们可以在layer的onLoad中直接执行脚本,也可以将display储存在UiNameSpace中。

比如说在OnLoad中直接执行脚本,在Rsc定义时:



在init.sqf中我们可以配合这么写:



这样做我们就能将layer移动到我们需要的位置:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
发表于 2013-11-5 10:08:49 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-11-5 09:37
可以的,有很多方法可以改变位置,我们可以在layer的onLoad中直接执行脚本,也可以将display储存在UiName ...

十分感谢~马上试试哈
发表于 2013-11-6 19:57:36 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-11-5 09:37
可以的,有很多方法可以改变位置,我们可以在layer的onLoad中直接执行脚本,也可以将display储存在UiName ...

Rsc 移动改变大小的问题解决了~但是我又遇到一个新的问题。。。

定义class RscTitles时

class RscTitles{
  class loading1
{
  idd=1;
};
  class loading2
{
  idd=2;
};
  class loading3
{
  idd=3;
};
};

本来我以为定义一个idd就Rsc哪个就成了~但是没想到的是我Rsc  loading1 他连后面的 2 3 都出来了。。。
而且我也分不清他们之间的遮罩层次关系~如果能分开独立Rsc出来~倒是可以设置 1 cutRsc ,2 cutRsc
他现在一下全跑出来。。。。

我怎么写才能把RscTitles里面的东西分开定义? 或者多定义几个不同RscTitles? 还有就是RscTitles里面不同的图层怎么去区分它们之间的遮罩关系?哪个覆盖哪个咧?跟什么有关的呢?

再次麻烦老版你了
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-5-3 16:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表