java 使用BlockBench和MineCraft插件API创建全新的武器

3wabscal  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(39)

我想使用Blockbench(一个3D建模应用程序,如blender)来创建一个全新的Minecraft武器。
然后,用java和一些API(例如bukkit),我想拥有一个全新的武器。
我不想改造现有的武器,例如钻石剑。
有没有人好心地给我给予一下?比如,我不清楚的是如何从Blockbench导出,以及如何导入到Minecraft中。
Bukkit是正确的API吗?确实知道另一个API能更好地满足我的需求。我不是Java初学者。

fbcarpbf

fbcarpbf1#

定制模型

背景

你绝对可以做到这一点。自Minecraft 1.9版本以来,Mojang引入了基于耐久性为物品纹理的功能。令人兴奋的是,它允许几乎无限的自定义模型,而不会取代现有的模型!是的,即使你在生存和损害它,所以确切的耐用性,你设置的自定义模型,它仍然是分离的。这是因为你可以设置物品不被损坏,但仍然有一定的耐久值。多么狡猾!唯一的问题是,如果你正在为1.8开发(通常为1.8最新的服务器),那么你可以使用任何这些。
这是如何工作的,例如,钻石锄头的最大耐久性为1561。这意味着您可以通过使用钻石锄头拥有1560种不同的自定义模型!它是1560而不是1561,因为1561/1561将是完整的耐久性或只是普通的钻石锄头。

创建基础资源包

我从Blockbench开始。要导出模型,是File-> Export-> Export Block/Item Model。这将把它导出为JSON文件。当你导出模型时,不要将项目命名为diamond_hoe或任何你将在model id下使用的项目。实际上,它将被称为什么。我将在下一步中向你展示为什么。你甚至可以添加一个如果你愿意的话,可以使用另一个命名空间,但是我们只使用Minecraft命名空间。要导出纹理,右键单击它并按Save As
我们将制作一个基本的资源包。您可以随意调用资源包文件夹。将JSON放入<your resource pack folder>-> assets-> minecraft-> models-> item。将纹理放入<your resource pack folder>-> assets-> minecraft-> textures-> item。在资源包文件夹中,你还必须有一个pack.mcmeta文件和一个pack.png文件。你很可能已经熟悉了。

自定义模型魔术

在你制作了一个基本的资源包之后,是时候为diamond hoe创建模型了,它将指向你的模型。这就是为什么你在上一步中将它命名为实际物品。diamond_hoe.json应该看起来像这样:

{
    "parent": "item/handheld",
    "textures": {
        "layer0": "item/diamond_hoe"
    },
    "overrides": [
        {"predicate": {"damage": 0}, "model": "item/diamond_hoe"},
        {"predicate": {"damaged": 0, "damage": 0.000640614990391}, "model": "item/your_custom_item" },
        {"predicate": {"damaged": 1}, "model": "item/diamond_hoe"}
    ]
}

字符串
predicate修改器是告诉游戏什么时候应该显示不同的模型。This tool可以为您生成JSON。伤害值是您希望它在总耐久度上使用的任何伤害(例如,一个耐久度将是1/1561,等于0.000640614990391)。
之后,只有一个自定义项目的布局应该看起来像这样:

.
└── resource pack folder/
    ├── assets/
    │   └── minecraft/
    │       ├── models/
    │       │   └── item/
    │       │       ├── diamond_hoe.json
    │       │       └── your_custom_item.json
    │       └── textures/
    │           └── item/
    │               └── your_custom_item.png
    ├── pack.mcmeta
    └── pack.png


同样,你可以用不同的方式来布局它。你可以在另一个名称空间中放置你的自定义内容。这就是我所做的。
要添加多个项目(例如三个以上的项目),请修改您的diamond_hoe.json,如下所示:

{
    "parent": "item/handheld",
    "textures": {
        "layer0": "item/diamond_hoe"
    },
    "overrides": [
        {"predicate": {"damage": 0}, "model": "item/diamond_hoe"},
        {"predicate": {"damaged": 0, "damage": 0.000640614990391}, "model": "item/your_custom_item"},
        {"predicate": {"damaged": 0, "damage": 0.001281229980782}, "model": "item/your_custom_item2"},
        {"predicate": {"damaged": 0, "damage": 0.001921844971172}, "model": "item/your_custom_item3"},
        {"predicate": {"damaged": 0, "damage": 0.002562459961563}, "model": "item/your_custom_item4"},
        {"predicate": {"damaged": 1}, "model": "item/diamond_hoe"}
    ]
}

Bukkit/Spigot插件

现在,在所有这些之后。是时候使用API了。是的,Bukkit API是你需要的。Spigot API包括Bukkit API,所以你应该使用Spigot API。如果你还没有使用它,请改用它。没有人再使用Bukkit服务器本身了。我假设你运行的是Spigot/Paper服务器。我假设你也使用最新的1.20.4版本。
听起来你对Spigot插件还很陌生,所以我们将从头开始制作一个插件。下面是Spigot插件的基本布局。你应该已经熟悉Java项目的基本布局,但下面是这个项目最终应该看起来的样子:

.
├── src
├── pom.xml/build.gradle
└── other_build_junk/
    └── main/
        ├── java/
        │   └── your_website_ending/me/
        │       └── your_company_or_name/
        │           └── yourplugin/
        │               ├── commands/
        │               │   └── GiveItem.java
        │               └── YourPlugin.java <- Main class
        └── resources/
            └── plugin.yml


使用您最喜欢的Java IDE(最好是IntelliJ而不是Eclipse或其他任何东西)来创建Java项目,但如果您有IntelliJ,只需安装Minecraft Development插件并创建Minecraft项目。它会为您创建plugin.yml和构建脚本。您可以使用任何您想要的构建系统。我喜欢Gradle,但我会向您展示两者的依赖关系应该是什么样子。
Gradle:

repositories {
    mavenCentral()
    maven {
        name = "spigotmc-repo"
        url = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/"
    }
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/groups/public/"
    }
}

dependencies {
    compileOnly "org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT"
}


梅文:

<repositories>
        <repository>
            <id>spigotmc-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.20.4-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>


现在,你的主类应该看起来像这样:

public final class YourPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        // Register our "giveitem" command
        getCommand("giveitem").setExecutor(new GiveItem());
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
}


注意它是如何扩展JavaPlugin的。这就是它如何成为一个插件的。onEnableonDisable方法在每次服务器启动或停止时运行。onEnable中的这行代码将我们的命令Giveitem分配给它的执行器,GiveItem类。它将是为我们提供自定义项的命令。如果您还没有创建命令文件夹,请创建命令文件夹。然后,GiveItem类。最终将如下所示:

public class GiveItem implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {

        if (commandSender instanceof Player player) {
            
            // Create a diamond hoe that will become our item
            ItemStack customItem = new ItemStack(Material.DIAMOND_HOE);
            // Item meta allows for modifying its data
            Damageable itemMeta = (Damageable) customItem.getItemMeta();
            // Set damage to 1 or like how we did in the json except the actual number
            // Why can't they do it this way in the json?
            itemMeta.setDamage(1);
            // Make it always stay the same durability
            itemMeta.setUnbreakable(true);
            // Use the following line to remove the extra lore we don't need
            itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_UNBREAKABLE);
            // Name it whatever you want
            itemMeta.setDisplayName("My Custom Item");
            customItem.setItemMeta(itemMeta);
            // Add item to player's inventory
            player.getInventory().addItem(customItem);
            
        }
        return true;
    }
}


如果你想知道为什么我们不能只使用give,那将覆盖游戏内置的/give命令,我们不想这样做。请记住,你可以以任何方式获得你的物品,无论是从命令,小游戏,或者一个GUI商店。我们只是想得到你的物品。这就是为什么我们从这个基本命令开始。这就是Spigot API的酷之处。你可以构建你的Minecraft梦想。* 几乎 * 任何你能想象的。
不管怎样,你的plugin.yml应该看起来像这样:

name: YourPlugin
version: '${version}' # Should be '${project.version}' for Maven
main: me.myname.yourplugin.YourPlugin
api-version: '1.20'
commands:
  giveitem:
    description:
      Give a custom item


这是使你的插件成为官方的东西。它还告诉服务器应该为这个插件创建的任何命令。

测试时间!

最后,构建你的插件(应该已经在IntelliJ中准备好了)。如果你正在使用其他东西,请使用Maven的package命令和Gradle的build命令。将插件放入你的服务器plugin文件夹。它应该在Maven的target文件夹和Gradle的build/libs文件夹中。
确保您的资源包在正确的位置。启动Minecraft并启用您的资源包。然后,启动您的服务器,登录后,运行我们使用/giveitem创建的giveitem命令,您应该有您的自定义项目!
请记住,你可以在不替换现有物品的情况下制作成千上万的自定义物品。从1.14版本开始,他们引入了custom_model_data修改器,允许更多的模型。尽管谁会制作那么多模型呢!
其中一些是我从this guide得到的。现在有点过时了,但是如果你知道最新的API,它就能工作。哎呀,虽然有些是不正确的。也许我应该修复它.

相关问题