如何在1.20.4版本NMS中用自定义末影龙替换原版?
1.20.4 NMS(Mojang映射)替换原版末影龙为自定义版本方案
针对你要替换原版末影龙、修改其属性的需求,以下是具体实现步骤,无需依赖onChunkLoad这类方法:
一、创建自定义末影龙实体类
继承原版EnderDragon类,重写对应方法来修改大小、速度等属性,示例如下:
import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import net.minecraft.world.level.Level; public class CustomEnderDragon extends EnderDragon { public CustomEnderDragon(EntityType<? extends EnderDragon> type, Level level) { super(type, level); } // 修改实体缩放比例(原版为1.0F) @Override public float getScale() { return 2.0F; // 2倍大小 } // 自定义tick逻辑,比如持续提升移动速度 @Override public void tick() { super.tick(); this.setSpeed(this.getSpeed() * 1.005F); // 每次tick小幅加速 } // 如需修改AI,可重写registerGoals方法调整目标优先级或新增行为 @Override protected void registerGoals() { super.registerGoals(); // 示例:移除原版某个AI目标,添加自定义目标 // this.goalSelector.removeGoal(原版目标实例); // this.goalSelector.addGoal(优先级, 自定义目标); } }
二、注册自定义实体类型
在插件启动时,将自定义龙注册到Minecraft的实体注册表中:
import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import org.bukkit.plugin.java.JavaPlugin; public class YourPlugin extends JavaPlugin { public static EntityType<CustomEnderDragon> CUSTOM_ENDER_DRAGON; @Override public void onEnable() { // 构建自定义实体类型 CUSTOM_ENDER_DRAGON = EntityType.Builder.of(CustomEnderDragon::new, MobCategory.MONSTER) .sized(16.0F, 8.0F) // 碰撞箱大小,原版为16x8,可按需调整 .clientTrackingRange(10) .build("custom_ender_dragon"); // 注册到实体注册表 Registry.register(Registry.ENTITY_TYPE, new ResourceLocation("yourplugin", "custom_ender_dragon"), CUSTOM_ENDER_DRAGON); // 注册事件监听器 getServer().getPluginManager().registerEvents(new DragonSpawnListener(), this); getServer().getPluginManager().registerEvents(new WorldInitListener(), this); } }
三、拦截原版末影龙生成
末影龙的生成分为两种场景:首次进入末地、击败后通过龙蛋重生,分别处理:
1. 拦截龙蛋重生事件
监听Bukkit的EnderDragonSpawnEvent,取消原版生成并替换为自定义龙:
import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EnderDragonSpawnEvent; import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; public class DragonSpawnListener implements Listener { @EventHandler public void onDragonSpawn(EnderDragonSpawnEvent event) { event.setCancelled(true); // 取消原版龙生成 // 获取NMS世界实例 net.minecraft.world.level.Level nmsWorld = ((CraftWorld) event.getWorld()).getHandle(); // 生成自定义龙并添加到世界 CustomEnderDragon customDragon = new CustomEnderDragon(YourPlugin.CUSTOM_ENDER_DRAGON, nmsWorld); customDragon.setPos(event.getLocation().getX(), event.getLocation().getY(), event.getLocation().getZ()); nmsWorld.addFreshEntity(customDragon); } }
2. 替换末地首次生成的龙
通过反射修改EndDragonFight中的龙实体类型,确保首次进入末地时生成自定义龙:
import org.bukkit.event.EventHandler; import org.bukkit.event.world.WorldInitEvent; import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; import net.minecraft.world.level.dimension.end.EndDragonFight; import net.minecraft.world.level.dimension.end.EndLevel; import java.lang.reflect.Field; public class WorldInitListener implements Listener { @EventHandler public void onWorldInit(WorldInitEvent event) { if (event.getWorld().getEnvironment() != org.bukkit.World.Environment.THE_END) { return; } EndLevel endLevel = (EndLevel) ((CraftWorld) event.getWorld()).getHandle(); EndDragonFight dragonFight = endLevel.getDragonFight(); if (dragonFight == null) { return; } // 反射替换龙实体类型 try { Field dragonTypeField = EndDragonFight.class.getDeclaredField("dragonType"); dragonTypeField.setAccessible(true); dragonTypeField.set(dragonFight, YourPlugin.CUSTOM_ENDER_DRAGON); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } }
四、关键注意事项
- 确保插件依赖的CraftBukkit/Spigot版本为1.20.4,Mojang映射配置正确。
- 修改实体属性时需测试兼容性,比如过度放大可能导致碰撞异常,速度过快可能让AI逻辑失效。
- 若需添加自定义同步数据,可重写
defineSynchedData方法注册数据包。
内容的提问来源于stack exchange,提问作者David Melendez Garcia
相关产品推荐
相关产品推荐

