之前自己做着玩发现网上大多都是旧版本的了,直接引用到1.20.1会有名字(customname)失效显示“无业”名字或者药水物品什么的指令里面改动了交易界面不改动,所以自己用NBT复制重新解析了一下算是
—————————————————————————————————————
话不多说,咱直接上个例子,带有(模组属性)的是我mod带的属性,实际运用中不修改的部分都可以不输入,但是要注意各个环节的大括号(括号的正确使用最大影响了指令结构不出错),所以建议手打一个指令后面的复制过去修修改改
/summon minecraft:villager 46.50 83.50 4.50 { #此处为生成村民以及坐标
# ===== 基础属性 =====
Brain: {memories: {}}, #清空AI记忆
HurtByTimestamp: 0, #最近受伤时间戳(0表示未受伤)
ForgeData: {}, #Forge模组数据(空)
#这三项一般不用管,有特殊需要可以自行研究
# ===== 实体属性 =====该部分为实体通用数值,按需要研究更改即可
Attributes: [
{Base: 0.5d, Name: "minecraft:generic.movement_speed"}, // 移动速度
{Base: 20.0d, Name: "minecraft:generic.max_health"}, // 最大生命值(20心)
{Base: 0.1d, Name: "caelus:fall_flying"}, // 鞘翅飞行相关(模组属性)
{Base: 0.0d, Name: "reach-entity-attributes:attack_range"}, // 攻击距离(模组)
{Base: 0.0d, Name: "minecraft:generic.knockback_resistance"}, // 击退抗性
{Base: 0.0d, Name: "obscure_api:regeneration"}, // 生命恢复(模组)
{Base: 2.0d, Name: "minecraft:generic.attack_damage"}, // 攻击伤害
{Base: 0.0d, Name: "minecraft:generic.armor"}, // 护甲值
{Base: 0.0d, Name: "reach-entity-attributes:reach"} // 交互距离(模组)
],
// ===== 状态标记 =====该部分为实体通用数值,按需要研究更改即可
FoodLevel: 0b, // 饥饿值(村民无用)
Invulnerable: 0b, // 是否无敌(0=false),如使用这项切记添加标签,否则无法通过常规方法清除该实体
FallFlying: 0b, // 是否正在滑翔(鞘翅)
ForcedAge: 0, // 强制年龄(繁殖用),这项很鸡肋,自定义村民不存在需要繁殖的说法
Gossips: [], // 村民 gossip 数据(空)(这项是什么八卦闲聊属性)
PortalCooldown: 0, // 传送门冷却
AbsorptionAmount: 0.0f, // 伤害吸收护盾值
LastRestock: 0L, // 上次补货时间(长整型)一般用来做交易直接0L
FallDistance: 0.0f, // 掉落距离
CanUpdate: 1b, // 是否可更新(1=true)
DeathTime: 0s, // 死亡时间(0=存活)
Xp: 12, // 当前经验值(12点)
LastGossipDecay: 22119811L, // 上次 gossip 衰减时间
// ===== 模组兼容性数据 =====该部分为模组需要联动才做修改,自行研究
如不需要只保留ForgeCaps: {}或者取消这项均可
ForgeCaps: {
"illageandspillage:webbed": {webbed: 0b}, // 是否被蛛网缠住(模组)
"cataclysm:hook_cap": {hasHook: 0b}, // 钩爪相关(模组)
...(其他模组数据省略)...
},
// ===== 物品相关 =====该部分为实体通用数值,按需要研究更改即可
HandDropChances: [0.0f, 0.0f], // 手中物品掉落概率,这个一般用于生成怪物实体
PersistenceRequired: 1b, // 是否永久存在(1=true)
ASLoaded: 1b, // 是否已加载(存档标记)
Tags: ["ctrlHealthM76"], // 自定义标签(用于识别),如果选用了无敌,可以利用kill @e[tag=.......]的方法杀死这个实体
// ===== 实体状态 =====该部分为实体通用数值,按需要研究更改即可
Age: 0, // 年龄(0=成年)
BalmData: {}, // 药水数据(空){}内按照实体药水效果填写即可
Motion: [0.0d, 0.0d, 0.0d], // 移动速度向量(静止)
YouthPotion: 0b, // 是否喝下青春药水
Health: 20.0f, // 当前生命值(20心)
LeftHanded: 0b, // 是否左撇子
Air: 300s, // 剩余氧气值
OnGround: 0b, // 是否在地面(0=空中)这项一般不用改,0b下NoAI开启情况实体会锁定在生成坐标
// ===== 交易系统 =====本次的主要环节
Offers: {
Recipes: [
// 交易1:20绿宝石 → 附魔金苹果(例证纯原版交易)
{
maxUses: 9999999, // 交易次数
buy: {id: "minecraft:emerald", Count: 20b}, // 消耗20绿宝石
sell: {id: "minecraft:enchanted_golden_apple", Count: 1b}, // 获得1附魔金苹果
xp: 1, // 提供1点交易经验
uses: 12, // 已交易次数(12次)初始是0,这里是因为我试验用过
rewardExp: 1b // 是否奖励经验(1=true)
},
// 交易2:1王国银票 → 3个猎兽场传送石(添加NBT和注释例证)
{
maxUses: 9999999,
buy: {id: "minecraft:paper", Count: 1b, //一张纸(王国银票)
tag: { // 自定义NBT
display: {
Lore: ['{"text":"等同 绿宝石×64 的凭证"}'],// 注释
Name: '{"text":"王国银票"}'//物品名字
}//display项结束
}//tag项结束
},//消耗项结束
sell: {id: "minecraft:flint", Count: 3b, //三个燧石(猎兽场传送石)
tag: {
display: {
Lore: ['{"text":"使用后传送进入猎兽场"}'],
Name: '{"text":"猎兽场传送石"}'
}
}
},//获得项结束
xp: 1,
uses: 0, // 当前交易次数(0次)
rewardExp: 1b
}
//交易二结束
]
},
// ===== 村民特性 =====
NoAI: 1b, // 禁用AI(静止不动)
Rotation: [0.0f, 0.0f], // 朝向角度(水平0°,垂直0°)
HandItems: [{}, {}], // 手中物品(空)
RestocksToday: 0, // 今日补货次数
ArmorDropChances: [0.0f, 0.0f, 0.0f, 0.0f], // 护甲掉落概率
CustomName: '{"text":"黑市商人","color":"#FFFFFF"}', // 显示名称(白色)
CustomNameVisible: 1b,//名称永远显示
Fire: 0s, // 燃烧时间(0=未燃烧)
ArmorItems: [{}, {}, {}, {}], // 护甲槽(空)
CanPickUpLoot: 1b, // 可拾取物品(1=true)
VillagerData: {
profession: "minecraft:none", // 职业(无职业)
level: 1, // 交易等级(1级)
type: "minecraft:plains" // 村民类型(平原)
},
HurtTime: 0s, // 受伤无敌帧(0=未受伤)
Inventory: [] // 背包物品(空)
}
至此一个自定义村民交易就结束了,红色部分作为主要修改项,绿色部分按需要修改即可,一般来说绿色部分不需要做改动,具体的改动项其实各个版本相差不大,只是这个模板下的生成指令更完善,不会出现物品或村民的名称失效的情况,整体来说各个版本的实体生成指令在小项上都没什么大区别。
最后在这里我给出最省事省力的偷懒方法:在AI的对话框中复制本文链接,按“.......根据这个网页的内容给我生成一个叫XXX的村民,第一项交易为X个注释为X的名为X购买Y个注释为Y的名为Y,第二项交易.....”以此内推,有其他的需求可以加在里面输出给AI,最后AI输出的指令去掉注释照着输入命令方块就行。