关于last_damage_from
2007/5/6 22:04:23
这个问题实质上就是判断"凶手"的问题。呵呵,在现实中,这也是一个很棘手的问题,有推理还得有刑侦手段。那么在一个MUD里,如何判断一个杀人凶手呢?
从ES2设计的结构来看是这样进行的。ES2假定了每一次的死亡都是由于战斗原因导致的。既然是战斗,那么到底是谁在最后击中被害人,那么这个凶手不就是出手的这个人了么?于是,我们可以看到:在COMBAT_D里的,只要计算后A打中B,并对B造成了伤害,并不是简单地直接减精减气,而是通过F_DAMAGE里的receive_damage()等几个函数来实现的。这里就要注意了,receive_damage()等等这几个函数都有一个第三个参数,伤害者。只有有了这个伤害者,被伤害者B身上才会有last_damage_from--A的ID。
然后在die()的函数里,会寻找这个伤害者,只有这个伤害者在的情况下,系统才会认定有凶手,那么有凶手才是正常死亡。是正常死亡才会调用COMBAT_D里的kill_reward()函数,那么有关对死者的减值等等处理才会正常进行。
ES2的这种设计思路太简单与绝对化了,带来了很多问题。加上不规范的编程设计方面:我不知道原作者为什么把象receive_damage()这样的函数设成参数不定状态。这样许多的新巫师在不明就理的情况下,往往会省略掉第三个参数。比如在许多的perform的伤害中,这样的情况比比皆是。所以这种情况致死的时候往往都不会准确地记录最后一次伤害者。如果之前的记录下的last_damage_from与后者一致的话还好说。不一致的话则问
题多多。其主要表现为下列:
首先玩家可以利用这种不调用减武功减经验的的所谓"假死"来牟利。象丐帮的天魔解体、星宿的地狱炼刹。还有利用一些采用condition来控制时间的要药要钱等也会在这个漏洞出现金钱等等方面的BUG。
其次可以利用这个方面的陷害别的玩家增加PK数。比如先向玩家攻击,即使这个玩家很小心地halt了,但只要被其击中一下哪怕只是很轻的伤,这就已经记录上了last_damage_from,然后此人就可以找一个不会记录第三个参数的减气伤害的地方直接伤害致死。OK,系统找到了last_damage_from,好那个无幸的玩家就成了杀人犯。
三是造成混乱,大家比了一次武也许都记录上了last_damage_from,突然因其它原因致死,谣言出现:叮当被胖胖杀死了。真是莫名其妙。
还有一个小问题就是:ES2对last_damage_from是采用的记录killer的ID,而我后来则是决定采用的是记录object.当然两者各有利弊。只是前者会产生误判,比如ID相同的玩家与NPC。同时也会有少量的漏判。比如,killer在伤害后与死亡前这段时间quit了并短时间内不上线。而后者只会有上述的漏判,却不会有错判。于是综合比较我改成了
object型.
经过一段时间的摸索。我首先确立了一个思想中心:完全准确并毫无差错地判断"凶手"的想法是不切实际也是不可能的。就算是在MUD里的死亡也是千变万化的。战斗死亡只是一种,还有中毒,中机关,跳崖等等。我要努力的方向是"不错判"。系统找不出凶手的死亡应该是客观存在的。
其次去除掉一些不应该死亡的漏洞。比如象打坐吐呐炼剑这些直接add("qi",-**)的地方,就不应该致死。凡是直接减精减气的地方前面都要加上判断。如果一次减20,那么在前一步不大于20就不应该执行下一步。在这样的情况下我们基本可以认定:再出现的死亡原则上都应该是正常的死亡。既然是正常的死亡,那么不管我们有没有记录到
last_damge_from,都应该是执行COMBAT_D的kill_reward()
第三,凡是在具体文件里用到类似receive_damage()这些函数的必须要加上第三个参数。凡是在具体文件里直接调用玩家的die()时之前必须要加上对于last_damage_from的设定。指定那个凶手。关于下毒的condition里也得加上施毒的记录。
第四,在此情况下可能还会有漏
下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms