本篇教程由作者设定未经允许禁止转载。
教程为原创,非wiki翻译
本模组提供了很多进度脚本例子,打开游戏加载模组后,可在配置文件中查看,这些例子都是有效的进度,会在游戏中显示。通过example文件里的各种脚本与游戏里新增的进度一一对应,从而知道每条语句的作用
(这一次就不是翻译wiki百科了,因为这模组的wiki只有1.7.10版本的,为防止两个版本出现不对应的情况,我选择直接根据栗子写教程)
现在请同学们打开下方文件夹
\.minecraft\config\triumph\script\triumph\example
我们先以example_all_rewards.txt举例,来说明一个有效的进度都需要哪些东西
务必打开文件跟着一起来,实践才是检验真理的唯一标准!
设置进度图标
setIcon(<minecraft:flint>)
图标只能用游戏中物品的图标,所以括号内为ItemStack类型(支持其他模组物品,前提是游戏里要有)
设置进度标题
setTitle("All Rewards")
设置进度描述
setDescription("Acquire flint")
这些都是String类型,所以,支持中文
添加父进度
addParent("triumph:example/root")
你会看到进度们都是环环相扣、线线相连的,连在前面的叫做“父进度”,连在后面的叫做“子进度”
下列图片中,左侧就是父进度。此处的父进度比较特殊,它没有父,只有一串串子,所以它就是进度的起点,代表着一系列的开始。
你也可以理解为要跟哪个进度连线
因为每个进度都是单独的文件,因此括号内为父进度的文件路径
设置进度位置
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(无解之事)
此条件本身就不是为了让玩家触发的
因为它有其他的用处,你可以给某些进度的触发范围设置为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")
看到这里你就基本掌握绝大部分了,其他的你就自己摸索吧!