国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【我?guī)旺椊切辀ug】從獨(dú)行長路到無限余燼

2021-04-22 14:48 作者:等--等燈等燈  | 我要投稿

前言和bug簡介

這個(gè)系列內(nèi)容大概是科學(xué)分析一些游戲bug或"bug"的原理并給出可能的解決方案

往期內(nèi)容歡迎查看本人專欄


本期的內(nèi)容只有一個(gè),但非常重要,被利用后可以造成非常嚴(yán)重的后果
表面bug的表現(xiàn)可以參閱貼子:https://ngabbs.com/read.php?tid=26262175
大概是巫戀娃娃放置于獨(dú)行長路范圍內(nèi),到時(shí)間自動(dòng)撤退時(shí)(提前撤退娃娃/巫戀不會觸發(fā)bug),無法使刻俄柏第二天賦獨(dú)行長路重新生效
如果覺得這沒什么大不了的那就大錯(cuò)特錯(cuò)了,可能造成的后果請看后文的分析

本期特別感謝 hxiaiya?大佬的測試,沒有他的測試結(jié)果我無法找到問題的突破口
同時(shí)感謝
苦艾和卓婭幫助制作視頻,以及群友們對bug的測試和在視頻制作上的幫助


bug表現(xiàn)的研究

在上文提到的貼子中貼子中,可以看到樓下的測試出現(xiàn)了2種不同的結(jié)果
絕大多數(shù)人會正常觸發(fā)這個(gè)bug,巫戀娃娃到時(shí)間自動(dòng)撤退時(shí),獨(dú)行長路無法重新生效
然而,部分人無論怎么測試都無法觸發(fā)這個(gè)bug,獨(dú)行長路會在巫戀娃娃到時(shí)間自動(dòng)撤退時(shí)重新生效

這個(gè)結(jié)果的不同困擾了我很長時(shí)間,直到hxiaiya告訴我蘇蘇洛在編隊(duì)時(shí)這個(gè)bug會直接失效
蘇蘇洛的天賦微創(chuàng)治療屬于deckbuff,即使蘇蘇洛在場下,也會對場上的單位生效,而且微創(chuàng)治療的buff是可以添加給娃娃的
那么和微創(chuàng)治療同類的,銀灰的天賦領(lǐng)袖,也很可能會讓這個(gè)bug失效
控制變量進(jìn)行實(shí)驗(yàn),結(jié)果確實(shí)如此
之前貼子中無法觸發(fā)bug的,隊(duì)伍里也確實(shí)帶了銀灰

還沒來得及思考為什么會這樣,hxiaiya又有了新的測試結(jié)果
觸發(fā)這個(gè)bug后,如果在獨(dú)行長路范圍內(nèi)再放置我方單位,場上有可能出現(xiàn)一些奇怪的現(xiàn)象
包括但不限于:紅的眩暈直接消失,浮士德的無敵直接消失,偵察兵的隱身直接消失,夕3的加攻擊力效果直接消失,穿刺手無法加速

無法加速的穿刺手。感謝hxiaiya提供的動(dòng)圖

事情突然變得玄學(xué)了起來


相關(guān)機(jī)制的研究

首先,這個(gè)bug和獨(dú)行長路相關(guān),那么需要知道獨(dú)行長路的機(jī)制是什么
獨(dú)行長路使用的觸發(fā)控制器是AdjacentAllyToggleChecker,使用同樣機(jī)制的還有清道夫的天賦單獨(dú)行動(dòng)者
單獨(dú)行動(dòng)者和獨(dú)行長路除了數(shù)值加成外沒有任何區(qū)別,在bug表現(xiàn)上也完全相同
這種觸發(fā)控制器,會在場上有單位出生/結(jié)束時(shí)進(jìn)行判定,根據(jù)設(shè)定開啟/關(guān)閉buff

非常簡單有效的機(jī)制,單看完全看不出任何存在bug的可能性
我隨后檢查了單位出生/觸發(fā)的事件判定,也沒有發(fā)現(xiàn)任何可能導(dǎo)致漏判目標(biāo)/無法觸發(fā)事件的漏洞

那么問題很可能不在獨(dú)行長路上
思考一下這個(gè)bug的其它奇怪之處,為什么只有巫戀娃娃在自然撤回時(shí)才可以觸發(fā)?巫戀娃娃的設(shè)定和自然撤退方式是否和其它召喚物/其它撤退方式存在不同?
然而很遺憾,我查看了巫戀娃娃的設(shè)定,并沒有發(fā)現(xiàn)娃娃/自然撤退的設(shè)定和其它召喚物/撤退方式存在顯著的不同

接下來是第三個(gè)問題,為什么觸發(fā)了bug后,在獨(dú)行長路范圍內(nèi)再放人,可能會出現(xiàn)這么多奇怪的現(xiàn)象?
查看這些現(xiàn)象的共性,可以發(fā)現(xiàn),導(dǎo)致這些現(xiàn)象的,都是buff的消失
眩暈是buff,無敵是buff,隱身是buff,加攻是buff,持續(xù)加速也是buff
而且丟失的buff數(shù)量正好為1,等于獨(dú)行長路記錄buff數(shù)
那么有沒有可能,這些buff,是因?yàn)槟撤N原因,被記錄到了獨(dú)行長路中,然后因?yàn)楠?dú)行長路范圍內(nèi)放了人,觸發(fā)器失效,導(dǎo)致這些buff被獨(dú)行長路清除呢?


bug原理的研究

因?yàn)閷?shí)在無法準(zhǔn)確定位問題就推演了整個(gè)撤回流程,結(jié)果推了幾遍還真的發(fā)現(xiàn)了問題

在說明問題前,需要解釋一些概念
為了節(jié)約內(nèi)存資源,戰(zhàn)斗中所有buff的object是循環(huán)利用的
打個(gè)比方,buff的object類似一個(gè)盤子,里面裝著各種菜,也就是buff的設(shè)定
為了節(jié)約盤子數(shù)量,每個(gè)人吃完了菜,不會把盤子直接扔掉,而是洗一下,放回去,再裝別的菜
buff也是類似的,當(dāng)buff失效后,會將buff的object的指針移到一個(gè)通用的棧中,這個(gè)過程程序中命名為recycle
如果誰想創(chuàng)建新的buff,就從這個(gè)棧里,取一個(gè)buff的object拿來用,這個(gè)過程被稱為程序中命名為allocate
至于棧是什么,可以理解為盤子疊高高。因?yàn)楸P子都疊在一起,因此每次拿盤子只能從最上面拿,放盤子也只能從最上面放

那么回到bug的解釋上
巫戀娃娃的自然撤退,是在撤回buff到達(dá)最長時(shí)間結(jié)束時(shí)執(zhí)行的
這一塊的代碼如圖

如圖,注意RunActions函數(shù)

在執(zhí)行RunActions函數(shù)的過程中,會觸發(fā)撤回自身的action {
而撤回自身的過程中,會清除自身所有的buff,隨后將buff的object全部放進(jìn)通用棧中
buff清除完了之后,會觸發(fā)單位結(jié)束事件,獨(dú)行長路觸發(fā),創(chuàng)建一個(gè)buff
但是注意,因?yàn)?strong>娃娃身上只有一個(gè)buff,也就是撤回buff,在之前清除的時(shí)候被最后放入了通用棧
所以這個(gè)時(shí)候,獨(dú)行長路buff取用的object,就是撤回buff的object
注意,這個(gè)時(shí)候我們還在RunActions函數(shù)里面,因此撤回執(zhí)行完成后,會從RunActions函數(shù)退出,繼續(xù)執(zhí)行下面的操作
}
而接下來的操作,可以看代碼,獲取了buff的持有者,隨后從buff持有者身上移除了這個(gè)buff附加的屬性效果
不過,在這里,因?yàn)?strong>這個(gè)buff的object,在之前的撤回過程中已經(jīng)被分配給了刻俄柏的獨(dú)行長路
因此移除的,是刻俄柏身上,獨(dú)行長路的屬性效果

如果僅僅是這樣還好,只少了獨(dú)行長路的屬性
不過,因?yàn)閎uff已經(jīng)完成了結(jié)束過程,所以接下來它會被再次回收至通用棧中,雖然它實(shí)際上根本沒有結(jié)束
而接下來創(chuàng)建的buff,會從通用棧中獲取獨(dú)行長路buff的object作為自身的object
注意在這時(shí),獨(dú)行長路的記錄里,還記錄著自身buff的uid,并且記錄為當(dāng)前生效中
因此,再次在獨(dú)行長路范圍內(nèi)放置我方單位時(shí),獨(dú)行長路會從生效切換至失效狀態(tài)
這時(shí),它通過記錄的uid從自身buffContainer的m_buffUidMap中獲取buff object的指針
隨后通過指針直接將這個(gè)buff結(jié)束
因此,接下來創(chuàng)建的這個(gè),使用獨(dú)行長路buff object的buff,控制權(quán)捏在獨(dú)行長路手里,可以被獨(dú)行長路的失效直接結(jié)束

那么還有一些問題,為什么只有巫戀娃娃可以觸發(fā)這個(gè)bug?為什么銀灰天賦可以使這個(gè)bug失效?
回到之前說的,這個(gè)bug只有可能在結(jié)束時(shí)觸發(fā)撤回的buff中生效
除此之外還有兩個(gè)條件:撤回buff必須由Tick函數(shù)結(jié)束,撤回buff結(jié)束時(shí)必須為娃娃身上唯一的buff

bug的完整邏輯如圖

完整邏輯

從以上邏輯中可知:

如果撤回buff在結(jié)束時(shí)不是娃娃唯一的buff,那么隨后buff列表不會為空,自然無法觸發(fā)立刻回收buff的邏輯

如果撤回buff沒有由Tick函數(shù)在遍歷中結(jié)束,立刻回收buff那一步由于沒有事先的緩存,獲取的會是空列表,無法獲取到撤回buff,也自然無法立刻回收

巫戀的娃娃只包含一個(gè)buff,在撤回buff結(jié)束時(shí)自然是娃娃身上唯一一個(gè)buff
除了巫戀之外,W地雷的120s自動(dòng)消失也可以觸發(fā)這個(gè)bug
地雷雖然包含兩個(gè)buff,但第二個(gè)buff同樣為有限時(shí)長,在到達(dá)最大持續(xù)時(shí)間時(shí)會因?yàn)榈剐虮闅v的原因優(yōu)先于撤回buff被結(jié)束
而無論對于哪個(gè),銀灰的deckBuff都會使撤回buff在結(jié)束時(shí)不是召喚物身上唯一的buff

因此,無論是巫戀娃娃還是W地雷,只要隊(duì)伍中存在銀灰/蘇蘇洛,由于他們天賦提供的buff,在撤回buff結(jié)束時(shí),撤回buff就不再是召喚物身上唯一的buff,自然無法觸發(fā)bug

以上就是對這個(gè)bug的完整解釋


bug應(yīng)用的研究

如果完全讀懂了以上的部分的話,也許可以猜到這個(gè)bug可以有多大的應(yīng)用范圍了
只要知道了場上buff的施加/結(jié)束順序,可以利用這個(gè)bug,隨意地刪除場上任意一個(gè)buff

如果你在想這有什么用,那么不妨看看下面這個(gè)視頻


沒錯(cuò),能夠刪除的buff,不僅限于簡單的屬性加成。
知道bug原理后,通過一定的計(jì)算,也可以準(zhǔn)確的刪除掉余燼的強(qiáng)制撤回,黃昏的掉血,森蚺的阻回,浮士德的無敵/不可阻擋,黑蛇的火雨...等等等
這就是為什么說這個(gè)bug可以造成非常嚴(yán)重的后果
建議盡快修復(fù)


最后是修復(fù)方案:
治本方案:

刪去清空buffContainer時(shí)立刻回收buff的那段邏輯,只保留延遲一幀回收的部分

為什么明明寫了對策還要畫蛇添足...

治標(biāo)不治本的方法更多,畢竟出問題的只有2個(gè)召喚物和2個(gè)天賦。以下方案2選1:
1. 巫戀娃娃添加空白buff天賦,或在撤退buff后面加一個(gè)無限時(shí)長的空白buff。W地雷的特效buff改為永久持續(xù)。
2. 使用光環(huán)能力實(shí)現(xiàn)獨(dú)行長路/單獨(dú)行動(dòng)者。



本文原載于NGA:https://ngabbs.com/read.php?&tid=26360801

作者為本人

此專欄以CC BY-NC-SA 4.0協(xié)議發(fā)布

【我?guī)旺椊切辀ug】從獨(dú)行長路到無限余燼的評論 (共 條)

分享到微博請遵守國家法律
南溪县| 崇州市| 达尔| 枣阳市| 噶尔县| 滕州市| 翼城县| 五家渠市| 洞口县| 清徐县| 冕宁县| 云梦县| 交口县| 宾川县| 孟津县| 华阴市| 彩票| 乐平市| 彭阳县| 蓬莱市| 天等县| 宁陕县| 宝丰县| 青河县| 赤峰市| 普宁市| 马龙县| 清涧县| 贵定县| 孝昌县| 琼结县| 通辽市| 南澳县| 茶陵县| 神农架林区| 通渭县| 江孜县| 岑巩县| 会昌县| 酉阳| 惠来县|