dh381
序言
众所周知,mc的数据包相比mod受限很多,虽然有CustomModelData的存在,玩家可以很轻松地自定义物品的贴图,但也有其他方面的限制,例如——不可以自定义方块
本帖就是一个基于展示实体的自定义方块教程,在阅读此帖并实践之前,你需要具备以下知识:
1.了解模型文件的基本语法
2.有一定的命令基础
3.会画图
范例
下面是我在数据包里自定义的一个方块



























可以看到这个方块的原型其实是木桶











贴图完美贴合方块,没有穿模

正文
如何制作方块ui并不在本帖的讨论范围内,想了解更多可以看此帖首先我们需要自定义一个可以用于放置方块的物品


Q:为什么是物品而不是方块?
A:如果我们要自定义方块的贴图,就必须要在方块位置生成一个展示对应模型的展示实体,而用进度虽然可以检测玩家放置方块,视线追踪法精度较低,不一定能精准找到方块被放置的具体坐标,相比之下,如果用using_item进度检测右键使用,就可以利用视线追踪法同时获得方块被放置的坐标和要生成展示实体的坐标
而且物品的战利品表比那种带ui方块的战利品表好写多了

先做一个对应的物品战利品表(这里我使用快速装填6的弩)
{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:crossbow",
                    "functions": [
                        {
                            "function": "set_nbt",
                            "tag": "{id:"edw:enhance_table",display:{Name:'{"text":"强化工作台","color":"blue","bold":true}',Lore:['[{"text":"神器注入元素之眼的力量,会怎么样?"}]']},Enchantments:[{id:"minecraft:quick_charge",lvl:6s}],CustomModelData:3810014}"
                        }
                    ]
                }
            ]
        }
    ]
}复制代码其他的都可以忽略,我们只需要记住它的自定义id是edw:enhance_table,它的CustomModelData是3810014

然后做一个右键检测的进度
edw:enhance_table_set
{
    "criteria": {
        "enhance_table_set": {
            "trigger": "minecraft:using_item",
            "conditions": {
                "item": {
                                "items": ["minecraft:crossbow"]
                                }
            }
        }
    },
    "rewards": {
        "function": "enhance_table:summon"
    }
}复制代码




接下来创建函数enhance_table:summon
execute as @s[nbt={SelectedItem:{tag:{id:"edw:enhance_table"}}}] at @s run summon armor_stand ~ ~ ~ {NoGravity:1b,Invisible:1b,Small:0b,Invulnerable:0b,ShowArms:0b} #生成盔甲架用于视线追踪
execute as @a[nbt={SelectedItem:{tag:{id:"edw:enhance_table"}}}] run tp @e[type=armor_stand,nbt={NoGravity:1b,Invisible:1b,Small:0b,Invulnerable:0b,ShowArms:0b}] @s #tp盔甲架校正方向
execute as @s[nbt={SelectedItem:{tag:{id:"edw:enhance_table"}}}] run item replace entity @s weapon.mainhand with minecraft:air #放置后清除玩家手上的物品
advancement revoke @s only edw:enhance_table_set #清除进度用于重复触发复制代码


然后创建函数enhance_table:enhance_table_set(tick)
execute as @e[type=armor_stand,nbt={NoGravity:1b,Invisible:1b,Small:0b,Invulnerable:0b,ShowArms:0b}] at @s run tp ^ ^ ^0.4复制代码标签#edw:block_not_place,此标签包含了那些不可以作为放置位置的方块
{
    "values": [
            "minecraft:water",
            "minecraft:air",
            "minecraft:lava"
        ]
}复制代码




可以看到,我对上面那条生成展示实体的命令标红了,非常重要
Q:为什么不在盔甲架位置直接生成物品展示实体,而是要先生成展示框
A:因为物品展示实体的生成位置不一定和方块一样,方块只能生成在整数坐标,但实体不行,所以我们需要想办法校正展示实体的坐标

缺点是:

不可自由旋转,例如用于显示地面的告示牌模型就相对麻烦一点;
不可自由移动,只能位于整数坐标处;
不可使用物品标签谓词,盔甲架可以将物品复制到主副手来判断其是否属于某物品标签,而物品展示框不行;
不可使用工具进行 loot mine/kill;
拥有CustomName时会显示物品名称。以上信息来自此帖
可以看到,展示框只能位于整数坐标的缺点反而对我们有利,可以利用这一点校正坐标

然后更改一下原版弩的模型文件,如果你使用其它物品,就需要改对应物品的模型文件
{
    "parent": "item/generated",
    "textures": {
        "layer0": "item/crossbow_standby"
    },
    "display": {
        "thirdperson_righthand": {
            "rotation": [ -90, 0, -60 ],
            "translation": [ 2, 0.1, -3 ],
            "scale": [ 0.9, 0.9, 0.9 ]
        },
        "thirdperson_lefthand": {
            "rotation": [ -90, 0, 30 ],
            "translation": [ 2, 0.1, -3 ],
            "scale": [ 0.9, 0.9, 0.9 ]
        },
        "firstperson_righthand": {
            "rotation": [ -90, 0, -55 ],
            "translation": [ 1.13, 3.2, 1.13],
            "scale": [ 0.68, 0.68, 0.68 ]
        },
        "firstperson_lefthand": {
            "rotation": [ -90, 0, 35 ],
            "translation": [ 1.13, 3.2, 1.13],
            "scale": [ 0.68, 0.68, 0.68 ]
        }
    },
    "overrides": [
                {
                    "predicate": {
                            "custom_model_data":3810002
                        },
                        "model": "item/gale_stick"
                },
                {
                    "predicate": {
                            "custom_model_data":3810004
                        },
                        "model": "item/vex_book"
                },
                {
                    "predicate": {
                            "custom_model_data":3810007
                        },
                        "model": "item/ice_stick"
                },
                [color=#ff0000]{[/color]
[color=#ff0000]                    "predicate": {[/color]
[color=#ff0000]                            "custom_model_data":3810014[/color]
[color=#ff0000]                        },[/color]
[color=#ff0000]                        "model": "item/enhance_table"[/color]
[color=#ff0000]                },[/color]
                {
                    "predicate": {
                        "pulling": 1,
                        "pull": 0.01
                    },
                    "model": "item/crossbow_pulling_0"
                },
                {
                    "predicate": {
                        "pulling": 1,
                        "pull": 0.58
                    },
                    "model": "item/crossbow_pulling_1"
                },
                {
                     "predicate": {
                         "pulling": 1,
                         "pull": 1.0
                    },
                    "model": "item/crossbow_pulling_2"
                },
                {
                    "predicate": {
                    "charged": 1
                    },
                    "model": "item/crossbow_arrow"
                },
                {
                    "predicate": {
                        "charged": 1,
                        "firework": 1
                    },
                    "model": "item/crossbow_firework"
                }
        ]
}复制代码




上面标红的那一段对应的就是自定义方块的模型

创建新模型enhance_table
{
    "parent": "minecraft:block/cube",
        "display": {
        "gui": {
            "rotation": [ 30, 225, 0 ],
            "translation": [ 0, 0, 0],
            "scale":[ 0.625, 0.625, 0.625 ]
        },
        "ground": {
            "rotation": [ 0, 0, 0 ],
            "translation": [ 0, 3, 0],
            "scale":[ 0.25, 0.25, 0.25 ]
        },
        [color=#ff0000]"fixed": {[/color]
[color=#ff0000]            "rotation": [ 0, 0, 0 ],[/color]
[color=#ff0000]            "translation": [ 0, 0, 0],[/color]
[color=#ff0000]            "scale":[ 1.001, 1.003, 1.001 ][/color]
[color=#ff0000]        },[/color]
        "thirdperson_righthand": {
            "rotation": [ 75, 45, 0 ],
            "translation": [ 0, 2.5, 0],
            "scale": [ 0.375, 0.375, 0.375 ]
        },
        "firstperson_righthand": {
            "rotation": [ 0, 45, 0 ],
            "translation": [ 0, 0, 0 ],
            "scale": [ 0.40, 0.40, 0.40 ]
        },
        "firstperson_lefthand": {
            "rotation": [ 0, 225, 0 ],
            "translation": [ 0, 0, 0 ],
            "scale": [ 0.40, 0.40, 0.40 ]
        }
    },
    "textures": {
        "down": "minecraft:block/bedrock",
        "east": "minecraft:block/stone_ingot",
        "north": "minecraft:block/stone_ingot",
        "particle": "minecraft:block/crafting_table_front",
        "south": "minecraft:block/stone_ingot",
        "up": "minecraft:block/enhance_table_top",
        "west": "minecraft:block/stone_ingot"
    }
}复制代码




上面标红的是在原版block模型基础上修改过的,在解释之前,先回去翻enhance_table:enhance_table_set的标红部分,我们可以看到生成的物品展示实体的展示模式是fixed,这也是我们在模型文件里修改那里的原因

Q:你一个物品为什么用的是方块模型
A:总比直接用方块展示实体简单得多罢(

实测在模型放大倍数为1.001时可以基本把整个贴图套在方块外边,不要设置为1,那样会造成贴图闪烁

接着创建函数edw:enhance_table_drop(tick),作为破坏事件
execute as @e[type=minecraft:item,nbt={Item: {id: "minecraft:barrel",tag: {display: {Name: '{"bold":true,"color":"blue","text":"强化工作台"}'}}}}] at @s run loot spawn ~ ~ ~ loot edw:enhance_table复制代码




结尾(随便bb,可以不用看)
没想到你还能看到这里,还真是不容易啊
这篇帖子可以说是我写的最长的教程帖了,如果觉得还不错的话,可以投喂一点人气

第一页 上一页 下一页 最后一页