本篇教程由作者设定未经允许禁止转载。

教程为原创,非wiki翻译

本模组提供了很多进度脚本例子,打开游戏加载模组后,可在配置文件中查看,这些例子都是有效的进度,会在游戏中显示。通过example文件里的各种脚本与游戏里新增的进度一一对应,从而知道每条语句的作用

(这一次就不是翻译wiki百科了,因为这模组的wiki只有1.7.10版本的,为防止两个版本出现不对应的情况,我选择直接根据栗子写教程)

 

现在请同学们打开下方文件夹

\.minecraft\config\triumph\script\triumph\example

我们先以example_all_rewards.txt举例,来说明一个有效的进度都需要哪些东西

务必打开文件跟着一起来,实践才是检验真理的唯一标准!

 

设置进度图标

setIcon(<minecraft:flint>)

图标只能用游戏中物品的图标,所以括号内为ItemStack类型(支持其他模组物品,前提是游戏里要有)

triumph自定义进度---个人教程-第1张图片


设置进度标题

setTitle("All Rewards")

 

设置进度描述

setDescription("Acquire flint")

这些都是String类型,所以,支持中文

triumph自定义进度---个人教程-第2张图片

 

添加父进度

addParent("triumph:example/root")

你会看到进度们都是环环相扣、线线相连的,连在前面的叫做“父进度”,连在后面的叫做“子进度”

下列图片中,左侧就是父进度。此处的父进度比较特殊,它没有父,只有一串串子,所以它就是进度的起点,代表着一系列的开始。

你也可以理解为要跟哪个进度连线

triumph自定义进度---个人教程-第3张图片

因为每个进度都是单独的文件,因此括号内为父进度的文件路径

 

设置进度位置

setPos(80,65)

暂时还没搞明白数字是怎么指示位置的

 

隐藏进度连接线

hideLines()

括号内为布尔值,默认false,即不隐藏

 

添加条件触发范围

criteria = addCriteria("hasFlint", "minecraft:inventory_changed")

解锁进度通常都要玩家完成一些事情,而条件就是用于检测玩家是否完成的

逗号前为条件名称

逗号后为触发条件的范围,minecraft:inventory_changed,即背包物品变动。

 

设置具体条件

criteria.addItem(<minecraft:flint>)

两条语句开头的“criteria”都是变量,你可以自由设置

比如

qwe = addCriteria("hasFlint", "minecraft:inventory_changed")

qwe.addItem(<minecraft:flint>)

条件系统是triumph中尤为重要的一环,一会儿将具体解释

 

解锁成就奖励物品配方

可以添加多个(似乎没卵用,在未解锁之前,仍然能合成)

addRewardRecipe("minecraft:ender_eye")

 

解锁进度触发function

可以添加多个(在function文件夹里)

addRewardFunction("triumph:happy_birthday")

 

解锁进度奖励经验

一个进度只能设置一次

setRewardExperience(42)

 

解锁进度提升一个技能等级

可添加多个,但是需要下载Skillable模组

addRewardSkillable("mining", 1)

 

解锁进度奖励一个物品

只能设置一个

setRewardItem(<minecraft:stick, nbt:{ench:[{lvl:1s,id:51s}],display:{Name:"The Stick of Truth"}}>)

 

我们来整体概括一下进度的各种配置

必须要有的:进度图标(setIcon)、进度标题(setTitle)与描述(setDescription)、父进度(addParent)、进度位置(setPos)、隐藏进度连接线 (hideLines)、进度条件(addCriteria)

不一定要有的:进度奖励(奖励合成表、奖励经验、奖励Skillable等级提升、奖励物品、触发function)

注意:如果想把某个进度作为进度起点的话,不必加父进度语句


总结

以上是一个有效进度的主要构成

除了触发条件以外的其他语句都很简单,所以接下来每个文件我们就只讲进度条件

 

条件概念

条件分为触发范围和具体条件(没有wiki,只能自己尝试造词了)

触发范围是不加以任何细分的条件触发

具体条件是对触发范围进行细分,在其之前必须要有触发范围

比如

“triumph:player_break_block”就是触发范围,通过“addCriteria”添加,没有任何细分,这的意思是“检测玩家破坏的任何方块”

“.setBlock(<ore:logWood>)”就是具体条件,将破坏方块细分至特定方块:原木

 

触发范围的构成

triumph/minecraft  :  条件关键字

前缀有两个:triumph和minecraft

前者是模组提供的触发范围,后者是原版自带的触发范围

条件关键字代表要检测什么条件

 

有效条件的两种形式

第一种,触发范围式,只添加触发范围

addCriteria("brokeLog", "triumph:player_break_block")

此语句可用于触发其中的触发范围,不过没有细分,所以这样的很少用,因为范围太大了

第二种,具体条件式

criteria = addCriteria("brokeLog", "triumph:player_break_block")

criteria.setBlock(<ore:logWood>)

将大范围的触发范围细分以缩小范围,最常用的形式

 

进度颜色

提示:此处似乎有bug,这些颜色实际上并不能更改,尽管模组提供的脚本里自己写着各种各样的颜色,游戏内仍然是默认颜色,不过我还是要写出来,万一哪天修复了呢

接下来看第二个文件example_better_advancement_colors.txt

下列这些都是对图标、标题和连接线颜色上的设置

颜色支持:单个颜色值、RGB、十六进制

1.设置未完成进度的图标颜色

setUncompletedIconColor(16744448)

 

2.设置已完成进度的图标颜色

setCompletedIconColor(128, 0, 255)

 

3.设置未完成进度的标题颜色

setUncompletedTitleColor(65535)

 

4.设置已完成进度的标题颜色

setCompletedTitleColor(#00FF80)

 

5.设置未完成进度的连接线颜色

setUncompletedLineColor(#ff0000)

 

6.设置已完成进度的连接线颜色

setCompletedLineColor(#ff00ff)

 

 

触发范围

安装Triumph后,它会自动提供各种各样的栗子文件,咱们根据这些栗子来讲一讲有哪些触发范围

 

example_break_block.txt(破坏方块)

添加条件名称“brokeLog”,并且设置触发范围为triumph:player_break_block,即破坏方块

criteria = addCriteria("brokeLog", "triumph:player_break_block")

给触发范围添加具体条件

criteria.setBlock(<ore:logWood>)

 

example_bred_animals.txt(繁殖动物)

添加条件名称“bred_sheep”,并且设置触发范围为minecraft:bred_animals,即繁殖动物

criteria = addCriteria("bred_sheep", "minecraft:bred_animals")

给触发范围添加具体条件(这里有三条)

设置父亲

criteria.setParentType("minecraft:sheep")

设置母亲

criteria.setPartnerType("minecraft:sheep")

设置小崽子

criteria.setChildType("minecraft:sheep")

这里倒也没什么可说的,父母当然得是同类,生出来的也是同类,不过你还是得写这三条(也许是为特殊模组编写的)

 

example_brewed_potion.txt(酿造药水)

添加条件名称“brewedPotion”,并且设置触发范围为minecraft:brewed_potion,即酿造药水

criteria = addCriteria("brewedPotion", "minecraft:brewed_potion")

给触发范围添加具体条件

criteria.setPotionType("minecraft:healing")

 

example_completed_advancement.txt(让你的进度更完整:添加前置条件)

触发范围、具体条件略过(条件就是挖掉一个地狱岩)

重点在这:设置此进度前置条件(父条件)

setRequiresParents()

前置条件写在下面

添加条件名称“completedParent”,并且设置触发范围为triumph:completed_advancement,即完成进度

criteria = addCriteria("completedParent", "triumph:completed_advancement")

给触发范围添加具体条件

criteria.setAdvancement("triumph:example/example_enter_dimension")

此处有必要说一下:setAdvancement为什么指向的是文件?

因为任何进度的存在形式都是txt文件

为了避免误解,还有另外一点要说:前置条件可以是任何触发范围,比如设置玩家需先获得钻石镐,或者收获黑曜石等,只是这里用的是“完成进度”这一触发范围

 

example_construct_beacon.txt(建造信标塔)

添加条件名称“beacon”,并且设置触发范围为minecraft:construct_beacon,即建造信标塔

criteria = addCriteria("beacon", "minecraft:construct_beacon")

给触发范围添加具体条件

criteria.setLevelsMinMax(2, 4)

你肯定看见了,这条语句与之前的都不同,因为这里是建造信标,信标是个多方块结构,但不像沉浸之类的,信标塔结构简单,所以这里仅通过识别层数就能知道信标塔的等级(此处条件是至少2层,最高4层)

 

看了这么多栗子你应该已经掌握规律了,所以接下来我就尽量简单写啦(如果有特殊的地方我仍然会仔细讲讲)

 

example_consume_item.txt(消耗物品)

触发范围:criteria = addCriteria("consumed", "minecraft:consume_item")

具体条件:criteria.setItem(<minecraft:melon>)

 

example_count.txt(计数)

触发范围、具体条件略过(条件就是右键铁矿是方块)

计数:criteria.setCount(5)

计数加在条件语句后,来设置玩家需要触发几次条件

也就是说你要对着铁矿石右键五下

 

example_destroy_block.txt(销毁方块)

触发范围:criteria = addCriteria("destroyedBlock", "triumph:player_destroy_block")

具体条件:criteria.setBlock(<minecraft:netherrack>)

注意辨析break和destroy,后者的“销毁”指的是破坏方块后不掉落(本质上destroy包含了break)

 

example_enchanted_item.txt(附魔物品)

触发范围:criteria = addCriteria("enchanted", "minecraft:enchanted_item")

具体条件:criteria.setItem(<minecraft:golden_sword>)

 

example_enter_biome.txt(进入生物群系)

触发范围:criteria = addCriteria("entered_forest", "minecraft:location")

具体条件:criteria.setBiome("minecraft:forest")

 

example_enter_block.txt(进入方块)

此处有必要解释一下什么叫做“进入方块”:

第一种比如像是树苗、草、花等等这样没有阻挡性质的,直接进入即可

第二种比如像是沙子、砂砾这样能把玩家埋起来的,通过重力,与玩家重叠后,也是进入了方块

第三种则是要通过特殊方法,比如活塞将玩家推入实心方块,也算是进入方块(物理)

触发范围:criteria = addCriteria("entered", "minecraft:enter_block")

具体条件:criteria.setBlock(<ore:treeSapling>)

 

example_enter_dimension.txt(进入维度)

触发范围:criteria = addCriteria("entered_nether", "minecraft:changed_dimension")

具体条件:criteria.setDimensionDestination("the_nether")

注意与进入生物群系做区分,别搞混了

 

example_harvest_block.txt(采集方块)

注意辨析inventory_changed(背包变动)与harvest_block,后者要有“采集”的动作,也就是先破坏方块,再获得方块(跟block沾边的通常都是指实在的方块,若是想指示方块的物品形式的话,明显可以用Item指代)

触发范围:criteria = addCriteria("harvestedBlock", "triumph:player_harvest_block")

具体条件:criteria.setBlock(<minecraft:netherrack>)

 

example_hurt_entity.txt(伤害实体)

触发范围:criteria = addCriteria("hurt_wolf", "minecraft:player_hurt_entity")

具体条件:criteria.setEntityType("minecraft:wolf")

 

example_impossible.txt(无解之事)

triumph自定义进度---个人教程-第4张图片

此条件本身就不是为了让玩家触发的

因为它有其他的用处,你可以给某些进度的触发范围设置为Impossible,使其无法触发从而不再显示,比如原版进度的root(如果你不想要原版进度,其实不必用这法子,直接把triumph\vanilla文件夹删掉就行)

.minecraft\config\triumph\script\triumph\vanilla\

里面都是原版进度,各个大类都用文件夹区分

打开每个大类文件夹里的root.txt

写上addCriteria("impossible", "minecraft:impossible")

别忘了无效化root中自带的addCriteria,不建议直接删掉,你可以给它加上“//”,用于避免两种条件产生冲突

(还是那句话,删了就行,当然别忘了备份)

 

example_inventory_changed.txt(背包变动

触发范围:criteria = addCriteria("hasStickOfTruth", "minecraft:inventory_changed")

具体条件:criteria.addItem(<minecraft:stick, nbt:{ench:[{lvl:1s,id:51s}],display:{Name:"The Stick of Truth"}}>)

 

example_item_crafted.txt(物品合成)

触发范围:criteria = addCriteria("crafted", "triumph:player_crafted_item")

具体条件:criteria.setItem(<ore:chest>)

 

example_killed_by_entity.txt(实体杀死玩家)

触发范围:criteria = addCriteria("killed_by_creeper", "minecraft:entity_killed_player")

具体条件:criteria.setEntityType("minecraft:creeper")

 

example_killed_entity.txt(玩家杀死实体)

触发范围:criteria = addCriteria("killed_spider", "minecraft:player_killed_entity")

具体条件:criteria.setEntityType("minecraft:spider")

 

example_left_click_block.txt(左键方块)

触发范围:criteria = addCriteria("clickedBlock", "triumph:left_click_block")

具体条件:criteria.setBlock(<minecraft:grass>)

就是字面意思,单击方块即可

 

example_location_dimID.txt(维度位置,此处维度ID表示,涉及到多维度模组请自行百科)

触发范围:criteria = addCriteria("entered_nether", "minecraft:location")

具体条件:criteria.setDimID(-1)

如果你只设置触发范围的话,那就是检测玩家进入任意世界(玩家进入游戏就是进入世界,所以可用来检测玩家登录,这样玩家一登录就能拥有一个进度起点)

 

example_location_worldtype.txt(世界类型位置)

触发范围:criteria = addCriteria("superflat", "minecraft:location")

具体条件:criteria.setWorldType("flat")

 

example_placed_block.txt(放置方块)

触发范围:criteria = addCriteria("placedDirt", "minecraft:placed_block")

具体条件:criteria.setBlock(<minecraft:dirt>)

 

example_player_death.txt(玩家殒命)

触发范围:criteria = addCriteria("die_in_lava", "triumph:player_death")

具体条件:criteria.damageType("lava")

可设置检测玩家的死法

 

example_recipe_unlocked.txt(解锁配方)

触发范围:criteria = addCriteria("unlocked_recipe", "minecraft:recipe_unlocked")

具体条件:criteria.setRecipe("minecraft:diamond")

完成进度之前,没法合成某样东西

 

example_repeatable.txt(进度重复)

设置完条件之后

此进度可以重复完成,可设置多少秒将进度可以再一次完成(即缓冲时间)

比如

触发范围、具体条件省略(右键十次绿宝石矿石)

setRepeatTime(10)

十秒钟的缓冲时间,过后可以再次完成(比如你想让玩家多次获得进度奖励)

 

example_right_click_block.txt(右键方块)

触发范围:criteria = addCriteria("clickedBlock", "triumph:right_click_block")

具体条件:criteria.setBlock(<minecraft:diamond_ore>)

与左键方块一样,右键方块即可

 

example_right_click_item.txt(右键物品)

触发范围:criteria = addCriteria("clickedItem", "triumph:right_click_item")

具体条件:criteria.setItem(<minecraft:diamond>)

 

example_slept_in_bed.txt(祝好梦)

触发范围:criteria = addCriteria("slept_in_bed", "minecraft:slept_in_bed")

具体条件:criteria.setBiome("minecraft:forest")

此处的具体条件可设可不设,不设就是玩家一睡觉就触发,此处设置要在森林生物群系睡觉才行

 

example_tame_animal.txt(驯服动物)

触发范围:criteria = addCriteria("tamed_horse", "minecraft:tame_animal")

具体条件:criteria.setEntityType("minecraft:horse")

 

example_villager_trade.txt(奸商交易)

触发范围:criteria = addCriteria("traded", "minecraft:villager_trade")

具体条件:criteria.setEntityType("minecraft:villager")

具体条件:criteria.setItem(<minecraft:emerald>)

可细分至交易什么东西

 

root.txt(根文件)

用于作为一系列进度的起点(父进度),本身也是一个进度

它的条件能多种多样

如果想让玩家进游戏就有此进度,可用:addCriteria("location", "minecraft:location")

 

看到这里你就基本掌握绝大部分了,其他的你就自己摸索吧!