写在前面
主要使用数据包以及 KubeJS(需要 KubeJS TFC)进行魔改。群峦版本为 3.2.10,KubeJS TFC 版本为 1.2.2。
本教程内容主要参考群峦本体数据包、群峦官方文档以及 KubeJS TFC 官方文档,包括一些较为基础的魔改与自定义内容。
大部分数据修改内容二者皆可。如果想要修改原有内容,推荐使用数据包进行覆盖;如果需要定义新内容,使用 KJS 更加便捷。
本教程中使用 KJS 脚本进行数据修改基本都属于 server_scripts,注册类内容基本属于 startup_scripts。
数据
优先讲数据的内容,因为如果缺乏某些数据,一些配方会无法生效。
食物
数据包文件位置:data\(模组id)\tfc\food_items。
可以为任意物品添加食物数据,即使不能吃,也可以腐烂。
内容主要包括:
"hunger": 设置食物恢复的饥饿值;
"saturation": 设置食物恢复的饱和度,游戏中显示值为 5% * 该值;
"water": 设置食物恢复的水量,游戏中显示值为 1% * 该值;
"decay_modifier": 设置食物腐烂的速度。默认配置下,游戏中显示保质期天数=20/该值;
"grain": 设置食物恢复的谷物营养;
"fruit": 设置食物恢复的水果营养;
"vegetables": 设置食物恢复的蔬菜营养;
"protein": 设置食物恢复的蛋白质营养;
"dairy": 设置食物恢复的乳制品营养。
一个示例:
{
"ingredient": {
"item": "casualness_delight:beef_noodles"
},
"hunger": 5,
"saturation": 4,
"decay_modifier": 3.6,
"grain": 1.5,
"dairy": 0.5,
"vegetables": 1,
"protein": 1.6
}
对应的脚本方法:
TFCEvents.data(event => {
event.foodItem('casualness_delight:beef_noodles', food => {
food.hunger(5)
food.saturation(4)
food.decayModifier(3.6)
food.grain(1.5)
food.dairy(0.5)
food.vegetables(1)
food.protein(1.6)
})
})
作物种植条件
已存在的作物可以通过数据包在 \data\(模组id)\tfc\climate_ranges\ 中修改,自定义作物必须通过脚本实现。
基本方法:
"min_hydration":最低湿度;
"max_hydration":最高湿度;
"hydration_wiggle_range":湿度范围外植物不会死亡的范围;
"min_temperature":最高温度;
"max_temperature":最低温度;
"temperature_wiggle_range":温度范围外植物不会死亡的范围。
数据包示例:
{
"min_hydration": 18,
"max_hydration": 75,
"hydration_wiggle_range": 0,
"min_temperature": -8,
"max_temperature": 26,
"temperature_wiggle_range": 5
}
脚本示例:
TFCEvents.data(event => {
event.climateRange(climate => {
climate.temperatureWiggle(5)
climate.maxHydration(85)
climate.minHydration(0)
climate.minTemperature(-5)
climate.maxTemperature(11)
}, 'kubejs:flax')
})
热导
如果没有设置物品的加热性质,则各种加热配方都不能生效。因此,如果需要添加加热配方,先得确保被加热物品拥有加热性质。
数据包方法路径为 \data\(模组id)\tfc\item_heats\。方法包括:
"heat_capacity":热导,越高加热速度越慢;
"forging_temperature":可锻造的温度(选填);
"welding_temperature":可焊接的温度(选填)。
示例:
{
"ingredient": {
"item": "kubejs:galvanized_steel_sheet"
},
"heat_capacity": 11.429,
"forging_temperature": 924,
"welding_temperature": 1232
}
体积与重量
物品的重量控制着其最大堆叠数量。可用值包括:very_light, light, medium, heavy, very_heavy。
关系见下表:
重量 | 最大堆叠数 |
---|---|
very_light | 64 |
light | 32 |
medium | 16 |
heavy | 4 |
very_heavy | 1 |
物品的体积控制着其可放入的最大容器。可用值包括:tiny, very_small, small, normal, large, very_large, huge。
常见容器与其可接纳最大体积见下表:
可接纳最大体积 | 容器 |
---|---|
large | 群峦的木箱子 |
normal | 大缸 |
small | 小罐 |
large 及以上 | 放在地上(1 个) |
normal 及以下 | 放在地上(4 个) |
无限制,而是与标签挂钩 | 工具架 |
物品的体积与重量与均为最大值时(即 huge 与 very_heavy),玩家背包只能容纳一个该物品并附上永久疲惫 debuff,两个以上则几乎无法移动。
此外,方块类的物品重量最低只能是 light,且群峦对堆叠数量是强制性的,无法使用其他方法进行修改。
数据包示例:
{
"ingredient": [
{
"item": "braziliandelight:coconut_drink"
},
{
"item": "braziliandelight:green_coconut"
}
],
"size": "large",
"weight": "medium"
}
脚本示例:
TFCEvents.data(event => {
event.itemSize('braziliandelight:coconut_drink', 'large', 'medium')
event.itemSize('braziliandelight:green_coconut', 'large', 'medium')
})
支撑
可支撑方块的设置只针对某个方块。
数据包方法路径为 \data\(模组id)\tfc\supports\。示例:
{
"__comment__": "ingredient 为方块列表,后三个数据依次为向上、向下、向四周的支持范围",
"ingredient": [
"kubejs:galvanized_square_steel_support_horizontal"
],
"support_up": 2,
"support_down": 2,
"support_horizontal": 4
}
脚本示例:
TFCEvents.data(event => {
event.support('kubejs:galvanized_square_steel_support_horizontal', 5, 6, 15)
})
肥料
可以将任何物品设置为肥料。
数据包路径为 \data\(模组id)\tfc\fertilizers\。示例:
{
"ingredient": {
"item": "manure:manure"
},
"nitrogen": 0.2, //氮
"phosphorus": 0.2, //磷
"potassium": 0 //钾
}
脚本示例:
TFCEvents.data(event => {
event.fertilizer('manure:manure', 0.2, 0.2, null) //营养依次为氮、磷、钾,“null”即设置为0
})
自定义内容
该部分均需要 KubeJS TFC 脚本实现。属于 startup_scripts。
自定义方块模型与贴图推荐使用材质包进行设置,用脚本设置不一定奏效。
地表方块
比如石子、矿粒等方块。
主要方法:
.ore():将碰撞形状设置为群峦的矿石;
.twig():将碰撞形状设置为群峦的树枝并使方块易燃;
.groundCoverModel():设置默认父模型;
.notAxisAligned():将放置的模型旋转 45 度;
.collision():为方块启用碰撞;
.withPreexistingItem():将方块的“放置方块的物品”设置为已存在的物品。
自定义一个普通地表方块的示例:
StartupEvents.registry('block', event => {
event.create("poop_piece","tfc:ground_cover")
.withPreexistingItem('manure:manure')
.collision()
.box(4, 0, 4, 12, 2, 12)
.hardness(0.1)
})
石子类方块因为可以堆叠三次,比较特殊,需要另一种注册方法。
主要方法:
.rotateModel(i: number): 将放置的模型旋转给定的角度
.collision(): 为块启用碰撞;
.itemTexture(): 设置物品纹理;
.itemTextureJson(): 设置物品模型的 json;
.rockTypeModel()设置应自动使用的岩石类型模型,接受 igneous_extrusive、igneous_intrusive、metamorphic 或 precipitatery。
示例:
StartupEvents.registry('block', event => {
//自定义一个类似于石子的煤矿粒
event.create("coal_sample","tfc:loose_rock")
.hardness(0.2)
.tagBlock('minecraft:mineable/pickaxe')
.rockTypeModel('igneous_intrusive')
.itemTexture("kubejs:item/coal_sample")
.noCollision()
.displayName("Coal Sample")
})
作物
想要在群峦种植其他模组的作物并且拥有气候的影响实际上不能实现的,想要通过魔改获得这些作物,不能通过修改原有的作物方块,而是需要进行额外作物方块的注册。
基本方法包括:
.stages(): 设置生长阶段数,应为 1 到 12 之间的数字,默认为 8;
.deadBlock(): 设置枯萎作物属性;
.seedItem(): 设置种子属性;
.productItem(): 将作物的“产物”设置为现有物品;
.nutrient(): 设置作物消耗的营养,可选项包括 nitrogen,phosphorous ,以及 potassium。
作物类型包括:
默认类型:tfc:crop;
两格类型:tfc:double_crop;
采摘类型:tfc:pickable_crop;
瓜类植物:tfc:spreading_crop;
水生作物:tfc:flooded_crop。
注意,注册植物方块不包括植物气候条件,还需要对其进行数据设置,见上。
下面是几个示例:
StartupEvents.registry('block', event => {
//自定义一个默认作物,亚麻
event.create('flax', 'tfc:crop')
.stages(6)
.displayName("Flax")
.noCollision()
.hardness(0.5)
.nutrient('potassium')
.tagBlock('tfc:mineable_with_sharp_tool')
.productItem('kubejs:flax') //这里需要填入已存在的物品,下同
.deadBlock(dead => {
dead.hardness(0.5)
dead.noCollision()
dead.tagBlock('tfc:mineable_with_sharp_tool')
dead.displayName("Dead Flax")
})
.seedItem(seed => {
seed.displayName("Flax Seeds")
})
//以上为一个完整示例,接下来的几个示例会省略部分重复内容
//自定义一个两格高作物,木薯
event.create('cassava', 'tfc:double_crop')
.stages(3)
.doubleStages(3) //第二格的阶段数
.productItem('kubejs:raw_cassava_root')
//自定义一个采摘作物,棉花
event.create('cotton', 'tfc:pickable_crop')
.stages(7)
.matureFruit('rusticdelight:cotton_boll') //完全成熟的产物
.fruit('rusticdelight:cotton_boll') //未成熟产物
.productItem('rusticdelight:cotton_boll') //此项可省略
//自定义一个瓜类作物,哈密瓜
event.create('cantaloupe', 'tfc:spreading_crop')
.stages(7)
.fruitBlock('kubejs:cantaloupe_block') //产物方块
})
金属类型
金属一定要有对应的流体。如果没有对应的流体,可以先定义一个。
这里,自定义金属锰作为例子。首先,进行一个简单的流体注册:
StartupEvents.registry("fluid",event=>{
event.create("manganese")
.thickTexture(0x330033)
.bucketColor(0x330033)
})
然后,对其进行群峦金属性质的设置。示例:
TFCEvents.data(event => {
event.metal('kubejs:manganese', //对应流体
1244, //熔点
0.5, //热导率
'kubejs:manganese_ingot', //对应锭(需要已存在的物品,下同)
'kubejs:manganese_double_ingot', //对应双锭
'kubejs:manganese_sheet', //对应板
1, //金属等级
'kubejs:manganese' //注册名(用于配方中)
)
})
支撑梁
自定义支撑梁比较简单,但有一些需要注意的点。
首先,注册一个支撑梁方块:
StartupEvents.registry('block', event => {
event.create('galvanized_square_steel_support', 'tfc:support')
.tagBlock('minecraft:mineable/pickaxe')
})
支撑梁的竖式与横式实际上属于两种注册名不同的方块(一般横式最后面会多个“_horizontal”),且真正起效的部分一般都是横式。
此外,默认情况下,横式方块被破坏后不会有掉落物,还需要进行设置:
//设置支撑数据部分见上
//设置横式部分的掉落物
ServerEvents.blockLootTables(event =>{
event.addBlock("kubejs:galvanized_square_steel_support_horizontal", loot=>{
loot.addPool(pool=>{
pool.addItem("kubejs:galvanized_square_steel_support")
})
})
})
世界生成
世界规模
该部分可以在创建世界时设置,但也可以使用数据包进行全局预设。
数据包文件位置:data\tfc\worldgen\world_preset\overworld.json。
除去比较复杂的岩石层生成方法,其他主要内容包括:
"spawn_distance":岩石类型范围;
"spawn_center_x":出生点偏离 x 轴距离;
"spawn_center_z":出生点偏离 z 轴距离;
"rainfall_constant":平均降雨量大小;
"temperature_constant":平均温度大小;
"temperature_scale":温度带峰值距离;
"rainfall_scale":降雨量峰值距离;
"flat_bedrock":是否启用平滑基岩;
"grassDensity":野草密度;
"continentalness":大陆占比。
示例:
"spawn_distance": 4000,
"spawn_center_x": 0,
"spawn_center_z": 0,
"rainfall_constant":0,
"temperature_constant":0,
"temperature_scale": 20000,
"rainfall_scale": 20000,
"flat_bedrock": false,
"grassDensity":0.5,
"continentalness": 0.5,
矿物生成
假设,这里想要添加一个以石灰石子为指示物、在千枚岩中生成原版石头的矿脉。
首先。需要在 \data\tfc\tags\worldgen\placed_feature\in_biome\veins.json 中为你的矿脉加个标签,可以写入:
{
"replace": false,
"values": [
"tfc:vein/stone"
]
}
或者,也可以直接使用脚本:
ServerEvents.tags('worldgen/placed_feature', event => {
event.add('tfc:in_biome/veins', 'tfc:vein/stone')
})
然后,在 \data\tfc\worldgen\placed_feature\vein 中加入相同命名的 json 文件,按本教程,即 stone.json。
此处可以对矿脉的生成位置进行配置。设置可以为空,如示例:
{
"feature": "tfc:vein/stone",
"placement": []
}
若使用脚本,可以直接在下一步骤中同步进行该设置。
最后,在 \data\tfc\worldgen\configured_feature\vein 中加入相同命名的 json 文件,按本教程,即 stone.json。
其中内容主要包括:
type:类型,主要包括 tfc:cluster_vein、tfc:disc_vein、tfc:pipe_vein、tfc:kaolin_disc_vein;
blocks:定义矿脉将放置哪些块的块替换图;
rarity:矿脉在每个区块有 1 /该值 的概率生成;
size:矿脉尺寸;
density:矿脉密度程度;
min_y:垂直锚点。矿脉将生成的最小 y 水平;
max_y:垂直锚点。矿脉将生成的最大 y 水平;
biomes:可选的生物群系标签。如果使用,矿脉将被限制在给定的生物群系中;
near_lava:如果为 true,则矿脉仅在附近检测到熔岩时才会生成;
indicator:表示在矿脉上方的表面上生成的指示物的可选对象。如果存在,需要具有以下字段:
depth:正整数。矿脉将在地表以下生成指示物的最大深度;
rarity:正整数。生成指示物的稀有度,占矿脉放置矿石块的水平位置的分数。
示例:
{
"type": "tfc:cluster_vein",
"config": {
"rarity": 12,
"density": 0.45,
"min_y": -60,
"max_y": 30,
"size": 30,
"random_name": "stone",
"blocks": [
{
"replace": [
"tfc:rock/raw/phyllite"
],
"with": [
{
"block": "minecraft:stone"
}
]
}
],
"indicator": {
"rarity": 20,
"depth": 80,
"underground_rarity": 1,
"underground_count": 3,
"blocks": [
{
"block": "tfc:rock/loose/limestone"
}
]
}
}
}
也可以使用脚本(内容与数据方法与上一一对应):
TFCEvents.worldgenData(event => {
event.clusterVein(
'example_cluster_vein', [
event.veinReplacement(['tfc:rock/raw/phyllite'], ['minecraft:stone'])
],
12,
0.45,
-60,
30,
vein => {vein.indicator(
20,
80,
1,
3,
['tfc:rock/loose/limestone']
)}, placement => {} //同上,位置设置可以留空
)
})
怪物生成
怪物生成相对比较容易。只需要在 \data\tfc\worldgen\biome\ 中打开想要怪物生成的群系文件,找到 "spawners" 集合下的 "monster" 集合,在该集合中填入怪物信息。
这样的怪物生成遵循群峦的生成方法,即按群生成,只在地下生成。
示例:
"monster": [
{
"type": "minecraft:enderman", //实体注册名
"weight": 100, //生成权重
"minCount": 4, //一群的最小数量
"maxCount": 4 //一群的最大数量
},
{
"type": "minecraft:cave_spider",
"weight": 100,
"minCount": 4,
"maxCount": 4
}
],
动物生成
动物生成相对比较困难。首先,需要进行动物群注册。一个简单的示例:
TFCEvents.registerFaunas(event => {
event.register(
'ytech:wild_boar',
'on_ground',
'world_surface_wg'
)
})
然后,进行动物群的生成配置。方法包括基本的气候设置以及以下:
.chance: 接受一个数字,设置某物生成的几率(1/N 块);
.distanceBelowSeaLevel: 设置某物必须生成的海平面以下距离,只应为水下生物设置;
.solidGround: 确定生物是否需要在标记为 minecraft:valid_spawn 的块上生成,默认为 false;
.maxBrightness: 设置生物可能生成的最大光照水平。
示例:
TFCEvents.data(event => {
event.fauna(climate => {
climate.minTemp(0)
climate.minRain(0)
}, fauna => {
fauna.chance(50)
}, 'ytech:wild_boar')
})
最后,与怪物生成类似,在\data\tfc\worldgen\biome\ 中打开想要动物生成的群系文件,找到 "spawners" 集合下的 "creature" 集合,在该集合中填入注册好的生物信息。
示例:
"creature": [
{
"type": "ytech:wild_boar", //动物群名
"weight": 100, //生成权重
"minCount": 4, //一群的最小数量
"maxCount": 4 //一群的最大数量
}
],