找回密码
 点一下
查看: 4482|回复: 12

神奇的TriggerSleepAction同步

[复制链接]
发表于 2009-3-13 00:34:39 | 显示全部楼层 |阅读模式
  1. if GetLocalPlayer() == Player(0) then
  2.     call TriggerSleepAction(10.0)
  3.     call SetUnitPosition(u,0,0)
  4. else
  5.     call TriggerSleepAction(20.0)
  6.     call SetUnitPosition(u,0,0)
  7. endif
复制代码

上面的代码中,u是某个单位。对于玩家(0),等待10秒后移动这个单位。对于其他人,等待20秒。
怎么看都应该掉线。

但结果并不掉线,而是在10秒后执行。非常的神奇。

根据一些试验,推测他的原因是当每个玩家同时开始TriggerSleepAction的时候,
第一个结束TriggerSleepAction的玩家会发出消息宣称完成,而后所有人都停止当前的等待。

这是因为他本身就不精确,会受到例如网速和机器卡住甚至暂停游戏的计时影响

最先发现这一点的是一个3c玩家,他加入别人主机,开变速齿轮,游戏变得一卡一卡的,
但总体速度没有加快(因为他不是主机)。但TriggerSleepAction却加快了很多倍,
某些技能是用sleepaction做的cooldown,这个cd变短了。

例如,MK的30级大招,死掉时范围爆炸。本来有45秒cd,把TriggerSleepAction(45.0)直接改成TriggerSleepAction(1.0)

不影响同步,而且所有人的数据都被改了。。结果那MK带满了复活就跑去别人基地。。硬生生把基地给炸飞了。。。

评分

参与人数 2威望 +11 收起 理由
kook + 10 oh..my
血戮魔动冰 + 1 不错~~

查看全部评分

发表于 2009-3-13 04:13:27 | 显示全部楼层
佩服!
这么一来除了Game cache又发现了新的漏洞了 哈哈。

会不会是估计涉及非触发一类的等待时间的函数都要同步?开始一次 结束一次?
回复

使用道具 举报

发表于 2009-3-13 12:27:11 | 显示全部楼层
难道以后所有等待都只能用TimerStart了 ?
回复

使用道具 举报

发表于 2009-3-13 15:30:40 | 显示全部楼层
回LS,Timer自被使用起始,貌似就没有什么Bug。
回复

使用道具 举报

发表于 2009-3-13 15:46:16 | 显示全部楼层
TriggerSleepAction用于长时间等待本身就不合适,很不精确
长时间要么用Timer要么用PolledWait,都是没BUG的
回复

使用道具 举报

发表于 2009-3-13 15:50:36 | 显示全部楼层
PolledWait这是什么东西?~~
回复

使用道具 举报

发表于 2009-3-13 16:59:20 | 显示全部楼层
BJ函数
  1. function PolledWait takes real duration returns nothing
  2.     local timer t
  3.     local real  timeRemaining
  4.     if (duration > 0) then
  5.         set t = CreateTimer()
  6.         call TimerStart(t, duration, false, null)
  7.         loop
  8.             set timeRemaining = TimerGetRemaining(t)
  9. &#160; &#160; &#160; &#160; &#160; &#160; exitwhen timeRemaining <= 0
  10. &#160; &#160; &#160; &#160; &#160; &#160; // If we have a bit of time left, skip past 10% of the remaining
  11. &#160; &#160; &#160; &#160; &#160; &#160; // duration instead of checking every interval, to minimize the
  12. &#160; &#160; &#160; &#160; &#160; &#160; // polling on long waits.
  13. &#160; &#160; &#160; &#160; &#160; &#160; if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
  14. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; call TriggerSleepAction(0.1 * timeRemaining)
  15. &#160; &#160; &#160; &#160; &#160; &#160; else
  16. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
  17. &#160; &#160; &#160; &#160; &#160; &#160; endif
  18. &#160; &#160; &#160; &#160; endloop
  19. &#160; &#160; &#160; &#160; call DestroyTimer(t)
  20. &#160; &#160; endif
  21. endfunction
复制代码

就是T里面的“等待游戏时间”
回复

使用道具 举报

发表于 2009-3-13 17:40:36 | 显示全部楼层
………………居然还是用Wait………………
话说Wait很耗资源的说…………
回复

使用道具 举报

发表于 2009-3-13 17:42:10 | 显示全部楼层
LZ是在研究用各种方法去作弊...
回复

使用道具 举报

发表于 2009-3-13 17:50:17 | 显示全部楼层
不要这么悲观,不研究病毒怎么杀毒呢
回复

使用道具 举报

发表于 2009-3-13 19:03:24 | 显示全部楼层
炸飞基地,很强大
回复

使用道具 举报

发表于 2009-3-16 00:34:51 | 显示全部楼层
双核  那个也是 等待瞬间到0把
回复

使用道具 举报

发表于 2009-3-16 13:21:22 | 显示全部楼层
tj通杀了。。。?

好强大。。。

这个应该在1.23之后才说比较好吧。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 21:24 , Processed in 0.037230 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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