日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Minecraft java edition 模组开发】(二):通过对岩浆怪和雪傀儡的源码分析,自己制作一个雪球怪

發(fā)布時間:2024/1/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Minecraft java edition 模组开发】(二):通过对岩浆怪和雪傀儡的源码分析,自己制作一个雪球怪 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

零、什么是實體

??實體(Entity)包括在Minecraft中所有動態(tài)的、移動中的對象。例如游戲中的怪物僵尸骷髏等,船和礦車,受重力影響的方塊如下落的沙子鐵砧等。

??我們今天要加入的東西就是一個雪球怪,它擁有和巖漿怪一樣的分裂能力,不同的是,他不能免疫灼燒傷害,和雪傀儡會受到比較熱的自然環(huán)境的傷害,并且走到哪里哪里有雪。

一、實體繼承樹


??這張圖有點糊,但是沒辦法,我從網(wǎng)上找不到其他圖了。

??從這張繼承樹中我們可以巖漿怪繼承自史萊姆;雪傀儡繼承自抽象類傀儡實體(傀儡實體有三個子類,雪傀儡,鐵傀儡和凋零。都是非抽象類);再進一步翻閱forge源碼,我們還會發(fā)現(xiàn)雪傀儡還實現(xiàn)了兩個接口:IRangedAttackMo用于實現(xiàn)怪物遠程攻擊,女巫,骷髏等也實現(xiàn)了這個接口,IShearable用于實現(xiàn)可剪裁,羊雪傀儡都實現(xiàn)了。

??巖漿怪:

public class EntityMagmaCube extends EntitySlime{/* codes */}

??雪傀儡:

public class EntitySnowman extends EntityGolem implements IRangedAttackMob, net.minecraftforge.common.IShearable{/* codes */}

二、編寫雪球怪的代碼:

??1.首先既然雪球怪要和巖漿怪類似,那肯定也要繼承史萊姆

public class EntitySnowCube extends EntitySlime {/* codes */ }

??2.然后我們從巖漿怪的源碼里面拷一段給雪球怪

public class EntitySnowCube extends EntitySlime {public EntitySnowCube(World worldIn) {super(worldIn);}public void registerFixesSnowCube(DataFixer fixer) {EntityLiving.registerFixesMob(fixer, EntitySnowCube.class);}/*** 改變了了雪球怪的速度,讓他和巖漿怪一樣(這個方法是粘貼自巖漿怪的)*/@Overrideprotected void applyEntityAttributes() {super.applyEntityAttributes();this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.20000000298023224D);}/*** @return 設(shè)置是否能召喚,只要游戲難度不是和平模式就能召喚*/@Overridepublic boolean getCanSpawnHere() {return this.world.getDifficulty() != EnumDifficulty.PEACEFUL;}/*** 這個方法依舊是粘貼的巖漿怪的,他的作用應(yīng)該是用來設(shè)置史萊姆的大小的(大史萊姆,中史萊姆,小史萊姆)* 這個方法中顯示調(diào)用了超類史萊姆的方法設(shè)置好了大小,然后再把生物的護甲值升高,所以巖漿怪才會比普通史萊姆難打。* @param size* @param resetHealth*/@Overrideprotected void setSlimeSize(int size, boolean resetHealth){super.setSlimeSize(size, resetHealth);this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue((double)(size * 3));}/*** 跳躍延遲,直接粘貼巖漿怪的數(shù)據(jù)了*/@Overrideprotected int getJumpDelay(){return super.getJumpDelay() * 4;}/*** @return 能否傷害玩家* 這里和巖漿怪保持一致,無論大小都能傷害,但其實史萊姆這里是return !this.isSmallSlime();小的沒有攻擊力*/@Overrideprotected boolean canDamagePlayer(){return true;}/*** @return 攻擊強度,這里和巖漿怪保持一致,是史萊姆攻擊強度加二*/@Overrideprotected int getAttackStrength(){return super.getAttackStrength() + 2;}}

??這樣雪球怪就擁有了一部分和巖漿怪一樣的屬性

??需要注意的是,巖漿怪的構(gòu)造方法其實比史萊姆和雪球怪的多了一行。

public EntityMagmaCube(World worldIn){super(worldIn);this.isImmuneToFire = true;}

??這多的一行是的巖漿怪可以免疫火焰,那我們的雪球怪自然要把這一行刪掉。

??3.設(shè)置一些不一樣的屬性:

/*** 該方法繼承自史萊姆* @return 設(shè)置的粒子效果*/@Overrideprotected EnumParticleTypes getParticleType() {return EnumParticleTypes.SNOWBALL;}/*** @return 這個返回值是雪球怪死后會分裂成什么*/@Overrideprotected EntitySlime createInstance(){return new EntitySnowCube(this.world);}/*** 這個方法是獲得掉落物表,繼承自EntityLiving* @return 返回掉落物表*/@Override@Nullableprotected ResourceLocation getLootTable(){// 如果是小史萊姆才會掉落雪球return this.isSmallSlime() ? LootTableList.ENTITIES_SNOWMAN : LootTableList.EMPTY;}/*** 被攻擊后發(fā)出的聲音* @return 這里和雪傀儡一致*/@Overrideprotected SoundEvent getHurtSound(DamageSource damageSourceIn){return SoundEvents.ENTITY_SNOWMAN_HURT;}/*** 死亡音效* @return 和雪傀儡一致*/@Overrideprotected SoundEvent getDeathSound(){return SoundEvents.ENTITY_SNOWMAN_DEATH;}/*** 被擠壓的音效* @return 雪傀儡沒有這個音效,所以這里用的是雪傀儡的環(huán)境音效*/@Overrideprotected SoundEvent getSquishSound(){return SoundEvents.ENTITY_SNOWMAN_AMBIENT;}/*** 跳躍音效* @return 使用扔雪球的音效*/protected SoundEvent getJumpSound(){return SoundEvents.ENTITY_SNOWBALL_THROW;}/** 此外還有幾個方法繼承自史萊姆* jump() handleJumpLava() handleJumpWater() 等,* 只知道是關(guān)于跳躍,其他具體情況就不知道了* 這里沒有拷貝巖漿球的數(shù)據(jù),讓雪球怪跟史萊姆的這些數(shù)據(jù)保持一致好了*/

??5.讓雪球怪具有一部分雪傀儡的屬性:

??首先我們翻閱雪傀儡的源碼,找到其中令雪傀儡走路留雪,見水死等屬性的方法:

public void onLivingUpdate(){super.onLivingUpdate();if (!this.world.isRemote){int i = MathHelper.floor(this.posX);int j = MathHelper.floor(this.posY);int k = MathHelper.floor(this.posZ);if (this.isWet()){this.attackEntityFrom(DamageSource.DROWN, 1.0F);}if (this.world.getBiome(new BlockPos(i, 0, k)).getTemperature(new BlockPos(i, j, k)) > 1.0F){this.attackEntityFrom(DamageSource.ON_FIRE, 1.0F);}if (!net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this)){return;}for (int l = 0; l < 4; ++l){i = MathHelper.floor(this.posX + (double)((float)(l % 2 * 2 - 1) * 0.25F));j = MathHelper.floor(this.posY);k = MathHelper.floor(this.posZ + (double)((float)(l / 2 % 2 * 2 - 1) * 0.25F));BlockPos blockpos = new BlockPos(i, j, k);if (this.world.getBlockState(blockpos).getMaterial() == Material.AIR && this.world.getBiome(blockpos).getTemperature(blockpos) < 0.8F && Blocks.SNOW_LAYER.canPlaceBlockAt(this.world, blockpos)){this.world.setBlockState(blockpos, Blocks.SNOW_LAYER.getDefaultState());}}}}

??顯而易見是這個,這個方法繼承自抽象類EntityLiving,而史萊姆也繼承自這個抽象類,所以我們完全可以讓雪球怪也繼承這個方法。

??6.完整的雪球怪代碼:

package com.darkill.examplemod.entity;import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.monster.EntitySlime; import net.minecraft.init.Blocks; import net.minecraft.init.SoundEvents; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraft.world.storage.loot.LootTableList;import javax.annotation.Nullable;public class EntitySnowCube extends EntitySlime {public EntitySnowCube(World worldIn) {super(worldIn);}public void registerFixesSnowCube(DataFixer fixer) {EntityLiving.registerFixesMob(fixer, EntitySnowCube.class);}/*** 改變了了雪球怪的速度,讓他和巖漿怪一樣(這個方法是粘貼自巖漿怪的)*/@Overrideprotected void applyEntityAttributes() {super.applyEntityAttributes();this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.20000000298023224D);}/*** @return 設(shè)置是否能召喚,只要游戲難度不是和平模式就能召喚*/@Overridepublic boolean getCanSpawnHere() {return this.world.getDifficulty() != EnumDifficulty.PEACEFUL;}/*** 從雪傀儡的源碼中拷貝了一個函數(shù)給雪球怪* 使雪球怪擁有一些雪傀儡的屬性。*/@Overridepublic void onLivingUpdate(){super.onLivingUpdate();if (!this.world.isRemote){int i = MathHelper.floor(this.posX);int j = MathHelper.floor(this.posY);int k = MathHelper.floor(this.posZ);if (this.isWet()){this.attackEntityFrom(DamageSource.DROWN, 1.0F);}if (this.world.getBiome(new BlockPos(i, 0, k)).getTemperature(new BlockPos(i, j, k)) > 1.0F){this.attackEntityFrom(DamageSource.ON_FIRE, 1.0F);}if (!net.minecraftforge.event.ForgeEventFactory.getMobGriefingEvent(this.world, this)){return;}for (int l = 0; l < 4; ++l){i = MathHelper.floor(this.posX + (double)((float)(l % 2 * 2 - 1) * 0.25F));j = MathHelper.floor(this.posY);k = MathHelper.floor(this.posZ + (double)((float)(l / 2 % 2 * 2 - 1) * 0.25F));BlockPos blockpos = new BlockPos(i, j, k);if (this.world.getBlockState(blockpos).getMaterial() == Material.AIR && this.world.getBiome(blockpos).getTemperature(blockpos) < 0.8F && Blocks.SNOW_LAYER.canPlaceBlockAt(this.world, blockpos)){this.world.setBlockState(blockpos, Blocks.SNOW_LAYER.getDefaultState());}}}}/*** 這個方法依舊是粘貼的巖漿怪的,他的作用應(yīng)該是用來設(shè)置史萊姆的大小的(大史萊姆,中史萊姆,小史萊姆)* 這個方法中顯示調(diào)用了超類史萊姆的方法設(shè)置好了大小,然后再把生物的護甲值升高,所以巖漿怪才會比普通史萊姆難打。* @param size* @param resetHealth*/@Overrideprotected void setSlimeSize(int size, boolean resetHealth){super.setSlimeSize(size, resetHealth);this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue((double)(size * 3));}/*** 該方法繼承自史萊姆* @return 設(shè)置的粒子效果*/@Overrideprotected EnumParticleTypes getParticleType() {return EnumParticleTypes.SNOWBALL;}/*** @return 這個返回值是雪球怪死后會分裂成什么*/@Overrideprotected EntitySlime createInstance(){return new EntitySnowCube(this.world);}/*** 這個方法是獲得掉落物表,繼承自EntityLiving* @return 返回掉落物表*/@Override@Nullableprotected ResourceLocation getLootTable(){// 如果是小史萊姆才會掉落雪球return this.isSmallSlime() ? LootTableList.ENTITIES_SNOWMAN : LootTableList.EMPTY;}/*** 跳躍延遲,直接粘貼巖漿怪的數(shù)據(jù)了*/@Overrideprotected int getJumpDelay(){return super.getJumpDelay() * 4;}/** 此外還有幾個方法繼承自史萊姆* jump() handleJumpLava() handleJumpWater() 等,* 只知道是關(guān)于跳躍,其他具體情況就不知道了* 這里沒有拷貝巖漿球的數(shù)據(jù),讓雪球怪跟史萊姆的這些數(shù)據(jù)保持一致好了*//*** @return 能否傷害玩家* 這里和巖漿怪保持一致,無論大小都能傷害,但其實史萊姆這里是return !this.isSmallSlime();小的沒有攻擊力*/@Overrideprotected boolean canDamagePlayer(){return true;}/*** @return 攻擊強度,這里和巖漿怪保持一致,是史萊姆攻擊強度加二*/@Overrideprotected int getAttackStrength(){return super.getAttackStrength() + 2;}/*** 被攻擊后發(fā)出的聲音* @return 這里和雪傀儡一致*/@Overrideprotected SoundEvent getHurtSound(DamageSource damageSourceIn){return SoundEvents.ENTITY_SNOWMAN_HURT;}/*** 死亡音效* @return 和雪傀儡一致*/@Overrideprotected SoundEvent getDeathSound(){return SoundEvents.ENTITY_SNOWMAN_DEATH;}/*** 被擠壓的音效* @return 雪傀儡沒有這個音效,所以這里用的是雪傀儡的環(huán)境音效*/@Overrideprotected SoundEvent getSquishSound(){return SoundEvents.ENTITY_SNOWMAN_AMBIENT;}/*** 跳躍音效* @return 使用扔雪球的音效*/protected SoundEvent getJumpSound(){return SoundEvents.ENTITY_SNOWBALL_THROW;}}

三、加載雪球怪的材質(zhì)

??做這一步時,我們需要下載兩個模組,tabula和iChunUtil,這個我在CSDN上上傳了,點這里下載tabula和iChunUtil。

??具體如何使用這兩個工具,并把模型導(dǎo)入項目,請參考b站的這個視頻

??然后做好材質(zhì)以后我們就可以運行游戲了。下面是我做的材質(zhì):

四、運行游戲

??呆萌的材質(zhì)

??能夠被雨淋死,還能留下雪跡:

??掉落物

總結(jié)

以上是生活随笔為你收集整理的【Minecraft java edition 模组开发】(二):通过对岩浆怪和雪傀儡的源码分析,自己制作一个雪球怪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。