You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:59:53