Localization functionality cleanup. Milker fluid transfer added. Sandstone Ornamented Clinker added.

This commit is contained in:
stfwi 2020-08-28 21:31:38 +02:00
parent 45fed1f374
commit dccd02c40d
27 changed files with 255 additions and 36 deletions

View file

@ -5,4 +5,4 @@ version_minecraft=1.16.2
version_forge_minecraft=1.16.2-33.0.22
version_fml_mappings=20200723-1.16.1
version_jei=1.16.2:7.1.3.19
version_engineersdecor=1.1.2-b4
version_engineersdecor=1.1.2-b5

View file

@ -11,6 +11,9 @@ Mod sources for Minecraft version 1.16.2.
## Version history
~ v1.1.2-b5 [A] Sandstone Ornamented Clinker Brick added.
[F] Milking Machine fluid transfer re-added (thx gebcrafter).
- v1.1.2-b4 [F] Mapping adaption to Forge 1.16.2-33.0.22/20200723-1.16.1.
[F] Fixed conditional recipe tag dependency (thx Blu, Cyborgmas).

View file

@ -82,8 +82,6 @@ public class ModContent
Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(3f, 50f).sound(SoundType.STONE)
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_wall"));
// -------------------------------------------------------------------------------------------------------------------
public static final DecorBlock.Normal CLINKER_BRICK_STAINED_BLOCK = (DecorBlock.Normal)(new DecorBlock.Normal(
DecorBlock.CFG_DEFAULT,
Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(3f, 50f).sound(SoundType.STONE)
@ -100,6 +98,12 @@ public class ModContent
Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(3f, 50f).sound(SoundType.STONE)
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_stained_stairs"));
public static final EdCornerOrnamentedBlock CLINKER_BRICK_SASTOR_CORNER = (EdCornerOrnamentedBlock)(new EdCornerOrnamentedBlock(
DecorBlock.CFG_DEFAULT,
Block.Properties.create(Material.ROCK, MaterialColor.STONE).hardnessAndResistance(3f, 50f).sound(SoundType.STONE),
new Block[]{CLINKER_BRICK_BLOCK, CLINKER_BRICK_STAINED_BLOCK, CLINKER_BRICK_SLAB, CLINKER_BRICK_STAIRS, CLINKER_BRICK_STAINED_SLAB, CLINKER_BRICK_STAINED_STAIRS}
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "clinker_brick_sastor_corner_block"));
// -------------------------------------------------------------------------------------------------------------------
public static final DecorBlock.Normal SLAG_BRICK_BLOCK = (DecorBlock.Normal)(new DecorBlock.Normal(
@ -784,6 +788,7 @@ public class ModContent
CLINKER_BRICK_SLAB,
CLINKER_BRICK_STAIRS,
CLINKER_BRICK_WALL,
CLINKER_BRICK_SASTOR_CORNER,
CLINKER_BRICK_STAINED_BLOCK,
CLINKER_BRICK_STAINED_SLAB,
CLINKER_BRICK_STAINED_STAIRS,

View file

@ -185,7 +185,7 @@ public class EdBreaker
progress = Integer.toString((int)MathHelper.clamp((((double)proc_time_elapsed_) / ((double)time_needed_) * 100), 0, 100));
}
String soc = Integer.toString(MathHelper.clamp((energy_*100/energy_max),0,100));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_block_breaker.status", null, new Object[]{soc, energy_max, progress }));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_block_breaker.status", new Object[]{soc, energy_max, progress }));
}
// TileEntity ------------------------------------------------------------------------------

View file

@ -0,0 +1,69 @@
/*
* @file EdCornerOrnamentedBlock.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Block for corner/quoin ornamentation.
*/
package wile.engineersdecor.blocks;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.world.World;
import wile.engineersdecor.libmc.detail.Auxiliaries;
import javax.annotation.Nullable;
import java.util.*;
public class EdCornerOrnamentedBlock extends DecorBlock.Directed
{
protected final HashSet<Block> compatible_blocks;
public EdCornerOrnamentedBlock(long config, Block.Properties properties, Block[] assigned_wall_blocks)
{
super(config, properties, Auxiliaries.getPixeledAABB(0,0,0,16,16,16));
compatible_blocks = new HashSet<Block>(Arrays.asList(assigned_wall_blocks));
}
@Override
@Nullable
public BlockState getStateForPlacement(BlockItemUseContext context)
{
final World world = context.getWorld();
final BlockPos pos = context.getPos();
// 1. Placement as below/above for corners, or placement adjacent horizontally if up/down facing.
for(Direction adj: Direction.values()) {
BlockState state = world.getBlockState(pos.offset(adj));
if(state.getBlock() != this) continue;
Direction facing = state.get(FACING);
if(facing.getAxis().isHorizontal() == (adj.getAxis().isVertical())) {
return super.getStateForPlacement(context).with(FACING, state.get(FACING));
}
}
// 2. By Player look angles with minimum horizontal diagonal deviation.
{
Direction facing = Direction.WEST;
final Vector2f look = context.getPlayer().getPitchYaw();
final Direction hit_face = context.getFace();
if((context.getFace()==Direction.DOWN) && (look.x <= -60)) {
facing = Direction.DOWN;
} else if((context.getFace()==Direction.UP) && (look.x >= 60)) {
facing = Direction.UP;
} else if(MathHelper.degreesDifferenceAbs(look.y, 45) <= 45) {
facing = Direction.NORTH;
} else if(MathHelper.degreesDifferenceAbs(look.y, 45+90) <= 45) {
facing = Direction.EAST;
} else if(MathHelper.degreesDifferenceAbs(look.y, 45+180) <= 45) {
facing = Direction.SOUTH;
}
return super.getStateForPlacement(context).with(FACING, facing);
}
}
}

View file

@ -130,13 +130,13 @@ public class EdFluidBarrel
}
FluidStack fs = FluidBarrelItem.getFluid(stack);
if(!fs.isEmpty()) {
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".status.tip", null, new Object[] {
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".status.tip", new Object[] {
Integer.toString(fs.getAmount()),
Integer.toString(capacity_),
new TranslationTextComponent(fs.getTranslationKey())
}));
} else {
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".status.tip.empty", null, new Object[] {
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".status.tip.empty", new Object[] {
"0",
Integer.toString(capacity_),
}));
@ -241,11 +241,11 @@ public class EdFluidBarrel
int cap = tank_.getCapacity();
String name = Auxiliaries.localizable(tank_.getFluid().getTranslationKey()).getString();
if((vol>0) && (cap>0)) {
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.fluid_barrel.status", null, new Object[]{
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.fluid_barrel.status", new Object[]{
Integer.toString(vol), Integer.toString(cap), name
}));
} else {
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.fluid_barrel.status.empty", null, new Object[]{
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.fluid_barrel.status.empty", new Object[]{
Integer.toString(vol), Integer.toString(cap)
}));
}

View file

@ -185,7 +185,7 @@ public class EdLabeledCrate
}
int num_free_slots = LabeledCrateTileEntity.ITEMFRAME_SLOTNO - num_used_slots;
ItemStack frameStack = items.get(LabeledCrateTileEntity.ITEMFRAME_SLOTNO);
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".tip", null, new Object[] {
tooltip.add(Auxiliaries.localizable(getTranslationKey()+".tip", new Object[] {
(frameStack.isEmpty() ? (new StringTextComponent("-/-")) : (new TranslationTextComponent(frameStack.getTranslationKey()))),
num_used_slots,
num_free_slots,

View file

@ -14,6 +14,7 @@ import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.detail.ExternalObjects;
import wile.engineersdecor.libmc.detail.Overlay;
import net.minecraft.world.World;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.IBlockReader;
@ -51,7 +52,7 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import wile.engineersdecor.libmc.detail.Overlay;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@ -186,8 +187,11 @@ public class EdMilker
energy_consumption = MathHelper.clamp(energy_consumption_per_tick, 0, 1024);
min_milking_delay_per_cow_ticks = MathHelper.clamp(min_milking_delay_per_cow, 1000, 24000);
{
Fluid milk = null; // FluidRe.getFluid("milk");
if(milk != null) milk_fluid_ = new FluidStack(milk, BUCKET_SIZE);
ResourceLocation milk_rl = ForgeRegistries.FLUIDS.getKeys().stream().filter(rl->rl.getPath().equals("milk")).findFirst().orElse(null);
if(milk_rl != null) {
Fluid milk = ForgeRegistries.FLUIDS.getValue(milk_rl);
if(milk != null) milk_fluid_ = new FluidStack(milk, BUCKET_SIZE);
}
}
{
milk_containers_.put(new ItemStack(Items.BUCKET), new ItemStack(Items.MILK_BUCKET));
@ -195,7 +199,7 @@ public class EdMilker
}
ModEngineersDecor.logger().info(
"Config milker: energy consumption:" + energy_consumption + "rf/t"
+ ((milk_fluid_==null)?"":" [milk fluid available]")
+ ((milk_fluid_==NO_MILK_FLUID)?"":" [milk fluid available]")
+ ((ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE==null)?"":" [bottledmilk mod available]")
);
}
@ -249,8 +253,8 @@ public class EdMilker
public void state_message(PlayerEntity player)
{
ITextComponent rf = (energy_consumption <= 0) ? (new StringTextComponent("")) : (Auxiliaries.localizable("block.engineersdecor.small_milking_machine.status.rf", null, new Object[]{energy_stored_}));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_milking_machine.status", null, new Object[]{tank_level_, rf}));
ITextComponent rf = (energy_consumption <= 0) ? (new StringTextComponent("")) : (Auxiliaries.localizable("block.engineersdecor.small_milking_machine.status.rf", new Object[]{energy_stored_}));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_milking_machine.status", new Object[]{tank_level_, rf}));
}
// TileEntity ------------------------------------------------------------------------------
@ -381,6 +385,20 @@ public class EdMilker
return dirty;
}
private boolean fill_adjacent_tank()
{
if((fluid_level()<=0) || (!has_milk_fluid())) return false;
final FluidStack fs = new FluidStack(milk_fluid_, Math.max(fluid_level(), BUCKET_SIZE));
for(Direction dir:Direction.values()) {
int amount = Fluidics.fill(getWorld(), getPos().offset(dir), dir.getOpposite(), fs);
if(amount > 0) {
tank_level_ = Math.max(fluid_level() - amount, 0);
return true;
}
}
return false;
}
private void release_cow(CowEntity cow)
{
log("release cow");
@ -565,7 +583,7 @@ public class EdMilker
// Adjacent inventory update, only done just after milking to prevent waste of server cpu.
if((!dirty) && (fluid_level() >= BUCKET_SIZE)) {
log("Try item transfer");
if(fill_adjacent_inventory_item_containers(block_state.get(MilkerBlock.HORIZONTAL_FACING))) dirty = true;
if(fill_adjacent_tank() || fill_adjacent_inventory_item_containers(block_state.get(MilkerBlock.HORIZONTAL_FACING))) dirty = true;
}
}
// State update

View file

@ -119,7 +119,7 @@ public class EdSolarPanel
public void state_message(PlayerEntity player)
{
String soc = Integer.toString(MathHelper.clamp((accumulated_power_*100/max_power_storage_),0,100));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_solar_panel.status", null, new Object[]{soc, max_power_storage_, current_production_, current_feedin_ }));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_solar_panel.status", new Object[]{soc, max_power_storage_, current_production_, current_feedin_ }));
}
// IEnergyStorage --------------------------------------------------------------------------

View file

@ -145,7 +145,7 @@ public class EdTreeCutter
progress = Integer.toString((int)MathHelper.clamp((((double)proc_time_elapsed_) / ((double)cutting_time_needed) * 100), 0, 100));
}
String soc = Integer.toString(MathHelper.clamp((energy_*100/energy_max),0,100));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_tree_cutter.status", null, new Object[]{soc, energy_max, progress, (cutting_time_needed/20) }));
Overlay.show(player, Auxiliaries.localizable("block.engineersdecor.small_tree_cutter.status", new Object[]{soc, energy_max, progress, (cutting_time_needed/20) }));
}
// TileEntity ------------------------------------------------------------------------------

View file

@ -113,15 +113,13 @@ public class Auxiliaries
* Text localisation wrapper, implicitly prepends `MODID` to the
* translation keys. Forces formatting argument, nullable if no special formatting shall be applied..
*/
public static TranslationTextComponent localizable(String modtrkey, @Nullable TextFormatting color, Object... args)
public static TranslationTextComponent localizable(String modtrkey, Object... args)
{
TranslationTextComponent tr = new TranslationTextComponent((modtrkey.startsWith("block.") || (modtrkey.startsWith("item."))) ? (modtrkey) : (modid+"."+modtrkey), args);
if(color!=null) tr.mergeStyle(color);
return tr;
return new TranslationTextComponent((modtrkey.startsWith("block.") || (modtrkey.startsWith("item."))) ? (modtrkey) : (modid+"."+modtrkey), args);
}
public static TranslationTextComponent localizable(String modtrkey)
{ return localizable(modtrkey, null); }
{ return localizable(modtrkey, new Object[]{}); }
public static TranslationTextComponent localizable_block_key(String blocksubkey)
{ return new TranslationTextComponent("block."+modid+"."+blocksubkey); }
@ -187,8 +185,7 @@ public class Auxiliaries
@OnlyIn(Dist.CLIENT)
public static boolean addInformation(@Nullable String advancedTooltipTranslationKey, @Nullable String helpTranslationKey, List<ITextComponent> tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints)
{
// Note: intentionally not using keybinding here, this must be `control` or `shift`. MC uses lwjgl Keyboard,
// so using this also here should be ok.
// Note: intentionally not using keybinding here, this must be `control` or `shift`.
final boolean help_available = (helpTranslationKey != null) && Auxiliaries.hasTranslation(helpTranslationKey + ".help");
final boolean tip_available = (advancedTooltipTranslationKey != null) && Auxiliaries.hasTranslation(helpTranslationKey + ".tip");
if((!help_available) && (!tip_available)) return false;
@ -196,7 +193,7 @@ public class Auxiliaries
if(!help_available) return false;
String s = localize(helpTranslationKey + ".help");
if(s.isEmpty()) return false;
tooltip.add(new StringTextComponent(s)); // @todo: check how to optimise that (to use TranslationTextComponent directly without compat losses)
tooltip.add(new StringTextComponent(s));
return true;
} else if(extendedTipCondition()) {
if(!tip_available) return false;

View file

@ -72,9 +72,15 @@ public class Fluidics
public Tank readnbt(CompoundNBT nbt)
{ setFluid(FluidStack.loadFluidStackFromNBT(nbt)); return this; }
public CompoundNBT writenbt()
{ return writenbt(new CompoundNBT()); }
public CompoundNBT writenbt(CompoundNBT nbt)
{ fluid_.writeToNBT(nbt); return nbt; }
public void reset()
{ setFluid(null); }
public int getCapacity()
{ return capacity_; }
@ -150,7 +156,6 @@ public class Fluidics
}
}
/**
* Fills or drains items with fluid handlers from or into tile blocks with fluid handlers.
*/
@ -191,6 +196,15 @@ public class Fluidics
return null;
}
public static int fill(World world, BlockPos pos, Direction side, FluidStack fs, FluidAction action)
{
IFluidHandler fh = FluidUtil.getFluidHandler(world, pos, side).orElse(null);
return (fh==null) ? (0) : (fh.fill(fs, action));
}
public static int fill(World world, BlockPos pos, Direction side, FluidStack fs)
{ return fill(world, pos, side, fs, FluidAction.EXECUTE); }
/**
* Fluid tank access when itemized.
*/

View file

@ -15,6 +15,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.api.distmarker.Dist;
@ -46,6 +47,7 @@ public class Overlay
@OnlyIn(Dist.CLIENT)
public static class TextOverlayGui extends AbstractGui
{
private static final ITextComponent EMPTY_TEXT = new StringTextComponent("");
private static double overlay_y_ = 0.75;
private static int text_color_ = 0x00ffaa00;
private static int border_color_ = 0xaa333333;
@ -53,7 +55,7 @@ public class Overlay
private static int background_color2_ = 0xaa444444;
private final Minecraft mc;
private static long deadline_;
private static String text_;
private static ITextComponent text_;
public static void on_config(double overlay_y)
{
@ -65,20 +67,20 @@ public class Overlay
background_color2_ = 0xaa444444;
}
public static synchronized String text()
public static synchronized ITextComponent text()
{ return text_; }
public static synchronized long deadline()
{ return deadline_; }
public static synchronized void hide()
{ deadline_ = 0; text_ = ""; }
{ deadline_ = 0; text_ = EMPTY_TEXT; }
public static synchronized void show(ITextComponent s, int displayTimeoutMs)
{ text_ = (s==null)?(""):(s.getString()); deadline_ = System.currentTimeMillis() + displayTimeoutMs; }
{ text_ = (s==null)?(EMPTY_TEXT):(s.deepCopy()); deadline_ = System.currentTimeMillis() + displayTimeoutMs; }
public static synchronized void show(String s, int displayTimeoutMs)
{ text_ = (s == null) ? ("") : (s); deadline_ = System.currentTimeMillis() + displayTimeoutMs; }
{ text_ = ((s==null)||(s.isEmpty()))?(EMPTY_TEXT):(new StringTextComponent(s)); deadline_ = System.currentTimeMillis() + displayTimeoutMs; }
TextOverlayGui()
{ super(); mc = SidedProxy.mc(); }
@ -88,9 +90,10 @@ public class Overlay
{
if(event.getType() != RenderGameOverlayEvent.ElementType.CHAT) return;
if(deadline() < System.currentTimeMillis()) return;
String txt = text();
MatrixStack mxs = event.getMatrixStack();
if(text()==EMPTY_TEXT) return;
String txt = text().getString();
if(txt.isEmpty()) return;
MatrixStack mxs = event.getMatrixStack();
final MainWindow win = mc.getMainWindow();
final FontRenderer fr = mc.fontRenderer;
final boolean was_unicode = fr.getBidiFlag();
@ -104,12 +107,11 @@ public class Overlay
hLine(mxs, cx-(w/2)-3, cx+(w/2)+2, cy+h+2, 0xaa333333);
vLine(mxs, cx-(w/2)-3, cy-2, cy+h+2, 0xaa333333);
vLine(mxs, cx+(w/2)+2, cy-2, cy+h+2, 0xaa333333);
drawCenteredString(mxs, fr, txt, cx , cy+1, 0x00ffaa00);
drawCenteredString(mxs, fr, text(), cx , cy+1, 0x00ffaa00);
} finally {
; // fr.setBidiFlag(was_unicode);
}
}
}
}

View file

@ -0,0 +1,10 @@
{
"variants": {
"facing=north": { "model": "engineersdecor:block/brick/clinker_brick_sastor_corner_model" },
"facing=south": { "model": "engineersdecor:block/brick/clinker_brick_sastor_corner_model", "y":180 },
"facing=west": { "model": "engineersdecor:block/brick/clinker_brick_sastor_corner_model", "y":270 },
"facing=east": { "model": "engineersdecor:block/brick/clinker_brick_sastor_corner_model", "y":90 },
"facing=up": { "model": "engineersdecor:block/brick/clinker_brick_sastor_up_model" },
"facing=down": { "model": "engineersdecor:block/brick/clinker_brick_sastor_down_model" }
}
}

View file

@ -196,6 +196,8 @@
"block.engineersdecor.slag_brick_stairs.help": "§6Gray-brown brick stairs.",
"block.engineersdecor.slag_brick_wall": "Slag Brick Wall",
"block.engineersdecor.slag_brick_wall.help": "§6Simplistic Slag Brick Wall.",
"block.engineersdecor.clinker_brick_sastor_corner_block": "Sandstone Ornamented Clinker Brick Corner",
"block.engineersdecor.clinker_brick_sastor_corner_block.help": "§6Quoin decoration for clinker wall accentuation.",
"block.engineersdecor.small_block_breaker": "Small Block Breaker",
"block.engineersdecor.small_block_breaker.help": "§6Breaks blocks in front of it.§r\nCan be disabled by applying a redstone signal. The time needed to destroy a block depends on the hardness of that block. ${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}",
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",

View file

@ -0,0 +1,24 @@
{
"parent": "block/block",
"textures": {
"d": "engineersdecor:block/clinker_brick/clinker_brick_sastor_corner_down_texture",
"n": "engineersdecor:block/clinker_brick/clinker_brick_sastor_corner_side_texture",
"particle": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"s": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"u": "engineersdecor:block/clinker_brick/clinker_brick_sastor_corner_up_texture"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [16, 0, 0, 16], "texture": "#n", "cullface": "north"},
"east": {"uv": [0, 0, 16, 16], "texture": "#n", "cullface": "east"},
"south": {"uv": [0, 0, 16, 16], "texture": "#s", "cullface": "south"},
"west": {"uv": [0, 0, 16, 16], "texture": "#s", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#u", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#d", "cullface": "down"}
}
}
]
}

View file

@ -0,0 +1,12 @@
{
"parent": "block/cube",
"textures": {
"particle": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"down": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_top_texture",
"up": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"north": "engineersdecor:block/clinker_brick/clinker_brick_sastor_downplate_side_texture",
"south": "engineersdecor:block/clinker_brick/clinker_brick_sastor_downplate_side_texture",
"west": "engineersdecor:block/clinker_brick/clinker_brick_sastor_downplate_side_texture",
"east": "engineersdecor:block/clinker_brick/clinker_brick_sastor_downplate_side_texture"
}
}

View file

@ -0,0 +1,12 @@
{
"parent": "block/cube",
"textures": {
"particle": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"down": "engineersdecor:block/clinker_brick/clinker_brick_texture0",
"up": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_top_texture",
"north": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_side_texture",
"south": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_side_texture",
"west": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_side_texture",
"east": "engineersdecor:block/clinker_brick/clinker_brick_sastor_upplate_side_texture"
}
}

View file

@ -0,0 +1 @@
{ "parent": "engineersdecor:block/brick/clinker_brick_sastor_corner_model" }

View file

@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"name": "clinker_brick_sastor_corner_block_dlt",
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:copy_name",
"source": "block_entity"
}
],
"name": "engineersdecor:clinker_brick_sastor_corner_block"
}
]
}
]
}

View file

@ -0,0 +1,29 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_sastor_corner_block",
"required": ["engineersdecor:clinker_brick_block"]
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"pattern": [
"BS",
"SB"
],
"key": {
"B": { "item": "engineersdecor:clinker_brick_block" },
"S": { "item": "minecraft:sandstone_stairs" }
},
"result": {
"item": "engineersdecor:clinker_brick_sastor_corner_block",
"count": 4
}
}
}
]
}