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

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
查看: 4231|回复: 18

[讨论] 玩JB的过来看看。。。。。。。。。。。。。。。这个脚本哪里错吧?

[复制链接]
发表于 2013-4-24 18:49:35 | 显示全部楼层 |阅读模式
本帖最后由 下网上载 于 2013-4-24 18:50 编辑

{:soso_e101:} 说过很多次JB是脚本的拼音缩写啊。。。。

说下问题,本来呢我想让随机事件脚本里有这么个功能,就是刷出来的兵 随机过智商的兵 以及空投的敌人补给品 都会随机地被敌人去装上诡雷,让玩家摸尸体和捡敌人装备箱时投鼠忌器

但是由于这个脚本老是有问题会随机地找不到变量。。。我觉得好奇怪。。。如果直接在一个小单位身上调用是没问题的。。那么是不是证明脚本没问题?但是到我的脚本里跑时就会有时找不到变量。。。一共就三套脚本 刷兵 空投 和 随机 skill 三个都会有一定几率调用到诡雷脚本。。但是三个似乎都可能会突然找不到变量。。而且是随机。。。我完全无法理解。。
我所有的脚本都是无报错的。。。但是一旦去跑诡雷脚本就可能死球。。但是诡雷脚本在单兵身上调用完美执行。。那么具体是啥问题???
一下是脚本
_lei = _this select 0;
_bomb = Ceil random 2.5
_bb = random 100  //埋雷几率
?((not alive _lei)AND(player distance _lei <= 200)):goto "random"  //如果该单位死了以及靠近玩家200米 则随机埋雷
?((not alive _lei)AND(player distance _lei >= 200)):exit;                  //如果距离大于200米就算球。。退出脚本
?!(_lei iskindof "man"):goto "sp_box"//如果单位不是人那么就去按照支援箱的方式埋雷
?(_bomb == 1):goto "man"//三种埋雷方式【这里有点乱没整理】
?(_bomb == 2):goto "man_2"
?(_bomb == 3):goto "man_1"
#man_1
@((not alive _lei)AND(player distance _lei <= random 15))//该单位死了并且距离玩家小于15米就起爆
~random 10
_mine = "APERSMine_Range_Ammo" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0];
exit;
#man
@(player distance _lei <= random 15)//如果该单位接近玩家15米则直接炸【人弹】
~random 10
_mine = "M_NLAW_AT_F" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0];
exit;
#man_2
@(getdammage _lei >= 0.6)//如果这个单位HP少于0.4就炸【模拟玩家打中他身上的爆炸物】
~random 5
_mine = "M_NLAW_AT_F" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0];
exit;
#sp_box
@(player distance _lei <= random 15)//【支援箱子爆炸跟死亡单位诡雷类似】
~random 25
?(_bb <= 40):_mine = "M_NLAW_AT_F" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0];_lei allowDammage true;_lei setdammage 1;
exit;
#random//[随机起爆,按概率算_bb 随机数值小于15的情况下]
~2
?(_bb <= 15):_mine = "APERSMine_Range_Ammo" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0];
exit;


就这样了。。。。脚本单兵运行没事。。。其他刷兵脚本运行也正常。。刷兵变量也没写错。。调用脚本变量也没写错。。。。但是随机地。。就找不到变量。。不断地跑进检测条件里面然后让我的电脑。。。。咔咔咔咔咔咔咔咔咔咔咔。。。。又运行不下去。。。

另外如果要检测一个变量是否存在这样写行不行?
?(_lei ==objnull):exit;  这样如果变量不存在是不是就退出脚本了?
发表于 2013-4-24 20:46:53 | 显示全部楼层
sqs格式不熟,纯支持帮顶
 楼主| 发表于 2013-4-24 21:10:43 | 显示全部楼层
2fast 发表于 2013-4-24 20:46
sqs格式不熟,纯支持帮顶

比sqf简单吧不过程序猿似乎很讨厌goto
发表于 2013-4-25 09:16:22 | 显示全部楼层
难道你写成死循环了吗?只是猜测....
 楼主| 发表于 2013-4-25 11:28:38 | 显示全部楼层
qevhytpl 发表于 2013-4-25 09:16
难道你写成死循环了吗?只是猜测....

不是死循环的问题。。设置了exit;的条件的
发表于 2013-4-25 12:30:38 | 显示全部楼层
但是由于这个脚本老是有问题会随机地找不到变量。。。我觉得好奇怪。。。如果直接在一个小单位身上调用是没问题的。。那么是不是证明脚本没问题?但是到我的脚本里跑时就会有时找不到变量。。。一共就三套脚本 刷兵 空投 和 随机 skill 三个都会有一定几率调用到诡雷脚本。。但是三个似乎都可能会突然找不到变量。。而且是随机。。。我完全无法理解。。
我所有的脚本都是无报错的。。。但是一旦去跑诡雷脚本就可能死球。。但是诡雷脚本在单兵身上调用完美执行。。那么具体是啥问题???

没有仔细看,但是从你以上所说的猜测可不可能是race condition?就好像你的变量还没有被上一个脚本生成,这个脚本就开跑了,于是拿不到值。
 楼主| 发表于 2013-4-25 14:26:55 | 显示全部楼层
2fast 发表于 2013-4-25 12:30
但是由于这个脚本老是有问题会随机地找不到变量。。。我觉得好奇怪。。。如果直接在一个小单位身上调用是没 ...

我也好奇得一逼。。
发表于 2013-4-25 16:05:40 | 显示全部楼层
2fast 发表于 2013-4-25 12:30
但是由于这个脚本老是有问题会随机地找不到变量。。。我觉得好奇怪。。。如果直接在一个小单位身上调用是没 ...


最后一句十分有道理,具体情形大概是这样,第一个局部变量参与运行了整套脚本,但是脚本有循环检测,当第一套局部运行的脚本不应当继续运行时,脚本自身无法退出(形成得不到值的死循环),第二套同样的局部运行的脚本又开始运行了,悲剧的是这些死循环积累起来,因为后面有第五套、第六套。。。。第十套。。。。产生了不良影响。
发表于 2013-4-25 16:40:16 | 显示全部楼层
qevhytpl 发表于 2013-4-25 16:05
最后一句十分有道理,具体情形大概是这样,第一个局部变量参与运行了整套脚本,但是脚本有循环检测,当 ...

恩 你用player groupChat str _lei 放进你的脚本才察看到底是什么原因。我估计是上一层脚本的问题,而不是这一层。

反正解决bug的死办法就是去一层一层的追踪脚本的运行情况,总有一个地方会找到原因的
发表于 2013-4-25 17:06:18 | 显示全部楼层
本帖最后由 qevhytpl 于 2013-4-25 17:08 编辑

花了一个小时改了下sqf。看着舒服多了。
  1. private ["_lei","_my_distance","_bb","_mine"];

  2. _lei = _this select 0;

  3. if{(not alive _lei)AND(player distance _lei >= 200)}exitwith{};

  4. if{(not alive _lei)AND(player distance _lei <= 200)}then
  5. {
  6. _bb = random 100;

  7. sleep 0.5;

  8. if(_bb <= 15)then{_mine = "APERSMine_Range_Ammo" createVehicle [(getpos _lei select 0), (getpos _lei select 1),0]};

  9. };

  10. if(_lei iskindof "man")then{

  11. _my_distance = random 15;

  12. switch (Ceil random 2.5)do

  13. {
  14.         case 1:        {
  15.         while{true}do{
  16.         if((not alive _lei)AND(player distance _lei <= _my_distance))then{_mine = "APERSMine_Range_Ammo"createVehicle[(getpos _lei select 0),(getpos _lei select 1),0];};
  17.         sleep 1;
  18.         if((not alive _lei)AND(player distance _lei <= _my_distance))exitwith{};
  19.         };
  20.         };
  21.         case 2:        {
  22.         while{alive _lei}do{
  23.         if(player distance _lei <= _my_distance)then{_mine = "APERSMine_Range_Ammo"createVehicle[(getpos _lei select 0),(getpos _lei select 1),0];};
  24.         sleep 1;
  25.         };
  26.         };
  27.         case 3:        {
  28.         while{alive _lei}do{
  29.         if(getdammage _lei >= 0.6)then{_mine = "APERSMine_Range_Ammo"createVehicle[(getpos _lei select 0),(getpos _lei select 1),0];};
  30.         sleep 1;
  31.         };
  32.         };
  33. };
  34. }else
  35. {
  36.         while{true}do{
  37.         if(player distance _lei <= _my_distance)then{_mine = "APERSMine_Range_Ammo"createVehicle[(getpos _lei select 0),(getpos _lei select 1),0];_lei setdammage 1;};
  38.         sleep 1;
  39.         if(player distance _lei <= _my_distance)exitwith{};
  40.         };
  41. };


复制代码

本帖子中包含更多资源

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

x
发表于 2013-4-25 17:06:47 | 显示全部楼层
?(_bomb == 1):goto "man"//三种埋雷方式【这里有点乱没整理】
?(_bomb == 2):goto "man_2"
?(_bomb == 3):goto "man_1"

换成switch (_bomb) do {
case (1):{};
case (2):{};
case (3):{};
};
试试。

?(_lei ==objnull):exit;

换成if (isNull _lei) exitwith {};
_lei == objnull不具意义
发表于 2013-4-25 17:09:01 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-4-25 17:06
换成switch (_bomb) do {
case (1):{};
case (2):{};

版主正解!
 楼主| 发表于 2013-4-25 17:24:34 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-4-25 17:06
换成switch (_bomb) do {
case (1):{};
case (2):{};

虽然不是看得很懂,但是理解精神。感谢基友帮忙
 楼主| 发表于 2013-4-25 17:38:46 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-4-25 17:06
换成switch (_bomb) do {
case (1):{};
case (2):{};

谢谢版主大神指导

如果这样的情况呢?

如果一个小组内有两架载具如何利用typeof命令返还两架载具各自的classname?

我有办法返还一个组所有单兵的classname

但是要是这个组有载具的话或者两架甚至三架四架载具是一个小组那怎么弄?

一个小组我固定他是十个人然后分别返还他们各自的classname
_classname0 = (typeof (units group _bing select 0))
_classname1 = (typeof (units group _bing select 1))
_classname2 = (typeof (units group _bing select 2))
_classname3 = (typeof (units group _bing select 3))
_classname4 = (typeof (units group _bing select 4))
_classname5 = (typeof (units group _bing select 5))
_classname6 = (typeof (units group _bing select 6))
_classname7 = (typeof (units group _bing select 7))
_classname8 = (typeof (units group _bing select 8))
_classname9 = (typeof (units group _bing select 9))
这样弄

但是载具貌似这样弄
_classname = (typeof vehicle _bing)

如果分别去返还组内的载具难道要这样搞?
_classname0 = (typeof vehicle (units group _bing select 0))
_classname1 = (typeof vehicle (units group _bing select 1))
_classname2 = (typeof vehicle (units group _bing select 2))
这样做能不能做到既能读取出载具也能读取出单兵单位?

这样做的话如果是一个有几个乘员的载具【比如M1坦克】,还能被定义成units group _bing select 1么?这样定义出来号数是,载具单位还某个组员?

如果是纯载具小组呢?一个小组有飞机有坦克然后用上面读取的方式读出来的是士兵还是载具?

我知道如果直接_classname = (typeof vehicle _bing)这样肯定是读出载具的classname
_classname0 = (typeof vehicle (units group _bing select 0)) 这样貌似应该是读出单兵而已吧?
那么问题又回到开始。。。一个纯载具的小组怎么按顺序返还小组内的载具classname?????
诚心求教
 楼主| 发表于 2013-4-26 10:33:09 | 显示全部楼层
FFUR2007SLX2_5 发表于 2013-4-25 17:06
换成switch (_bomb) do {
case (1):{};
case (2):{};

好了上个问题否决掉

接着提问

现在有个单位我想让他随机加进附近的友军组里怎么实现?该单位可运行脚本要求就是附近的友军组就算不定义名字他也能加进去。

还有就是,怎么去定义一个正在和玩家交战的敌军单位?要求也是该单位不需要设置名字也能被定义到然后执行脚本。。。我目前用cursorTarget然后去验证是不是敌军 我感觉这样做不好。。但说不上来哪里不好
来问问有没有更好的办法去定义与玩家交战的在玩家附近的单位。

嗯 就这两个问题。。麻烦斑竹不吝赐教
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-5-2 23:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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