1.14/1.15: Delayed GUI button tooltips added.

This commit is contained in:
stfwi 2020-06-11 13:59:48 +02:00
parent 7cf182652b
commit f46b2b6bc7
59 changed files with 852 additions and 90 deletions

View file

@ -10,6 +10,8 @@ Mod sources for Minecraft version 1.12.2.
---- ----
## Version history ## Version history
~ v1.1.0-b2 [F]
- v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace). - v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).
[M] Changed Labeled Crate Nesting to circumvent server crashing [M] Changed Labeled Crate Nesting to circumvent server crashing
in combination with the Sponge mod. in combination with the Sponge mod.

View file

@ -5,4 +5,4 @@ version_minecraft=1.14.4
version_forge_minecraft=1.14.4-28.2.3 version_forge_minecraft=1.14.4-28.2.3
version_fml_mappings=20190719-1.14.3 version_fml_mappings=20190719-1.14.3
version_jei=1.14.4:6.0.0.10 version_jei=1.14.4:6.0.0.10
version_engineersdecor=1.1.0-b1 version_engineersdecor=1.1.0-b2

View file

@ -1,6 +1,7 @@
{ {
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
"1.14.4": { "1.14.4": {
"1.1.0-b2": "[A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).",
"1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.", "1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.",
"1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.", "1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.",
"1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.", "1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.",
@ -57,6 +58,6 @@
}, },
"promos": { "promos": {
"1.14.4-recommended": "", "1.14.4-recommended": "",
"1.14.4-latest": "1.1.0-b1" "1.14.4-latest": "1.1.0-b2"
} }
} }

View file

@ -11,6 +11,8 @@ Mod sources for Minecraft version 1.14.4.
## Version history ## Version history
- v1.1.0-b2 [A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).
- v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace). - v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).
[A] Sheet Metal Slab Slices added (only available if IE is installed). [A] Sheet Metal Slab Slices added (only available if IE is installed).
[M] Config options extended/updated. [M] Config options extended/updated.

View file

@ -22,6 +22,8 @@ import wile.engineersdecor.libmc.detail.Auxiliaries;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.libmc.detail.Inventories.SlotRange; import wile.engineersdecor.libmc.detail.Inventories.SlotRange;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.inventory.container.*; import net.minecraft.inventory.container.*;
import net.minecraft.network.play.server.SSetSlotPacket; import net.minecraft.network.play.server.SSetSlotPacket;
import net.minecraft.network.NetworkManager; import net.minecraft.network.NetworkManager;
@ -59,6 +61,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -1106,6 +1109,7 @@ public class EdCraftingTable
protected final PlayerEntity player; protected final PlayerEntity player;
protected final ArrayList<Button> buttons = new ArrayList<Button>(); protected final ArrayList<Button> buttons = new ArrayList<Button>();
protected final boolean history_slot_tooltip[] = {false,false,false,false,false,false,false,false,false,false}; protected final boolean history_slot_tooltip[] = {false,false,false,false,false,false,false,false,false,false};
protected final TooltipDisplay tooltip = new TooltipDisplay();
public CraftingTableGui(CraftingTableContainer container, PlayerInventory playerInventory, ITextComponent title) public CraftingTableGui(CraftingTableContainer container, PlayerInventory playerInventory, ITextComponent title)
{ {
@ -1131,6 +1135,16 @@ public class EdCraftingTable
buttons.add(addButton(new ImageButton(x0+59, y0+71, 17, 9, 180,71, 9, BACKGROUND, (bt)->action(CraftingTableContainer.BUTTON_TO_PLAYER)))); buttons.add(addButton(new ImageButton(x0+59, y0+71, 17, 9, 180,71, 9, BACKGROUND, (bt)->action(CraftingTableContainer.BUTTON_TO_PLAYER))));
} }
} }
{
List<TipRange> tooltips = new ArrayList<>();
final String prefix = ModContent.TREATED_WOOD_CRAFTING_TABLE.getTranslationKey() + ".tooltips.";
String[] translation_keys = { "next", "prev", "clear", "nextcollisionrecipe", "fromstorage", "tostorage", "fromplayer", "toplayer" };
for(int i=0; (i<buttons.size()) && (i<translation_keys.length); ++i) {
Button bt = buttons.get(i);
tooltips.add(new TipRange(bt.x,bt.y, bt.getWidth(), bt.getHeight(), Auxiliaries.localizable(prefix+translation_keys[i])));
}
tooltip.init(tooltips);
}
} }
@Override @Override
@ -1143,7 +1157,7 @@ public class EdCraftingTable
} }
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip.render(this,mouseX,mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
@ -1229,11 +1243,12 @@ public class EdCraftingTable
{ action(message, new CompoundNBT()); } { action(message, new CompoundNBT()); }
protected void action(String message, CompoundNBT nbt) protected void action(String message, CompoundNBT nbt)
{ getContainer().onGuiAction(message, nbt); } { getContainer().onGuiAction(message, nbt); tooltip.resetTimer(); }
@Override @Override
protected void handleMouseClick(Slot slot, int slotId, int mouseButton, ClickType type) protected void handleMouseClick(Slot slot, int slotId, int mouseButton, ClickType type)
{ {
tooltip.resetTimer();
if(type == ClickType.PICKUP) { if(type == ClickType.PICKUP) {
boolean place_refab = (slot instanceof CraftingResultSlot) && (!slot.getHasStack()); boolean place_refab = (slot instanceof CraftingResultSlot) && (!slot.getHasStack());
if(place_refab && with_assist_direct_history_refab) on_history_item_placement(); // place before crafting -> direct item pick if(place_refab && with_assist_direct_history_refab) on_history_item_placement(); // place before crafting -> direct item pick
@ -1281,6 +1296,7 @@ public class EdCraftingTable
@Override @Override
public boolean mouseScrolled(double mouseX, double mouseY, double wheel_inc) public boolean mouseScrolled(double mouseX, double mouseY, double wheel_inc)
{ {
tooltip.resetTimer();
final Slot resultSlot = this.getSlotUnderMouse(); final Slot resultSlot = this.getSlotUnderMouse();
if((!with_crafting_slot_mouse_scrolling) || (!(resultSlot instanceof CraftingResultSlot))) { if((!with_crafting_slot_mouse_scrolling) || (!(resultSlot instanceof CraftingResultSlot))) {
return this.func_212930_a(mouseX, mouseY).filter((evl) -> { return this.func_212930_a(mouseX, mouseY).filter((evl) -> {

View file

@ -13,6 +13,8 @@ import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.blocks.StandardBlocks; import wile.engineersdecor.libmc.blocks.StandardBlocks;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.block.DoorBlock; import net.minecraft.block.DoorBlock;
@ -23,10 +25,11 @@ import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer; import net.minecraft.state.StateContainer;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.*; import net.minecraft.util.math.*;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -52,6 +55,7 @@ import net.minecraftforge.items.wrapper.SidedInvWrapper;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -802,25 +806,43 @@ public class EdDropper
public static class DropperGui extends ContainerScreen<DropperContainer> public static class DropperGui extends ContainerScreen<DropperContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public DropperGui(DropperContainer container, PlayerInventory player_inventory, ITextComponent title) public DropperGui(DropperContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_DROPPER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+130, y0+10, 12, 25, new TranslationTextComponent(prefix + "velocity")),
new TipRange(x0+145, y0+10, 25, 25, new TranslationTextComponent(prefix + "direction")),
new TipRange(x0+129, y0+40, 44, 10, new TranslationTextComponent(prefix + "dropcount")),
new TipRange(x0+129, y0+50, 44, 10, new TranslationTextComponent(prefix + "period")),
new TipRange(x0+114, y0+51, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+162, y0+66, 7, 9, new TranslationTextComponent(prefix + "triggermode")),
new TipRange(x0+132, y0+66, 9, 9, new TranslationTextComponent(prefix + "filtergate")),
new TipRange(x0+148, y0+66, 9, 9, new TranslationTextComponent(prefix + "externgate"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
DropperContainer container = (DropperContainer)getContainer(); DropperContainer container = (DropperContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(114, 1, 61, 79, mouseX, mouseY))) { if((!isPointInRegion(114, 1, 61, 79, mouseX, mouseY))) {

View file

@ -12,6 +12,8 @@ import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -32,6 +34,7 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -782,20 +785,32 @@ public class EdElectricalFurnace
public static class ElectricalFurnaceGui extends ContainerScreen<ElectricalFurnaceContainer> public static class ElectricalFurnaceGui extends ContainerScreen<ElectricalFurnaceContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public ElectricalFurnaceGui(ElectricalFurnaceContainer container, PlayerInventory player_inventory, ITextComponent title) public ElectricalFurnaceGui(ElectricalFurnaceContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.SMALL_ELECTRICAL_FURNACE.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
final Slot aux = container.getSlot(ElectricalFurnaceTileEntity.SMELTING_AUX_SLOT_NO);
tooltip_.init(
new TipRange(x0+135, y0+50, 25, 25, new TranslationTextComponent(prefix + "speed")),
new TipRange(x0+aux.xPos, y0+aux.yPos, 16, 16, new TranslationTextComponent(prefix + "auxslot"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
@ -825,6 +840,7 @@ public class EdElectricalFurnace
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
ElectricalFurnaceContainer container = (ElectricalFurnaceContainer)getContainer(); ElectricalFurnaceContainer container = (ElectricalFurnaceContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(136, 48, 28, 28, mouseX, mouseY))) { if((!isPointInRegion(136, 48, 28, 28, mouseX, mouseY))) {

View file

@ -15,6 +15,8 @@ import wile.engineersdecor.libmc.detail.Auxiliaries;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.libmc.detail.Inventories.SlotRange; import wile.engineersdecor.libmc.detail.Inventories.SlotRange;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -838,25 +840,42 @@ public class EdHopper
public static class HopperGui extends ContainerScreen<HopperContainer> public static class HopperGui extends ContainerScreen<HopperContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public HopperGui(HopperContainer container, PlayerInventory player_inventory, ITextComponent title) public HopperGui(HopperContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_HOPPER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+148, y0+22, 3, 3, new TranslationTextComponent(prefix + "delayindicator")),
new TipRange(x0+130, y0+ 9, 40, 10, new TranslationTextComponent(prefix + "range")),
new TipRange(x0+130, y0+22, 40, 10, new TranslationTextComponent(prefix + "period")),
new TipRange(x0+130, y0+35, 40, 10, new TranslationTextComponent(prefix + "count")),
new TipRange(x0+133, y0+49, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+145, y0+49, 9, 9, new TranslationTextComponent(prefix + "inversion")),
new TipRange(x0+159, y0+49, 9, 9, new TranslationTextComponent(prefix + "triggermode"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
protected void handleMouseClick(Slot slot, int slotId, int button, ClickType type) protected void handleMouseClick(Slot slot, int slotId, int button, ClickType type)
{ {
tooltip_.resetTimer();
if((type == ClickType.QUICK_MOVE) && (slot!=null) && slot.getHasStack() && Auxiliaries.isShiftDown() && Auxiliaries.isCtrlDown()) { if((type == ClickType.QUICK_MOVE) && (slot!=null) && slot.getHasStack() && Auxiliaries.isShiftDown() && Auxiliaries.isCtrlDown()) {
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
nbt.putInt("slot", slotId); nbt.putInt("slot", slotId);
@ -869,6 +888,7 @@ public class EdHopper
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
HopperContainer container = (HopperContainer)getContainer(); HopperContainer container = (HopperContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) { if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) {

View file

@ -12,6 +12,8 @@ import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.blocks.StandardBlocks; import wile.engineersdecor.libmc.blocks.StandardBlocks;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -32,9 +34,10 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.util.math.*;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.shapes.VoxelShapes;
@ -689,25 +692,38 @@ public class EdPlacer
public static class PlacerGui extends ContainerScreen<PlacerContainer> public static class PlacerGui extends ContainerScreen<PlacerContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public PlacerGui(PlacerContainer container, PlayerInventory player_inventory, ITextComponent title) public PlacerGui(PlacerContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_PLACER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+133, y0+49, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+145, y0+49, 9, 9, new TranslationTextComponent(prefix + "inversion")),
new TipRange(x0+159, y0+49, 9, 9, new TranslationTextComponent(prefix + "triggermode"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
PlacerContainer container = (PlacerContainer)getContainer(); PlacerContainer container = (PlacerContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) { if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) {

View file

@ -0,0 +1,103 @@
/*
* @file Tooltip.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2018 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Delayed tooltip for a selected area. Constructed with a
* GUI, invoked in `render()`.
*/
package wile.engineersdecor.libmc.detail;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.inventory.container.Container;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@OnlyIn(Dist.CLIENT)
public class TooltipDisplay
{
private static long default_delay = 1500;
private static int default_max_deviation = 1;
public static void config(long delay, int max_deviation)
{
default_delay = (long)MathHelper.clamp((long)delay, 500L, 5000L);
default_max_deviation = MathHelper.clamp(max_deviation, 1, 5);
}
// ---------------------------------------------------------------------------------------------------
public static class TipRange
{
public final int x0,y0,x1,y1;
public final ITextComponent text;
public TipRange(int x, int y, int w, int h, ITextComponent text)
{ this.text=text; this.x0=x; this.y0=y; this.x1=x0+w-1; this.y1=y0+h-1; }
}
// ---------------------------------------------------------------------------------------------------
private List<TipRange> ranges = new ArrayList<>();
private long delay = default_delay;
private int max_deviation = default_max_deviation;
private int x_last, y_last;
private long t;
public TooltipDisplay()
{ t = System.currentTimeMillis(); }
public void init(List<TipRange> ranges, long delay_ms, int max_deviation_xy)
{
this.ranges = ranges;
this.delay = delay_ms;
this.max_deviation = max_deviation_xy;
t = System.currentTimeMillis();
x_last = y_last = 0;
}
public void init(List<TipRange> ranges)
{ init(ranges, default_delay, default_max_deviation); }
public void init(TipRange... ranges)
{ init(Arrays.asList(ranges), default_delay, default_max_deviation); }
public void resetTimer()
{ t = System.currentTimeMillis(); }
public <T extends Container> boolean render(final ContainerScreen<T> gui, int x, int y)
{
if((Math.abs(x-x_last) > max_deviation) || (Math.abs(y-y_last) > max_deviation)) {
x_last = x;
y_last = y;
resetTimer();
return false;
} else if(Math.abs(System.currentTimeMillis()-t) < delay) {
return false;
} else if(ranges.stream().noneMatch(
(tip)->{
if((x<tip.x0) || (x>tip.x1) || (y<tip.y0) || (y>tip.y1)) return false;
String text = tip.text.getFormattedText();
if(!text.isEmpty() && (!text.startsWith("block."))) {
gui.renderTooltip(Collections.singletonList(tip.text.getFormattedText()), x, y, Minecraft.getInstance().fontRenderer);
}
return true;
})
){
resetTimer();
return false;
} else {
return true;
}
}
}

View file

@ -71,10 +71,28 @@
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "Factory Dropper", "block.engineersdecor.factory_dropper": "Factory Dropper",
"block.engineersdecor.factory_dropper.help": "§6Dropper suitable for advanced factory automation.§r Has twelve round-robin selected slots. Drop force, angle, stack size, and cool-down delay adjustable using sliders in the GUI. Three stack compare slots (below the inventory slots) with logical AND or OR can be used as internal trigger source. The internal trigger can be AND'ed or OR'ed with the external redstone signal trigger. Trigger simulation buttons for testing. Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks simultaneously. Simply click on all elements in the GUI to see how it works.", "block.engineersdecor.factory_dropper.help": "§6Dropper suitable for advanced factory automation.§r Has twelve round-robin selected slots. Drop force, angle, stack size, and cool-down delay adjustable using sliders in the GUI. Three stack compare slots (below the inventory slots) with logical AND or OR can be used as internal trigger source. The internal trigger can be AND'ed or OR'ed with the external redstone signal trigger. Trigger simulation buttons for testing. Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks simultaneously. Simply click on all elements in the GUI to see how it works.",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\n§8AND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\n§8AND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator\n §8(click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\n§8Pulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "Factory Hopper", "block.engineersdecor.factory_hopper": "Factory Hopper",
"block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).", "block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "Factory Block Placer", "block.engineersdecor.factory_placer": "Factory Block Placer",
"block.engineersdecor.factory_placer.help": "§6Allows placing blocks and planting crops or trees.§r\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant.", "block.engineersdecor.factory_placer.help": "§6Allows placing blocks and planting crops or trees.§r\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant.",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "Gas Concrete Block", "block.engineersdecor.gas_concrete": "Gas Concrete Block",
"block.engineersdecor.gas_concrete.help": "§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.", "block.engineersdecor.gas_concrete.help": "§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.",
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab", "block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
@ -159,6 +177,8 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "Small Electrical Furnace", "block.engineersdecor.small_electrical_furnace": "Small Electrical Furnace",
"block.engineersdecor.small_electrical_furnace.help": "§6Small metal cased pass-through furnace.§r Automatically draws items from the input side and puts items into the inventory at the output side. Items can be inserted or drawn from all sides using hoppers. Implicitly bypasses items that cannot be smelted or cooked to the output. Slightly more energy efficient and faster than a heated cobblestone furnace. Fifos and feeders transfer whole stacks. Feeders require a bit of power.", "block.engineersdecor.small_electrical_furnace.help": "§6Small metal cased pass-through furnace.§r Automatically draws items from the input side and puts items into the inventory at the output side. Items can be inserted or drawn from all sides using hoppers. Implicitly bypasses items that cannot be smelted or cooked to the output. Slightly more energy efficient and faster than a heated cobblestone furnace. Fifos and feeders transfer whole stacks. Feeders require a bit of power.",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel", "block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel",
"block.engineersdecor.small_fluid_funnel.help": "§6Collects fluids above it.§r Has an internal tank with three buckets capacity. Traces flowing fluids to nearby source blocks. The fluid can be obtained with fluid transfer systems or a bucket. Fills only tanks below (gravity transfer). Compatible with vanilla infinite-water-source creation.", "block.engineersdecor.small_fluid_funnel.help": "§6Collects fluids above it.§r Has an internal tank with three buckets capacity. Traces flowing fluids to nearby source blocks. The fluid can be obtained with fluid transfer systems or a bucket. Fills only tanks below (gravity transfer). Compatible with vanilla infinite-water-source creation.",
"block.engineersdecor.small_lab_furnace": "Small Laboratory Furnace", "block.engineersdecor.small_lab_furnace": "Small Laboratory Furnace",
@ -207,6 +227,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.",
"block.engineersdecor.treated_wood_crafting_table": "Treated Wood Crafting Table", "block.engineersdecor.treated_wood_crafting_table": "Treated Wood Crafting Table",
"block.engineersdecor.treated_wood_crafting_table.help": "§6Robust and weather-proof.§r Eight storage slots, keeps inventory, no vanilla recipe book.\n Click up/down arrow buttons for crafting history selection, output slot for item placement, X-button to clear crafting grid and history. Shift-click stack: player-to-storage stack transfer when crafting grid empty, otherwise player-to-grid stack transfer. Automatically distributes the clicked stack. Shift-Ctrl-click stack: Move all same stacks. Mouse wheel over crafting slot: Increase/decrease crafting grid items.", "block.engineersdecor.treated_wood_crafting_table.help": "§6Robust and weather-proof.§r Eight storage slots, keeps inventory, no vanilla recipe book.\n Click up/down arrow buttons for crafting history selection, output slot for item placement, X-button to clear crafting grid and history. Shift-click stack: player-to-storage stack transfer when crafting grid empty, otherwise player-to-grid stack transfer. Automatically distributes the clicked stack. Shift-Ctrl-click stack: Move all same stacks. Mouse wheel over crafting slot: Increase/decrease crafting grid items.",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor", "block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
"block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r", "block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r",
"block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder", "block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder",

View file

@ -71,10 +71,28 @@
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "Фабричный выбрасыватель", "block.engineersdecor.factory_dropper": "Фабричный выбрасыватель",
"block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.", "block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\n§8AND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\n§8AND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator\n §8(click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\n§8Pulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "Фабричная воронка", "block.engineersdecor.factory_hopper": "Фабричная воронка",
"block.engineersdecor.factory_hopper.help": "§6Воронка для продвинутой автоматизации производства.§r Может передавать полустеки, максимальный диапазон сбора 9x9.\n GUI ползунки: Диапазон сбора (0 до 4), задержка помещения(0.5сек до 10сек), размер стека помещения (1 до 32).\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).", "block.engineersdecor.factory_hopper.help": "§6Воронка для продвинутой автоматизации производства.§r Может передавать полустеки, максимальный диапазон сбора 9x9.\n GUI ползунки: Диапазон сбора (0 до 4), задержка помещения(0.5сек до 10сек), размер стека помещения (1 до 32).\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "Фабричный разместитель блоков", "block.engineersdecor.factory_placer": "Фабричный разместитель блоков",
"block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.", "block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "Газобетон", "block.engineersdecor.gas_concrete": "Газобетон",
"block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.", "block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
"block.engineersdecor.gas_concrete_slab": "Газобетонная плита", "block.engineersdecor.gas_concrete_slab": "Газобетонная плита",
@ -159,6 +177,8 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь", "block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь",
"block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.", "block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости", "block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости",
"block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.", "block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.",
"block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь", "block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь",
@ -207,6 +227,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.",
"block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева", "block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева",
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.", "block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева", "block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева",
"block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r", "block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r",
"block.engineersdecor.treated_wood_ladder": "Лестница из обработанного дерева", "block.engineersdecor.treated_wood_ladder": "Лестница из обработанного дерева",

View file

@ -71,10 +71,28 @@
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "工厂掉落器", "block.engineersdecor.factory_dropper": "工厂掉落器",
"block.engineersdecor.factory_dropper.help": "§6适用于高级工厂自动化的掉落器。§r有十二个轮询选择的储物格。 掉落的力度、角度、一叠数量和冷却延时可在GUI调节。三个 内部比较槽带有逻辑与或逻辑或功能,可用作内部触发源。内部触发 还能和外部红石信号触发再进行逻辑与或逻辑或。触发模拟按钮仅作测试用途。 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品 会同时掉落。点击GUI的各处来了解如何运作。", "block.engineersdecor.factory_dropper.help": "§6适用于高级工厂自动化的掉落器。§r有十二个轮询选择的储物格。 掉落的力度、角度、一叠数量和冷却延时可在GUI调节。三个 内部比较槽带有逻辑与或逻辑或功能,可用作内部触发源。内部触发 还能和外部红石信号触发再进行逻辑与或逻辑或。触发模拟按钮仅作测试用途。 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品 会同时掉落。点击GUI的各处来了解如何运作。",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\n§8AND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\n§8AND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator\n §8(click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\n§8Pulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "工厂漏斗", "block.engineersdecor.factory_hopper": "工厂漏斗",
"block.engineersdecor.factory_hopper.help": "§6适用于高级工厂自动化的漏斗。§r可一次传输半组物品最大收集范围9x9。\n GUI滑动条控制收集距离0到4插入延迟0.5秒到10秒插入一叠物品的大小1到32。\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。", "block.engineersdecor.factory_hopper.help": "§6适用于高级工厂自动化的漏斗。§r可一次传输半组物品最大收集范围9x9。\n GUI滑动条控制收集距离0到4插入延迟0.5秒到10秒插入一叠物品的大小1到32。\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "工厂方块放置器", "block.engineersdecor.factory_placer": "工厂方块放置器",
"block.engineersdecor.factory_placer.help": "§6能够放置方块和种植作物或树。§r\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。\n 也支持从耕地下方穿透方块种植。会吐出不能放置或种植的物品。", "block.engineersdecor.factory_placer.help": "§6能够放置方块和种植作物或树。§r\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。\n 也支持从耕地下方穿透方块种植。会吐出不能放置或种植的物品。",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "加气混凝土", "block.engineersdecor.gas_concrete": "加气混凝土",
"block.engineersdecor.gas_concrete.help": "§6低硬度高产出的混凝土。§r容易破坏的装饰性混凝土方块。", "block.engineersdecor.gas_concrete.help": "§6低硬度高产出的混凝土。§r容易破坏的装饰性混凝土方块。",
"block.engineersdecor.gas_concrete_slab": "加气混凝土台阶", "block.engineersdecor.gas_concrete_slab": "加气混凝土台阶",
@ -159,6 +177,8 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "小型电炉", "block.engineersdecor.small_electrical_furnace": "小型电炉",
"block.engineersdecor.small_electrical_furnace.help": "§6小型金属封装穿过式熔炉。§r 自动从输入端获取物品并在输出端物品栏放置物品。 物品能从所有面使用漏斗插入或提取。无法熔炼或烹饪的物品会直接送到出口。 比加热的圆石炉有稍微高的能效比和更快。 先进先出和自动输出一次移动一组物品。自动输出需要一点能量。", "block.engineersdecor.small_electrical_furnace.help": "§6小型金属封装穿过式熔炉。§r 自动从输入端获取物品并在输出端物品栏放置物品。 物品能从所有面使用漏斗插入或提取。无法熔炼或烹饪的物品会直接送到出口。 比加热的圆石炉有稍微高的能效比和更快。 先进先出和自动输出一次移动一组物品。自动输出需要一点能量。",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "小型流体收集漏斗", "block.engineersdecor.small_fluid_funnel": "小型流体收集漏斗",
"block.engineersdecor.small_fluid_funnel.help": "§6收集上方的流体。§r有一个三桶大的内部储罐。会 追溯流体到附近的源方块。流体可被流体运输系统或桶 移出。只会装满下方的储罐(重力传输)。与原版 无限水兼容。", "block.engineersdecor.small_fluid_funnel.help": "§6收集上方的流体。§r有一个三桶大的内部储罐。会 追溯流体到附近的源方块。流体可被流体运输系统或桶 移出。只会装满下方的储罐(重力传输)。与原版 无限水兼容。",
"block.engineersdecor.small_lab_furnace": "小型实验室炉", "block.engineersdecor.small_lab_furnace": "小型实验室炉",
@ -207,6 +227,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6简单的窗户装饰。", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6简单的窗户装饰。",
"block.engineersdecor.treated_wood_crafting_table": "防腐木合成台", "block.engineersdecor.treated_wood_crafting_table": "防腐木合成台",
"block.engineersdecor.treated_wood_crafting_table.help": "§6坚固防风防雨。§r内含八个存储格破坏后保留内容物没有原版合成书。\n 单击上/下箭头按钮可选择合成历史单击输出格自动放置物品单击X按钮 清除合成栏和历史。Shift单击一叠物品合成格空时转移到存储格 非空时到合成栏。会自动分配转移的物品。", "block.engineersdecor.treated_wood_crafting_table.help": "§6坚固防风防雨。§r内含八个存储格破坏后保留内容物没有原版合成书。\n 单击上/下箭头按钮可选择合成历史单击输出格自动放置物品单击X按钮 清除合成栏和历史。Shift单击一叠物品合成格空时转移到存储格 非空时到合成栏。会自动分配转移的物品。",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "防腐木地板", "block.engineersdecor.treated_wood_floor": "防腐木地板",
"block.engineersdecor.treated_wood_floor.help": "§6装饰性地板砖有可变的贴图。§r", "block.engineersdecor.treated_wood_floor.help": "§6装饰性地板砖有可变的贴图。§r",
"block.engineersdecor.treated_wood_ladder": "防腐木梯", "block.engineersdecor.treated_wood_ladder": "防腐木梯",

View file

@ -2,7 +2,7 @@
org.gradle.daemon=false org.gradle.daemon=false
org.gradle.jvmargs=-Xmx8G org.gradle.jvmargs=-Xmx8G
version_minecraft=1.15.2 version_minecraft=1.15.2
version_forge_minecraft=1.15.2-31.1.77 version_forge_minecraft=1.15.2-31.2.5
version_fml_mappings=20200225-1.15.1 version_fml_mappings=20200514-1.15.1
version_jei=1.15.2:6.0.0.2 version_jei=1.15.2:6.0.0.2
version_engineersdecor=1.1.0-b1 version_engineersdecor=1.1.0-b2

View file

@ -1,6 +1,7 @@
{ {
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
"1.15.2": { "1.15.2": {
"1.1.0-b2": "[A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).\n[U] Updated Forge/Mappings.",
"1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] IE Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] GUI models updated to circumvent too dark representations.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.", "1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] IE Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] GUI models updated to circumvent too dark representations.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.",
"1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.", "1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.",
"1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.", "1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.",
@ -22,6 +23,6 @@
}, },
"promos": { "promos": {
"1.15.2-recommended": "", "1.15.2-recommended": "",
"1.15.2-latest": "1.1.0-b1" "1.15.2-latest": "1.1.0-b2"
} }
} }

View file

@ -11,6 +11,9 @@ Mod sources for Minecraft version 1.15.1.
## Version history ## Version history
- v1.1.0-b2 [A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).
[U] Updated Forge/Mappings.
- v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace). - v1.1.0-b1 [F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).
[A] IE Sheet Metal Slab Slices added (only available if IE is installed). [A] IE Sheet Metal Slab Slices added (only available if IE is installed).
[M] Config options extended/updated. [M] Config options extended/updated.

View file

@ -697,7 +697,10 @@ public class ModConfig
EdMilker.MilkerTileEntity.on_config(COMMON.milking_machine_energy_consumption.get(), COMMON.milking_machine_milking_delay.get()); EdMilker.MilkerTileEntity.on_config(COMMON.milking_machine_energy_consumption.get(), COMMON.milking_machine_milking_delay.get());
EdSlabBlock.on_config(!COMMON.without_direct_slab_pickup.get()); EdSlabBlock.on_config(!COMMON.without_direct_slab_pickup.get());
EdSlabSliceBlock.on_config(!COMMON.without_direct_slab_pickup.get()); EdSlabSliceBlock.on_config(!COMMON.without_direct_slab_pickup.get());
// currently no file config planned
EdLabeledCrate.on_config(false); EdLabeledCrate.on_config(false);
EdFluidFunnel.on_config(with_experimental_features_); // @todo: double check for abuse as pump first
EdDropper.on_config(with_experimental_features_); // @todo: double check handler cross-mod-compat first
// ----------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------
{ {
// Check if the config is already synchronized or has to be synchronised. // Check if the config is already synchronized or has to be synchronised.

View file

@ -212,11 +212,16 @@ public class ModContent
// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------
public static final DecorBlock.Normal DENSE_GRIT_SAND = (DecorBlock.Normal)(new DecorBlock.Normal( public static final EdGroundBlock DENSE_GRIT_SAND = (EdGroundBlock)(new EdGroundBlock(
DecorBlock.CFG_DEFAULT, DecorBlock.CFG_DEFAULT,
Block.Properties.create(Material.EARTH, MaterialColor.DIRT).hardnessAndResistance(0.5f, 3f).sound(SoundType.GROUND).harvestTool(ToolType.SHOVEL) Block.Properties.create(Material.EARTH, MaterialColor.DIRT).hardnessAndResistance(0.5f, 3f).sound(SoundType.GROUND).harvestTool(ToolType.SHOVEL)
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "dense_grit_sand_block")); )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "dense_grit_sand_block"));
public static final EdGroundBlock DENSE_GRIT_DIRT = (EdGroundBlock)(new EdGroundBlock(
DecorBlock.CFG_DEFAULT,
Block.Properties.create(Material.EARTH, MaterialColor.DIRT).hardnessAndResistance(0.5f, 3f).sound(SoundType.GROUND).harvestTool(ToolType.SHOVEL)
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "dense_grit_dirt_block"));
// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------
public static final EdLadderBlock METAL_RUNG_LADDER = (EdLadderBlock)(new EdLadderBlock( public static final EdLadderBlock METAL_RUNG_LADDER = (EdLadderBlock)(new EdLadderBlock(
@ -764,6 +769,7 @@ public class ModContent
}; };
private static final Block devBlocks[] = { private static final Block devBlocks[] = {
DENSE_GRIT_DIRT // texture needs improvments, looks too blurry yet.
//TEST_BLOCK //TEST_BLOCK
}; };

View file

@ -39,7 +39,7 @@ public class EdChair
sitting_enabled = (!without_sitting); sitting_enabled = (!without_sitting);
sitting_probability = (without_sitting||without_mob_sitting) ? 0.0 : MathHelper.clamp(sitting_probability_percent/100, 0, 0.9); sitting_probability = (without_sitting||without_mob_sitting) ? 0.0 : MathHelper.clamp(sitting_probability_percent/100, 0, 0.9);
standup_probability = (without_sitting||without_mob_sitting) ? 1.0 : MathHelper.clamp(standup_probability_percent/100, 1e-6, 1e-2); standup_probability = (without_sitting||without_mob_sitting) ? 1.0 : MathHelper.clamp(standup_probability_percent/100, 1e-6, 1e-2);
ModEngineersDecor.logger().info("Config chairs: " + sitting_enabled + ", sit: " + sitting_probability, ", stand up: " + standup_probability); ModEngineersDecor.logger().info("Config chairs sit:" + sitting_enabled + ", mob-sit: " + (sitting_probability*100) + "%, stand up: " + (standup_probability)+"%");
} }
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------

View file

@ -50,6 +50,9 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -1093,6 +1096,7 @@ public class EdCraftingTable
protected final PlayerEntity player; protected final PlayerEntity player;
protected final ArrayList<Button> buttons = new ArrayList<Button>(); protected final ArrayList<Button> buttons = new ArrayList<Button>();
protected final boolean history_slot_tooltip[] = {false,false,false,false,false,false,false,false,false,false}; protected final boolean history_slot_tooltip[] = {false,false,false,false,false,false,false,false,false,false};
protected final TooltipDisplay tooltip = new TooltipDisplay();
public CraftingTableGui(CraftingTableContainer container, PlayerInventory playerInventory, ITextComponent title) public CraftingTableGui(CraftingTableContainer container, PlayerInventory playerInventory, ITextComponent title)
{ {
@ -1118,6 +1122,16 @@ public class EdCraftingTable
buttons.add(addButton(new ImageButton(x0+59, y0+71, 17, 9, 180,71, 9, BACKGROUND, (bt)->action(CraftingTableContainer.BUTTON_TO_PLAYER)))); buttons.add(addButton(new ImageButton(x0+59, y0+71, 17, 9, 180,71, 9, BACKGROUND, (bt)->action(CraftingTableContainer.BUTTON_TO_PLAYER))));
} }
} }
{
List<TipRange> tooltips = new ArrayList<>();
final String prefix = ModContent.TREATED_WOOD_CRAFTING_TABLE.getTranslationKey() + ".tooltips.";
String[] translation_keys = { "next", "prev", "clear", "nextcollisionrecipe", "fromstorage", "tostorage", "fromplayer", "toplayer" };
for(int i=0; (i<buttons.size()) && (i<translation_keys.length); ++i) {
Button bt = buttons.get(i);
tooltips.add(new TipRange(bt.x,bt.y, bt.getWidth(), bt.getHeight(), Auxiliaries.localizable(prefix+translation_keys[i])));
}
tooltip.init(tooltips);
}
} }
@Override @Override
@ -1130,7 +1144,7 @@ public class EdCraftingTable
} }
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip.render(this,mouseX,mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
@ -1221,11 +1235,12 @@ public class EdCraftingTable
{ action(message, new CompoundNBT()); } { action(message, new CompoundNBT()); }
protected void action(String message, CompoundNBT nbt) protected void action(String message, CompoundNBT nbt)
{ getContainer().onGuiAction(message, nbt); } { getContainer().onGuiAction(message, nbt); tooltip.resetTimer(); }
@Override @Override
protected void handleMouseClick(Slot slot, int slotId, int mouseButton, ClickType type) protected void handleMouseClick(Slot slot, int slotId, int mouseButton, ClickType type)
{ {
tooltip.resetTimer();
if(type == ClickType.PICKUP) { if(type == ClickType.PICKUP) {
boolean place_refab = (slot instanceof CraftingResultSlot) && (!slot.getHasStack()); boolean place_refab = (slot instanceof CraftingResultSlot) && (!slot.getHasStack());
if(place_refab && with_assist_direct_history_refab) on_history_item_placement(); // place before crafting -> direct item pick if(place_refab && with_assist_direct_history_refab) on_history_item_placement(); // place before crafting -> direct item pick
@ -1273,6 +1288,7 @@ public class EdCraftingTable
@Override @Override
public boolean mouseScrolled(double mouseX, double mouseY, double wheel_inc) public boolean mouseScrolled(double mouseX, double mouseY, double wheel_inc)
{ {
tooltip.resetTimer();
final Slot resultSlot = this.getSlotUnderMouse(); final Slot resultSlot = this.getSlotUnderMouse();
if((!with_crafting_slot_mouse_scrolling) || (!(resultSlot instanceof CraftingResultSlot))) { if((!with_crafting_slot_mouse_scrolling) || (!(resultSlot instanceof CraftingResultSlot))) {
return this.getEventListenerForPos(mouseX, mouseY).filter((evl) -> { return this.getEventListenerForPos(mouseX, mouseY).filter((evl) -> {

View file

@ -11,37 +11,41 @@ package wile.engineersdecor.blocks;
import wile.engineersdecor.ModContent; import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.libmc.detail.Inventories.SlotRange;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
import net.minecraft.tileentity.ITickableTileEntity; import wile.engineersdecor.libmc.detail.TooltipDisplay;
import net.minecraft.inventory.container.INamedContainerProvider; import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import net.minecraft.block.DoorBlock; import net.minecraft.world.IBlockReader;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.world.World;
import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer; import net.minecraft.state.StateContainer;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.block.DoorBlock;
import net.minecraft.util.math.*;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.world.IBlockReader;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.World; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.item.*; import net.minecraft.item.*;
import net.minecraft.inventory.*; import net.minecraft.inventory.*;
import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot;
import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.SoundEvents;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@ -51,14 +55,24 @@ import net.minecraftforge.items.wrapper.SidedInvWrapper;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
public class EdDropper public class EdDropper
{ {
private static boolean with_adjacent_item_insertion = false;
public static void on_config(boolean with_item_insertion)
{
with_adjacent_item_insertion = with_item_insertion;
ModEngineersDecor.logger().info("Config dropper: item-insertion:" + with_adjacent_item_insertion);
}
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
// Block // Block
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
@ -224,6 +238,7 @@ public class EdDropper
private int drop_slot_index_ = 0; private int drop_slot_index_ = 0;
private int tick_timer_ = 0; private int tick_timer_ = 0;
protected NonNullList<ItemStack> stacks_; protected NonNullList<ItemStack> stacks_;
protected final SlotRange slot_range_ = new SlotRange(this, INPUT_SLOTS_FIRST, INPUT_SLOTS_FIRST+INPUT_SLOTS_SIZE);
public static void on_config(int cooldown_ticks) public static void on_config(int cooldown_ticks)
{ {
@ -515,6 +530,34 @@ public class EdDropper
world.addEntity(ei); world.addEntity(ei);
} }
private static Tuple<Boolean, List<ItemStack>> try_eject(World world, BlockPos pos, Direction facing, ItemStack[] stacks, int speed_percent, int xdeviation, int ydeviation, int noise_percent)
{
if(Arrays.stream(stacks).allMatch(e->e.isEmpty())) return new Tuple<>(false, Arrays.asList(stacks));
if(with_adjacent_item_insertion) {
final TileEntity te = world.getTileEntity(pos.offset(facing));
if(te != null) {
final IItemHandler ih = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, (facing==null)?(null):(facing.getOpposite())).orElse(null);
if(ih != null) {
boolean inserted = false;
List<ItemStack> remaining = new ArrayList<>();
for(int i = 0; i < stacks.length; ++i) {
ItemStack rs = Inventories.insert(ih, stacks[i].copy(), false);
if(rs.getCount() < stacks[i].getCount()) inserted = true;
if(!rs.isEmpty()) remaining.add(rs);
}
return new Tuple<>(inserted, remaining);
} else {
// The TE could also be small, so that dropping over it is intended.
}
}
}
for(int i = 0; i < stacks.length; ++i) {
if(stacks[i].isEmpty()) continue;
drop(world, pos, facing, stacks[i], speed_percent, xdeviation, ydeviation, noise_percent);
}
return new Tuple<>(true, Collections.emptyList());
}
@Nullable @Nullable
BlockState update_blockstate() BlockState update_blockstate()
{ {
@ -653,13 +696,13 @@ public class EdDropper
} }
} }
// drop action // drop action
boolean dropped = false; Tuple<Boolean, List<ItemStack>> res = try_eject(world, pos, state.get(DropperBlock.FACING), drop_stacks, drop_speed_, drop_xdev_, drop_ydev_, drop_noise_);
for(int i = 0; i < drop_stacks.length; ++i) { final boolean dropped = res.getA();
if(drop_stacks[i].isEmpty()) continue; final List<ItemStack> remaining = res.getB();
dirty = true; for(ItemStack st:remaining) {
drop(world, pos, state.get(DropperBlock.FACING), drop_stacks[i], drop_speed_, drop_xdev_, drop_ydev_, drop_noise_); if(!slot_range_.insert(st).isEmpty()) ModEngineersDecor.logger().debug("NOT ALL NON-DROPPED ITEMS PUT BACK:" + st);
dropped = true;
} }
if(dropped || (!remaining.isEmpty())) dirty = true;
// cooldown // cooldown
if(dropped) drop_timer_ = DROP_PERIOD_OFFSET + drop_period_ * 2; // 0.1s time base -> 100%===10s if(dropped) drop_timer_ = DROP_PERIOD_OFFSET + drop_period_ * 2; // 0.1s time base -> 100%===10s
// drop sound // drop sound
@ -800,25 +843,43 @@ public class EdDropper
public static class DropperGui extends ContainerScreen<DropperContainer> public static class DropperGui extends ContainerScreen<DropperContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public DropperGui(DropperContainer container, PlayerInventory player_inventory, ITextComponent title) public DropperGui(DropperContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_DROPPER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+130, y0+10, 12, 25, new TranslationTextComponent(prefix + "velocity")),
new TipRange(x0+145, y0+10, 25, 25, new TranslationTextComponent(prefix + "direction")),
new TipRange(x0+129, y0+40, 44, 10, new TranslationTextComponent(prefix + "dropcount")),
new TipRange(x0+129, y0+50, 44, 10, new TranslationTextComponent(prefix + "period")),
new TipRange(x0+114, y0+51, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+162, y0+66, 7, 9, new TranslationTextComponent(prefix + "triggermode")),
new TipRange(x0+132, y0+66, 9, 9, new TranslationTextComponent(prefix + "filtergate")),
new TipRange(x0+148, y0+66, 9, 9, new TranslationTextComponent(prefix + "externgate"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
DropperContainer container = (DropperContainer)getContainer(); DropperContainer container = (DropperContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(114, 1, 61, 79, mouseX, mouseY))) { if((!isPointInRegion(114, 1, 61, 79, mouseX, mouseY))) {

View file

@ -8,6 +8,7 @@
*/ */
package wile.engineersdecor.blocks; package wile.engineersdecor.blocks;
import net.minecraft.util.text.TranslationTextComponent;
import wile.engineersdecor.ModContent; import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
@ -52,6 +53,8 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -781,20 +784,32 @@ public class EdElectricalFurnace
public static class ElectricalFurnaceGui extends ContainerScreen<ElectricalFurnaceContainer> public static class ElectricalFurnaceGui extends ContainerScreen<ElectricalFurnaceContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public ElectricalFurnaceGui(ElectricalFurnaceContainer container, PlayerInventory player_inventory, ITextComponent title) public ElectricalFurnaceGui(ElectricalFurnaceContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.SMALL_ELECTRICAL_FURNACE.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
final Slot aux = container.getSlot(ElectricalFurnaceTileEntity.SMELTING_AUX_SLOT_NO);
tooltip_.init(
new TipRange(x0+135, y0+50, 25, 25, new TranslationTextComponent(prefix + "speed")),
new TipRange(x0+aux.xPos, y0+aux.yPos, 16, 16, new TranslationTextComponent(prefix + "auxslot"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
@ -826,6 +841,7 @@ public class EdElectricalFurnace
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
ElectricalFurnaceContainer container = (ElectricalFurnaceContainer)getContainer(); ElectricalFurnaceContainer container = (ElectricalFurnaceContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(136, 48, 28, 28, mouseX, mouseY))) { if((!isPointInRegion(136, 48, 28, 28, mouseX, mouseY))) {

View file

@ -37,6 +37,8 @@ import net.minecraftforge.fluids.*;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import wile.engineersdecor.ModEngineersDecor;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
@ -44,6 +46,15 @@ import java.util.*;
public class EdFluidFunnel public class EdFluidFunnel
{ {
private static boolean with_device_fluid_handler_collection = false;
public static void on_config(boolean with_tank_fluid_collection)
{
with_device_fluid_handler_collection = with_tank_fluid_collection;
ModEngineersDecor.logger().info("Config fluid funnel: tank-fluid-collection:"+with_device_fluid_handler_collection);
}
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
// Block // Block
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
@ -407,10 +418,28 @@ public class EdFluidFunnel
boolean dirty = false; boolean dirty = false;
// Collection // Collection
if((collection_timer_ >= COLLECTION_INTERVAL) && ((tank_==null) || (tank_.getAmount() <= (TANK_CAPACITY-1000)))) { if((collection_timer_ >= COLLECTION_INTERVAL) && ((tank_==null) || (tank_.getAmount() <= (TANK_CAPACITY-1000)))) {
collection_timer_ = 0; collection_timer_ = 0;
if(!world.isBlockPowered(pos)) { // redstone disable feature if(!world.isBlockPowered(pos)) { // redstone disable feature
if(last_pick_pos_==null) last_pick_pos_ = pos.up(); if(last_pick_pos_==null) last_pick_pos_ = pos.up();
if(try_collect(pos.up())) dirty = true; TileEntity te = with_device_fluid_handler_collection ? (world.getTileEntity(pos.up())) : (null);
if(te != null) {
IFluidHandler fh = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, Direction.DOWN).orElse(null);
if(fh == null) {
te = null;
} else if(tank_.isEmpty()) {
FluidStack fs = fh.drain(1000, FluidAction.EXECUTE);
if((fs!=null) && (!fs.isEmpty())) tank_ = fs.copy();
dirty = true;
} else {
FluidStack todrain = new FluidStack(tank_.getFluid(), 1000);
FluidStack fs = fh.drain(todrain, FluidAction.EXECUTE);
if((fs!=null) && (!fs.isEmpty())) tank_.setAmount(tank_.getAmount()+fs.getAmount());
dirty = true;
}
}
if(te==null) {
if(try_collect(pos.up())) dirty = true;
}
} }
} }
// Gravity fluid transfer // Gravity fluid transfer

View file

@ -0,0 +1,20 @@
/*
* @file EdSoilBlock.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Block type for soils, floors, etc. Drawn out into a class
* to enable functionality block overrides.
*/
package wile.engineersdecor.blocks;
import net.minecraft.block.*;
public class EdGroundBlock extends DecorBlock.Normal implements IDecorBlock
{
public EdGroundBlock(long config, Block.Properties builder)
{ super(config, builder); }
}

View file

@ -50,6 +50,9 @@ import net.minecraftforge.items.wrapper.SidedInvWrapper;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -833,25 +836,42 @@ public class EdHopper
public static class HopperGui extends ContainerScreen<HopperContainer> public static class HopperGui extends ContainerScreen<HopperContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public HopperGui(HopperContainer container, PlayerInventory player_inventory, ITextComponent title) public HopperGui(HopperContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_HOPPER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+148, y0+22, 3, 3, new TranslationTextComponent(prefix + "delayindicator")),
new TipRange(x0+130, y0+ 9, 40, 10, new TranslationTextComponent(prefix + "range")),
new TipRange(x0+130, y0+22, 40, 10, new TranslationTextComponent(prefix + "period")),
new TipRange(x0+130, y0+35, 40, 10, new TranslationTextComponent(prefix + "count")),
new TipRange(x0+133, y0+49, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+145, y0+49, 9, 9, new TranslationTextComponent(prefix + "inversion")),
new TipRange(x0+159, y0+49, 9, 9, new TranslationTextComponent(prefix + "triggermode"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
protected void handleMouseClick(Slot slot, int slotId, int button, ClickType type) protected void handleMouseClick(Slot slot, int slotId, int button, ClickType type)
{ {
tooltip_.resetTimer();
if((type == ClickType.QUICK_MOVE) && (slot!=null) && slot.getHasStack() && Auxiliaries.isShiftDown() && Auxiliaries.isCtrlDown()) { if((type == ClickType.QUICK_MOVE) && (slot!=null) && slot.getHasStack() && Auxiliaries.isShiftDown() && Auxiliaries.isCtrlDown()) {
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
nbt.putInt("slot", slotId); nbt.putInt("slot", slotId);
@ -864,6 +884,7 @@ public class EdHopper
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
HopperContainer container = (HopperContainer)getContainer(); HopperContainer container = (HopperContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) { if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) {

View file

@ -281,7 +281,7 @@ public class EdLabeledCrate
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() public double getMaxRenderDistanceSquared()
{ return 400; } { return 1600; }
// INameable --------------------------------------------------------------------------- // INameable ---------------------------------------------------------------------------

View file

@ -85,7 +85,7 @@ public class EdLadderBlock extends LadderBlock implements IDecorBlock
// Player update event, forwarded from the main mod instance. // Player update event, forwarded from the main mod instance.
public static void onPlayerUpdateEvent(final PlayerEntity player) public static void onPlayerUpdateEvent(final PlayerEntity player)
{ {
if((without_speed_boost_) || (player.onGround) || (!player.isOnLadder()) || (player.isShiftKeyDown()) || (player.isSpectator())) return; if((without_speed_boost_) || (player.onGround) || (!player.isOnLadder()) || (player.isSteppingCarefully()) || (player.isSpectator())) return;
double lvy = player.getLookVec().y; double lvy = player.getLookVec().y;
if(Math.abs(lvy) < 0.94) return; if(Math.abs(lvy) < 0.94) return;
final BlockPos pos = player.getPosition(); final BlockPos pos = player.getPosition();

View file

@ -8,6 +8,9 @@
*/ */
package wile.engineersdecor.blocks; package wile.engineersdecor.blocks;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import wile.engineersdecor.libmc.detail.Auxiliaries;
import wile.engineersdecor.libmc.detail.Inventories; import wile.engineersdecor.libmc.detail.Inventories;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.ModContent; import wile.engineersdecor.ModContent;
@ -46,6 +49,8 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import wile.engineersdecor.libmc.detail.Overlay;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
@ -106,26 +111,32 @@ public class EdMilker
if(te==null) return ActionResultType.FAIL; if(te==null) return ActionResultType.FAIL;
final ItemStack in_stack = player.getHeldItem(hand); final ItemStack in_stack = player.getHeldItem(hand);
final ItemStack out_stack = MilkerTileEntity.milk_filled_container_item(in_stack); final ItemStack out_stack = MilkerTileEntity.milk_filled_container_item(in_stack);
if(out_stack.isEmpty() && (te.fluid_handler()!=null)) return FluidUtil.interactWithFluidHandler(player, hand, te.fluid_handler()) ? ActionResultType.SUCCESS : ActionResultType.FAIL; if(in_stack.isEmpty()) {
boolean drained = false; te.state_message(player);
IItemHandler player_inventory = new PlayerMainInvWrapper(player.inventory); return ActionResultType.SUCCESS;
if(te.fluid_level() >= MilkerTileEntity.BUCKET_SIZE) { } else if(out_stack.isEmpty() && (te.fluid_handler()!=null)) {
final ItemStack insert_stack = out_stack.copy(); return FluidUtil.interactWithFluidHandler(player, hand, te.fluid_handler()) ? ActionResultType.SUCCESS : ActionResultType.FAIL;
ItemStack remainder = ItemHandlerHelper.insertItemStacked(player_inventory, insert_stack, false); } else {
if(remainder.getCount() < insert_stack.getCount()) { boolean drained = false;
te.drain(MilkerTileEntity.BUCKET_SIZE); IItemHandler player_inventory = new PlayerMainInvWrapper(player.inventory);
in_stack.shrink(1); if(te.fluid_level() >= MilkerTileEntity.BUCKET_SIZE) {
drained = true; final ItemStack insert_stack = out_stack.copy();
if(remainder.getCount() > 0) { ItemStack remainder = ItemHandlerHelper.insertItemStacked(player_inventory, insert_stack, false);
final ItemEntity ei = new ItemEntity(world, player.getPosition().getX(), player.getPosition().getY()+0.5, player.getPosition().getZ(), remainder); if(remainder.getCount() < insert_stack.getCount()) {
ei.setPickupDelay(40); te.drain(MilkerTileEntity.BUCKET_SIZE);
ei.setMotion(0,0,0); in_stack.shrink(1);
world.addEntity(ei); drained = true;
if(remainder.getCount() > 0) {
final ItemEntity ei = new ItemEntity(world, player.getPosition().getX(), player.getPosition().getY()+0.5, player.getPosition().getZ(), remainder);
ei.setPickupDelay(40);
ei.setMotion(0,0,0);
world.addEntity(ei);
}
} }
} }
} if(drained) {
if(drained) { world.playSound(null, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 0.8f, 1f);
world.playSound(null, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 0.8f, 1f); }
} }
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }
@ -181,7 +192,7 @@ public class EdMilker
if(ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE!=null) milk_containers_.put(new ItemStack(Items.GLASS_BOTTLE), new ItemStack(ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE)); if(ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE!=null) milk_containers_.put(new ItemStack(Items.GLASS_BOTTLE), new ItemStack(ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE));
} }
ModEngineersDecor.logger().info( ModEngineersDecor.logger().info(
"Config milker energy consumption:" + energy_consumption + "rf/t" "Config milker: energy consumption:" + energy_consumption + "rf/t"
+ ((milk_fluid_==null)?"":" [milk fluid available]") + ((milk_fluid_==null)?"":" [milk fluid available]")
+ ((ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE==null)?"":" [bottledmilk mod available]") + ((ExternalObjects.BOTTLED_MILK_BOTTLE_DRINKLABLE==null)?"":" [bottledmilk mod available]")
); );
@ -234,6 +245,12 @@ public class EdMilker
private void drain(int amount) private void drain(int amount)
{ tank_level_ = MathHelper.clamp(tank_level_-BUCKET_SIZE, 0, TANK_CAPACITY); markDirty(); } { tank_level_ = MathHelper.clamp(tank_level_-BUCKET_SIZE, 0, TANK_CAPACITY); markDirty(); }
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}));
}
// TileEntity ------------------------------------------------------------------------------ // TileEntity ------------------------------------------------------------------------------
@Override @Override
@ -366,6 +383,7 @@ public class EdMilker
Inventories.extract(src, e.getKey(), 1, false); Inventories.extract(src, e.getKey(), 1, false);
tank_level_ -= BUCKET_SIZE; tank_level_ -= BUCKET_SIZE;
inserted = true; inserted = true;
break;
} }
if(!inserted) break; if(!inserted) break;
} }

View file

@ -116,7 +116,7 @@ public class EdMineralSmelter
@Override @Override
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult rayTraceResult) public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult rayTraceResult)
{ {
if(player.isShiftKeyDown()) return ActionResultType.PASS; if(player.isSneaking()) return ActionResultType.PASS;
if(world.isRemote) return ActionResultType.SUCCESS; if(world.isRemote) return ActionResultType.SUCCESS;
MineralSmelterTileEntity te = getTe(world, pos); MineralSmelterTileEntity te = getTe(world, pos);
if(te==null) return ActionResultType.FAIL; if(te==null) return ActionResultType.FAIL;

View file

@ -8,6 +8,7 @@
*/ */
package wile.engineersdecor.blocks; package wile.engineersdecor.blocks;
import net.minecraft.util.text.TranslationTextComponent;
import wile.engineersdecor.ModContent; import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.libmc.detail.Networking; import wile.engineersdecor.libmc.detail.Networking;
@ -48,6 +49,9 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import wile.engineersdecor.libmc.detail.TooltipDisplay;
import wile.engineersdecor.libmc.detail.TooltipDisplay.TipRange;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -687,25 +691,38 @@ public class EdPlacer
public static class PlacerGui extends ContainerScreen<PlacerContainer> public static class PlacerGui extends ContainerScreen<PlacerContainer>
{ {
protected final PlayerEntity player_; protected final PlayerEntity player_;
protected final TooltipDisplay tooltip_ = new TooltipDisplay();
public PlacerGui(PlacerContainer container, PlayerInventory player_inventory, ITextComponent title) public PlacerGui(PlacerContainer container, PlayerInventory player_inventory, ITextComponent title)
{ super(container, player_inventory, title); this.player_ = player_inventory.player; } { super(container, player_inventory, title); this.player_ = player_inventory.player; }
@Override @Override
public void init() public void init()
{ super.init(); } {
super.init();
{
final String prefix = ModContent.FACTORY_PLACER.getTranslationKey() + ".tooltips.";
final int x0 = getGuiLeft(), y0 = getGuiTop();
tooltip_.init(
new TipRange(x0+133, y0+49, 9, 9, new TranslationTextComponent(prefix + "rssignal")),
new TipRange(x0+145, y0+49, 9, 9, new TranslationTextComponent(prefix + "inversion")),
new TipRange(x0+159, y0+49, 9, 9, new TranslationTextComponent(prefix + "triggermode"))
);
}
}
@Override @Override
public void render(int mouseX, int mouseY, float partialTicks) public void render(int mouseX, int mouseY, float partialTicks)
{ {
renderBackground(); renderBackground();
super.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks);
renderHoveredToolTip(mouseX, mouseY); if(!tooltip_.render(this, mouseX, mouseY)) renderHoveredToolTip(mouseX, mouseY);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) public boolean mouseClicked(double mouseX, double mouseY, int mouseButton)
{ {
tooltip_.resetTimer();
PlacerContainer container = (PlacerContainer)getContainer(); PlacerContainer container = (PlacerContainer)getContainer();
int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5); int mx = (int)(mouseX - getGuiLeft() + .5), my = (int)(mouseY - getGuiTop() + .5);
if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) { if((!isPointInRegion(126, 1, 49, 60, mouseX, mouseY))) {

View file

@ -302,7 +302,7 @@ public class StandardBlocks
// default: placement on the face the player clicking // default: placement on the face the player clicking
} }
if((config & CFG_OPPOSITE_PLACEMENT)!=0) facing = facing.getOpposite(); if((config & CFG_OPPOSITE_PLACEMENT)!=0) facing = facing.getOpposite();
if(((config & CFG_FLIP_PLACEMENT_SHIFTCLICK) != 0) && (context.getPlayer().isShiftKeyDown())) facing = facing.getOpposite(); if(((config & CFG_FLIP_PLACEMENT_SHIFTCLICK) != 0) && (context.getPlayer().isSneaking())) facing = facing.getOpposite();
return super.getStateForPlacement(context).with(FACING, facing); return super.getStateForPlacement(context).with(FACING, facing);
} }
} }
@ -363,7 +363,7 @@ public class StandardBlocks
facing = ((facing==Direction.UP)||(facing==Direction.DOWN)) ? (context.getPlacementHorizontalFacing()) : facing; facing = ((facing==Direction.UP)||(facing==Direction.DOWN)) ? (context.getPlacementHorizontalFacing()) : facing;
} }
if((config & CFG_OPPOSITE_PLACEMENT)!=0) facing = facing.getOpposite(); if((config & CFG_OPPOSITE_PLACEMENT)!=0) facing = facing.getOpposite();
if(((config & CFG_FLIP_PLACEMENT_SHIFTCLICK) != 0) && (context.getPlayer().isShiftKeyDown())) facing = facing.getOpposite(); if(((config & CFG_FLIP_PLACEMENT_SHIFTCLICK) != 0) && (context.getPlayer().isSneaking())) facing = facing.getOpposite();
return super.getStateForPlacement(context).with(HORIZONTAL_FACING, facing); return super.getStateForPlacement(context).with(HORIZONTAL_FACING, facing);
} }

View file

@ -50,8 +50,8 @@ public class Inventories
return null; return null;
} }
public static ItemStack insert(IItemHandler inventory, ItemStack stack , boolean simulate) public static ItemStack insert(IItemHandler handler, ItemStack stack , boolean simulate)
{ return ItemHandlerHelper.insertItemStacked(inventory, stack, simulate); } { return ItemHandlerHelper.insertItemStacked(handler, stack, simulate); }
public static ItemStack insert(TileEntity te, @Nullable Direction side, ItemStack stack, boolean simulate) public static ItemStack insert(TileEntity te, @Nullable Direction side, ItemStack stack, boolean simulate)
{ {
@ -64,9 +64,12 @@ public class Inventories
} else if(te instanceof IInventory) { } else if(te instanceof IInventory) {
hnd = new InvWrapper((IInventory)te); hnd = new InvWrapper((IInventory)te);
} }
return (hnd==null) ? stack : ItemHandlerHelper.insertItemStacked(hnd, stack, simulate); return (hnd==null) ? stack : insert(hnd, stack, simulate);
} }
public static ItemStack insert(World world, BlockPos pos, @Nullable Direction side, ItemStack stack, boolean simulate)
{ return insert(world.getTileEntity(pos), side, stack, simulate); }
public static ItemStack extract(IItemHandler inventory, @Nullable ItemStack match, int amount, boolean simulate) public static ItemStack extract(IItemHandler inventory, @Nullable ItemStack match, int amount, boolean simulate)
{ {
if((inventory==null) || (amount<=0)) return ItemStack.EMPTY; if((inventory==null) || (amount<=0)) return ItemStack.EMPTY;
@ -128,9 +131,6 @@ public class Inventories
* to stacks that have that item already, and last uses any empty slot that can be found. * to stacks that have that item already, and last uses any empty slot that can be found.
* Returns the stack that is still remaining in the referenced `stack`. * Returns the stack that is still remaining in the referenced `stack`.
*/ */
public ItemStack insert(final ItemStack stack_to_move, boolean only_fillup, int limit)
{ return insert(stack_to_move, only_fillup, limit, false, false); }
public ItemStack insert(final ItemStack stack_to_move, boolean only_fillup, int limit, boolean reverse, boolean force_group_stacks) public ItemStack insert(final ItemStack stack_to_move, boolean only_fillup, int limit, boolean reverse, boolean force_group_stacks)
{ {
final ItemStack mvstack = stack_to_move.copy(); final ItemStack mvstack = stack_to_move.copy();
@ -224,6 +224,15 @@ public class Inventories
return checked(mvstack); return checked(mvstack);
} }
public ItemStack insert(final ItemStack stack_to_move, boolean only_fillup, int limit)
{ return insert(stack_to_move, only_fillup, limit, false, false); }
public ItemStack insert(final ItemStack stack_to_move, boolean only_fillup)
{ return insert(stack_to_move, only_fillup, 0, false, false); }
public ItemStack insert(final ItemStack stack_to_move)
{ return insert(stack_to_move, false, 0, false, false); }
/** /**
* Moves as much items from the slots in range [start_slot, end_slot] of the inventory into a new stack. * Moves as much items from the slots in range [start_slot, end_slot] of the inventory into a new stack.
* Implicitly shrinks the inventory stacks and the `request_stack`. * Implicitly shrinks the inventory stacks and the `request_stack`.

View file

@ -39,7 +39,8 @@ public class SidedProxy
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
private static ISidedProxy proxy = DistExecutor.runForDist(()->ClientProxy::new, ()->ServerProxy::new); // @todo: check conditions for safeRunForDist()
private static ISidedProxy proxy = DistExecutor.unsafeRunForDist(()->ClientProxy::new, ()->ServerProxy::new);
private interface ISidedProxy private interface ISidedProxy
{ {
@ -63,4 +64,4 @@ public class SidedProxy
{ {
} }
} }

View file

@ -0,0 +1,103 @@
/*
* @file Tooltip.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2018 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Delayed tooltip for a selected area. Constructed with a
* GUI, invoked in `render()`.
*/
package wile.engineersdecor.libmc.detail;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.inventory.container.Container;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@OnlyIn(Dist.CLIENT)
public class TooltipDisplay
{
private static long default_delay = 1500;
private static int default_max_deviation = 1;
public static void config(long delay, int max_deviation)
{
default_delay = MathHelper.clamp(delay, 500, 5000);
default_max_deviation = MathHelper.clamp(max_deviation, 1, 5);
}
// ---------------------------------------------------------------------------------------------------
public static class TipRange
{
public final int x0,y0,x1,y1;
public final ITextComponent text;
public TipRange(int x, int y, int w, int h, ITextComponent text)
{ this.text=text; this.x0=x; this.y0=y; this.x1=x0+w-1; this.y1=y0+h-1; }
}
// ---------------------------------------------------------------------------------------------------
private List<TipRange> ranges = new ArrayList<>();
private long delay = default_delay;
private int max_deviation = default_max_deviation;
private int x_last, y_last;
private long t;
public TooltipDisplay()
{ t = System.currentTimeMillis(); }
public void init(List<TipRange> ranges, long delay_ms, int max_deviation_xy)
{
this.ranges = ranges;
this.delay = delay_ms;
this.max_deviation = max_deviation_xy;
t = System.currentTimeMillis();
x_last = y_last = 0;
}
public void init(List<TipRange> ranges)
{ init(ranges, default_delay, default_max_deviation); }
public void init(TipRange... ranges)
{ init(Arrays.asList(ranges), default_delay, default_max_deviation); }
public void resetTimer()
{ t = System.currentTimeMillis(); }
public <T extends Container> boolean render(final ContainerScreen<T> gui, int x, int y)
{
if((Math.abs(x-x_last) > max_deviation) || (Math.abs(y-y_last) > max_deviation)) {
x_last = x;
y_last = y;
resetTimer();
return false;
} else if(Math.abs(System.currentTimeMillis()-t) < delay) {
return false;
} else if(ranges.stream().noneMatch(
(tip)->{
if((x<tip.x0) || (x>tip.x1) || (y<tip.y0) || (y>tip.y1)) return false;
String text = tip.text.getFormattedText();
if(!text.isEmpty() && (!text.startsWith("block."))) {
gui.renderTooltip(Collections.singletonList(tip.text.getFormattedText()), x, y, Minecraft.getInstance().fontRenderer);
}
return true;
})
){
resetTimer();
return false;
} else {
return true;
}
}
}

View file

@ -0,0 +1,14 @@
{
"variants": {
"": [
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model0" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model1" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model2" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model3" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model4" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model5" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model6" },
{ "model": "engineersdecor:block/soil/dense_grit_dirt_model7" }
]
}
}

View file

@ -67,14 +67,34 @@
"block.engineersdecor.clinker_brick_wall.help": "§6Simplistic Clinker Brick Wall.", "block.engineersdecor.clinker_brick_wall.help": "§6Simplistic Clinker Brick Wall.",
"block.engineersdecor.concrete_wall": "Concrete Wall", "block.engineersdecor.concrete_wall": "Concrete Wall",
"block.engineersdecor.concrete_wall.help": "§6Wall made of solid concrete.", "block.engineersdecor.concrete_wall.help": "§6Wall made of solid concrete.",
"block.engineersdecor.dense_grit_dirt_block": "Dense Grit Dirt",
"block.engineersdecor.dense_grit_dirt_block.help": "§6A compressed dirt-like soil, plain texture with some cracks.§r Known from often used paths or trampled yard grounds. Dirt and coarse dirt can be mixed in for accentuation. Position dependent texture variations. Prevents grass spreading.",
"block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand", "block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand",
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "Factory Dropper", "block.engineersdecor.factory_dropper": "Factory Dropper",
"block.engineersdecor.factory_dropper.help": "§6Dropper suitable for advanced factory automation.§r Has twelve round-robin selected slots. Drop force, angle, stack size, and cool-down delay adjustable using sliders in the GUI. Three stack compare slots (below the inventory slots) with logical AND or OR can be used as internal trigger source. The internal trigger can be AND'ed or OR'ed with the external redstone signal trigger. Trigger simulation buttons for testing. Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks simultaneously. Simply click on all elements in the GUI to see how it works.", "block.engineersdecor.factory_dropper.help": "§6Dropper suitable for advanced factory automation.§r Has twelve round-robin selected slots. Drop force, angle, stack size, and cool-down delay adjustable using sliders in the GUI. Three stack compare slots (below the inventory slots) with logical AND or OR can be used as internal trigger source. The internal trigger can be AND'ed or OR'ed with the external redstone signal trigger. Trigger simulation buttons for testing. Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks simultaneously. Simply click on all elements in the GUI to see how it works.",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\n§8AND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\n§8AND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator\n §8(click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\n§8Pulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "Factory Hopper", "block.engineersdecor.factory_hopper": "Factory Hopper",
"block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).", "block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "Factory Block Placer", "block.engineersdecor.factory_placer": "Factory Block Placer",
"block.engineersdecor.factory_placer.help": "§6Allows placing blocks and planting crops or trees.§r\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant.", "block.engineersdecor.factory_placer.help": "§6Allows placing blocks and planting crops or trees.§r\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant.",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "Gas Concrete Block", "block.engineersdecor.gas_concrete": "Gas Concrete Block",
"block.engineersdecor.gas_concrete.help": "§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.", "block.engineersdecor.gas_concrete.help": "§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.",
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab", "block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
@ -159,12 +179,16 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "Small Electrical Furnace", "block.engineersdecor.small_electrical_furnace": "Small Electrical Furnace",
"block.engineersdecor.small_electrical_furnace.help": "§6Small metal cased pass-through furnace.§r Automatically draws items from the input side and puts items into the inventory at the output side. Items can be inserted or drawn from all sides using hoppers. Implicitly bypasses items that cannot be smelted or cooked to the output. Slightly more energy efficient and faster than a heated cobblestone furnace. Fifos and feeders transfer whole stacks. Feeders require a bit of power.", "block.engineersdecor.small_electrical_furnace.help": "§6Small metal cased pass-through furnace.§r Automatically draws items from the input side and puts items into the inventory at the output side. Items can be inserted or drawn from all sides using hoppers. Implicitly bypasses items that cannot be smelted or cooked to the output. Slightly more energy efficient and faster than a heated cobblestone furnace. Fifos and feeders transfer whole stacks. Feeders require a bit of power.",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel", "block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel",
"block.engineersdecor.small_fluid_funnel.help": "§6Collects fluids above it.§r Has an internal tank with three buckets capacity. Traces flowing fluids to nearby source blocks. The fluid can be obtained with fluid transfer systems or a bucket. Fills only tanks below (gravity transfer). Compatible with vanilla infinite-water-source creation.", "block.engineersdecor.small_fluid_funnel.help": "§6Collects fluids above it.§r Has an internal tank with three buckets capacity. Traces flowing fluids to nearby source blocks. The fluid can be obtained with fluid transfer systems or a bucket. Fills only tanks below (gravity transfer). Compatible with vanilla infinite-water-source creation.",
"block.engineersdecor.small_lab_furnace": "Small Laboratory Furnace", "block.engineersdecor.small_lab_furnace": "Small Laboratory Furnace",
"block.engineersdecor.small_lab_furnace.help": "§6Small metal cased lab kiln.§r Solid fuel consuming, updraught. Slightly hotter and better isolated than a cobblestone furnace, therefore more efficient. Two auxiliary slots e.g. for storage. Two stack internal hopper fifos for input, output, and fuel. Place an external heater into a aux slot and connect power for electrical smelting speed boost.", "block.engineersdecor.small_lab_furnace.help": "§6Small metal cased lab kiln.§r Solid fuel consuming, updraught. Slightly hotter and better isolated than a cobblestone furnace, therefore more efficient. Two auxiliary slots e.g. for storage. Two stack internal hopper fifos for input, output, and fuel. Place an external heater into a aux slot and connect power for electrical smelting speed boost.",
"block.engineersdecor.small_milking_machine": "Small Milking Machine", "block.engineersdecor.small_milking_machine": "Small Milking Machine",
"block.engineersdecor.small_milking_machine.help": "§6Occasionally grooms and milks cows.§r\n Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk. Pulls/stores milk container items from/to inventories at the back or bottom (preferrs extracting from the back and inserting below, but can also put filled vessels back into the same inventory). Supports fluid output to tanks or pipes below (only if milk exists as fluid). Care that it's not too crowdy in the cow pen, only happy animals stroll by voluntarily.", "block.engineersdecor.small_milking_machine.help": "§6Occasionally milks cows.§r\n Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk. Pulls/stores milk container items from/to inventories at the back or bottom (preferrs extracting from the back and inserting below, but can also put filled vessels back into the same inventory). Supports fluid output to tanks or pipes below (only if milk exists as fluid). Care that it's not too crowdy in the cow pen, only happy animals stroll by voluntarily.",
"block.engineersdecor.small_milking_machine.status": "Milk: %1$smB %2$s",
"block.engineersdecor.small_milking_machine.status.rf": "| %1$sRF",
"block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace", "block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace",
"block.engineersdecor.small_mineral_smelter.help": "§6High temperature, high insulation electrical stone melting furnace.§r\n Heats up mineral blocks to magma blocks, and finally to lava. Click with a mineral block (stone, cobble, etc) or use item insertion to place a block in the melter. Use bucket or fluid extraction to retrieve the lava. When cooling down lava, obsidian is generated. Remove the RF power or apply a redstone signal to disable the furnace. For automation, use a redstone comparator to see in which melting phase the mineral is a moment.", "block.engineersdecor.small_mineral_smelter.help": "§6High temperature, high insulation electrical stone melting furnace.§r\n Heats up mineral blocks to magma blocks, and finally to lava. Click with a mineral block (stone, cobble, etc) or use item insertion to place a block in the melter. Use bucket or fluid extraction to retrieve the lava. When cooling down lava, obsidian is generated. Remove the RF power or apply a redstone signal to disable the furnace. For automation, use a redstone comparator to see in which melting phase the mineral is a moment.",
"block.engineersdecor.small_solar_panel": "Small Solar Panel", "block.engineersdecor.small_solar_panel": "Small Solar Panel",
@ -207,6 +231,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.",
"block.engineersdecor.treated_wood_crafting_table": "Treated Wood Crafting Table", "block.engineersdecor.treated_wood_crafting_table": "Treated Wood Crafting Table",
"block.engineersdecor.treated_wood_crafting_table.help": "§6Robust and weather-proof.§r Eight storage slots, keeps inventory, no vanilla recipe book.\n Click up/down arrow buttons for crafting history selection, output slot for item placement, X-button to clear crafting grid and history. Shift-click stack: player-to-storage stack transfer when crafting grid empty, otherwise player-to-grid stack transfer. Automatically distributes the clicked stack. Shift-Ctrl-click stack: Move all same stacks. Mouse wheel over crafting slot: Increase/decrease crafting grid items.", "block.engineersdecor.treated_wood_crafting_table.help": "§6Robust and weather-proof.§r Eight storage slots, keeps inventory, no vanilla recipe book.\n Click up/down arrow buttons for crafting history selection, output slot for item placement, X-button to clear crafting grid and history. Shift-click stack: player-to-storage stack transfer when crafting grid empty, otherwise player-to-grid stack transfer. Automatically distributes the clicked stack. Shift-Ctrl-click stack: Move all same stacks. Mouse wheel over crafting slot: Increase/decrease crafting grid items.",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor", "block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
"block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r", "block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r",
"block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder", "block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder",

View file

@ -67,14 +67,34 @@
"block.engineersdecor.clinker_brick_wall.help": "§6Обыкновенная клинкерная кирпичная стена.", "block.engineersdecor.clinker_brick_wall.help": "§6Обыкновенная клинкерная кирпичная стена.",
"block.engineersdecor.concrete_wall": "Бетонная стена", "block.engineersdecor.concrete_wall": "Бетонная стена",
"block.engineersdecor.concrete_wall.help": "§6Стена из твёрдого бетона.", "block.engineersdecor.concrete_wall.help": "§6Стена из твёрдого бетона.",
"block.engineersdecor.dense_grit_dirt_block": "Dense Grit Dirt",
"block.engineersdecor.dense_grit_dirt_block.help": "§6A compressed dirt-like soil, plain texture with some cracks.§r Known from often used paths or trampled yard grounds. Dirt and coarse dirt can be mixed in for accentuation. Position dependent texture variations. Prevents grass spreading.",
"block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand", "block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand",
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "Фабричный выбрасыватель", "block.engineersdecor.factory_dropper": "Фабричный выбрасыватель",
"block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.", "block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\nAND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\nAND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator (click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\nPulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "Фабричная воронка", "block.engineersdecor.factory_hopper": "Фабричная воронка",
"block.engineersdecor.factory_hopper.help": "§6Воронка для продвинутой автоматизации производства.§r Может передавать полустеки, максимальный диапазон сбора 9x9.\n GUI ползунки: Диапазон сбора (0 до 4), задержка помещения(0.5сек до 10сек), размер стека помещения (1 до 32).\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).", "block.engineersdecor.factory_hopper.help": "§6Воронка для продвинутой автоматизации производства.§r Может передавать полустеки, максимальный диапазон сбора 9x9.\n GUI ползунки: Диапазон сбора (0 до 4), задержка помещения(0.5сек до 10сек), размер стека помещения (1 до 32).\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "Фабричный разместитель блоков", "block.engineersdecor.factory_placer": "Фабричный разместитель блоков",
"block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.", "block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "Газобетон", "block.engineersdecor.gas_concrete": "Газобетон",
"block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.", "block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
"block.engineersdecor.gas_concrete_slab": "Газобетонная плита", "block.engineersdecor.gas_concrete_slab": "Газобетонная плита",
@ -159,12 +179,16 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь", "block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь",
"block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.", "block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости", "block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости",
"block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.", "block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.",
"block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь", "block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь",
"block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее и изолированней каменной, поэтому быстрее. Два вспомогательных слота, например для хранения. Два слота-воронки для ввода, вывода, и топлива. Поместите внешний нагреватель в слот AUX и подключите питание для электрического повышения скорости обработки.", "block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее и изолированней каменной, поэтому быстрее. Два вспомогательных слота, например для хранения. Два слота-воронки для ввода, вывода, и топлива. Поместите внешний нагреватель в слот AUX и подключите питание для электрического повышения скорости обработки.",
"block.engineersdecor.small_milking_machine": "Малый доильный аппарат", "block.engineersdecor.small_milking_machine": "Малый доильный аппарат",
"block.engineersdecor.small_milking_machine.help": "§6Изредка чистит и доит коров.§r\n Имеет внутренний бак для жидкости. Не кормит животных. Используйте ведра для извлечения молока. Извлекает/кладёт сосуды для молока из/в инвентарь сзади или снизу (предпочитает извлекать сзади и класть снизу, но может также класть заполненные сосуды обратно в тот же инвентарь). Поддерживает выход жидкости в резервуары или трубы снизу (только если молоко существует в виде жидкости). Позаботьтесь, чтобы в загоне не было тесно, добровольно прогуливаются только счастливые животные.", "block.engineersdecor.small_milking_machine.help": "§6Изредка чистит и доит коров.§r\n Имеет внутренний бак для жидкости. Не кормит животных. Используйте ведра для извлечения молока. Извлекает/кладёт сосуды для молока из/в инвентарь сзади или снизу (предпочитает извлекать сзади и класть снизу, но может также класть заполненные сосуды обратно в тот же инвентарь). Поддерживает выход жидкости в резервуары или трубы снизу (только если молоко существует в виде жидкости). Позаботьтесь, чтобы в загоне не было тесно, добровольно прогуливаются только счастливые животные.",
"block.engineersdecor.small_milking_machine.status": "Milk: %1$smB %2$s",
"block.engineersdecor.small_milking_machine.status.rf": "| %1$sRF",
"block.engineersdecor.small_mineral_smelter": "Малая плавильная печь минералов", "block.engineersdecor.small_mineral_smelter": "Малая плавильная печь минералов",
"block.engineersdecor.small_mineral_smelter.help": "§6Высокотемпературная электрическая каменная плавильная печь с высокой изоляцией.§r\n Нагревает минеральные блоки до магматических блоков и, наконец, до лавы. Нажмите с минеральным блоком (камень, булыжник, и т.п.) или используйте другие способы загрузки. Используйте ведро или жидкостные насосы для извлечения лавы. При охлаждении лавы, генерируется обсидиан. Отключите RF питание или подайте сигнал красного камня для отключения печи. Для автоматизации используйте редстоуновый компаратор, чтобы увидеть, в какой фазе плавления находится минерал.", "block.engineersdecor.small_mineral_smelter.help": "§6Высокотемпературная электрическая каменная плавильная печь с высокой изоляцией.§r\n Нагревает минеральные блоки до магматических блоков и, наконец, до лавы. Нажмите с минеральным блоком (камень, булыжник, и т.п.) или используйте другие способы загрузки. Используйте ведро или жидкостные насосы для извлечения лавы. При охлаждении лавы, генерируется обсидиан. Отключите RF питание или подайте сигнал красного камня для отключения печи. Для автоматизации используйте редстоуновый компаратор, чтобы увидеть, в какой фазе плавления находится минерал.",
"block.engineersdecor.small_solar_panel": "Малая солнечная панель", "block.engineersdecor.small_solar_panel": "Малая солнечная панель",
@ -207,6 +231,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.",
"block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева", "block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева",
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.", "block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева", "block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева",
"block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r", "block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r",
"block.engineersdecor.treated_wood_ladder": "Лестница из обработанного дерева", "block.engineersdecor.treated_wood_ladder": "Лестница из обработанного дерева",

View file

@ -67,14 +67,34 @@
"block.engineersdecor.clinker_brick_wall.help": "§6简单的过烧砖墙。", "block.engineersdecor.clinker_brick_wall.help": "§6简单的过烧砖墙。",
"block.engineersdecor.concrete_wall": "混凝土墙", "block.engineersdecor.concrete_wall": "混凝土墙",
"block.engineersdecor.concrete_wall.help": "§6用坚固混凝土制造的墙。", "block.engineersdecor.concrete_wall.help": "§6用坚固混凝土制造的墙。",
"block.engineersdecor.dense_grit_dirt_block": "Dense Grit Dirt",
"block.engineersdecor.dense_grit_dirt_block.help": "§6A compressed dirt-like soil, plain texture with some cracks.§r Known from often used paths or trampled yard grounds. Dirt and coarse dirt can be mixed in for accentuation. Position dependent texture variations. Prevents grass spreading.",
"block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand", "block.engineersdecor.dense_grit_sand_block": "Dense Grit Sand",
"block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.", "block.engineersdecor.dense_grit_sand_block.help": "§6A compressed sandy soil mixed with stone grid, as known from machine and storage yards.§r Flowers don't really grow on that. Position dependent texture variations.",
"block.engineersdecor.factory_dropper": "工厂掉落器", "block.engineersdecor.factory_dropper": "工厂掉落器",
"block.engineersdecor.factory_dropper.help": "§6适用于高级工厂自动化的掉落器。§r有十二个轮询选择的储物格。 掉落的力度、角度、一叠数量和冷却延时可在GUI调节。三个 内部比较槽带有逻辑与或逻辑或功能,可用作内部触发源。内部触发 还能和外部红石信号触发再进行逻辑与或逻辑或。触发模拟按钮仅作测试用途。 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品 会同时掉落。点击GUI的各处来了解如何运作。", "block.engineersdecor.factory_dropper.help": "§6适用于高级工厂自动化的掉落器。§r有十二个轮询选择的储物格。 掉落的力度、角度、一叠数量和冷却延时可在GUI调节。三个 内部比较槽带有逻辑与或逻辑或功能,可用作内部触发源。内部触发 还能和外部红石信号触发再进行逻辑与或逻辑或。触发模拟按钮仅作测试用途。 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品 会同时掉落。点击GUI的各处来了解如何运作。",
"block.engineersdecor.factory_dropper.tooltips.direction": "Drop direction x/y (-45° to +45°)",
"block.engineersdecor.factory_dropper.tooltips.dropcount": "Drop stack size (1 to 32 items)",
"block.engineersdecor.factory_dropper.tooltips.externgate": "External signal combination logic (AND or OR)§r\nAND: Drop only on an external signal.\nOR: Drop filter matches automatically, non-matching items on external trigger.",
"block.engineersdecor.factory_dropper.tooltips.filtergate": "Filter combination gate logic (AND or OR)§r\nAND: Drop the stacks as specified in the filters when ALL filters are green.\nOR: Drop the stack of each individual filter when green.",
"block.engineersdecor.factory_dropper.tooltips.period": "Drop delay (1s to 10s)",
"block.engineersdecor.factory_dropper.tooltips.rssignal": "External Redstone signal indicator (click to generate a test trigger).",
"block.engineersdecor.factory_dropper.tooltips.triggermode": "Trigger mode (pulse/continuous)§r\nPulse: One drop for each OFF->ON of the external signal.\nContinuous: Drop as long as the external signal is ON.",
"block.engineersdecor.factory_dropper.tooltips.velocity": "Drop velocity (slow to fast speed)",
"block.engineersdecor.factory_hopper": "工厂漏斗", "block.engineersdecor.factory_hopper": "工厂漏斗",
"block.engineersdecor.factory_hopper.help": "§6适用于高级工厂自动化的漏斗。§r可一次传输半组物品最大收集范围9x9。\n GUI滑动条控制收集距离0到4插入延迟0.5秒到10秒插入一叠物品的大小1到32。\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。", "block.engineersdecor.factory_hopper.help": "§6适用于高级工厂自动化的漏斗。§r可一次传输半组物品最大收集范围9x9。\n GUI滑动条控制收集距离0到4插入延迟0.5秒到10秒插入一叠物品的大小1到32。\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。",
"block.engineersdecor.factory_hopper.tooltips.count": "Insertion stack size §8(1 to 32 items)",
"block.engineersdecor.factory_hopper.tooltips.delayindicator": "Delay indicator\n§8Blinks when the insertion delay timer has not expired yet, or when the Hopper cannot insert into the adjacent inventory.",
"block.engineersdecor.factory_hopper.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_hopper.tooltips.period": "Insertion delay §8(1s to 10s)",
"block.engineersdecor.factory_hopper.tooltips.range": "Collection radius §8(0 to 4)",
"block.engineersdecor.factory_hopper.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_hopper.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.factory_placer": "工厂方块放置器", "block.engineersdecor.factory_placer": "工厂方块放置器",
"block.engineersdecor.factory_placer.help": "§6能够放置方块和种植作物或树。§r\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。\n 也支持从耕地下方穿透方块种植。会吐出不能放置或种植的物品。", "block.engineersdecor.factory_placer.help": "§6能够放置方块和种植作物或树。§r\n GUI红石控制不反相/反相(默认),脉冲模式/持续模式(默认)。\n 也支持从耕地下方穿透方块种植。会吐出不能放置或种植的物品。",
"block.engineersdecor.factory_placer.tooltips.inversion": "Inversion mode §8(inverted/not inverted)",
"block.engineersdecor.factory_placer.tooltips.rssignal": "External Redstone signal indicator",
"block.engineersdecor.factory_placer.tooltips.triggermode": "Trigger mode §8(continuous/pulse)",
"block.engineersdecor.gas_concrete": "加气混凝土", "block.engineersdecor.gas_concrete": "加气混凝土",
"block.engineersdecor.gas_concrete.help": "§6低硬度高产出的混凝土。§r容易破坏的装饰性混凝土方块。", "block.engineersdecor.gas_concrete.help": "§6低硬度高产出的混凝土。§r容易破坏的装饰性混凝土方块。",
"block.engineersdecor.gas_concrete_slab": "加气混凝土台阶", "block.engineersdecor.gas_concrete_slab": "加气混凝土台阶",
@ -159,12 +179,16 @@
"block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%", "block.engineersdecor.small_block_breaker.status": "SOC: %1$s%% of %2$sRF§r | progress: %3$s%%",
"block.engineersdecor.small_electrical_furnace": "小型电炉", "block.engineersdecor.small_electrical_furnace": "小型电炉",
"block.engineersdecor.small_electrical_furnace.help": "§6小型金属封装穿过式熔炉。§r 自动从输入端获取物品并在输出端物品栏放置物品。 物品能从所有面使用漏斗插入或提取。无法熔炼或烹饪的物品会直接送到出口。 比加热的圆石炉有稍微高的能效比和更快。 先进先出和自动输出一次移动一组物品。自动输出需要一点能量。", "block.engineersdecor.small_electrical_furnace.help": "§6小型金属封装穿过式熔炉。§r 自动从输入端获取物品并在输出端物品栏放置物品。 物品能从所有面使用漏斗插入或提取。无法熔炼或烹饪的物品会直接送到出口。 比加热的圆石炉有稍微高的能效比和更快。 先进先出和自动输出一次移动一组物品。自动输出需要一点能量。",
"block.engineersdecor.small_electrical_furnace.tooltips.auxslot": "Auxiliary slot\n§8Place a Hopper here to enable automatic feeding from the input side.",
"block.engineersdecor.small_electrical_furnace.tooltips.speed": "Smelting speed selection §8(OFF/I/II/III)",
"block.engineersdecor.small_fluid_funnel": "小型流体收集漏斗", "block.engineersdecor.small_fluid_funnel": "小型流体收集漏斗",
"block.engineersdecor.small_fluid_funnel.help": "§6收集上方的流体。§r有一个三桶大的内部储罐。会 追溯流体到附近的源方块。流体可被流体运输系统或桶 移出。只会装满下方的储罐(重力传输)。与原版 无限水兼容。", "block.engineersdecor.small_fluid_funnel.help": "§6收集上方的流体。§r有一个三桶大的内部储罐。会 追溯流体到附近的源方块。流体可被流体运输系统或桶 移出。只会装满下方的储罐(重力传输)。与原版 无限水兼容。",
"block.engineersdecor.small_lab_furnace": "小型实验室炉", "block.engineersdecor.small_lab_furnace": "小型实验室炉",
"block.engineersdecor.small_lab_furnace.help": "§6小型金属壳实验室窑。§r消耗固体燃料向上排气。 比圆石炉稍微热一点,隔热性也更好,因此效率更高。 有两个用于储存的辅助格。两个堆叠的内部漏斗对输入、输出和燃料进行队列管理。 在辅助格放置一个外置加热器并通入电力可以加快熔炼速度。", "block.engineersdecor.small_lab_furnace.help": "§6小型金属壳实验室窑。§r消耗固体燃料向上排气。 比圆石炉稍微热一点,隔热性也更好,因此效率更高。 有两个用于储存的辅助格。两个堆叠的内部漏斗对输入、输出和燃料进行队列管理。 在辅助格放置一个外置加热器并通入电力可以加快熔炼速度。",
"block.engineersdecor.small_milking_machine": "小型挤奶机", "block.engineersdecor.small_milking_machine": "小型挤奶机",
"block.engineersdecor.small_milking_machine.help": "§6偶尔给奶牛梳理和挤奶。§r\n 有一个内置流体储罐。不会喂食动物。使用桶获得牛奶。 从后方或下方的方块物品栏拉取或存储牛奶容器物品(偏好 从下方输入,从后方输出,但也能将装满的牛奶容器放回原来 的物品栏)支持将牛奶作为流体输出到下方的储罐和管道(只要牛奶是流体)。 小心牛栏里不要太拥挤,只有快乐的动物才会自觉地在挤奶机前散步。", "block.engineersdecor.small_milking_machine.help": "§6偶尔给奶牛梳理和挤奶。§r\n 有一个内置流体储罐。不会喂食动物。使用桶获得牛奶。 从后方或下方的方块物品栏拉取或存储牛奶容器物品(偏好 从下方输入,从后方输出,但也能将装满的牛奶容器放回原来 的物品栏)支持将牛奶作为流体输出到下方的储罐和管道(只要牛奶是流体)。 小心牛栏里不要太拥挤,只有快乐的动物才会自觉地在挤奶机前散步。",
"block.engineersdecor.small_milking_machine.status": "Milk: %1$smB %2$s",
"block.engineersdecor.small_milking_machine.status.rf": "| %1$sRF",
"block.engineersdecor.small_mineral_smelter": "小型矿物熔炼炉", "block.engineersdecor.small_mineral_smelter": "小型矿物熔炼炉",
"block.engineersdecor.small_mineral_smelter.help": "§6高温、高绝缘电熔石炉。§r\n 把矿物块加热成岩浆块,最后变成熔岩。由于 小型化的设备大小,该过程效率不高,需要大量时间和能源 来液化一块石头。", "block.engineersdecor.small_mineral_smelter.help": "§6高温、高绝缘电熔石炉。§r\n 把矿物块加热成岩浆块,最后变成熔岩。由于 小型化的设备大小,该过程效率不高,需要大量时间和能源 来液化一块石头。",
"block.engineersdecor.small_solar_panel": "小型太阳能板", "block.engineersdecor.small_solar_panel": "小型太阳能板",
@ -207,6 +231,14 @@
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6简单的窗户装饰。", "block.engineersdecor.treated_wood_broad_windowsill.help": "§6简单的窗户装饰。",
"block.engineersdecor.treated_wood_crafting_table": "防腐木合成台", "block.engineersdecor.treated_wood_crafting_table": "防腐木合成台",
"block.engineersdecor.treated_wood_crafting_table.help": "§6坚固防风防雨。§r内含八个存储格破坏后保留内容物没有原版合成书。\n 单击上/下箭头按钮可选择合成历史单击输出格自动放置物品单击X按钮 清除合成栏和历史。Shift单击一叠物品合成格空时转移到存储格 非空时到合成栏。会自动分配转移的物品。", "block.engineersdecor.treated_wood_crafting_table.help": "§6坚固防风防雨。§r内含八个存储格破坏后保留内容物没有原版合成书。\n 单击上/下箭头按钮可选择合成历史单击输出格自动放置物品单击X按钮 清除合成栏和历史。Shift单击一叠物品合成格空时转移到存储格 非空时到合成栏。会自动分配转移的物品。",
"block.engineersdecor.treated_wood_crafting_table.tooltips.clear": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromplayer": "Move items from player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.fromstorage": "Move items from storage",
"block.engineersdecor.treated_wood_crafting_table.tooltips.next": "Next crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.nextcollisionrecipe": "Show next colliding recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.prev": "Previous crafting history recipe",
"block.engineersdecor.treated_wood_crafting_table.tooltips.toplayer": "Clear grid to player inventory",
"block.engineersdecor.treated_wood_crafting_table.tooltips.tostorage": "Clear grid to storage",
"block.engineersdecor.treated_wood_floor": "防腐木地板", "block.engineersdecor.treated_wood_floor": "防腐木地板",
"block.engineersdecor.treated_wood_floor.help": "§6装饰性地板砖有可变的贴图。§r", "block.engineersdecor.treated_wood_floor.help": "§6装饰性地板砖有可变的贴图。§r",
"block.engineersdecor.treated_wood_ladder": "防腐木梯", "block.engineersdecor.treated_wood_ladder": "防腐木梯",

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture0" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture1" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture2" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture3" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture4" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture5" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture6" } }

View file

@ -0,0 +1 @@
{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:block/soil/dense_grit_dirt_texture7" } }

View file

@ -0,0 +1 @@
{ "parent": "engineersdecor:block/soil/dense_grit_dirt_model0" }

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

View file

@ -0,0 +1,23 @@
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:dense_grit_dirt_block",
"required": ["minecraft:sand", "minecraft:gravel", "minecraft:dirt"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"DGD",
"DCD"
],
"key": {
"G": { "item": "minecraft:gravel" },
"D": { "item": "minecraft:dirt" },
"C": { "item": "minecraft:cobblestone" }
},
"result": {
"item": "engineersdecor:dense_grit_dirt_block",
"count": 6
}
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"engineersdecor:dense_grit_dirt_block"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"engineersdecor:dense_grit_dirt_block"
]
}

View file

@ -4,9 +4,9 @@
"1.12.2-recommended": "1.0.20", "1.12.2-recommended": "1.0.20",
"1.12.2-latest": "1.1.0-b1", "1.12.2-latest": "1.1.0-b1",
"1.14.4-recommended": "", "1.14.4-recommended": "",
"1.14.4-latest": "1.1.0-b1", "1.14.4-latest": "1.1.0-b2",
"1.15.2-recommended": "", "1.15.2-recommended": "",
"1.15.2-latest": "1.1.0-b1" "1.15.2-latest": "1.1.0-b2"
}, },
"1.12.2": { "1.12.2": {
"1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[M] Changed Labeled Crate Nesting to circumvent server crashing in combination with the Sponge mod.", "1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[M] Changed Labeled Crate Nesting to circumvent server crashing in combination with the Sponge mod.",
@ -97,6 +97,7 @@
"1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table."
}, },
"1.14.4": { "1.14.4": {
"1.1.0-b2": "[A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).",
"1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.", "1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.",
"1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.", "1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.",
"1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.", "1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.",
@ -152,6 +153,7 @@
"1.0.7-b3": "[A] Initial 1.14.2 port of decorative blocks." "1.0.7-b3": "[A] Initial 1.14.2 port of decorative blocks."
}, },
"1.15.2": { "1.15.2": {
"1.1.0-b2": "[A] Added tooltips for buttons/settings in device GUIs (1.5s display delay).\n[U] Updated Forge/Mappings.",
"1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] IE Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] GUI models updated to circumvent too dark representations.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.", "1.1.0-b1": "[F] Fixed Electrical Furnace speed sanitizing bug (issue #97, thx therobotmenace).\n[A] IE Sheet Metal Slab Slices added (only available if IE is installed).\n[M] Config options extended/updated.\n[M] GUI models updated to circumvent too dark representations.\n[M] Dense Grit Sand textures altered to get slightly more visible structure from distance.",
"1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.", "1.0.20-b7": "[A] Dense Grit Sand added.\n[!] Variant Slab compatibility fix. *This may alter placed slabs of this mod, data fixers don't work yet unfortunately*.",
"1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.", "1.0.20-b6": "[M] Slab Slice placement improved.\n[M] Quite some naming/refractoring under the hood.",