mirror of
https://github.com/GTNewHorizons/Botania.git
synced 2026-10-26 14:24:22 +00:00
Special item models
This commit is contained in:
1 parent
23cab39892
commit
dcd08963e9
55 files changed
+481
-41
No files matched your search
@@ -88,7 +88,7 @@ public final class BotaniaAPI {
|
||||
public static Map<Item, Block> seeds = new HashMap();
|
||||
|
||||
public static Set<Item> looniumBlacklist = new LinkedHashSet<Item>();
|
||||
public static Map<Block, PropertyEnum> paintableBlocks = new LinkedHashMap<Block, PropertyEnum>();
|
||||
public static Map<Block, PropertyEnum<EnumDyeColor>> paintableBlocks = new LinkedHashMap<Block, PropertyEnum<EnumDyeColor>>();
|
||||
public static Set<String> magnetBlacklist = new LinkedHashSet<String>();
|
||||
|
||||
|
||||
@@ -285,11 +285,7 @@ public final class BotaniaAPI {
|
||||
* You must also provide the PropertyEnum that this block uses to express its color
|
||||
* The component type of the property must be EnumDyeColor
|
||||
*/
|
||||
public static Block registerPaintableBlock(Block paintable, PropertyEnum colorProp){
|
||||
if (colorProp.getValueClass() != EnumDyeColor.class) {
|
||||
throw new IllegalArgumentException("Must be EnumDyeColor");
|
||||
}
|
||||
|
||||
public static Block registerPaintableBlock(Block paintable, PropertyEnum<EnumDyeColor> colorProp){
|
||||
paintableBlocks.put(paintable, colorProp);
|
||||
return paintable;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.google.common.base.Function;
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
@@ -47,40 +48,67 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
|
||||
/**
|
||||
* Register your model for the given subtile class here.
|
||||
* Call this DURING PREINIT. Calling it anytime after models have already baked does not guarantee that your model will work.
|
||||
* Call this DURING PREINIT. Calling it anytime after blockModels have already baked does not guarantee that your model will work.
|
||||
* Your model json must specify key "tintindex" in all the faces it wants tint applied.
|
||||
* Tint is applied whenever a player recolors the flower using floral dye
|
||||
* todo 1.8.8 move this elsewhere or otherwise make it fit better with the rest of the subtile registration process
|
||||
*
|
||||
* @param subTileName The String ID of the subtile
|
||||
* @param subTileName The String ID of the subtile
|
||||
* @param model A path to a blockstate json and variant to be used for this subtile
|
||||
* @param itemModel A path to a blockstate json and variant to be used for this subtile's item form
|
||||
*/
|
||||
public static void register(String subTileName, ModelResourceLocation model, ModelResourceLocation itemModel) {
|
||||
queuedBlockModels.put(subTileName, model);
|
||||
queuedItemModels.put(subTileName, itemModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register your model for the given subtile class here.
|
||||
* Call this DURING PREINIT. Calling it anytime after blockModels have already baked does not guarantee that your model will work.
|
||||
* Your model json must specify key "tintindex" in all the faces it wants tint applied.
|
||||
* Tint is applied whenever a player recolors the flower using floral dye
|
||||
* todo 1.8.8 move this elsewhere or otherwise make it fit better with the rest of the subtile registration process
|
||||
*
|
||||
* @param subTileName The String ID of the subtile
|
||||
* @param model A path to a blockstate json and variant to be used the block. The item model will be drawn from the same blockstate json, from variant "inventory"
|
||||
*/
|
||||
public static void register(String subTileName, ModelResourceLocation model) {
|
||||
queuedModels.put(subTileName, model);
|
||||
register(subTileName, model, new ModelResourceLocation(model.getResourceDomain() + ":" + model.getResourcePath(), "inventory"));
|
||||
}
|
||||
|
||||
public static void register(Class<? extends SubTileEntity> clazz, ModelResourceLocation model) {
|
||||
register(BotaniaAPI.getSubTileStringMapping(clazz), model);
|
||||
}
|
||||
|
||||
public static void register(Class<? extends SubTileEntity> clazz, ModelResourceLocation model, ModelResourceLocation itemModel) {
|
||||
register(BotaniaAPI.getSubTileStringMapping(clazz), model, itemModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal implementation
|
||||
**/
|
||||
// SpecialFlowerModel for when there are no models registered for a subtile
|
||||
public static final SpecialFlowerModel INSTANCE = new SpecialFlowerModel(ImmutableMap.<Optional<String>, ModelResourceLocation>of());
|
||||
// SpecialFlowerModel for when there are no blockModels registered for a subtile
|
||||
public static final SpecialFlowerModel INSTANCE = new SpecialFlowerModel(ImmutableMap.<Optional<String>, ModelResourceLocation>of(), ImmutableMap.<Optional<String>, ModelResourceLocation>of());
|
||||
// Models registered from the externel API thus far
|
||||
private static final Map<String, ModelResourceLocation> queuedModels = Maps.newHashMap();
|
||||
private static final Map<String, ModelResourceLocation> queuedBlockModels = Maps.newHashMap();
|
||||
private static final Map<String, ModelResourceLocation> queuedItemModels = Maps.newHashMap();
|
||||
|
||||
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> models;
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> blockModels;
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> itemModels;
|
||||
|
||||
public SpecialFlowerModel(ImmutableMap<Optional<String>, ModelResourceLocation> models) {
|
||||
this.models = models;
|
||||
public SpecialFlowerModel(ImmutableMap<Optional<String>, ModelResourceLocation> blockModels,
|
||||
ImmutableMap<Optional<String>, ModelResourceLocation> itemModels) {
|
||||
this.blockModels = blockModels;
|
||||
this.itemModels = itemModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ResourceLocation> getDependencies() {
|
||||
return ImmutableList.<ResourceLocation>copyOf(models.values());
|
||||
ImmutableSet.Builder<ResourceLocation> builder = ImmutableSet.builder();
|
||||
builder.addAll(blockModels.values());
|
||||
builder.addAll(itemModels.values());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -90,8 +118,8 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
|
||||
@Override
|
||||
public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
|
||||
// "Bake" the SpecialFlowerModel (in reality, just create another wrapper for all the delegate models)
|
||||
return new SpecialFlowerBakedModel(models, format, IPerspectiveAwareModel.MapWrapper.getTransforms(state));
|
||||
// "Bake" the SpecialFlowerModel (in reality, just create another wrapper for all the delegate blockModels)
|
||||
return new SpecialFlowerBakedModel(blockModels, itemModels, format, IPerspectiveAwareModel.MapWrapper.getTransforms(state));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -102,18 +130,26 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
@Override
|
||||
public IModel process(ImmutableMap<String, String> customData) {
|
||||
// Load the base variant from blockstate json, and also add all the model paths we received from external API
|
||||
ImmutableMap.Builder<Optional<String>, ModelResourceLocation> builder = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<Optional<String>, ModelResourceLocation> blockBuilder = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<Optional<String>, ModelResourceLocation> itemBuilder = ImmutableMap.builder();
|
||||
|
||||
for (String key : customData.keySet()) {
|
||||
if ("base".equals(key)) {
|
||||
builder.put(Optional.<String>absent(), getLocation(customData.get(key)));
|
||||
}
|
||||
for (Map.Entry<String, ModelResourceLocation> e : queuedModels.entrySet()) {
|
||||
builder.put(Optional.<String>of(e.getKey()), e.getValue());
|
||||
blockBuilder.put(Optional.<String>absent(), getLocation(customData.get(key)));
|
||||
}
|
||||
}
|
||||
ImmutableMap<Optional<String>, ModelResourceLocation> models = builder.build();
|
||||
if (models.isEmpty()) return INSTANCE;
|
||||
return new SpecialFlowerModel(models);
|
||||
|
||||
for (Map.Entry<String, ModelResourceLocation> e : queuedBlockModels.entrySet()) {
|
||||
blockBuilder.put(Optional.of(e.getKey()), e.getValue());
|
||||
}
|
||||
for (Map.Entry<String, ModelResourceLocation> e : queuedItemModels.entrySet()) {
|
||||
itemBuilder.put(Optional.of(e.getKey()), e.getValue());
|
||||
}
|
||||
|
||||
ImmutableMap<Optional<String>, ModelResourceLocation> blockModels = blockBuilder.build();
|
||||
ImmutableMap<Optional<String>, ModelResourceLocation> itemModels = itemBuilder.build();
|
||||
if (blockModels.isEmpty() && itemModels.isEmpty()) return INSTANCE;
|
||||
return new SpecialFlowerModel(blockModels, itemModels);
|
||||
}
|
||||
|
||||
private ModelResourceLocation getLocation(String json) {
|
||||
@@ -141,7 +177,7 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
|
||||
@Override
|
||||
public IModel loadModel(ResourceLocation modelLocation) throws IOException {
|
||||
// Load a dummy model for now, all actual models added in process().
|
||||
// Load a dummy model for now, all actual blockModels added in process().
|
||||
return SpecialFlowerModel.INSTANCE;
|
||||
}
|
||||
}
|
||||
@@ -150,33 +186,46 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
public static class SpecialFlowerBakedModel implements IPerspectiveAwareModel, ISmartBlockModel, ISmartItemModel {
|
||||
|
||||
private final ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transforms;
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> models;
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> blockModels;
|
||||
private final ImmutableMap<Optional<String>, ModelResourceLocation> itemModels;
|
||||
private final VertexFormat vertexFormat;
|
||||
|
||||
private IBakedModel baseModel;
|
||||
private ImmutableMap<String, IBakedModel> bakedFlowerModels;
|
||||
private ImmutableMap<String, IBakedModel> bakedBlockModels;
|
||||
private ImmutableMap<String, IBakedModel> bakedItemModels;
|
||||
private ImmutableMap<Optional<EnumFacing>, ImmutableList<BakedQuad>> quads;
|
||||
|
||||
public SpecialFlowerBakedModel(ImmutableMap<Optional<String>, ModelResourceLocation> models, VertexFormat format, ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> cameraTransforms) {
|
||||
this.models = models;
|
||||
public SpecialFlowerBakedModel(ImmutableMap<Optional<String>, ModelResourceLocation> blockModels,
|
||||
ImmutableMap<Optional<String>, ModelResourceLocation> itemModels,
|
||||
VertexFormat format, ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> cameraTransforms) {
|
||||
this.blockModels = blockModels;
|
||||
this.itemModels = itemModels;
|
||||
this.vertexFormat = format;
|
||||
this.transforms = cameraTransforms;
|
||||
}
|
||||
|
||||
private void refreshBakedModels() {
|
||||
if (baseModel == null) {
|
||||
System.out.println("Refreshing baked models");
|
||||
ModelManager manager = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelManager();
|
||||
baseModel = getModel(manager, Optional.<String>absent());
|
||||
baseModel = getBlockModel(manager, Optional.<String>absent());
|
||||
|
||||
ImmutableMap.Builder<String, IBakedModel> builder = ImmutableMap.builder();
|
||||
for (Map.Entry<Optional<String>, ModelResourceLocation> e : models.entrySet()) {
|
||||
for (Map.Entry<Optional<String>, ModelResourceLocation> e : blockModels.entrySet()) {
|
||||
if (e.getKey().isPresent()) {
|
||||
builder.put(e.getKey().get(), getModel(manager, e.getKey()));
|
||||
builder.put(e.getKey().get(), getBlockModel(manager, e.getKey()));
|
||||
}
|
||||
}
|
||||
|
||||
bakedFlowerModels = builder.build();
|
||||
bakedBlockModels = builder.build();
|
||||
|
||||
ImmutableMap.Builder<String, IBakedModel> builder2 = ImmutableMap.builder();
|
||||
for (Map.Entry<Optional<String>, ModelResourceLocation> e : itemModels.entrySet()) {
|
||||
if (e.getKey().isPresent()) {
|
||||
builder2.put(e.getKey().get(), getItemModel(manager, e.getKey()));
|
||||
}
|
||||
}
|
||||
|
||||
bakedItemModels = builder2.build();
|
||||
|
||||
ImmutableMap.Builder<Optional<EnumFacing>, ImmutableList<BakedQuad>> quadBuilder = ImmutableMap.builder();
|
||||
quadBuilder.put(Optional.<EnumFacing>absent(), buildQuads(Optional.<EnumFacing>absent()));
|
||||
@@ -187,8 +236,16 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
}
|
||||
}
|
||||
|
||||
private IBakedModel getModel(ModelManager manager, Optional<String> optClazz) {
|
||||
ModelResourceLocation loc = models.get(optClazz);
|
||||
private IBakedModel getBlockModel(ModelManager manager, Optional<String> opt) {
|
||||
ModelResourceLocation loc = blockModels.get(opt);
|
||||
if (loc == null) {
|
||||
loc = new ModelResourceLocation("builtin/missing", "missing");
|
||||
}
|
||||
return manager.getModel(loc);
|
||||
}
|
||||
|
||||
private IBakedModel getItemModel(ModelManager manager, Optional<String> opt) {
|
||||
ModelResourceLocation loc = itemModels.get(opt);
|
||||
if (loc == null) {
|
||||
loc = new ModelResourceLocation("builtin/missing", "missing");
|
||||
}
|
||||
@@ -197,13 +254,22 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
|
||||
private ImmutableList<BakedQuad> buildQuads(Optional<EnumFacing> side) {
|
||||
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
|
||||
for (IBakedModel model : bakedFlowerModels.values()) {
|
||||
for (IBakedModel model : bakedBlockModels.values()) {
|
||||
if (side.isPresent()) {
|
||||
builder.addAll(model.getFaceQuads(side.get()));
|
||||
} else {
|
||||
builder.addAll(model.getGeneralQuads());
|
||||
}
|
||||
}
|
||||
|
||||
for (IBakedModel model : bakedItemModels.values()) {
|
||||
if (side.isPresent()) {
|
||||
builder.addAll(model.getFaceQuads(side.get()));
|
||||
} else {
|
||||
builder.addAll(model.getGeneralQuads());
|
||||
}
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@@ -252,7 +318,7 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
public IBakedModel handleBlockState(IBlockState state) {
|
||||
refreshBakedModels();
|
||||
IExtendedBlockState extendedState = ((IExtendedBlockState) state);
|
||||
IBakedModel ret = bakedFlowerModels.get(extendedState.getValue(BotaniaStateProps.SUBTILE_ID));
|
||||
IBakedModel ret = bakedBlockModels.get(extendedState.getValue(BotaniaStateProps.SUBTILE_ID));
|
||||
if (ret == null) {
|
||||
System.out.println("Warning: no flower model for subtile: " + extendedState.getValue(BotaniaStateProps.SUBTILE_ID));
|
||||
}
|
||||
@@ -272,7 +338,14 @@ public class SpecialFlowerModel implements IModelCustomData {
|
||||
@Override
|
||||
public IBakedModel handleItemState(ItemStack stack) {
|
||||
refreshBakedModels();
|
||||
return bakedFlowerModels.get(ItemBlockSpecialFlower.getType(stack));
|
||||
//System.out.println("calling smart item");
|
||||
IBakedModel item = bakedItemModels.get(ItemBlockSpecialFlower.getType(stack));
|
||||
if (item == null) {
|
||||
System.out.println("Missing item model, selecting block model");
|
||||
item = bakedBlockModels.get(ItemBlockSpecialFlower.getType(stack));
|
||||
}
|
||||
|
||||
return item == null ? Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getMissingModel() : item;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/agricarnation"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/agricarnation"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/agricarnationChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/agricarnationChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/arcanerose"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/arcanerose"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/bellethorn"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/bellethorn"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/bellethornChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/bellethornChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/bubbell"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/bubbell"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/bubbellChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/bubbellChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/clayconia"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/clayconia"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/daffomill"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/daffomill"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/dandelifeon"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/dandelifeon"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/daybloom"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/daybloom"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/daybloomDecor"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/daybloomDecor"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/daybloomPrime"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/daybloomPrime"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/dreadthorn"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/dreadthorn"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/endoflame"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/endoflame"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/entropinnyum"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/entropinnyum"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/exoflame"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/exoflame"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/fallenKanade"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/fallenKanade"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/gourmaryllis"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/gourmaryllis"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/heiseiDream"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/heiseiDream"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/hopperhock"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/hopperhock"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/hopperhockChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/hopperhockChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/hyacidus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/hyacidus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/hydroangeas"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/hydroangeas"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/hydroangeasDecor"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/hydroangeasDecor"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/jadedAmaranthus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/jadedAmaranthus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/jiyuulia"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/jiyuulia"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/kekimurus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/kekimurus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/loonium"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/loonium"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/manastar"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/manastar"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/marimorphosis"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/marimorphosis"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/marimorphosisChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/marimorphosisChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/medumone"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/medumone"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/munchdew"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/munchdew"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/narslimmus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/narslimmus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/nightshade"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/nightshade"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/nightshadeDecor"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/nightshadeDecor"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/nightshadePrime"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/nightshadePrime"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/orechid"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/orechid"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/orechidIgnem"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/orechidIgnem"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/pollidisiac"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/pollidisiac"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/puredaisy"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/puredaisy"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/rafflowsia"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/rafflowsia"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/rannuncarpus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/rannuncarpus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/rannuncarpusChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/rannuncarpusChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/solegnolia"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/solegnolia"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/solegnoliaChibi"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/solegnoliaChibi"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/spectranthemum"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/spectranthemum"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/spectrolus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/spectrolus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/tangleberrie"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/tangleberrie"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/thermalily"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/thermalily"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/tigerseye"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/tigerseye"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,13 @@
|
||||
"textures": {
|
||||
"cross": "botania:blocks/vinculotus"
|
||||
}
|
||||
}],
|
||||
"inventory": [{
|
||||
"model": "builtin/generated",
|
||||
"transform": "forge:default-item",
|
||||
"textures": {
|
||||
"layer0": "botania:blocks/vinculotus"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user