Ticking Block Entity以及其他

這類在Ticking Tile Entity或者Ticking Block Entity時候發(fā)生的報錯,一般有一個簡單的解決方案。

簡單來說,就是找到forge.cfg,把里面removeErroringTileEntities(刪除報錯的方塊實體)設(shè)為true即可。這樣,每當(dāng)有TileEntity/BlockEntity報錯的時候,它們就會直接被刪掉。如果你解決不了問題,你至少可以解決掉那個方塊實體。
(嗯對,“方塊實體”,簡稱TE,它不是“實體”的一種,而是一類完全不同的存在,一般伴隨著特定方塊升成與銷毀。作為MC代碼層面的概念,沒親自寫過mod或者插件的老玩家可能玩了幾年都沒聽說過這么個東西。)
同理,如果是實體報錯,你可以把上面那個removeErroringEntities設(shè)為true。
這類報錯見到的最常見的是植物魔法的魔力池報錯,在為空氣的格子上發(fā)現(xiàn)魔力池的TE,然后tick一下就炸了。一般認(rèn)為這種爆炸來自小地圖,可以靠刪小地圖mod或者打開上面的選項來解決。

就今早我看到的那封不是植物魔法的崩潰日志來說,它的情況有點不同。
Description: Ticking block entity
java.lang.ClassCastException: micdoodle8.mods.galacticraft.core.entities.player.GCEntityPlayerMP cannot be cast to net.minecraft.inventory.IInventory
? ? at net.minecraft.tileentity.TileEntityHopper.getInventoryAtPosition(TileEntityHopper.java:552)
這個報錯如果你懂代碼的話,會發(fā)現(xiàn)有點反常。它說,星系mod的玩家對象不能被類型轉(zhuǎn)化為MC的背包接口IInventory。
1,但凡拜讀過含星系mod日志的人都會知道,星系mod給玩家引入了不同于原版的類,GCEntityPlayer。
2,玩家有背包。
難道是星系mod搞事情寫出bug了?
我們看看堆棧。
?at net.minecraft.tileentity.TileEntityHopper.getInventoryAtPosition(TileEntityHopper.java:552)
? ? at net.minecraft.tileentity.TileEntityHopper.getSourceInventory(TileEntityHopper.java:513)
? ? at net.minecraft.tileentity.TileEntityHopper.pullItems(TileEntityHopper.java:303)
? ? at net.minecraft.tileentity.TileEntityHopper.updateHopper(TileEntityHopper.java:142)
Hopper,這不是漏斗嗎,我們看看TileEntityHopper的代碼不就知道了。

List<Entity> list = worldIn.getEntitiesInAABBexcluding((Entity)null, new AxisAlignedBB(x - 0.5D, y - 0.5D, z - 0.5D, x + 0.5D, y + 0.5D, z + 0.5D), EntitySelectors.HAS_INVENTORY);
這就是報錯的那一行,因為太長而在一張圖里放不下了。簡單來說,就是獲取了漏斗上面格子里的所有、有背包的生物。HAS_INVENTORY是什么標(biāo)準(zhǔn)呢?

標(biāo)準(zhǔn)是實現(xiàn)IInventory接口,并且處于存活狀態(tài)。好家伙。那么因此被選中的GCEntityPlayer怎么可能會不能被轉(zhuǎn)化為IInventory呢?我們看看后面。

它是原版的漏斗方塊,而TE卻是泡沫修復(fù)的魔改后的快速漏斗。好,我血壓已經(jīng)上來了??吹竭@種關(guān)于優(yōu)化、修復(fù)類報錯的日志我就想打人。切記:看不懂崩潰日志就不要裝這種mod。
那么是不是泡沫修復(fù)把這個HAS_INVENTORY的判斷去掉導(dǎo)致的呢?
我看了下泡沫修復(fù)的源碼里的TileEntityFasterHopper,它并沒有改getInventoryAtPosition方法。事實上你也可以看到,堆棧里全都是原版的漏斗TE,沒有出現(xiàn)泡沫修復(fù)的TE。

于是我轉(zhuǎn)而去看星系mod。日志里的版本是281,于是我去官網(wǎng)找那個版本的星系……

星系的官網(wǎng)最新才是280!我原地問號。算了,拿著280湊合吧。

這不就繼承EntityPlayerMP嗎?看起來什么問題也沒有啊。如果你看原版MP的話,你會發(fā)現(xiàn)原版的MP并不實現(xiàn)IInventory,玩家類都不直接實現(xiàn)。InventoryPlayer類才是實現(xiàn)接口的那個,并且它只是MP的成員,并不是MP的基類。所以,GCEntityPlayerMP不應(yīng)該被那個實體選擇器選中才是。
老天爺,就先到這吧。鬼知道為什么。那么多coremod,我可沒時間一個個去查誰改了原版的方法。