骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
查看: 16240|回复: 40

ModuleSystem的坑爹事

[复制链接]
鲜花(160) 鸡蛋(65)
发表于 2015-8-28 05:43:26 | 显示全部楼层 |阅读模式
本帖最后由 Borr 于 2017-7-4 23:15 编辑

在制作过程中曾遇到了几个MS无比坑爹的事情。有些难以理解的错误经过了无数编译、重进程序调试才终于找到原因,居然是MS自身的问题。 这里和大家分享一下,如果诸位有发现其他的,请也分享一下,减少大家被坑的次数

(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)


(点击展开 / 收起)

评分

参与人数 2荣誉 +1 第纳尔 +200 互助 +5 收起 理由
蛋清 + 1 + 150 + 3 您的帖子很有价值!
海涵狮心王理查 + 50 + 2 乐于助人!

查看全部评分

鲜花鸡蛋

蛋清  在2016-7-11 14:11  送朵鲜花  并说:进来查坑交学费
蛋清  在2016-7-11 14:11  送朵鲜花  并说:进来查坑交学费
蛋清  在2016-7-11 14:11  送朵鲜花  并说:进来查坑交学费
蛋清  在2016-7-11 14:11  送朵鲜花  并说:进来查坑交学费
蛋清  在2016-7-11 14:11  送朵鲜花  并说:进来查坑交学费
oolonglgx(老李)  在2016-1-20 18:33  送朵鲜花  并说:确实。235也折磨过俺。
鲜花(231) 鸡蛋(13)
发表于 2015-8-28 08:44:58 | 显示全部楼层
第一个和第三个看得懂,第二个看不懂
鲜花(178) 鸡蛋(2)
发表于 2015-8-28 09:05:36 来自手机 | 显示全部楼层
我遇到过几次,编译后,进入游戏,玩家属性暴增,然后重新编译,恢复正常了,
头像被屏蔽
鲜花(403) 鸡蛋(2)
发表于 2015-8-28 10:24:09 | 显示全部楼层
MS表示已被坑
鲜花(29) 鸡蛋(0)
发表于 2015-8-28 14:23:21 | 显示全部楼层
呵呵 都看不懂
鲜花(2140) 鸡蛋(8)
发表于 2015-8-28 18:08:16 | 显示全部楼层
这几条都没有用到过。。。
鲜花(48) 鸡蛋(0)
发表于 2015-8-28 18:14:12 | 显示全部楼层
rubik 发表于 2015-8-28 18:08
这几条都没有用到过。。。

啥时候更新捏  R大
鲜花(1423) 鸡蛋(47)
发表于 2015-8-28 19:56:43 | 显示全部楼层
borr叔诈尸了,好久不见~

不过降到地表这条语句为什么会出现这样的纰漏呢?是因为语句的计算原理之类的原因嘛?
鲜花(160) 鸡蛋(65)
 楼主| 发表于 2015-8-29 01:39:47 | 显示全部楼层
蛋清 发表于 2015-8-28 03:56
borr叔诈尸了,好久不见~

不过降到地表这条语句为什么会出现这样的纰漏呢?是因为语句的计算原理之类的原 ...

不知道,也许是设计时避免卡进碰撞体吧,但基本上是自做聪明的坑。

话说你的mod做的咋样啦
鲜花(1423) 鸡蛋(47)
发表于 2015-8-29 09:31:38 | 显示全部楼层
Borr 发表于 2015-8-29 01:39
不知道,也许是设计时避免卡进碰撞体吧,但基本上是自做聪明的坑。

话说你的mod做的咋样啦

在等谅大复活后的移植,最近自己又开了个坑正在填~
鲜花(0) 鸡蛋(0)
发表于 2015-9-1 21:59:09 | 显示全部楼层
(store_div,":post_y_1",":post",100),
(store_mod,":post_x_1",":post",100),
请教各位大侠,坐标运算中store_mod(取余数)适合作用,不理解

点评

常用一:循环时,每N次只执行一次 常用二:用来排序。 常用三:用不同的数位,一个变量存多个数据  发表于 2015-9-2 23:30
鲜花(1363) 鸡蛋(2)
发表于 2015-9-2 16:29:40 | 显示全部楼层
地表的那个我也碰到了,现在总算是知道原因了。
鲜花(2140) 鸡蛋(8)
发表于 2015-9-6 22:31:29 | 显示全部楼层
本帖最后由 rubik 于 2015-9-6 22:41 编辑

很早以前发现的坑爹事:

官方论坛上Lav发布的header_operations.py详解里的troop_get_upgrade_troop
troop_get_upgrade_troop                  = 1561  # (troop_get_upgrade_troop, <destination>, <troop_id>, <upgrade_path>),
                                                 # Retrieves possible directions for non-hero troop upgrade. Use 0 to retrieve first upgrade path, and 1 to return second. Result of -1 means there's no such upgrade path for this troop.

官方自带的header_operations.py里的troop_get_upgrade_troop
troop_get_upgrade_troop                = 1561   # (troop_get_upgrade_troop,<destination>,<troop_id>,<upgrade_path>), #upgrade_path can be: 0 = get first node, 1 = get second node (returns -1 if not available)

这两者都说,如果没有后续的升级兵种,就返回-1。按常规来讲,没有找到符合条件的兵种的时候,返回值应该就是-1。 但实测发现,返回的是0(即玩家)。 早期的骑砍版本,仍然根据返回值是否大于-1来判定兵种是否可以升级,结果玩家在村子里招募到XX个玩家,因为顶级兵升级成玩家了。

评分

参与人数 1第纳尔 +10 互助 +1 收起 理由
海涵狮心王理查 + 10 + 1 乐于助人!

查看全部评分

鲜花(160) 鸡蛋(65)
 楼主| 发表于 2016-1-2 01:47:07 | 显示全部楼层
新更一坑。
鲜花(2140) 鸡蛋(8)
发表于 2016-1-3 00:21:39 | 显示全部楼层
本帖最后由 rubik 于 2016-1-3 00:37 编辑

我发现了一个算是骑砍MS里最大的坑了。 同一个mission_template里面,那些关于特殊时刻的触发器(比如ti_on_agent_killed_or_wounded,ti_on_agent_hit等)如果使用过多次,很容易出现冲突,说的就是返回值问题。

就以ti_on_agent_killed_or_wounded为例。如果同一个mission_template里面,前面一个或者几个以ti_on_agent_killed_or_wounded为条件的触发器设了返回值,最后一个以ti_on_agent_killed_or_wounded为条件的触发器没有设返回值。 最终的结果完全出乎意料之外。最后一个没有设返回值,前面几个以ti_on_agent_killed_or_wounded为条件的触发器设的返回值都无效,相当于没有设返回值。 如果都设了返回值,以最后一个设的返回值为准。 这太坑了,前面的几个同条件的触发器已经设了返回值,凭什么最后一个没有设返回值,就把前面设的返回值抹去? 当然,这并不意味着,同样的触发条件,最后一个触发器的内容抹掉了前面所有触发器的内容。 内容方面,只要不冲突,几个触发器里的内容都是有效的,可以共存的。比如ti_on_agent_killed_or_wounded,可以实现被锐器杀死变成打晕,还可以实现NPC击倒敌人,获得额外的武器点。分两个触发器写,两个效果都是有效的。只是返回值方面会出问题。

那些把同条件的触发器合并写在一起的人,是无法体会这个有多坑。反过来,这也教导了所有人,在同一个mission_template里面,要把同条件的触发器合并写在一个触发器里面。 这里的同条件,都是指的特殊时刻相同,而不是指检测周期相同。

评分

参与人数 1第纳尔 +10 互助 +1 收起 理由
海涵狮心王理查 + 10 + 1 乐于助人!

查看全部评分

鲜花(1423) 鸡蛋(47)
发表于 2016-1-3 16:35:41 | 显示全部楼层
rubik 发表于 2016-1-3 00:21
我发现了一个算是骑砍MS里最大的坑了。 同一个mission_template里面,那些关于特殊时刻的触发器(比如ti_on ...

最近也发现了类似这个特殊条件的问题。我在mission_template里面写了大概七八个ti_on_agent_hit的触发器来影响伤害返回值,然后就时不时的会出现-2147483648 这样的伤害数字,然后武器熟练度暴增到1000,穿盾秒杀什么的
鲜花(160) 鸡蛋(65)
 楼主| 发表于 2016-1-6 17:11:59 来自手机 | 显示全部楼层
楼上这个估计是主程序触发用到了reg吧,内容被覆盖掉了

点评

整个触发器是独立运行,倒是也没涉及到reg的问题,全都是临时变量……之前整合了一下触发器好多了  发表于 2016-1-10 09:58
鲜花(2140) 鸡蛋(8)
发表于 2016-1-6 17:43:18 来自手机 | 显示全部楼层
本帖最后由 rubik 于 2016-1-6 17:45 编辑
蛋清 发表于 2016-1-3 16:35
最近也发现了类似这个特殊条件的问题。我在mission_template里面写了大概七八个ti_on_agent_hit的触发器来 ...


保险起见,加一个val_max操作,强制最低伤害为0。即便真的出现bug,计算的值不正确或者算法本身有问题,也不会出现太离奇的结果。这是治标,治本还是要排查bug。

对了,战团最高伤害限定为500,不知道通过改触发器返回值能不能超过500。就算能超过500,也最好卡到500。
鲜花(2140) 鸡蛋(8)
发表于 2016-2-8 19:54:57 来自手机 | 显示全部楼层
本帖最后由 rubik 于 2016-2-8 20:21 编辑

又新增一条坑爹的。那个获取agent某块骨头位置的操作仅限于agent活着的情况,agent倒下之后,再用这个操作就容易跳出。我的MOD已经应验,我在代码里获取玩家头骨的位置,以此为基准来调整镜头的位置,结果玩家一倒下就跳出。

究其原理应该是agent倒下之后,尸体会析化消失,骨头也不存在了,获取骨头位置就自然出问题。我问了一些玩家,开启保留尸体也无济于事。

获取agent骨头位置的操作特有用,特别是获取头骨(编号9)的位置。获取头骨的位置(头骨的最低点,看起来是脖子的位置),再往上移动40个单位就能一次性确定agent头顶血条的位置。没有这个操作的时候,确定头顶血条的位置特麻烦,要判断agent是否骑马。如果人物或者马匹的骨骼被放大了,血条位置就又要特别地一一判断然后进行设定。

获取头骨的位置还可以判断是否爆头,用ti_on_agent_hit能获得被击中的pos,只要这个pos等于或高于agent头骨的位置,就是爆头了。

骨骼的编号,根据官方lav提供的ms版本,他提到用openBRF打开人物或者马匹的骨骼的brf文件,就能获取骨骼的名字和编号,右侧的预览图还可以直观看到具体是哪一块骨骼,相应的mesh线框会加粗。

@oolonglgx

点评

想起来了,当初连枷遇到过同样的问题,一死就跳出,也没细想,就直接加了个判断agent为生的条件就不管了  发表于 2016-2-8 23:50

评分

参与人数 1第纳尔 +10 互助 +1 收起 理由
海涵狮心王理查 + 10 + 1 原创内容,值得鼓励!

查看全部评分

鲜花(574) 鸡蛋(44)
发表于 2016-2-8 20:29:36 | 显示全部楼层
rubik 发表于 2016-2-8 19:54
又新增一条坑爹的。那个获取agent某块骨头位置的操作仅限于agent活着的情况,agent倒下之后,再用这个操作就 ...

ti_on_agent_hit现在直接有一个param给出受击骨骼,当初跟老李讨论相关问题时发现的,很省事,连判断都省了。
用openbrf查看骨骼号这个功能我也忘了,自己傻傻地写了段代码去找出了号和骨骼的对应关系。。
鲜花(2140) 鸡蛋(8)
发表于 2016-2-8 22:53:57 来自手机 | 显示全部楼层
本帖最后由 rubik 于 2016-2-8 23:01 编辑
海涵狮心王理查 发表于 2016-2-8 20:29
ti_on_agent_hit现在直接有一个param给出受击骨骼,当初跟老李讨论相关问题时发现的,很省事,连判断都省 ...


我认为谁把官方lav版MS里head_operation.py里关于所有操作的注释以及说明都翻译一遍的话,给个精华都不为过。这个版本的MS解决了我的很多困惑。

举个例子,盾牌的面积问题。非圆盾有长和高两个参数。他的注释里写得很清楚,length是盾牌中心到右,到左,到顶的距离,height是盾牌中心到底的距离。关键地,他指出要设置精度为100才能获得正确的盾牌height。这是我以前万万没想到的。

看了他的注释。我就知道骑砍的盾牌只有方盾和长方盾,外形都是虚的。长方盾是下摆加长的方盾,上端并不加高。
鲜花(2140) 鸡蛋(8)
发表于 2016-2-14 23:11:23 | 显示全部楼层
又更新一坑。 "game_get_skill_modifier_for_troop"这个script的作用是让特定的兵种获得特定技能的额外加成,绿字显示。 对其他技能加成没有什么问题,但千万不能对tracking(跟踪)技能进行加成,我有血的教训。我曾经添加了一本工具书,让持有这本书的NPC的跟踪技能获得1点额外加成。 结果玩家在大地图上行走的时候,走两步就一卡,走两步就一卡。注释掉相关的代码,在大地图上一点都不卡了。

也不要玩文字游戏,把tracking(跟踪)技能的名字变一下。没用的,游戏引擎是认技能ID的。我之前就把跟踪和向导合并,屏蔽向导,把向导的效果加到跟踪里面,最后把跟踪改名为向导。那本工具书名义上是加向导,但是实际上是加的跟踪,结果卡得一塌糊涂。后来赶紧换回来,那本工具书就又真正地加向导,不加跟踪了。虽然解决了卡的问题,但那个时候没有真正弄明白为什么卡。
鲜花(574) 鸡蛋(44)
发表于 2016-2-29 21:20:33 来自手机 | 显示全部楼层
新加的map icon必须编译过一遍后才能使用,直接加map icon然后应用给party是不行的。。
鲜花(33) 鸡蛋(0)
发表于 2016-4-12 07:18:58 | 显示全部楼层
rubik 发表于 2016-2-14 23:11
又更新一坑。 "game_get_skill_modifier_for_troop"这个script的作用是让特定的兵种获得特定技能的额外加成 ...

难道这个加成是额外运算的。。。? 所以每走一步就会算周围情况
鲜花(1423) 鸡蛋(47)
发表于 2016-4-24 16:09:56 | 显示全部楼层
更新一个坑:
ti_on_agent_hit这一条件返回的造成伤害的物品ID是武器本身而非子弹。也就是说如果一个agent使用猎弩射出钢弩箭对另一agent造成伤害时,该条件返回的物品id是猎弩而非钢弩箭
鲜花(2140) 鸡蛋(8)
发表于 2016-4-24 16:35:52 | 显示全部楼层
本帖最后由 rubik 于 2016-4-24 16:39 编辑
蛋清 发表于 2016-4-24 16:09
更新一个坑:
ti_on_agent_hit这一条件返回的造成伤害的物品ID是武器本身而非子弹。也就是说如果一个agent ...

ti_on_agent_hit的参数众多,第五个参数即为远程武器弹药的ID(如果使用的是远程武器),这个坑坑在官方自带的MS对于很多东西的解释过于简略。

ti_on_agent_hit               = -28.0 # Agent has been damaged with a weapon attack
    # trigger param 1 = damage inflicted agent_id
    # trigger param 2 = attacker agent_id
    # trigger param 3 = inflicted damage
    # trigger param 4 = hit bone
    # trigger param 5 = item_id of missile used to attack (if attack was with a ranged weapon)
    # reg0            = weapon item_id
    # pos0            = position of the hit area, rotation fields contain the direction of the blow
    # If (set_trigger_result) is used in the code with operation parameter equal or greater than zero, it will override the inflicted damage.

鲜花鸡蛋

蛋清  在2016-4-24 16:57  送朵鲜花  并说:是的,这个坑在没用lav注释的版本之前坑了我半天
鲜花(1423) 鸡蛋(47)
发表于 2016-4-25 18:00:43 | 显示全部楼层
再补个坑,跟汉化有关。
dialog里面上下标识为start:close_window的组会在编译时根据列表位置加上.x后缀方便汉化识别,然后坑就来了,如果MOD在这个文件的非尾端位置加了start:close_window的话,就会导致原有的同标识对话出现错乱。
避免方法:尽可能避免start:close_window对话,中间多跳转一次。实在不可避免就要做好一个一个往下重新排布汉化的觉悟
鲜花(1423) 鸡蛋(47)
发表于 2016-5-11 12:18:56 | 显示全部楼层
刚被坑完,还热乎着……其实也怪自己眼瞎没仔细看native,发出来提醒一下后人:
(store_sqrt, <destination_fixed_point>, <value_fixed_point>),
类似这样的操作语句,要注意: <value_fixed_point>这种变量必须提前设置好精度:(set_fixed_point_multiplier, 1),
否则就要按照比例进行计算再往里面填数
不过我觉得这种低级错误除了我也没别人会犯了。。。

点评

真的当然了。不过最坑的是sqrt(0)返回值不是零。  发表于 2016-5-12 01:36
http://bbs.mountblade.com.cn/forum.php?mod=redirect&goto=findpost&ptid=1883209&pid=7569198  发表于 2016-5-11 14:11
鲜花(41) 鸡蛋(0)
发表于 2016-5-17 00:01:19 | 显示全部楼层
本帖最后由 zhl199565 于 2016-5-17 09:14 编辑

为什么我觉得余数并没有问题- -.........首先数学上的余数都是关于自然数的除法....是不包含任何负数过程的....(当然你自己可以定义建立模型,你定义一个()数的平方为负都可以...,名为xx氏数论),(补充:这里不是指虚数,而是其实数的平方就为负- -,表达的目的是其所谓定理上的不同(例子没举好,补充说明把)......其实这类例子有很多,比如欧式空间和黎曼空间)...
而对计算机而言所谓余数的正负便由被除数的正负来决定,而商的正负是被除数和除数异同决定的....这种人为的设定也是根据人的思维来决定的...
比如-3/-2的商就是1,余数就为-1,这没问题把, 你可以反过来验证一下,商*除数+余数=被除数.....余数的绝对值小于除数的绝对值...

点评

一个数平方的为负,说的就是数学里的虚数。  发表于 2016-5-17 00:45
鲜花(160) 鸡蛋(65)
 楼主| 发表于 2016-5-17 16:19:19 | 显示全部楼层
zhl199565 发表于 2016-5-16 10:01
为什么我觉得余数并没有问题- -.........首先数学上的余数都是关于自然数的除法....是不包含任何负数过程的 ...

这里的重点是程序的可靠性。总不能写行代码,还老要考虑是不是有的时候不适用要打补丁。

至于数学问题,mod定义就是0 到 n-1。 引入负数是多余的。
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站 ( 鄂ICP备07001403号 )

GMT+8, 2018-1-24 19:30 , Processed in 0.255156 second(s), 97 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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