Plants-Stars
本帖最后由 Plants-Stars 于 2021-3-18 23:06 编辑

1.自定义维度:有没有办法搞一个自定义维度,地形要的是自定义世界的浮岛类型,并且每种生物群系都存在,名称为sky(就是说用execute in sky进入)

2.自定义成就:比方说进入上一个维度,就可以触发这个成就,要求是隐藏成就,边框为挑战,名称为sky,简介为oh,背景为石英块,有子成就为ok,触发条件是捡起带nbt为{ts:true},名称和简介随意(我自己改)

3.用谓词检测问题:比如用谓词检测我背包里有无甘蔗,我末影箱里是否有甘蔗,有没有办法用谓词检测月亮的圆缺(谓词不行的话其他的也可以),还有个应该比较简单的问题,虽然很老套,但我也不会,就是检测玩家背包里是否至少存在72颗绿宝石,最好用谓词,还有,怎么检测玩家背包或末影箱的指定位置是否有指定物品,比如甘蔗

4./属性指令:有没有办法用属性指令更改自己的属性,比如我的damage分数为6,我想把我的攻击伤害基础点数来自于damage记分板

5.资源包问题:custommodeldata标签怎么正常应用于弓和钓鱼竿,/playsound指令怎么播放资源包里的音乐(就是不间断的长音乐,音乐文件的格式应该是啥,应该放到哪个目录,有没有限制)

6.战利品表:也没有办法覆盖mc原版的钓鱼战利品表,让他能钓上来自定义物品,最好直接是生物;能不能让指定生物,比如tag为to的僵尸执行指定的战利品表(最好能覆盖他原有本身而不影响普通僵尸的)







ps:我把我压箱底的问题都拿出来了,希望有大佬解答qwq



yan1459070731
嗯 这个问题好高深啊

Chelover_C60
本帖最后由 Chelover_C60 于 2021-3-19 12:53 编辑

1.
自定义维度 - Minecraft Wiki
<datapack>/data/minecraft/dimension/sky.json
  1. {
  2.     "type": "overworld",
  3.     "generator": {
  4.         "type": "noise",
  5.         "seed": 0,
  6.         "settings": "minecraft:floating_islands",
  7.         "biome_source": {
  8.             "type": "vanilla_layered",
  9.             "seed": 0
  10.         }
  11.     }
  12. }
复制代码
这里设置维度类型为主世界,生成器类型为noise(这里区分于超平坦与调试世界)。地形生成器里的噪声设置里,默认的floating_island即可满足要求,无需自定义。生物群系方面使用默认填充即可。两个种子任意填即可,只会影响生成的地形与生物群系的分布。



2.
进度/JSON格式 - Minecraft Wiki
<datapack>/data/minecraft/advancements/sky.json
  1. {
  2.     "display": {
  3.         "icon": {
  4.             "item": "minecraft:stone"
  5.         },
  6.         "title": "sky",
  7.         "description": "oh",
  8.         "frame": "challenge",
  9.         "hidden": true,
  10.         "background": "minecraft:textures/block/quartz_block_top.png"
  11.     },
  12.     "criteria": {
  13.         "sky": {
  14.             "trigger": "changed_dimension",
  15.             "conditions": {
  16.                 "to": "minecraft:sky"
  17.             }
  18.         }
  19.     }
  20. }
复制代码
感觉不需要怎么解释
进度页的背景由根进度控制。background后指定资源包目录下的一张图片,从textures开始,需要命名空间(命名空间为minecraft时可省略)
触发器使用change_dimension,检测当玩家前往sky维度时触发。
<datapack>/data/minecraft/advancements/oh.json
  1. {
  2.     "display": {
  3.         "icon": {
  4.             "item": "minecraft:stone"
  5.         },
  6.         "title": "ok",
  7.         "description": ""
  8.     },
  9.     "parent": "minecraft:sky",
  10.     "criteria": {
  11.         "item": {
  12.             "trigger": "inventory_changed",
  13.             "conditions": {
  14.                 "items": [
  15.                     {
  16.                         "nbt": "{ts: 1b}"
  17.                     }
  18.                 ]
  19.             }
  20.         }
  21.     }
  22. }
复制代码
后面的进度指定parents为sky,此时该进度即成为sky的子进度。
trigger使用inventory_change,并匹配玩家背包内物品nbt。需要注意的是,nbt中,数据出现true/false时,会自动转化成1b/0b,因此最好也写成这类形式(不过印象中似乎写true/false也行?不过懒得试了)



3.
战利品表谓词 - Minecraft Wiki
Player.dat格式 - Minecraft Wiki
谓词并没有直接匹配玩家背包的判定,因此这里的策略是通过entity_properties来匹配玩家nbt。
检测背包
  1. {
  2.     "condition": "entity_properties",
  3.     "entity": "this",
  4.     "predicate": {
  5.         "nbt": "{Inventory:[{id:\"minecraft:sugar_cane\"}]}"
  6.     }
  7. }
复制代码

code代码吞转义好烦啊
检测末影箱
  1. {
  2.     "condition": "entity_properties",
  3.     "entity": "this",
  4.     "predicate": {
  5.         "nbt": "{EnderItems:[{id:\"minecraft:sugar_cane\"}]}"
  6.     }
  7. }
复制代码
检测圆缺做不到,这里提供一种记分板的思路
首先,建立一个dummy记分板(此处假定记分板id为scb,下同)
借助time query获取游戏时间,然后对7取余,得到的数即可用来判断当天月相。
执行一次(设置常量)
  1. scoreboard players set 7 scb 7
复制代码
需要检测时执行
  1. execute store result score day scb run time query day
  2. scoreboard players operation day scb %= 7 scb
复制代码
之后检测day的分数即可用于判断月相。

检测多余一个物品,谓词做不到。这里还是用记分板。
  1. execute as @a store result score @s scb run clear @s emerald 0
  2. execute as @a if score @s scb matches 72.. run say 我有72个绿宝石
复制代码
检测特定栏位的话,在以上谓词的基础上添加Slot即可。对末影箱来说,从第一行第一个到最后一行最后一个依次是0b~26b,玩家背包编号见此处。比如,检测玩家副手拿甘蔗的谓词
  1. {
  2.     "condition": "entity_properties",
  3.     "entity": "this",
  4.     "predicate": {
  5.         "nbt": "{Inventory:[{id:"minecraft:sugar_cane",Slot:-106b}]}"
  6.     }
  7. }
复制代码



4.
除穷举外,无解。/attribute无法做到动态修改玩家属性。
不过还有另一种做法,将分数值储存至一个装备的属性中,然后再通过潜影盒或/item(1.17)转移至玩家身上。缺点是需要固定占用玩家的一个装备栏。



5.
新建资源包,建立assets/minecraft/models/carrot_on_a_stick.json覆盖掉原版胡萝卜钓竿模型,然后写入
  1. {
  2.     "parent": "item/handheld_rod",
  3.     "textures": {
  4.         "layer0": "item/carrot_on_a_stick"
  5.     },
  6.     "overrides": [
  7.         {
  8.             "predicate": {
  9.                 "custom_model_data": 1
  10.             },
  11.             "model": "<另一个模型>"
  12.         }
  13.     ]
  14. }
复制代码
需要做的是在overrides内添加东西。有时候为了方便,也会把overrides中的每一个对象单独写一行。
在predicate中指定custom_model_data为1,并引用另一个模型。模型的路径从model后开始写。
多数情况下被custommodeldata引用的模型是一个仅拥有一个贴图的模型,因此可以直接指定父模型为item/handheld,然后指定layer0为指定贴图的路径。
  1. {
  2.     "parent": "item/handheld_rod",
  3.     "textures": {
  4.         "layer0": "<namespace>:<path>"
  5.     }
  6. }
复制代码
模型引用好后,在游戏中获得对应cmd的胡萝卜钓竿,即可应用特定材质。
这里有一份比较详细的教程,可以参考一下

添加音乐的话,首先需要音乐是ogg格式,放入assets/<namespace>/sounds路径中,然后在资源包中建立assets/<namespace>/sounds.json,编写该文件夹指定音效id、类型,以及所需的音乐(路径从sounds之后开始写,无后缀,有命名空间,若为minecraft则可忽略)。
Sounds.json - Minecraft Wiki
这里我找了一份教程
个人最近瞎写的如何做一个音效资源包的教程



6.
覆盖钓鱼战利品表只需建立文件<datapack>/data/minecraft/loot_tables/gameplay/fishing.json并进行编写即可。
直接是生物。。。你是想钓生物吗?emmmm或许给一个物品特殊的nbt,检测到这个特殊的物品就原地生成生物,然后data modufy Motion再kill物品?
指定生物执行战利品表很容易,修改生物的DeathLootTable这个nbt为指定路径的战利品表即可。一般为了方便会直接在生成时即添加。不过既然楼主要求,那就
  1. /execute as @e[type=zombie,tag=to] run data merge entity @s {DeathLootTable:"<namespace>:<path>"}
复制代码




终于打完了,累死了,睡了

Plants-Stars
本帖最后由 Plants-Stars 于 2021-3-19 19:24 编辑
Chelover_C60 发表于 2021-3-19 02:15
1.
自定义维度 - Minecraft Wiki
/data/minecraft/dimension/sky.json

大佬我还想问一下,就是,自定义维度能不能设置不生成建筑,生成自带的结构方块存储的结构,然后wiki:"https://wiki.biligame.com/mc/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%B4%E5%BA%A6",维度类型,应该怎么设置;那个成就我看原版进度界面一个标签和标题,获取时另一个标签和标题,请问自定义的能做到吗;那个是弓和钓鱼竿,不是胡萝卜钓竿,用cutommodeldata只能显示弓和钓鱼竿的第一阶段的材质,拉弓或者抛出后就还是游戏原材质了(或者是大佬已经讲了,我没听懂 bushi)

Chelover_C60
Plants-Stars 发表于 2021-3-19 18:47
大佬我还想问一下,就是,自定义维度能不能设置不生成建筑,生成自带的结构方块存储的结构,然后wiki:"ht ...

我翻了下level.dat,建筑生成的规则是全存档通用的,可能没法搞每个维度使用不同的建筑生成规则。
可能有一种方法,在一个单独的数据包中使用空的结构替换掉游戏原本的结构,当玩家进入自定义维度时开启这个数据包,并在玩家离开后禁用掉,这样可能可以解决这个问题。不过这样也会导致数据包不再兼容多人游戏。
或者也可以直接用自定义的结构替换游戏原本的结构
这个教程讲述了一些在原版中添加自定义建筑的一些方法,可供参考
https://zhangshenxing.gitee.io/v ... 0%E7%BB%93%E6%9E%84

一般情况下默认的四个维度类型(overworld、overworld_caves、the_nether、the_end)足够用,直接在dimension里调用即可
如果不够的话,可以在data/<namespace>/dimension_type目录下建立json文件,并依照对应格式编写即可。
自定义维度 - Minecraft Wiki

弓和钓竿的问题,是我看错了,不好意思()
我翻了下原版弓和钓竿的模型文件,弓在拉动时会随时间依次调用 bow_pulling_0、bow_pulling_1、bow_pulling_2 这三个模型。钓竿抛出后会调用 fishing_rod_cast 这个模型,因此我个人推测,如果在这三个模型上也应用上custommodeldata,或许能解决这个问题

Plants-Stars
Chelover_C60 发表于 2021-3-19 19:34
我翻了下level.dat,建筑生成的规则是全存档通用的,可能没法搞每个维度使用不同的建筑生成规则。
可能有 ...

行吧,大佬,我试试;那个成就我看原版进度界面一个标签和标题,获取时另一个标签和标题,请问自定义的能做到吗,不能做到就算了(比如末地,进度界面是“末地”,“还是开始了?”,获取的时候是“结束了?”,“进入末地传送门”)

Chelover_C60
本帖最后由 Chelover_C60 于 2021-3-19 20:40 编辑
Plants-Stars 发表于 2021-3-19 20:03
行吧,大佬,我试试;那个成就我看原版进度界面一个标签和标题,获取时另一个标签和标题,请问自定义的能 ...

实际上这是两个进度
进度“结束了”是主世界的一个进度,达成条件为进入末地
进度“还是开始了”是末地的根进度,达成条件也是进入末地

进度json中有两项是可以控制进度在达成时是否在右上角及聊天栏展示,将其中一个进度的这几项设置为不展示即可。
  1. {
  2.     "display": {
  3.         ...
  4.         "show_toast": false,
  5.         "announce_to_chat": false,
  6.     }
  7. }
复制代码