Forge模組開(kāi)發(fā)-方塊類(lèi)詳解

引言:
首先要了解方塊分為這樣幾種:
注冊(cè)方塊:例如Blocks.Wood,一般寫(xiě)在方塊注冊(cè)類(lèi),注冊(cè)后生成一種類(lèi)似【方塊類(lèi)型】的變量,用以對(duì)比、調(diào)用。
實(shí)例方塊生成類(lèi):例如RotatedPillarBlock類(lèi),用于注冊(cè)方塊提供構(gòu)造器引用的類(lèi),使用形式一般為調(diào)用DeferredRegister<Block>的register方法時(shí),作為第二個(gè)形參將構(gòu)造器以Supplier的形式傳入被用。
實(shí)例方塊:使用實(shí)例方塊生成類(lèi)寫(xiě)入并生成BlockState實(shí)例,該實(shí)例則是存在于世界的真正的方塊,一切操作以該實(shí)例為主,而實(shí)例方塊生成類(lèi)更像一個(gè)工具類(lèi),被調(diào)用,這也就是為什么很多Block類(lèi)的方法都會(huì)傳入方塊坐標(biāo)這個(gè)形參。
所以,需要先解析實(shí)例方塊生成類(lèi),包括:AbstractBlock類(lèi)、Block類(lèi)、IForgeBlock類(lèi)以及其他小接口。方法會(huì)在講完構(gòu)造器后詳解,構(gòu)造器涉及的成員變量初始化會(huì)提及一些方法,但仍然會(huì)下下面詳解。
講的方法是在游戲主線程中,泛化調(diào)用的方法,你覆寫(xiě)以后,執(zhí)行到你的方塊后,有效果的方法,例如玩家掉落在你方塊上沒(méi)有傷害,就是覆寫(xiě)了你的實(shí)例方塊生成類(lèi)的onFallenUpon方法,顯然你沒(méi)有調(diào)用這個(gè)方法換入摔傷檢測(cè)里,只是他將你的方塊抽象為Block父類(lèi)調(diào)用了作為子類(lèi)的你的對(duì)應(yīng)方法。
如果本文提及方塊,一般指的是方塊實(shí)例。
AbstractBlock類(lèi)
?
構(gòu)造器:public AbstractBlock(AbstractBlock.Properties properties)
其中,傳入的Properties 決定了實(shí)例方塊的基本屬性,使用AbstractBlock.Properties.create()靜態(tài)方法創(chuàng)建它,該方法形參需要傳入一個(gè)Material實(shí)例。
Properties 類(lèi)成員變量包括但不止:
Material material?方塊基本類(lèi)別,預(yù)設(shè)了一些屬性,寫(xiě)入了AbstractBlock類(lèi)的material成員變量,并據(jù)此設(shè)置了Properties 類(lèi)的方塊顏色(一種更寬泛感性的類(lèi)別,并不是真的顏色),該參數(shù)影響B(tài)lockTags的貼附,后面有重復(fù)會(huì)講;
boolean blocksMovement?是否有碰撞箱,寫(xiě)入了AbstractBlock類(lèi)的boolean canCollide成員變量,被AbstractBlock類(lèi)默認(rèn)方法中的getCollisionShape方法使用,默認(rèn)方法作用為如果不可碰撞,則返回0體積碰撞箱,否則返回標(biāo)準(zhǔn)16*16*16標(biāo)準(zhǔn)方塊(完整方塊)碰撞箱;
ResourceLocation lootTable?掉落表位置,寫(xiě)入了AbstractBlock類(lèi)的ResourceLocation lootTable成員變量,被AbstractBlock類(lèi)默認(rèn)方法中的getDrops方法使用,根據(jù)資源路徑的戰(zhàn)利品表內(nèi)容生成一個(gè)物品堆列表供調(diào)用;其次還有一個(gè)默認(rèn)getter方法getLootTable,返回該資源目錄詳見(jiàn)我的世界wiki內(nèi)loottable,與數(shù)據(jù)包制作類(lèi)教程,默認(rèn)為方塊注冊(cè)名對(duì)應(yīng)的loottable。
float resistance?抗爆性,寫(xiě)入了AbstractBlock類(lèi)的float blastResistance成員變量,顧名思義,方塊對(duì)爆炸的抗性,在爆炸計(jì)算時(shí)會(huì)使用,自定義爆炸時(shí),為了模組兼容性,建議以此判別。
float hardness構(gòu)造器并沒(méi)有,一般是與爆炸抗性同設(shè)的,但是可以單獨(dú)設(shè)置,自行查看方法。
boolean ticksRandomly?該方塊是否參與隨機(jī)刻的執(zhí)行,此處提醒,方塊雖然有tick方法,意思是每個(gè)tick該方塊均會(huì)執(zhí)行一次tick方法的功能,但實(shí)際上該方法多數(shù)情況下并不奏效,不過(guò)隨機(jī)刻還是奏效的,該參數(shù)寫(xiě)入了AbstractBlock類(lèi)的boolean ticksRandomly成員變量,用于默認(rèn)方法ticksRandomly方法調(diào)用判斷是否能執(zhí)行隨機(jī)刻方法。
SoundType soundType,基本聲音使用設(shè)置,包括放置、摧毀等,一般與Material 參數(shù)對(duì)應(yīng)設(shè)置,例如設(shè)置SoundType.WOOD,寫(xiě)入了AbstractBlock類(lèi)的SoundType soundType成員變量,被默認(rèn)方法getSoundType調(diào)用,在一些預(yù)設(shè)播放聲音的代碼中調(diào)用作為形參使用,例如playsound方法。
float slipperiness?滑溜溜,寫(xiě)入了AbstractBlock類(lèi)的float slipperiness成員變量,同爆炸抗性顧名思義,例如冰。
float speedFactor?速度影響(速率系數(shù)),寫(xiě)入了AbstractBlock類(lèi)的float speedFactor成員變量,同爆炸抗性顧名思義,例如靈魂沙。
float jumpFactor 跳躍影響,寫(xiě)入了AbstractBlock類(lèi)的float jumpFactor成員變量,同爆炸抗性顧名思義,例如粘液塊。
boolean variableOpacity,參數(shù)不建議在這設(shè)置,表示貼圖透明度。
方法:
updateDiagonalNeighbors(BlockState state, IWorld worldIn, BlockPos pos, int flags, int recursionLeft)
該方法默認(rèn)是給紅石線路使用的,用以讓紅石線路上下對(duì)角線路臺(tái)階式連接傳遞信號(hào)使用,其中state為本方塊實(shí)例,worldin為實(shí)例所在世界,pos為實(shí)例所在位置,剩下兩個(gè)參數(shù)紅石相關(guān),不予細(xì)講,這是一個(gè)多數(shù)少用的方法,科技類(lèi)模組可以參考。
boolean allowsMovement(BlockState state, IBlockReader worldIn, BlockPos pos, PathType type)
該方法在實(shí)體將要穿過(guò)方塊時(shí)調(diào)用,判斷是否能穿過(guò)方塊,返回true表示可以,false表示不行,state是本方塊實(shí)例,worldin是本方塊世界,pos是本方塊位置,type是該方塊的可穿基本類(lèi)型,例如水是該枚舉類(lèi)的WATER,一般方塊為空,此處如果重寫(xiě)為true,即使有碰撞箱也可以被穿過(guò)。
BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos)
該方法在該方塊實(shí)例statein其空間一格十字內(nèi)放置/摧毀方塊后調(diào)用,返回的方塊實(shí)例會(huì)被把該方塊實(shí)例替換(更新掉),facing為狀態(tài)改變的方塊實(shí)例facingstate在該方塊的哪個(gè)朝向,worldin為方塊實(shí)例所在世界,兩個(gè)pos一下分別是本方塊和更新方塊(facing)的位置,例如導(dǎo)線連接,需要詳細(xì)重寫(xiě)該方法以調(diào)整連接狀態(tài)與朝向,原版案例則是火把。
@OnlyIn(Dist.CLIENT)
public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side)
該方法被僅客戶(hù)端修飾,是一個(gè)顯示方法,表示是否能透過(guò)方塊看到,與后面要講的,處理作物貼圖透明部分純黑不同,該方法一般是用于液體透過(guò)觀察與史萊姆塊透過(guò),而且傾向于看到另一個(gè)方塊實(shí)例adjacentBlockState,side則是朝向,指看不看得到另一邊的那一邊不理解可以自行測(cè)試。
neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving)
在本方塊位置改變時(shí)調(diào)用,除非內(nèi)容寫(xiě)了改變自身的代碼,否則一般是作用一些其他功能,例如TNT充能檢測(cè),海綿吸水檢測(cè),漏斗重新綁定容器,state為本方塊實(shí)例,worldin為本方塊世界,pos為當(dāng)前位置(移動(dòng)穩(wěn)定后),frompos為移動(dòng)前位置,blockin是本方塊注冊(cè)方塊。
onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving)
在本方塊被完全加入到世界后執(zhí)行,用于設(shè)置方塊的一些參數(shù),例如漏斗綁定容器,火焰燃燒計(jì)時(shí)開(kāi)始等,state為確定下的方塊實(shí)例,worldin為該方塊世界,pos為該方塊位置,oldstate是原位置的方塊,一般是空氣方塊實(shí)例,ismoving表示是不是移動(dòng)來(lái)的,一般不用這個(gè)參數(shù)。
onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving)
在方塊實(shí)例被替換時(shí)調(diào)用,據(jù)上個(gè)方法可知,其實(shí)是不存在方塊破壞這個(gè)概念的,而是替換為了空氣方塊實(shí)例,這個(gè)就是在本方塊實(shí)例被銷(xiāo)毀前調(diào)用的方法,一般是交代后事,比如挖爆箱子掉落箱子內(nèi)物品,state為本方塊實(shí)例,worldin為本方塊世界,pos為本方塊位置,newstate為要替換上的方塊實(shí)例,ismoving表示是不是移動(dòng)來(lái)的,一般不用這個(gè)參數(shù)。
ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit)
該方法用以決定玩家右鍵點(diǎn)擊的動(dòng)作,返回SUCCESS表示動(dòng)作應(yīng)當(dāng)執(zhí)行完畢,CONSUME表示動(dòng)作仍要展示,一般是連續(xù)長(zhǎng)按動(dòng)作使用,返回PASS是白給,F(xiàn)ail未知功能,不建議未理解透徹使用。按道理,是允許在本方法添加一些右擊方塊的內(nèi)容,mojang也是這么做的,但是這在物品類(lèi)中有所不同,state為該方塊實(shí)例,worldin為該方塊世界,pos為該方塊位置,player為傳入的玩家實(shí)體,hit為記錄了稍微詳細(xì)交互信息的類(lèi),自行研究。
boolean eventReceived(BlockState state, World worldIn, BlockPos pos, int id, int param)
該方法如果返回true,那么服務(wù)端和客戶(hù)端都會(huì)執(zhí)行該事件,否則僅服務(wù)端執(zhí)行,該方法在服務(wù)端事件執(zhí)行完后才會(huì)執(zhí)行判斷,state為該方塊實(shí)例,worldin為該方塊世界,pos為該方塊位置,id與param為事件的鑒別信息,具體清空不同,無(wú)法講明。
BlockRenderType getRenderType(BlockState state)
該方法決定了方塊的渲染形式,一般情況返回MODEL,箱子類(lèi)則返回ENTITYBLOCK_ANIMATED,箱子實(shí)質(zhì)上渲染的是實(shí)體模型而不是方塊模型,因此有所不同,INVISIBLE則是不可見(jiàn),state為該方塊實(shí)例。
boolean isTransparent(BlockState state)
該方法決定了方塊渲染形式,上述講過(guò),非完整方塊模型空缺部分會(huì)填充為黑色,該方法返回true,則不會(huì)出錯(cuò),正常顯示透明,這個(gè)錯(cuò)誤也可以在FMLClientSetupEvent中解決,RenderTypeLookup.setRenderLayer(注冊(cè)方塊, RenderType.getCutout());
其中rendertype如果是cutout和transeparent,等效于該方法返回true,功能被棄用,近身辨別使用,state為該方塊實(shí)例。
boolean canProvidePower(BlockState state)
本方法決定了該方塊實(shí)例是否能向外輸出紅石信號(hào),true表示可以,state為該方塊實(shí)例,forgedoc建議就方塊實(shí)例來(lái)檢測(cè)是否能輸出,而不是該注冊(cè)方塊生成類(lèi)的方法。
PushReaction getPushReaction(BlockState state)
該方法決定了該方塊實(shí)例的推動(dòng)形式,例如床返回DESTROY,那么會(huì)塞推動(dòng)時(shí)就會(huì)破壞該床,參數(shù)來(lái)源是Material,翻譯即可知道枚舉返回值的用法,state為該方塊實(shí)例。
FluidState getFluidState(BlockState state)
該方法目的是獲取方塊容納的流體的流體實(shí)例,一般含水方塊調(diào)用不為空,state為本方塊實(shí)例。
boolean hasComparatorInputOverride(BlockState state)
該方法表決定該方塊實(shí)例state可以被紅石比較器比較輸出,返回true則可以,例如箱子。
AbstractBlock.OffsetType getOffsetType()
該方法決定該方塊實(shí)例是否執(zhí)行隨機(jī)偏移原位的渲染,有常用的不偏移NONE,有花用的xz也就是水平隨機(jī)偏移,這也是為何花的位置不在中心,還有xyz偏移,返回值是什么,就怎么偏。
BlockState rotate(BlockState state, Rotation rot)
一般有朝向的方塊必要重寫(xiě)該方法,為傳入的state根據(jù)rot進(jìn)行with方塊屬性。
BlockState mirror(BlockState state, Mirror mirrorIn)
一般有朝向的方塊必要重寫(xiě)該方法,為傳入的state根據(jù)mirrorIn進(jìn)行with方塊屬性。
boolean isReplaceable(BlockState state, BlockItemUseContext useContext)
該方法決定方塊實(shí)例state能否被替換,或者說(shuō)是覆蓋,例如空氣就可以,他默認(rèn)從Material里
獲取參數(shù)用以判斷,而useContext則是一種信息類(lèi)你可以使用其內(nèi)容來(lái)判斷到底返回什么,里面包含內(nèi)容足夠使用了,而同類(lèi)型的boolean isReplaceable(BlockState state, Fluid fluid)方法一般不建議覆寫(xiě),原版涉及也很少。
List<ItemStack> getDrops(BlockState state, LootContext.Builder builder)
該方法在上述將了生成來(lái)源,決定了方塊掉落,state是本方塊,builder是生成器,它會(huì)根據(jù)你對(duì)生成器的設(shè)置來(lái)生成掉落物,例如生成器傳入Random實(shí)例和不傳入會(huì)有區(qū)別。
VoxelShape getRenderShape(BlockState state, IBlockReader worldIn, BlockPos pos)
該方法決定了渲染范圍,柵欄、頭顱、講臺(tái)有所使用,意義不明,默認(rèn)調(diào)用總shape方法返回,state為該方塊實(shí)例,worldin是一種閹割版世界,用于快速讀取方塊實(shí)例,pos是方塊實(shí)例位置。
VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context)
該方法決定了碰撞箱體積,默認(rèn)調(diào)用總shape方法返回,形參同上,該方法一般配合方塊實(shí)例屬性食用,其中VoxelShape getCollisionShape(BlockState state, IBlockReader reader, BlockPos pos)應(yīng)當(dāng)是特例重寫(xiě)用方法,專(zhuān)供樹(shù)葉、雪等。
VoxelShape getRaytraceShape(BlockState state, IBlockReader worldIn, BlockPos pos)
該方法決定光追渲染,一般為空,可以自定義,影子等光追效果依此生成,形參同上,其中VoxelShape getRayTraceShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext context) 同上為專(zhuān)供方法,提供雪、草、柵欄等,均需自行鑒別。
int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos)
該方法僅樹(shù)葉覆寫(xiě),恒定返回1,基本上是結(jié)合光照等級(jí)寫(xiě)的,材質(zhì)透明度,形參同上。
INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos)
該方法舉個(gè)例子會(huì)用在漏斗檢測(cè),建議有容器的,根據(jù)形參傳入的位置和世界,獲取到容器實(shí)例返回,用以讓漏斗判別容器類(lèi)型,形參差不多同上。
boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos)
該方法會(huì)在放置前檢查當(dāng)前要放置的位置是否合理,返回false則無(wú)法放下,例如作物,注意位置是要放下的位置,不是右鍵的方塊的位置,一般在右鍵的方塊的一面的這格子。
@OnlyIn(Dist.CLIENT)
float getAmbientOcclusionLightValue(BlockState state, IBlockReader worldIn, BlockPos pos)
客戶(hù)端方法,用于計(jì)算環(huán)境遮光。
int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos)
在允許比較器比較方法后,比較器調(diào)用的方法。
VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context)
總shape方法,返回的是一個(gè)體積大小,默認(rèn)會(huì)被各種需求的體積getter調(diào)用,例如碰撞箱等,默認(rèn)值為完整方塊,context為信息實(shí)例。
randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random)
隨機(jī)刻方法,當(dāng)在構(gòu)造器中允許時(shí),該方法參與隨機(jī)刻,如同作物一樣的隨機(jī)刻,詳見(jiàn)我的世界wiki隨機(jī)刻。
tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random rand)
脆弱的tick方法,不建議在方塊的tick方法中寫(xiě)過(guò)多內(nèi)容讓他執(zhí)行,而且在方塊實(shí)體中寫(xiě)。
float getPlayerRelativeBlockHardness(BlockState state, PlayerEntity player, IBlockReader worldIn, BlockPos pos)
一般該方法用于對(duì)構(gòu)造器中設(shè)定的方塊硬度的二次計(jì)算給定,AbstractBlock構(gòu)造器并無(wú)硬度,所以該方法默認(rèn)是從state獲取的,一般用于計(jì)算工具加成等,被扣進(jìn)了forge事件執(zhí)行。
spawnAdditionalDrops(BlockState state, ServerWorld worldIn, BlockPos pos, ItemStack stack)
該方法決定了方塊實(shí)例是否額外掉落一些東西,例如蠹蟲(chóng)就是在這生成的,state為該方塊實(shí)例,worldin是世界,pos為方塊位置,stack為采集工具。
onBlockClicked(BlockState state, World worldIn, BlockPos pos, PlayerEntity player)
與onBlockActivated方法不同,該方法是左鍵點(diǎn)擊長(zhǎng)按則是連續(xù)點(diǎn)擊,state為該方塊實(shí)例,worldin為該方塊世界,pos為該方塊位置,player是左鍵進(jìn)行點(diǎn)擊的玩家。
int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side)
該方法一般是紅石信號(hào)源覆寫(xiě),例如紅石火把,在紅石火把點(diǎn)亮狀態(tài)且輸出面不為向上時(shí)返回15,否則返回0,形參side為脈沖輸出面。
onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn)
該方法會(huì)在實(shí)體已經(jīng)進(jìn)入了方塊碰撞形狀內(nèi)部而調(diào)用,而非即將進(jìn)入,state為本方塊實(shí)例,worldin為該方塊世界,pos為該方塊位置,entityin為該實(shí)體。
int getStrongPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side)
紅石火把在打開(kāi)狀態(tài)會(huì)對(duì)其下方返回信號(hào)15,否則0;總之這倆方法是用來(lái)輸出朝向最強(qiáng)信號(hào)的。
onProjectileCollision(World worldIn, BlockState state, BlockRayTraceResult hit, ProjectileEntity projectile)
該方法會(huì)在方塊實(shí)例state被飛行道具射中插入后調(diào)用,例如標(biāo)靶等,projectile為飛行道具例如箭,hit有一些信息可供使用。
?
======至此,抽象方塊類(lèi)可覆寫(xiě)方法結(jié)束======
由于IForgeBlock接口被Block類(lèi)實(shí)現(xiàn),所以一塊將Block類(lèi),同時(shí),Block類(lèi)作為AbstractBlock類(lèi)的子類(lèi),重復(fù)的方法不再細(xì)講。由于Blocks繼承了AbstractBlock類(lèi),如果在本節(jié)有方法名與其父類(lèi)重復(fù)的,以覆寫(xiě)本節(jié)方法為主,否則并不會(huì)如期生效。
Block類(lèi)
?
構(gòu)造器:public Block(AbstractBlock.Properties properties)
其中大部分的方塊基本屬性已經(jīng)通過(guò)super調(diào)用AbstractBlock類(lèi)的構(gòu)造器解決了,剩下是在注冊(cè)blockstate額外屬性容器(例如朝向、生長(zhǎng)狀態(tài)等),額外的基本屬性:
Int harvestLevel?采集等級(jí),寫(xiě)入了Blocks的Int harvestLevel成員變量中;
ToolType harvestTool?采集工具類(lèi)型,寫(xiě)入了Blocks的ToolType harvestTooll成員變量中;
然后還初始化了默認(rèn)方塊實(shí)例創(chuàng)建器StateContainer<Block, BlockState> stateContainer,并用這個(gè)創(chuàng)建器創(chuàng)建了默認(rèn)方塊實(shí)例存入了該類(lèi)(實(shí)例方塊創(chuàng)建類(lèi))的成員變量BlockState defaultState中,等待getDefaultState方法調(diào)用。
方法:
Block getBlockFromItem(@Nullable Item itemIn)
靜態(tài)方法,返回該物品類(lèi)型對(duì)應(yīng)的方塊,覆寫(xiě)無(wú)用,游戲內(nèi)原版調(diào)用的是Block類(lèi)的靜態(tài)方法而不是你覆寫(xiě)的方法,你仍可以使用此方法,或者在自己方塊父類(lèi)中進(jìn)行一些覆寫(xiě)操作。
BlockState nudgeEntitiesWithNewState(BlockState oldState, BlockState newState, World worldIn, BlockPos pos)
此方法太過(guò)抽象,舉例就是農(nóng)田作為非完整方塊,在被踩壞時(shí)變?yōu)橥暾綁K泥土,如果不執(zhí)行本方法,那么玩家在下一tick會(huì)自然下落,穿過(guò)泥土站在泥土下面方塊上,而不是被輕推上去站在泥土上,用法特點(diǎn)同上。
boolean ticksRandomly(BlockState state)
該方法決定了是否允許執(zhí)行隨機(jī)刻,返回是則允許,state為該方塊實(shí)例。
boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos)
該方法決定了自然光線是否能從上而下傳播,state為該方塊實(shí)例,reader是一種類(lèi)似閹割版世界的方塊實(shí)例獲取器,pos為方塊位置。
@OnlyIn(Dist.CLIENT)
animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand)
客戶(hù)端方法,以tick在客戶(hù)端執(zhí)行一些方塊動(dòng)畫(huà)顯示,例如熔爐的火,其實(shí)是一張長(zhǎng)圖uv切割按tick展示形成的動(dòng)畫(huà),rand是調(diào)用者傳入的隨機(jī)實(shí)例,頻繁創(chuàng)建隨機(jī)實(shí)例會(huì)有極高的消耗,所以一般要用的時(shí)候都是傳遞繼承的。
onPlayerDestroy(IWorld worldIn, BlockPos pos, BlockState state)
該方法在完全破壞此方塊實(shí)例后調(diào)用,注意是破壞后,state已經(jīng)非有效形參了,建議使用pos和worldin來(lái)進(jìn)行自己的功能。
dropXpOnBlockBreak(ServerWorld worldIn, BlockPos pos, int amount)
該方法在方塊被采集后調(diào)用,且只有玩家采集后調(diào)用,worldin為該方塊世界,pos為該方塊位置,amount為要產(chǎn)生的數(shù)量,默認(rèn)他會(huì)把數(shù)量分成幾份,以生成經(jīng)驗(yàn)實(shí)體的形式掉落。
float getExplosionResistance()
該方法在爆炸炸到該方塊時(shí)調(diào)用,返回的就是在AbstractBlock構(gòu)造器初始化的爆炸抗性參數(shù)。
onExplosionDestroy(World worldIn, BlockPos pos, Explosion explosionIn)
該方法在方塊被炸毀后調(diào)用,explosionIn是爆炸參數(shù),包括不限于是否破壞,爆炸范圍,是否有火等詳細(xì)爆炸信息。
onEntityWalk(World worldIn, BlockPos pos, Entity entityIn)
該方法在實(shí)體在方塊上走時(shí)調(diào)用,不建議寫(xiě)過(guò)多內(nèi)容,放點(diǎn)聲音是一種他的用法,entityIn是該走路的實(shí)體,注意是否是活的生物;
BlockState getStateForPlacement(BlockItemUseContext context)
在方塊放置前調(diào)用,調(diào)用次數(shù)未知,context內(nèi)有詳細(xì)放置信息供使用,一般是放之前預(yù)處理,例如設(shè)置朝向等。
harvestBlock(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack)
方塊被破壞能掉落物品,就是執(zhí)行的本方法,覆寫(xiě)后可以例如實(shí)現(xiàn)隨機(jī)掉落,worldin為該方塊實(shí)例世界,player為采集的玩家,pos為該方塊實(shí)例位置,state為該方塊實(shí)例(暫時(shí)存在),te為方塊實(shí)體,如果這個(gè)方塊實(shí)例是容器類(lèi)方塊,原版一般這個(gè)方塊實(shí)體就是容器本身,可獲取它里面的物品,stack是采集工具,原版用法是精準(zhǔn)采集檢測(cè)。
onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack)
在方塊被完全放下后執(zhí)行,可以進(jìn)行后處理或者寫(xiě)一些類(lèi)似戰(zhàn)吼的功能,stack是方塊物品堆,就是手持的方塊物品。
boolean canSpawnInBlock()
該方法在生物生成前調(diào)用判斷,如果返回為false,生物·不會(huì)生成在其內(nèi)部,但不代表生物不會(huì)生成,生物會(huì)繼續(xù)檢測(cè)附近允許位置,生成在他附近。
@OnlyIn(Dist.CLIENT)
IFormattableTextComponent getTranslatedName()
客戶(hù)端方法,返回本地化代碼,配合語(yǔ)言文件,用以改變客戶(hù)端該方塊名稱(chēng)本地文字顯示。
String getTranslationKey()
與上面類(lèi)似,只不過(guò)這個(gè)返回字符串。
onFallenUpon(World worldIn, BlockPos pos, Entity entityIn, float fallDistance)
生物掉落在該方塊實(shí)例上方時(shí)調(diào)用,例如農(nóng)田,史萊姆塊都有重寫(xiě),如非必要,super調(diào)用,不然完全重寫(xiě)實(shí)體么得掉落傷害了。
onLanded(IBlockReader worldIn, Entity entityIn)
實(shí)體躺在該方塊時(shí)調(diào)用,實(shí)際上實(shí)體不會(huì)躺,是該方塊讓實(shí)體躺了,例如玩家睡覺(jué),玩家只是狀態(tài)在睡覺(jué),是這個(gè)方法讓玩家做了一系列傳送動(dòng)作。
ItemStack getItem(IBlockReader worldIn, BlockPos pos, BlockState state)
該方法用以獲取該方塊實(shí)例對(duì)應(yīng)的物品類(lèi)型,實(shí)際上是該方塊實(shí)例的Item asItem()方法的包裝,沒(méi)什么用應(yīng)該,forge好像也不推薦。
public float getSlipperiness() {return this.slipperiness;}
public float getSpeedFactor() {return this.speedFactor;}
public float getJumpFactor() {return this.jumpFactor;}
三個(gè)getter方法返回了一些基本屬性,想改就改,比如倍率返回。
onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player)
該方法在玩家將方塊采集并破壞成空氣前調(diào)用,其默認(rèn)內(nèi)容判斷了state的BlockTags是否有豬靈看守著的標(biāo)簽,會(huì)發(fā)怒。
fillWithRain(World worldIn, BlockPos pos)
在下雨天且執(zhí)行到本方塊隨機(jī)刻時(shí)調(diào)用,一般用在坩堝接水。
boolean canDropFromExplosion(Explosion explosionIn)
在爆炸并破壞本方塊后執(zhí)行的檢查,返回true則可以如常規(guī)破壞一樣掉落物品,explosionIn為爆炸的詳細(xì)信息。
fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
寫(xiě)方塊必然要覆寫(xiě)的方法,決定了方塊額外屬性是否能正常注冊(cè)應(yīng)用,一般格式是builder.add(屬性鍵...)。
@OnlyIn(Dist.CLIENT)
Public?void addInformation(ItemStack stack, @Nullable IBlockReader worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn)
客戶(hù)端方法,用以為其加入描述,方塊的話位置未知,如果是物品,那么會(huì)加在物品的lore上,請(qǐng)注意,不要寫(xiě)一些檢測(cè)物品有這個(gè)方法加入的lore而執(zhí)行功能的代碼,因?yàn)檫@個(gè)方法在服務(wù)端是不存在的,而客戶(hù)端向服務(wù)端同步數(shù)據(jù)是危險(xiǎn)行為。
?
有關(guān)方塊注冊(cè)
第一種方法 新建一個(gè)方塊注冊(cè)類(lèi),其內(nèi)寫(xiě)一靜態(tài)成員:
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "modid");
然后可以使用:
public static final RegistryObject<Block> 方塊類(lèi)型名稱(chēng)?= BLOCKS.register("類(lèi)型鍵名", 實(shí)例方塊生成類(lèi)::new);
或者
public static final RegistryObject<Block> 方塊類(lèi)型名稱(chēng) = BLOCKS.register("類(lèi)型鍵名", () -> new?Block(AbstractBlock.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(3.0F, 3.0F).notSolid().setLightLevel((light) -> 1)));
這樣,將屬性等內(nèi)容在這寫(xiě)。
注冊(cè)幾個(gè)方塊都可以,最后是注冊(cè)這個(gè)注冊(cè)類(lèi),在你的模組主類(lèi)構(gòu)造器中寫(xiě)
方塊注冊(cè)類(lèi).BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());即可
第二種方法? 也可以監(jiān)聽(tīng)RegistryEvent.Register<Block>,在這里通過(guò)事件獲取方塊注冊(cè)器,將你的方塊注冊(cè)進(jìn)去。
============
到此,有關(guān)方塊的覆寫(xiě)有效方法已經(jīng)解析完畢,有時(shí)候我會(huì)把可調(diào)用方法解析也補(bǔ)充上去。
補(bǔ)充:版本為1.16.5請(qǐng)注意甄別。