finish terrain generation
166
scripts/ore_manager/block_gen.py
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def ReadListFromFile(filename, listInstance):
|
||||||
|
f = open(filename, 'r', encoding='utf-8')
|
||||||
|
while True:
|
||||||
|
cache = f.readline()
|
||||||
|
if cache == '':
|
||||||
|
break;
|
||||||
|
cache = cache.strip()
|
||||||
|
if cache == '':
|
||||||
|
listInstance.append('')
|
||||||
|
continue
|
||||||
|
if cache.startswith('//'):
|
||||||
|
continue
|
||||||
|
listInstance.append(cache)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def GetUnderlineName(strl):
|
||||||
|
return strl.lower().replace(',', '').replace('& ', '').replace('é', 'e').replace('-', '_').replace("'", '').replace('"', '').replace(' ', '_')
|
||||||
|
|
||||||
|
# folder creation
|
||||||
|
if not os.path.isdir('data/teyvatcraft/loot_tables/blocks'):
|
||||||
|
os.makedirs('data/teyvatcraft/loot_tables/blocks')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/models/block'):
|
||||||
|
os.makedirs('assets/teyvatcraft/models/block')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/models/item'):
|
||||||
|
os.makedirs('assets/teyvatcraft/models/item')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/blockstates'):
|
||||||
|
os.makedirs('assets/teyvatcraft/blockstates')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/textures/block'):
|
||||||
|
os.makedirs('assets/teyvatcraft/textures/block')
|
||||||
|
|
||||||
|
|
||||||
|
# read file
|
||||||
|
enList = []
|
||||||
|
zhList = []
|
||||||
|
|
||||||
|
ReadListFromFile('zh.txt', zhList)
|
||||||
|
ReadListFromFile('en.txt', enList)
|
||||||
|
|
||||||
|
if len(zhList) != len(enList):
|
||||||
|
print('2 files item is not matched')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
javaDeclareFile = open('declare.block.java', 'w', encoding='utf-8')
|
||||||
|
javaRegisterFile = open('register.block.java', 'w', encoding='utf-8')
|
||||||
|
langZhFile = open('zh_cn.block.json', 'w', encoding='utf-8')
|
||||||
|
langEnFile = open('en_us.block.json', 'w', encoding='utf-8')
|
||||||
|
for index in range(len(enList)):
|
||||||
|
if enList[index] == '':
|
||||||
|
# keep blank line in register & declare
|
||||||
|
javaDeclareFile.write('\n')
|
||||||
|
javaRegisterFile.write('\n')
|
||||||
|
langZhFile.write('\n')
|
||||||
|
langEnFile.write('\n')
|
||||||
|
continue
|
||||||
|
|
||||||
|
(droppedName, oreName) = enList[index].split('#')
|
||||||
|
dropped_underlineName = GetUnderlineName(droppedName)
|
||||||
|
ore_underlineName = GetUnderlineName(oreName)
|
||||||
|
ore_upperName = ore_underlineName.upper()
|
||||||
|
|
||||||
|
flootTables = open('data/teyvatcraft/loot_tables/blocks/' + ore_underlineName + '.json', 'w', encoding='utf-8')
|
||||||
|
fblockstates = open('assets/teyvatcraft/blockstates/' + ore_underlineName + '.json', 'w', encoding='utf-8')
|
||||||
|
fmodel = open('assets/teyvatcraft/models/block/{}.json'.format(ore_underlineName), 'w', encoding='utf-8')
|
||||||
|
fmodelItem = open('assets/teyvatcraft/models/item/{}.json'.format(ore_underlineName), 'w', encoding='utf-8')
|
||||||
|
|
||||||
|
flootTables.write('''{{
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"pools": [
|
||||||
|
{{
|
||||||
|
"rolls": 1,
|
||||||
|
"entries": [
|
||||||
|
{{
|
||||||
|
"type": "minecraft:alternatives",
|
||||||
|
"children": [
|
||||||
|
{{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"conditions": [
|
||||||
|
{{
|
||||||
|
"condition": "minecraft:match_tool",
|
||||||
|
"predicate": {{
|
||||||
|
"enchantments": [
|
||||||
|
{{
|
||||||
|
"enchantment": "minecraft:silk_touch",
|
||||||
|
"levels": {{
|
||||||
|
"min": 1
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"name": "teyvatcraft:{}"
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"functions": [
|
||||||
|
{{
|
||||||
|
"function": "minecraft:set_count",
|
||||||
|
"count": {{
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 2.0,
|
||||||
|
"type": "minecraft:uniform"
|
||||||
|
}}
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"function": "minecraft:apply_bonus",
|
||||||
|
"enchantment": "minecraft:fortune",
|
||||||
|
"formula": "minecraft:uniform_bonus_count",
|
||||||
|
"parameters": {{
|
||||||
|
"bonusMultiplier": 1
|
||||||
|
}}
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"function": "minecraft:explosion_decay"
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"name": "teyvatcraft:{}"
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}'''.format(ore_underlineName, dropped_underlineName))
|
||||||
|
|
||||||
|
fblockstates.write('''{{
|
||||||
|
"variants": {{
|
||||||
|
"": {{
|
||||||
|
"model": "teyvatcraft:block/{}"
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}}'''.format(ore_underlineName))
|
||||||
|
|
||||||
|
fmodel.write('''{{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {{
|
||||||
|
"all": "teyvatcraft:block/{}"
|
||||||
|
}}
|
||||||
|
}}'''.format(ore_underlineName))
|
||||||
|
|
||||||
|
fmodelItem.write('''{{
|
||||||
|
"parent": "teyvatcraft:block/{}"
|
||||||
|
}}'''.format(ore_underlineName))
|
||||||
|
|
||||||
|
flootTables.close()
|
||||||
|
fblockstates.close()
|
||||||
|
fmodel.close()
|
||||||
|
fmodelItem.close()
|
||||||
|
|
||||||
|
javaDeclareFile.write('public static final Block {} = new OreBlock(getOreBlockSettings(1, 3.0f));\n'.format(ore_upperName))
|
||||||
|
javaRegisterFile.write('Registry.register(Registry.BLOCK, new Identifier("teyvatcraft", "{}"), {});\n'.format(ore_underlineName, ore_upperName))
|
||||||
|
|
||||||
|
langZhFile.write('"block.teyvatcraft.{}": "{}",\n'.format(ore_underlineName, zhList[index].split('#')[1]))
|
||||||
|
langEnFile.write('"block.teyvatcraft.{}": "{}",\n'.format(ore_underlineName, enList[index].split('#')[1].replace('"', '')))
|
||||||
|
|
||||||
|
shutil.copyfile('stone.png', 'assets/teyvatcraft/textures/block/{}.png'.format(ore_underlineName))
|
||||||
|
|
||||||
|
|
||||||
|
javaDeclareFile.close()
|
||||||
|
javaRegisterFile.close()
|
||||||
|
langZhFile.close()
|
||||||
|
langEnFile.close()
|
7
scripts/ore_manager/en.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
//Magical Crystal Chunk#Magical Crystal Chunk Ore
|
||||||
|
//Crystal Chunk#Crystal Chunk Ore
|
||||||
|
//White Iron Chunk#White Iron Chunk Ore
|
||||||
|
//Iron Chunk#Iron Chunk Ore
|
||||||
|
//Starsilver#Starsilver Ore
|
||||||
|
Cor Lapis#Cor Lapis Ore
|
||||||
|
Noctilucous Jade#Noctilucous Jade Ore
|
BIN
scripts/ore_manager/stone.png
Normal file
After Width: | Height: | Size: 215 B |
7
scripts/ore_manager/zh.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
//魔晶块#魔晶块原矿
|
||||||
|
//水晶块#水晶块原矿
|
||||||
|
//白铁块#白铁块原矿
|
||||||
|
//铁块#铁块原矿
|
||||||
|
//星银矿石#星银矿石原矿
|
||||||
|
石珀#石珀原矿
|
||||||
|
夜泊石#夜泊石原矿
|
239
scripts/plant_manager/block_gen.py
Normal file
|
@ -0,0 +1,239 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def ReadListFromFile(filename, listInstance):
|
||||||
|
f = open(filename, 'r', encoding='utf-8')
|
||||||
|
while True:
|
||||||
|
cache = f.readline()
|
||||||
|
if cache == '':
|
||||||
|
break;
|
||||||
|
cache = cache.strip()
|
||||||
|
if cache == '':
|
||||||
|
listInstance.append('')
|
||||||
|
continue
|
||||||
|
if cache.startswith('//'):
|
||||||
|
continue
|
||||||
|
listInstance.append(cache)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def GenerateSweetBerryBushStageModel(name, stage):
|
||||||
|
f = open('assets/teyvatcraft/models/block/{}_stage{}.json'.format(name, stage), 'w', encoding='utf-8')
|
||||||
|
f.write('''{{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {{
|
||||||
|
"cross": "teyvatcraft:block/{}_stage{}"
|
||||||
|
}}
|
||||||
|
}}'''.format(name, stage))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# folder creation
|
||||||
|
if not os.path.isdir('data/teyvatcraft/loot_tables/blocks'):
|
||||||
|
os.makedirs('data/teyvatcraft/loot_tables/blocks')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/models/block'):
|
||||||
|
os.makedirs('assets/teyvatcraft/models/block')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/blockstates'):
|
||||||
|
os.makedirs('assets/teyvatcraft/blockstates')
|
||||||
|
if not os.path.isdir('assets/teyvatcraft/textures/block'):
|
||||||
|
os.makedirs('assets/teyvatcraft/textures/block')
|
||||||
|
|
||||||
|
|
||||||
|
# read file
|
||||||
|
enList = []
|
||||||
|
zhList = []
|
||||||
|
propList = []
|
||||||
|
|
||||||
|
ReadListFromFile('zh.txt', zhList)
|
||||||
|
ReadListFromFile('en.txt', enList)
|
||||||
|
ReadListFromFile('prop.txt', propList)
|
||||||
|
|
||||||
|
if len(zhList) != len(enList) or len(propList) != len(enList):
|
||||||
|
print('3 files item is not matched')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
javaDeclareFile = open('declare.block.java', 'w', encoding='utf-8')
|
||||||
|
javaRegisterFile = open('register.block.java', 'w', encoding='utf-8')
|
||||||
|
langZhFile = open('zh_cn.block.json', 'w', encoding='utf-8')
|
||||||
|
langEnFile = open('en_us.block.json', 'w', encoding='utf-8')
|
||||||
|
for index in range(len(enList)):
|
||||||
|
underlineName = enList[index].lower().replace(',', '').replace('& ', '').replace('é', 'e').replace('-', '_').replace("'", '').replace('"', '').replace(' ', '_')
|
||||||
|
upperName = underlineName.upper()
|
||||||
|
|
||||||
|
if propList[index] == '':
|
||||||
|
# keep blank line in register & declare
|
||||||
|
javaDeclareFile.write('\n')
|
||||||
|
javaRegisterFile.write('\n')
|
||||||
|
langZhFile.write('\n')
|
||||||
|
langEnFile.write('\n')
|
||||||
|
continue
|
||||||
|
|
||||||
|
flootTables = open('data/teyvatcraft/loot_tables/blocks/' + underlineName + '.json', 'w', encoding='utf-8')
|
||||||
|
fblockstates = open('assets/teyvatcraft/blockstates/' + underlineName + '.json', 'w', encoding='utf-8')
|
||||||
|
if propList[index] == 'sweet_berry_bush':
|
||||||
|
javaDeclareFile.write('public static final Block {} = new TeyvatSweetBerryBushLikePlantBlock(ItemsManager.{});\n'.format(upperName, upperName))
|
||||||
|
|
||||||
|
flootTables.write('''{{
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"pools": [
|
||||||
|
{{
|
||||||
|
"rolls": 1.0,
|
||||||
|
"entries": [
|
||||||
|
{{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"name": "teyvatcraft:{}"
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"conditions": [
|
||||||
|
{{
|
||||||
|
"condition": "minecraft:block_state_property",
|
||||||
|
"block": "teyvatcraft:{}",
|
||||||
|
"properties": {{
|
||||||
|
"age": "3"
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"functions": [
|
||||||
|
{{
|
||||||
|
"function": "minecraft:set_count",
|
||||||
|
"count": {{
|
||||||
|
"min": 2.0,
|
||||||
|
"max": 3.0,
|
||||||
|
"type": "minecraft:uniform"
|
||||||
|
}}
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"function": "minecraft:apply_bonus",
|
||||||
|
"enchantment": "minecraft:fortune",
|
||||||
|
"formula": "minecraft:uniform_bonus_count",
|
||||||
|
"parameters": {{
|
||||||
|
"bonusMultiplier": 1
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"rolls": 1.0,
|
||||||
|
"entries": [
|
||||||
|
{{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"name": "teyvatcraft:{}"
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"conditions": [
|
||||||
|
{{
|
||||||
|
"condition": "minecraft:block_state_property",
|
||||||
|
"block": "teyvatcraft:{}",
|
||||||
|
"properties": {{
|
||||||
|
"age": "2"
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"functions": [
|
||||||
|
{{
|
||||||
|
"function": "minecraft:set_count",
|
||||||
|
"count": {{
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 2.0,
|
||||||
|
"type": "minecraft:uniform"
|
||||||
|
}}
|
||||||
|
}},
|
||||||
|
{{
|
||||||
|
"function": "minecraft:apply_bonus",
|
||||||
|
"enchantment": "minecraft:fortune",
|
||||||
|
"formula": "minecraft:uniform_bonus_count",
|
||||||
|
"parameters": {{
|
||||||
|
"bonusMultiplier": 1
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"functions": [
|
||||||
|
{{
|
||||||
|
"function": "minecraft:explosion_decay"
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}'''.format(*([underlineName, ]*4)))
|
||||||
|
|
||||||
|
fblockstates.write('''{{
|
||||||
|
"variants": {{
|
||||||
|
"age=0": {{
|
||||||
|
"model": "teyvatcraft:block/{}_stage0"
|
||||||
|
}},
|
||||||
|
"age=1": {{
|
||||||
|
"model": "teyvatcraft:block/{}_stage1"
|
||||||
|
}},
|
||||||
|
"age=2": {{
|
||||||
|
"model": "teyvatcraft:block/{}_stage2"
|
||||||
|
}},
|
||||||
|
"age=3": {{
|
||||||
|
"model": "teyvatcraft:block/{}_stage3"
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}}'''.format(*([underlineName, ]*4)))
|
||||||
|
|
||||||
|
GenerateSweetBerryBushStageModel(underlineName, 0)
|
||||||
|
GenerateSweetBerryBushStageModel(underlineName, 1)
|
||||||
|
GenerateSweetBerryBushStageModel(underlineName, 2)
|
||||||
|
GenerateSweetBerryBushStageModel(underlineName, 3)
|
||||||
|
|
||||||
|
#shutil.copyfile('sweet_berry_bush_stage0.png', 'assets/teyvatcraft/textures/block/{}_stage0.png'.format(underlineName))
|
||||||
|
#shutil.copyfile('sweet_berry_bush_stage1.png', 'assets/teyvatcraft/textures/block/{}_stage1.png'.format(underlineName))
|
||||||
|
#shutil.copyfile('sweet_berry_bush_stage2.png', 'assets/teyvatcraft/textures/block/{}_stage2.png'.format(underlineName))
|
||||||
|
#shutil.copyfile('sweet_berry_bush_stage3.png', 'assets/teyvatcraft/textures/block/{}_stage3.png'.format(underlineName))
|
||||||
|
|
||||||
|
elif propList[index] == 'flower':
|
||||||
|
fmodel = open('assets/teyvatcraft/models/block/{}.json'.format(underlineName), 'w', encoding='utf-8')
|
||||||
|
javaDeclareFile.write('public static final Block {} = new TeyvatFlowerLikePlantBlock();\n'.format(upperName))
|
||||||
|
|
||||||
|
flootTables.write('''{{
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"pools": [
|
||||||
|
{{
|
||||||
|
"rolls": 1,
|
||||||
|
"entries": [
|
||||||
|
{{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"name": "teyvatcraft:{}"
|
||||||
|
}}
|
||||||
|
],
|
||||||
|
"conditions": [
|
||||||
|
{{
|
||||||
|
"condition": "minecraft:survives_explosion"
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
}}'''.format(underlineName))
|
||||||
|
|
||||||
|
fblockstates.write('''{{
|
||||||
|
"variants": {{
|
||||||
|
"": {{
|
||||||
|
"model": "teyvatcraft:block/{}"
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
}}'''.format(underlineName))
|
||||||
|
|
||||||
|
fmodel.write('''{{
|
||||||
|
"parent": "minecraft:block/cross",
|
||||||
|
"textures": {{
|
||||||
|
"cross": "teyvatcraft:block/{}"
|
||||||
|
}}
|
||||||
|
}}'''.format(underlineName))
|
||||||
|
fmodel.close()
|
||||||
|
|
||||||
|
#shutil.copyfile('flower.png', 'assets/teyvatcraft/textures/block/{}.png'.format(underlineName))
|
||||||
|
|
||||||
|
flootTables.close()
|
||||||
|
fblockstates.close()
|
||||||
|
|
||||||
|
javaRegisterFile.write('registerTeyvatPlant({}, "{}");\n'.format(upperName, underlineName))
|
||||||
|
|
||||||
|
langZhFile.write('"block.teyvatcraft.{}": "{}",\n'.format(underlineName, zhList[index]))
|
||||||
|
langEnFile.write('"block.teyvatcraft.{}": "{}",\n'.format(underlineName, enList[index].replace('"', '')))
|
||||||
|
|
||||||
|
|
||||||
|
javaDeclareFile.close()
|
||||||
|
javaRegisterFile.close()
|
||||||
|
langZhFile.close()
|
||||||
|
langEnFile.close()
|
18
scripts/plant_manager/en.txt
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
Calla Lily
|
||||||
|
Dandelion Seed
|
||||||
|
Jueyun Chili
|
||||||
|
Small Lamp Grass
|
||||||
|
Mint
|
||||||
|
Sweet Flower
|
||||||
|
Berry
|
||||||
|
Snapdragon
|
||||||
|
Matsutake
|
||||||
|
Horsetail
|
||||||
|
Cecilia
|
||||||
|
Glaze Lily
|
||||||
|
Philanemo Mushroom
|
||||||
|
Silk Flower
|
||||||
|
Valberry
|
||||||
|
Windwheel Aster
|
||||||
|
Wolfhook
|
||||||
|
Qingxin
|
BIN
scripts/plant_manager/flower.png
Normal file
After Width: | Height: | Size: 139 B |
18
scripts/plant_manager/prop.txt
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
sweet_berry_bush
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
sweet_berry_bush
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
flower
|
||||||
|
sweet_berry_bush
|
||||||
|
sweet_berry_bush
|
||||||
|
flower
|
||||||
|
sweet_berry_bush
|
||||||
|
flower
|
BIN
scripts/plant_manager/sweet_berry_bush_stage0.png
Normal file
After Width: | Height: | Size: 162 B |
BIN
scripts/plant_manager/sweet_berry_bush_stage1.png
Normal file
After Width: | Height: | Size: 255 B |
BIN
scripts/plant_manager/sweet_berry_bush_stage2.png
Normal file
After Width: | Height: | Size: 280 B |
BIN
scripts/plant_manager/sweet_berry_bush_stage3.png
Normal file
After Width: | Height: | Size: 294 B |
18
scripts/plant_manager/zh.txt
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
嘟嘟莲
|
||||||
|
蒲公英籽
|
||||||
|
绝云椒椒
|
||||||
|
小灯草
|
||||||
|
薄荷
|
||||||
|
甜甜花
|
||||||
|
树莓
|
||||||
|
金鱼草
|
||||||
|
松茸
|
||||||
|
马尾
|
||||||
|
塞西莉亚花
|
||||||
|
琉璃百合
|
||||||
|
慕风蘑菇
|
||||||
|
霓裳花
|
||||||
|
落落莓
|
||||||
|
风车菊
|
||||||
|
钩钩果
|
||||||
|
清心
|
|
@ -3,78 +3,204 @@ package net.yyc12345.teyvatcraft.init;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
|
|
||||||
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
|
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
|
||||||
|
import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext;
|
||||||
|
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.world.biome.BiomeKeys;
|
||||||
import net.minecraft.world.gen.GenerationStep;
|
import net.minecraft.world.gen.GenerationStep;
|
||||||
import net.minecraft.world.gen.decorator.Decorator;
|
|
||||||
import net.minecraft.world.gen.decorator.RangeDecoratorConfig;
|
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||||
|
import net.minecraft.world.gen.feature.ConfiguredFeatures;
|
||||||
import net.minecraft.world.gen.feature.Feature;
|
import net.minecraft.world.gen.feature.Feature;
|
||||||
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
||||||
|
import net.minecraft.world.gen.feature.RandomPatchFeatureConfig;
|
||||||
|
import net.minecraft.world.gen.feature.ConfiguredFeatures.Decorators;
|
||||||
|
import net.minecraft.world.gen.placer.BlockPlacer;
|
||||||
|
import net.minecraft.world.gen.placer.SimpleBlockPlacer;
|
||||||
|
import net.minecraft.world.gen.stateprovider.BlockStateProvider;
|
||||||
|
import net.minecraft.world.gen.stateprovider.SimpleBlockStateProvider;
|
||||||
|
import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider;
|
||||||
|
import net.yyc12345.teyvatcraft.mixin.FlowerForestAccess;
|
||||||
|
|
||||||
public class TerrainsManager {
|
public class TerrainsManager {
|
||||||
|
|
||||||
|
private static final Block[] NORMAL__FLOWERS = new Block[] {
|
||||||
|
BlocksManager.DANDELION_SEED,
|
||||||
|
BlocksManager.SMALL_LAMP_GRASS,
|
||||||
|
BlocksManager.MINT,
|
||||||
|
BlocksManager.SWEET_FLOWER,
|
||||||
|
BlocksManager.MATSUTAKE,
|
||||||
|
BlocksManager.GLAZE_LILY,
|
||||||
|
BlocksManager.PHILANEMO_MUSHROOM,
|
||||||
|
BlocksManager.WINDWHEEL_ASTER
|
||||||
|
};
|
||||||
|
private static final Block[] SWAMP__FLOWERS = new Block[] {
|
||||||
|
BlocksManager.CALLA_LILY,
|
||||||
|
BlocksManager.SNAPDRAGON,
|
||||||
|
BlocksManager.HORSETAIL
|
||||||
|
};
|
||||||
|
private static final Block[] MOUNTAINS__FLOWERS = new Block[] {
|
||||||
|
BlocksManager.CECILIA,
|
||||||
|
BlocksManager.QINGXIN
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final Block[] NORMAL__SWEET_BERRY_BUSH = new Block[] {
|
||||||
|
BlocksManager.JUEYUN_CHILI,
|
||||||
|
BlocksManager.BERRY,
|
||||||
|
BlocksManager.SILK_FLOWER,
|
||||||
|
BlocksManager.VALBERRY,
|
||||||
|
BlocksManager.WOLFHOOK,
|
||||||
|
};
|
||||||
|
|
||||||
// ==================== ore gen
|
// ==================== ore gen
|
||||||
private static ConfiguredFeature<?, ?> OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE = Feature.ORE
|
private static ConfiguredFeature<?, ?> OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE = generateOreFreature(2, 12, 5, BlocksManager.MAGICAL_CRYSTAL_CHUNK_ORE);
|
||||||
.configure(new OreFeatureConfig(
|
private static ConfiguredFeature<?, ?> OREGEN_CRYSTAL_CHUNK_ORE = generateOreFreature(4, 32, 12, BlocksManager.CRYSTAL_CHUNK_ORE);
|
||||||
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
private static ConfiguredFeature<?, ?> OREGEN_WHITE_IRON_CHUNK_ORE = generateOreFreature(4, 64, 24, BlocksManager.WHITE_IRON_CHUNK_ORE);
|
||||||
BlocksManager.MAGICAL_CRYSTAL_CHUNK_ORE.getDefaultState(),
|
private static ConfiguredFeature<?, ?> OREGEN_IRON_CHUNK_ORE = generateOreFreature(8, 64, 24, BlocksManager.IRON_CHUNK_ORE);
|
||||||
1)) // vein size
|
private static ConfiguredFeature<?, ?> OREGEN_STARSILVER_ORE = generateOreFreature(4, 64, 24, BlocksManager.STARSILVER_ORE);
|
||||||
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 12)))
|
private static ConfiguredFeature<?, ?> OREGEN_NOCTILUCOUS_JADE_ORE = generateOreFreature(4, 64, 24, BlocksManager.NOCTILUCOUS_JADE_ORE);
|
||||||
.spreadHorizontally()
|
private static ConfiguredFeature<?, ?> OREGEN_COR_LAPIS_ORE = generateOreFreature(4, 64, 24, BlocksManager.COR_LAPIS_ORE);
|
||||||
.repeat(5); // number of veins per chunk
|
|
||||||
|
|
||||||
private static ConfiguredFeature<?, ?> OREGEN_CRYSTAL_CHUNK_ORE = Feature.ORE
|
private static ConfiguredFeature<?, ?> FLOWERGEN_NORMAL = generateFlowerLikePlantFreature(NORMAL__FLOWERS);
|
||||||
.configure(new OreFeatureConfig(
|
private static ConfiguredFeature<?, ?> FLOWERGEN_SWAMP = generateFlowerLikePlantFreature(SWAMP__FLOWERS);
|
||||||
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
private static ConfiguredFeature<?, ?> FLOWERGEN_MOUNTAINS = generateFlowerLikePlantFreature(MOUNTAINS__FLOWERS);
|
||||||
BlocksManager.CRYSTAL_CHUNK_ORE.getDefaultState(),
|
private static ConfiguredFeature<?, ?> SBBGEN_NORMAL = generateSweetBerryBushLikePlantFreature(NORMAL__SWEET_BERRY_BUSH);
|
||||||
4))
|
|
||||||
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 32)))
|
|
||||||
.spreadHorizontally()
|
|
||||||
.repeat(12);
|
|
||||||
|
|
||||||
private static ConfiguredFeature<?, ?> OREGEN_WHITE_IRON_CHUNK_ORE = Feature.ORE
|
// ================ feature generator
|
||||||
.configure(new OreFeatureConfig(
|
private static ConfiguredFeature<?, ?> generateOreFreature(int veinSize, int maxY, int repeat, Block blk) {
|
||||||
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
return Feature.ORE
|
||||||
BlocksManager.WHITE_IRON_CHUNK_ORE.getDefaultState(),
|
.configure(new OreFeatureConfig(
|
||||||
4))
|
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
||||||
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
|
blk.getDefaultState(),
|
||||||
.spreadHorizontally()
|
veinSize))
|
||||||
.repeat(24);
|
.rangeOf(maxY)
|
||||||
|
.spreadHorizontally()
|
||||||
|
.repeat(repeat);
|
||||||
|
}
|
||||||
|
private static ConfiguredFeature<?, ?> generateFlowerLikePlantFreature(Block[] flowerBlks) {
|
||||||
|
WeightedBlockStateProvider provider = new WeightedBlockStateProvider();
|
||||||
|
for(Block item : flowerBlks) {
|
||||||
|
provider.addState(item.getDefaultState(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
private static ConfiguredFeature<?, ?> OREGEN_IRON_CHUNK_ORE = Feature.ORE
|
return Feature.FLOWER
|
||||||
.configure(new OreFeatureConfig(
|
.configure((new RandomPatchFeatureConfig.Builder(
|
||||||
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
(BlockStateProvider)provider,
|
||||||
BlocksManager.IRON_CHUNK_ORE.getDefaultState(),
|
(BlockPlacer)SimpleBlockPlacer.INSTANCE))
|
||||||
8))
|
.tries(64)
|
||||||
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
|
.build())
|
||||||
.spreadHorizontally()
|
.decorate(Decorators.SPREAD_32_ABOVE)
|
||||||
.repeat(24);
|
.decorate(Decorators.SQUARE_HEIGHTMAP)
|
||||||
|
.repeat(2);
|
||||||
|
}
|
||||||
|
private static ConfiguredFeature<?, ?> generateSweetBerryBushLikePlantFreature(Block[] plantBlks) {
|
||||||
|
WeightedBlockStateProvider provider = new WeightedBlockStateProvider();
|
||||||
|
for(Block item : plantBlks) {
|
||||||
|
provider.addState(item.getDefaultState(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
private static ConfiguredFeature<?, ?> OREGEN_STARSILVER_ORE = Feature.ORE
|
return Feature.RANDOM_PATCH
|
||||||
.configure(new OreFeatureConfig(
|
.configure((new RandomPatchFeatureConfig.Builder(
|
||||||
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
|
(BlockStateProvider)provider,
|
||||||
BlocksManager.IRON_CHUNK_ORE.getDefaultState(),
|
(BlockPlacer)SimpleBlockPlacer.INSTANCE))
|
||||||
4))
|
.tries(64)
|
||||||
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
|
.whitelist((Set<Block>)ImmutableSet.of(Blocks.GRASS_BLOCK))
|
||||||
.spreadHorizontally()
|
.cannotProject()
|
||||||
.repeat(24);
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
private static void registerOreGeneration(String mIdentifier, ConfiguredFeature<?, ?> genStasticas) {
|
// ================ biome register
|
||||||
|
private static Predicate<BiomeSelectionContext> getAllBiomeSelector() {
|
||||||
|
return BiomeSelectors.foundInOverworld();
|
||||||
|
}
|
||||||
|
private static Predicate<BiomeSelectionContext> getMountainsBiomeSelector() {
|
||||||
|
return BiomeSelectors.includeByKey(
|
||||||
|
BiomeKeys.MOUNTAINS,
|
||||||
|
BiomeKeys.GRAVELLY_MOUNTAINS,
|
||||||
|
BiomeKeys.WOODED_MOUNTAINS,
|
||||||
|
BiomeKeys.MODIFIED_GRAVELLY_MOUNTAINS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
private static Predicate<BiomeSelectionContext> getSwampBiomeSelector() {
|
||||||
|
return BiomeSelectors.includeByKey(
|
||||||
|
BiomeKeys.SWAMP,
|
||||||
|
BiomeKeys.SWAMP_HILLS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
private static Predicate<BiomeSelectionContext> getBadlandsBiomeSelector() {
|
||||||
|
return BiomeSelectors.includeByKey(
|
||||||
|
BiomeKeys.BADLANDS,
|
||||||
|
BiomeKeys.ERODED_BADLANDS,
|
||||||
|
BiomeKeys.WOODED_BADLANDS_PLATEAU,
|
||||||
|
BiomeKeys.MODIFIED_BADLANDS_PLATEAU,
|
||||||
|
BiomeKeys.BADLANDS_PLATEAU
|
||||||
|
);
|
||||||
|
}
|
||||||
|
private static Predicate<BiomeSelectionContext> getFrozenBiomeSelector() {
|
||||||
|
return BiomeSelectors.includeByKey(
|
||||||
|
BiomeKeys.SNOWY_TUNDRA,
|
||||||
|
BiomeKeys.ICE_SPIKES,
|
||||||
|
BiomeKeys.SNOWY_TAIGA,
|
||||||
|
BiomeKeys.SNOWY_TAIGA_MOUNTAINS,
|
||||||
|
BiomeKeys.FROZEN_RIVER,
|
||||||
|
BiomeKeys.SNOWY_BEACH,
|
||||||
|
BiomeKeys.SNOWY_MOUNTAINS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void registerOreGeneration(String mIdentifier, ConfiguredFeature<?, ?> genFeature, Predicate<BiomeSelectionContext> biomeSelector) {
|
||||||
RegistryKey<ConfiguredFeature<?, ?>> regKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN,
|
RegistryKey<ConfiguredFeature<?, ?>> regKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN,
|
||||||
new Identifier("teyvatcraft", mIdentifier));
|
new Identifier("teyvatcraft", mIdentifier));
|
||||||
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genStasticas);
|
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genFeature);
|
||||||
BiomeModifications.addFeature(BiomeSelectors.foundInOverworld(), GenerationStep.Feature.UNDERGROUND_ORES, regKey);
|
BiomeModifications.addFeature(biomeSelector, GenerationStep.Feature.UNDERGROUND_ORES, regKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void registerPlantGeneration(String mIdentifier, ConfiguredFeature<?, ?> genFeature, Predicate<BiomeSelectionContext> biomeSelector) {
|
||||||
|
RegistryKey<ConfiguredFeature<?, ?>> regKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN,
|
||||||
|
new Identifier("teyvatcraft", mIdentifier));
|
||||||
|
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genFeature);
|
||||||
|
BiomeModifications.addFeature(biomeSelector, GenerationStep.Feature.VEGETAL_DECORATION, regKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterAll() {
|
public static void RegisterAll() {
|
||||||
// ore gen
|
// ore gen
|
||||||
registerOreGeneration("oregen_magical_crystal_ore", OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE);
|
registerOreGeneration("oregen_magical_crystal_ore", OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE, getAllBiomeSelector());
|
||||||
registerOreGeneration("oregen_crystal_ore", OREGEN_CRYSTAL_CHUNK_ORE);
|
registerOreGeneration("oregen_crystal_ore", OREGEN_CRYSTAL_CHUNK_ORE, getAllBiomeSelector());
|
||||||
registerOreGeneration("oregen_white_iron_ore", OREGEN_WHITE_IRON_CHUNK_ORE);
|
registerOreGeneration("oregen_white_iron_ore", OREGEN_WHITE_IRON_CHUNK_ORE, getAllBiomeSelector());
|
||||||
registerOreGeneration("oregen_iron_ore", OREGEN_IRON_CHUNK_ORE);
|
registerOreGeneration("oregen_iron_ore", OREGEN_IRON_CHUNK_ORE, getAllBiomeSelector());
|
||||||
registerOreGeneration("oregen_starsilver_ore", OREGEN_STARSILVER_ORE);
|
registerOreGeneration("oregen_starsilver_ore", OREGEN_STARSILVER_ORE, getFrozenBiomeSelector());
|
||||||
|
registerOreGeneration("oregen_noctilucous_jade_ore", OREGEN_NOCTILUCOUS_JADE_ORE, getBadlandsBiomeSelector());
|
||||||
|
registerOreGeneration("oregen_cor_lapis_ore", OREGEN_COR_LAPIS_ORE, getBadlandsBiomeSelector());
|
||||||
|
|
||||||
|
// flower gen
|
||||||
|
registerPlantGeneration("flowergen_normal", FLOWERGEN_NORMAL, getAllBiomeSelector());
|
||||||
|
registerPlantGeneration("flowergen_swamp", FLOWERGEN_SWAMP, getSwampBiomeSelector());
|
||||||
|
registerPlantGeneration("flowergen_mountains", FLOWERGEN_MOUNTAINS, getMountainsBiomeSelector());
|
||||||
|
|
||||||
|
registerPlantGeneration("sbbgen_normal", SBBGEN_NORMAL, getAllBiomeSelector());
|
||||||
|
|
||||||
|
// patch flower forest
|
||||||
|
BlockState[] flowerForestArray = FlowerForestAccess.getFlowers();
|
||||||
|
List<BlockState> flowerForestList = new ArrayList<BlockState>();
|
||||||
|
for(BlockState item : flowerForestArray) {
|
||||||
|
flowerForestList.add(item);
|
||||||
|
}
|
||||||
|
for(Block item : NORMAL__FLOWERS) {
|
||||||
|
flowerForestList.add(item.getDefaultState());
|
||||||
|
}
|
||||||
|
BlockState[] newFlowerForestArray = flowerForestList.toArray(new BlockState[flowerForestList.size()]);
|
||||||
|
FlowerForestAccess.setFlowers(newFlowerForestArray);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package net.yyc12345.teyvatcraft.mixin;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.world.gen.stateprovider.ForestFlowerBlockStateProvider;
|
||||||
|
|
||||||
|
@Mixin(ForestFlowerBlockStateProvider.class)
|
||||||
|
public interface FlowerForestAccess {
|
||||||
|
@Accessor("FLOWERS")
|
||||||
|
static BlockState[] getFlowers() {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Accessor("FLOWERS")
|
||||||
|
static void setFlowers(BlockState[] items) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"variants": {
|
||||||
|
"": {
|
||||||
|
"model": "teyvatcraft:block/cor_lapis_ore"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"variants": {
|
||||||
|
"": {
|
||||||
|
"model": "teyvatcraft:block/noctilucous_jade_ore"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,6 +34,8 @@
|
||||||
"block.teyvatcraft.white_iron_chunk_ore": "White Iron Chunk Ore",
|
"block.teyvatcraft.white_iron_chunk_ore": "White Iron Chunk Ore",
|
||||||
"block.teyvatcraft.iron_chunk_ore": "Iron Chunk Ore",
|
"block.teyvatcraft.iron_chunk_ore": "Iron Chunk Ore",
|
||||||
"block.teyvatcraft.starsilver_ore": "Starsilver Ore",
|
"block.teyvatcraft.starsilver_ore": "Starsilver Ore",
|
||||||
|
"block.teyvatcraft.cor_lapis_ore": "Cor Lapis Ore",
|
||||||
|
"block.teyvatcraft.noctilucous_jade_ore": "Noctilucous Jade Ore",
|
||||||
|
|
||||||
"block.teyvatcraft.rice": "Rice",
|
"block.teyvatcraft.rice": "Rice",
|
||||||
"block.teyvatcraft.tomato": "Tomato",
|
"block.teyvatcraft.tomato": "Tomato",
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
"block.teyvatcraft.white_iron_chunk_ore": "白铁块原矿",
|
"block.teyvatcraft.white_iron_chunk_ore": "白铁块原矿",
|
||||||
"block.teyvatcraft.iron_chunk_ore": "铁块原矿",
|
"block.teyvatcraft.iron_chunk_ore": "铁块原矿",
|
||||||
"block.teyvatcraft.starsilver_ore": "星银矿石原矿",
|
"block.teyvatcraft.starsilver_ore": "星银矿石原矿",
|
||||||
|
"block.teyvatcraft.cor_lapis_ore": "石珀原矿",
|
||||||
|
"block.teyvatcraft.noctilucous_jade_ore": "夜泊石原矿",
|
||||||
|
|
||||||
"block.teyvatcraft.rice": "稻米",
|
"block.teyvatcraft.rice": "稻米",
|
||||||
"block.teyvatcraft.tomato": "番茄",
|
"block.teyvatcraft.tomato": "番茄",
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "teyvatcraft:block/cor_lapis_ore"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "minecraft:block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "teyvatcraft:block/noctilucous_jade_ore"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"parent": "teyvatcraft:block/cor_lapis_ore"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"parent": "teyvatcraft:block/noctilucous_jade_ore"
|
||||||
|
}
|
After Width: | Height: | Size: 617 B |
After Width: | Height: | Size: 629 B |
|
@ -32,8 +32,8 @@
|
||||||
{
|
{
|
||||||
"function": "minecraft:set_count",
|
"function": "minecraft:set_count",
|
||||||
"count": {
|
"count": {
|
||||||
"min": 4.0,
|
"min": 1.0,
|
||||||
"max": 5.0,
|
"max": 2.0,
|
||||||
"type": "minecraft:uniform"
|
"type": "minecraft:uniform"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -56,4 +56,4 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -32,8 +32,8 @@
|
||||||
{
|
{
|
||||||
"function": "minecraft:set_count",
|
"function": "minecraft:set_count",
|
||||||
"count": {
|
"count": {
|
||||||
"min": 4.0,
|
"min": 1.0,
|
||||||
"max": 5.0,
|
"max": 2.0,
|
||||||
"type": "minecraft:uniform"
|
"type": "minecraft:uniform"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -56,4 +56,4 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -7,7 +7,8 @@
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"TeyvatCraftMixin",
|
"TeyvatCraftMixin",
|
||||||
"VillagerAccess"
|
"VillagerAccess",
|
||||||
|
"FlowerForestAccess"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|