最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

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

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

2023-02-11 18:48 作者:輕描淡寫(xiě)的呵呵  | 我要投稿

引言:


首先要了解方塊分為這樣幾種:

注冊(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)注意甄別。



Forge模組開(kāi)發(fā)-方塊類(lèi)詳解的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
新余市| 潼南县| 高陵县| 邵阳市| 桐乡市| 平果县| 咸阳市| 闻喜县| 临城县| 桃园县| 本溪市| 精河县| 芮城县| 博客| 沙坪坝区| 西青区| 彭山县| 资阳市| 宁陵县| 郯城县| 龙南县| 临海市| 宿松县| 达拉特旗| 涞源县| 固始县| 九江县| 凤阳县| 灯塔市| 灌阳县| 焦作市| 四平市| 望城县| 吴江市| 秦皇岛市| 石渠县| 萍乡市| 承德县| 沙田区| 渝北区| 昌图县|