1.12: v1.0.17 release merge.
This commit is contained in:
commit
eda8b14b57
58 changed files with 3130 additions and 1537 deletions
|
@ -4,4 +4,4 @@ org.gradle.jvmargs=-Xmx8G
|
|||
version_minecraft=1.12.2
|
||||
version_forge=14.23.5.2768
|
||||
version_jei=4.10.0.198
|
||||
version_engineersdecor=1.0.17
|
||||
version_engineersdecor=1.0.18
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"1.12.2": {
|
||||
"1.0.18": "[R] Release based on v1.0.18-b2. Release-to-release changes: * Tree cutter config fixes. * Treated Wood Crafting Table mouse tweaks. * Lang updates.\n[M] Lang update ru_ru (PR#77, thanks Smollet777).",
|
||||
"1.0.18-b2": "[A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).",
|
||||
"1.0.18-b1": "[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.17": "[R] Release based on v1.0.17-b3. Release-to-release changes: * Milking machine added. * Reverse recipes for slab slices added. * Texture and model improvements. * Lang file updates. * Minor bug fixes. * Config options added.\n[M] Updated zh_cn lang file (scikirbypoke).\n[A] Added opt-out config for the Small Tree Cutter.",
|
||||
"1.0.17-b3": "[F] Fixed Small Block Breaker facings to the horizontal range (issue #70, thx JimMiningWorm).",
|
||||
"1.0.17-b2": "[A] Reverse recipes for slabs and slab slices added.\n[M] Inset Floor Edge Light slightly thinner, looks better.",
|
||||
|
@ -73,7 +76,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."
|
||||
},
|
||||
"promos": {
|
||||
"1.12.2-recommended": "1.0.17",
|
||||
"1.12.2-latest": "1.0.17"
|
||||
"1.12.2-recommended": "1.0.18",
|
||||
"1.12.2-latest": "1.0.18"
|
||||
}
|
||||
}
|
|
@ -10,6 +10,21 @@ Mod sources for Minecraft version 1.12.2.
|
|||
----
|
||||
## Version history
|
||||
|
||||
-------------------------------------------------------------------
|
||||
- v1.0.18 [R] Release based on v1.0.18-b2. Release-to-release changes:
|
||||
* Tree cutter config fixes.
|
||||
* Treated Wood Crafting Table mouse tweaks.
|
||||
* Lang updates.
|
||||
-------------------------------------------------------------------
|
||||
[M] Lang update ru_ru (PR#77, thanks Smollet777).
|
||||
|
||||
- v1.0.18-b2 [A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the
|
||||
inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).
|
||||
[F] EN Lang file fixed (issue #76, thx Riverstar907).
|
||||
[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).
|
||||
|
||||
- v1.0.18-b1 [M] Lang ru_ru updated (Smollet777).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
- v1.0.17 [R] Release based on v1.0.17-b3. Release-to-release changes:
|
||||
* Milking machine added.
|
||||
|
|
|
@ -11,7 +11,10 @@ package wile.engineersdecor.blocks;
|
|||
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
||||
import org.lwjgl.Sys;
|
||||
import org.lwjgl.input.Mouse;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import wile.engineersdecor.detail.Networking;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.Explosion;
|
||||
|
@ -52,6 +55,8 @@ import net.minecraftforge.registries.IForgeRegistry;
|
|||
import com.google.common.collect.ImmutableList;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.sound.midi.SysexMessage;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
@ -62,12 +67,15 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
public static boolean with_assist = true;
|
||||
public static boolean with_assist_direct_history_refab = false;
|
||||
public static boolean with_assist_quickmove_buttons = false;
|
||||
public static boolean with_crafting_slot_mouse_scrolling = true;
|
||||
|
||||
public static final void on_config(boolean without_crafting_assist, boolean with_assist_immediate_history_refab, boolean with_quickmove_buttons)
|
||||
public static final void on_config(boolean without_crafting_assist, boolean with_assist_immediate_history_refab,
|
||||
boolean with_quickmove_buttons, boolean without_crafting_slot_mouse_scrolling)
|
||||
{
|
||||
with_assist = !without_crafting_assist;
|
||||
with_assist_direct_history_refab = with_assist_immediate_history_refab;
|
||||
with_assist_quickmove_buttons = with_quickmove_buttons;
|
||||
with_crafting_slot_mouse_scrolling = !without_crafting_slot_mouse_scrolling;
|
||||
CraftingHistory.max_history_size(32);
|
||||
}
|
||||
|
||||
|
@ -354,6 +362,9 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
protected static final int BUTTON_TO_PLAYER = 7;
|
||||
protected static final int ACTION_PLACE_CURRENT_HISTORY_SEL = 8;
|
||||
protected static final int ACTION_PLACE_SHIFTCLICKED_STACK = 9;
|
||||
protected static final int ACTION_MOVE_ALL_STACKS = 10;
|
||||
protected static final int ACTION_INCREASE_CRAFTING_STACKS = 11;
|
||||
protected static final int ACTION_DECREASE_CRAFTING_STACKS = 12;
|
||||
|
||||
protected static final ResourceLocation BACKGROUND = new ResourceLocation(ModEngineersDecor.MODID, "textures/gui/treated_wood_crafting_table.png");
|
||||
protected final BTileEntity te;
|
||||
|
@ -385,6 +396,18 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMouseInput() throws IOException
|
||||
{
|
||||
super.handleMouseInput();
|
||||
final int wheel = Mouse.getDWheel();
|
||||
if(wheel != 0) {
|
||||
int x = Mouse.getEventX() * width / mc.displayWidth;
|
||||
int y = this.height - Mouse.getEventY() * height / mc.displayHeight - 1;
|
||||
if(wheel != 0) mouseScrolled(x, y, (wheel>0) ? 1 : -1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen(int mouseX, int mouseY, float partialTicks)
|
||||
{
|
||||
|
@ -507,25 +530,75 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
if(place_refab && (!with_assist_direct_history_refab)) onHistoryItemPlacement(); // place after crafting -> confirmation first
|
||||
return;
|
||||
}
|
||||
if((type == ClickType.QUICK_MOVE) && (slotId > 9) && (slot.getHasStack())) { // container slots 0..9 are crafting output and grid
|
||||
List<ItemStack> history = te.history.current();
|
||||
boolean palce_in_crafting_grid = (!history.isEmpty());
|
||||
if(!palce_in_crafting_grid) {
|
||||
for(int i=0; i<9; ++i) {
|
||||
if(!(te.getStackInSlot(i).isEmpty())) { palce_in_crafting_grid = true; break; }
|
||||
if((type == ClickType.QUICK_MOVE) && (slotId > 0) && (slot.getHasStack())) { // container slots 0 is crafting output
|
||||
if(with_assist) {
|
||||
List<ItemStack> history = te.history.current();
|
||||
boolean palce_in_crafting_grid = false;
|
||||
if(slotId > 9) { // container slots 1..9 are crafting grid
|
||||
palce_in_crafting_grid = (!history.isEmpty());
|
||||
if(!palce_in_crafting_grid) {
|
||||
for(int i = 0; i < 9; ++i) {
|
||||
if(!(te.getStackInSlot(i).isEmpty())) {
|
||||
palce_in_crafting_grid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(palce_in_crafting_grid) {
|
||||
// Explicit grid placement.
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
nbt.setInteger("action", ACTION_PLACE_SHIFTCLICKED_STACK);
|
||||
nbt.setInteger("containerslot", slotId);
|
||||
if(ModAuxiliaries.isCtrlDown()) nbt.setBoolean("move-all", true);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
return;
|
||||
} else if(ModAuxiliaries.isCtrlDown()) {
|
||||
// Move all same items from the inventory of the clicked slot
|
||||
// (or the crafting grid) to the corresponding target inventory.
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
nbt.setInteger("action", ACTION_MOVE_ALL_STACKS);
|
||||
nbt.setInteger("containerslot", slotId);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
return;
|
||||
} else {
|
||||
// Let the normal slot click handle that.
|
||||
}
|
||||
}
|
||||
if(palce_in_crafting_grid) {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
nbt.setInteger("action", ACTION_PLACE_SHIFTCLICKED_STACK);
|
||||
nbt.setInteger("containerslot", slotId);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handleMouseClick(slot, slotId, mouseButton, type);
|
||||
}
|
||||
|
||||
private boolean mouseScrolled(int mouseX, int mouseY, int wheel_inc)
|
||||
{
|
||||
final Slot resultSlot = getSlotUnderMouse();
|
||||
if((!with_crafting_slot_mouse_scrolling) || (!(resultSlot instanceof BSlotCrafting))) return false;
|
||||
int count = resultSlot.getStack().getCount();
|
||||
int limit = (ModAuxiliaries.isShiftDown() ? 2 : 1) * (ModAuxiliaries.isCtrlDown() ? 4 : 1);
|
||||
if(wheel_inc > 0) {
|
||||
if(count > 0) {
|
||||
if((count < resultSlot.getStack().getMaxStackSize()) && (count < resultSlot.getSlotStackLimit())) {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
nbt.setInteger("action", ACTION_INCREASE_CRAFTING_STACKS);
|
||||
if(limit > 1) nbt.setInteger("limit", limit);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
}
|
||||
} else if(!te.history.current().isEmpty()) {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
nbt.setInteger("action", ACTION_PLACE_CURRENT_HISTORY_SEL);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
}
|
||||
} else if(wheel_inc < 0) {
|
||||
if(count > 0) {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
if(limit > 1) nbt.setInteger("limit", limit);
|
||||
nbt.setInteger("action", ACTION_DECREASE_CRAFTING_STACKS);
|
||||
Networking.PacketTileNotify.sendToServer(te, nbt);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void onHistoryItemPlacement()
|
||||
{
|
||||
if(te.history.current().isEmpty()) return;
|
||||
|
@ -790,6 +863,13 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
}
|
||||
}
|
||||
|
||||
private static class SlotRange
|
||||
{
|
||||
public final IInventory inventory;
|
||||
public int start_slot, end_slot;
|
||||
public SlotRange(IInventory inv, int start, int end) { inventory=inv; start_slot=start; end_slot=end; }
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
// Tile entity
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -826,6 +906,8 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
|
||||
// private aux methods ---------------------------------------------------------------------
|
||||
|
||||
enum PlacementResult { UNCHANGED, INCOMPLETE, PLACED }
|
||||
|
||||
private boolean has_recipe_collision()
|
||||
{ return has_recipe_collision_; }
|
||||
|
||||
|
@ -845,7 +927,7 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
return false;
|
||||
}
|
||||
|
||||
private List<ItemStack> crafting_slot_stacks_to_add()
|
||||
private List<ItemStack> refab_crafting_stacks()
|
||||
{
|
||||
final ArrayList<ItemStack> slots = new ArrayList<ItemStack>();
|
||||
final List<ItemStack> tocraft = history.current();
|
||||
|
@ -887,30 +969,46 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
return slots;
|
||||
}
|
||||
|
||||
private List<ItemStack> incr_crafting_grid_stacks(int count)
|
||||
{
|
||||
final ArrayList<ItemStack> stacks = new ArrayList<ItemStack>();
|
||||
for(int i=0; i<9; ++i) {
|
||||
final ItemStack palced = getStackInSlot(i+CRAFTING_SLOTS_BEGIN).copy();
|
||||
if(!palced.isEmpty()) palced.setCount(count);
|
||||
stacks.add(palced);
|
||||
}
|
||||
return stacks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves as much items from the stack to the slots in range [first_slot, last_slot] of the inventory,
|
||||
* filling up existing stacks first, then (player inventory only) checks appropriate empty slots next
|
||||
* 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`.
|
||||
*/
|
||||
private ItemStack move_stack_to_inventory(final ItemStack stack_to_move, IInventory inventory, final int slot_begin, final int slot_end, boolean only_fillup)
|
||||
private ItemStack move_stack_to_inventory(final ItemStack stack_to_move, SlotRange range, boolean only_fillup, int limit)
|
||||
{
|
||||
final IInventory inventory = range.inventory;
|
||||
final int slot_begin = range.start_slot;
|
||||
final int slot_end = range.end_slot;
|
||||
final ItemStack mvstack = stack_to_move.copy();
|
||||
if((mvstack.isEmpty()) || (slot_begin < 0) || (slot_end > inventory.getSizeInventory())) return mvstack;
|
||||
int limit_left = (limit>0) ? (Math.min(limit, mvstack.getMaxStackSize())) : (mvstack.getMaxStackSize());
|
||||
// first iteration: fillup existing stacks
|
||||
for(int i = slot_begin; i < slot_end; ++i) {
|
||||
final ItemStack stack = inventory.getStackInSlot(i);
|
||||
if((stack.isEmpty()) || (!isItemExactlyEqual(stack,mvstack))) continue;
|
||||
int nmax = stack.getMaxStackSize() - stack.getCount();
|
||||
if((stack.isEmpty()) || (!stack.isItemEqual(mvstack))) continue;
|
||||
int nmax = Math.min(limit_left, stack.getMaxStackSize() - stack.getCount());
|
||||
if(mvstack.getCount() <= nmax) {
|
||||
stack.setCount(stack.getCount()+mvstack.getCount());
|
||||
mvstack.setCount(0);
|
||||
inventory.setInventorySlotContents(i, stack);
|
||||
return mvstack;
|
||||
} else {
|
||||
stack.setCount(stack.getMaxStackSize());
|
||||
stack.grow(nmax);
|
||||
mvstack.shrink(nmax);
|
||||
inventory.setInventorySlotContents(i, stack);
|
||||
limit_left -= nmax;
|
||||
}
|
||||
}
|
||||
if(only_fillup) return mvstack;
|
||||
|
@ -920,8 +1018,11 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
final ItemStack stack = inventory.getStackInSlot(i);
|
||||
if(!stack.isEmpty()) continue;
|
||||
if((!inventory.getStackInSlot(i+1).isItemEqual(mvstack)) && (!inventory.getStackInSlot(i-1).isItemEqual(mvstack))) continue;
|
||||
inventory.setInventorySlotContents(i, mvstack.copy());
|
||||
mvstack.setCount(0);
|
||||
int nmax = Math.min(limit_left, mvstack.getCount());
|
||||
ItemStack placed = mvstack.copy();
|
||||
placed.setCount(nmax);
|
||||
mvstack.shrink(nmax);
|
||||
inventory.setInventorySlotContents(i, placed);
|
||||
return mvstack;
|
||||
}
|
||||
}
|
||||
|
@ -929,8 +1030,11 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
for(int i = slot_begin; i < slot_end; ++i) {
|
||||
final ItemStack stack = inventory.getStackInSlot(i);
|
||||
if(!stack.isEmpty()) continue;
|
||||
inventory.setInventorySlotContents(i, mvstack.copy());
|
||||
mvstack.setCount(0);
|
||||
int nmax = Math.min(limit_left, mvstack.getCount());
|
||||
ItemStack placed = mvstack.copy();
|
||||
placed.setCount(nmax);
|
||||
mvstack.shrink(nmax);
|
||||
inventory.setInventorySlotContents(i, placed);
|
||||
return mvstack;
|
||||
}
|
||||
return mvstack;
|
||||
|
@ -958,8 +1062,11 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
* Moves as much items from the slots in range [first_slot, last_slot] of the inventory into a new stack.
|
||||
* Implicitly shrinks the inventory stacks and the `request_stack`.
|
||||
*/
|
||||
private ItemStack move_stack_from_inventory(IInventory inventory, final ItemStack request_stack, final int slot_begin, final int slot_end)
|
||||
private ItemStack move_stack_from_inventory(SlotRange range, final ItemStack request_stack)
|
||||
{
|
||||
final IInventory inventory = range.inventory;
|
||||
final int slot_begin = range.start_slot;
|
||||
final int slot_end = range.end_slot;
|
||||
ItemStack fetched_stack = request_stack.copy();
|
||||
fetched_stack.setCount(0);
|
||||
int n_left = request_stack.getCount();
|
||||
|
@ -968,10 +1075,16 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
int smallest_stack_index = -1;
|
||||
for(int i = slot_begin; i < slot_end; ++i) {
|
||||
final ItemStack stack = inventory.getStackInSlot(i);
|
||||
if((!stack.isEmpty()) && (isItemExactlyEqual(stack, request_stack))) {
|
||||
if((!stack.isEmpty()) && (stack.isItemEqual(request_stack))) {
|
||||
// Never automatically place stuff with nbt (except a few allowed like "Damage"),
|
||||
// as this could be a full crate, a valuable tool item, etc. For these recipes
|
||||
// the user has to place this item manually.
|
||||
if(stack.hasTagCompound()) {
|
||||
final NBTTagCompound nbt = stack.getTagCompound();
|
||||
int n = nbt.getSize();
|
||||
if((n > 0) && (nbt.hasKey("Damage"))) --n;
|
||||
if(n > 0) continue;
|
||||
}
|
||||
fetched_stack = stack.copy(); // copy exact stack with nbt and tool damage, otherwise we have an automagical repair of items.
|
||||
fetched_stack.setCount(0);
|
||||
int n = stack.getCount();
|
||||
|
@ -998,10 +1111,10 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
private boolean clear_grid_to_storage(EntityPlayer player)
|
||||
{
|
||||
boolean changed = false;
|
||||
for(int grid_i = CRAFTING_SLOTS_BEGIN; grid_i < (CRAFTING_SLOTS_BEGIN + NUM_OF_CRAFTING_SLOTS); ++grid_i) {
|
||||
for(int grid_i = CRAFTING_SLOTS_BEGIN; grid_i < (CRAFTING_SLOTS_BEGIN+NUM_OF_CRAFTING_SLOTS); ++grid_i) {
|
||||
ItemStack stack = getStackInSlot(grid_i);
|
||||
if(stack.isEmpty()) continue;
|
||||
ItemStack remaining = move_stack_to_inventory(stack, this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS, false);
|
||||
ItemStack remaining = move_stack_to_inventory(stack, new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS), false, 0);
|
||||
setInventorySlotContents(grid_i, remaining);
|
||||
changed = true;
|
||||
}
|
||||
|
@ -1011,67 +1124,72 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
private boolean clear_grid_to_player(EntityPlayer player)
|
||||
{
|
||||
boolean changed = false;
|
||||
for(int grid_i = CRAFTING_SLOTS_BEGIN; grid_i < (CRAFTING_SLOTS_BEGIN + NUM_OF_CRAFTING_SLOTS); ++grid_i) {
|
||||
for(int grid_i = CRAFTING_SLOTS_BEGIN; grid_i < (CRAFTING_SLOTS_BEGIN+NUM_OF_CRAFTING_SLOTS); ++grid_i) {
|
||||
ItemStack remaining = getStackInSlot(grid_i);
|
||||
if(remaining.isEmpty()) continue;
|
||||
remaining = move_stack_to_inventory(remaining, player.inventory,9, 36, true); // prefer filling up inventory stacks
|
||||
remaining = move_stack_to_inventory(remaining, player.inventory,0, 9, true); // then fill up the hotbar stacks
|
||||
remaining = move_stack_to_inventory(remaining, player.inventory,9, 36, false); // then allow empty stacks in inventory
|
||||
remaining = move_stack_to_inventory(remaining, player.inventory,0, 9, false); // then new stacks in the hotbar
|
||||
this.setInventorySlotContents(grid_i, remaining);
|
||||
remaining = move_stack_to_inventory(remaining, new SlotRange(player.inventory,9, 36), true, 0); // prefer filling up inventory stacks
|
||||
remaining = move_stack_to_inventory(remaining, new SlotRange(player.inventory,0, 9), true, 0); // then fill up the hotbar stacks
|
||||
remaining = move_stack_to_inventory(remaining, new SlotRange(player.inventory,9, 36), false, 0); // then allow empty stacks in inventory
|
||||
remaining = move_stack_to_inventory(remaining, new SlotRange(player.inventory,0, 9), false, 0); // then new stacks in the hotbar
|
||||
setInventorySlotContents(grid_i, remaining);
|
||||
changed = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
enum EnumRefabPlacement { UNCHANGED, INCOMPLETE, PLACED }
|
||||
private EnumRefabPlacement place_refab_stacks(IInventory inventory, final int slot_begin, final int slot_end, @Nullable EntityPlayer player)
|
||||
private PlacementResult place_stacks(final SlotRange[] ranges, final List<ItemStack> to_fill, @Nullable EntityPlayer player)
|
||||
{
|
||||
List<ItemStack> to_fill = crafting_slot_stacks_to_add();
|
||||
boolean slots_changed = false;
|
||||
boolean missing_item = false;
|
||||
int num_slots_placed = 0;
|
||||
if(!to_fill.isEmpty()) {
|
||||
for(int it_guard=63; it_guard>=0; --it_guard) {
|
||||
boolean slots_updated = false;
|
||||
for(int i = 0; i < 9; ++i) {
|
||||
final ItemStack req_stack = to_fill.get(i).copy();
|
||||
if(req_stack.isEmpty()) continue;
|
||||
req_stack.setCount(1);
|
||||
to_fill.get(i).shrink(1);
|
||||
final ItemStack mv_stack = move_stack_from_inventory(inventory, req_stack, slot_begin, slot_end);
|
||||
if(mv_stack.isEmpty()) { missing_item=true; continue; }
|
||||
// sizes already checked
|
||||
ItemStack grid_stack = getStackInSlot(i + CRAFTING_SLOTS_BEGIN).copy();
|
||||
if(grid_stack.isEmpty()) {
|
||||
grid_stack = mv_stack.copy();
|
||||
} else {
|
||||
grid_stack.grow(mv_stack.getCount());
|
||||
for(SlotRange slot_range: ranges) {
|
||||
for(int it_guard=63; it_guard>=0; --it_guard) {
|
||||
boolean slots_updated = false;
|
||||
for(int i = 0; i < 9; ++i) {
|
||||
if(to_fill.get(i).isEmpty()) continue;
|
||||
ItemStack grid_stack = getStackInSlot(i + CRAFTING_SLOTS_BEGIN).copy();
|
||||
if(grid_stack.getCount() >= grid_stack.getMaxStackSize()) continue;
|
||||
final ItemStack req_stack = to_fill.get(i).copy();
|
||||
req_stack.setCount(1);
|
||||
final ItemStack mv_stack = move_stack_from_inventory(slot_range, req_stack);
|
||||
if(mv_stack.isEmpty()) continue;
|
||||
to_fill.get(i).shrink(1);
|
||||
if(grid_stack.isEmpty()) {
|
||||
grid_stack = mv_stack.copy();
|
||||
} else {
|
||||
grid_stack.grow(mv_stack.getCount());
|
||||
}
|
||||
setInventorySlotContents(i + CRAFTING_SLOTS_BEGIN, grid_stack);
|
||||
slots_changed = true;
|
||||
slots_updated = true;
|
||||
}
|
||||
setInventorySlotContents(i + CRAFTING_SLOTS_BEGIN, grid_stack);
|
||||
slots_changed = true;
|
||||
slots_updated = true;
|
||||
if(!slots_updated) break;
|
||||
}
|
||||
if(!slots_updated) break;
|
||||
}
|
||||
}
|
||||
boolean missing_item = false;
|
||||
for(ItemStack st:to_fill) {
|
||||
if(!st.isEmpty()) {
|
||||
missing_item = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if((history.current_recipe() != null) && (player!=null) && (player.openContainer instanceof BContainer)) {
|
||||
((BContainer)player.openContainer).craftResult.setRecipeUsed(history.current_recipe());
|
||||
}
|
||||
if(!slots_changed) {
|
||||
return EnumRefabPlacement.UNCHANGED;
|
||||
return PlacementResult.UNCHANGED;
|
||||
} else if(missing_item) {
|
||||
return EnumRefabPlacement.INCOMPLETE;
|
||||
return PlacementResult.INCOMPLETE;
|
||||
} else {
|
||||
return EnumRefabPlacement.PLACED;
|
||||
return PlacementResult.PLACED;
|
||||
}
|
||||
}
|
||||
|
||||
private EnumRefabPlacement distribute_stack(IInventory inventory, final int slotno)
|
||||
private PlacementResult distribute_stack(IInventory inventory, final int slotno)
|
||||
{
|
||||
List<ItemStack> to_refab = crafting_slot_stacks_to_add();
|
||||
List<ItemStack> to_refab = refab_crafting_stacks();
|
||||
ItemStack to_distribute = inventory.getStackInSlot(slotno).copy();
|
||||
if(to_distribute.isEmpty()) return EnumRefabPlacement.UNCHANGED;
|
||||
if(to_distribute.isEmpty()) return PlacementResult.UNCHANGED;
|
||||
int matching_grid_stack_sizes[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
|
||||
int max_matching_stack_size = -1;
|
||||
int min_matching_stack_size = 65;
|
||||
|
@ -1098,9 +1216,9 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
}
|
||||
}
|
||||
}
|
||||
if(min_matching_stack_size < 0) return EnumRefabPlacement.UNCHANGED;
|
||||
if(min_matching_stack_size < 0) return PlacementResult.UNCHANGED;
|
||||
final int stack_limit_size = Math.min(to_distribute.getMaxStackSize(), getInventoryStackLimit());
|
||||
if(min_matching_stack_size >= stack_limit_size) return EnumRefabPlacement.UNCHANGED;
|
||||
if(min_matching_stack_size >= stack_limit_size) return PlacementResult.UNCHANGED;
|
||||
int n_to_distribute = to_distribute.getCount();
|
||||
for(int it_guard=63; it_guard>=0; --it_guard) {
|
||||
if(n_to_distribute <= 0) break;
|
||||
|
@ -1119,7 +1237,7 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
}
|
||||
if(min_matching_stack_size >= stack_limit_size) break; // all full
|
||||
}
|
||||
if(n_to_distribute == to_distribute.getCount()) return EnumRefabPlacement.UNCHANGED; // was already full
|
||||
if(n_to_distribute == to_distribute.getCount()) return PlacementResult.UNCHANGED; // was already full
|
||||
if(n_to_distribute <= 0) {
|
||||
inventory.setInventorySlotContents(slotno, ItemStack.EMPTY);
|
||||
} else {
|
||||
|
@ -1133,9 +1251,30 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
grid_stack.setCount(matching_grid_stack_sizes[i]);
|
||||
setInventorySlotContents(i + CRAFTING_SLOTS_BEGIN, grid_stack);
|
||||
}
|
||||
return EnumRefabPlacement.PLACED;
|
||||
return PlacementResult.PLACED;
|
||||
}
|
||||
|
||||
private boolean decrease_grid_stacks(SlotRange[] ranges, int limit)
|
||||
{
|
||||
boolean changed = false;
|
||||
for(int i=0; i<9; ++i) {
|
||||
ItemStack stack = getStackInSlot(i+CRAFTING_SLOTS_BEGIN).copy();
|
||||
if(stack.isEmpty()) continue;
|
||||
for(SlotRange range:ranges) {
|
||||
ItemStack remaining = move_stack_to_inventory(stack, range, false, limit);
|
||||
if(remaining.getCount() < stack.getCount()) changed = true;
|
||||
boolean stop = (remaining.getCount() <= Math.max(0, (stack.getCount()-limit)));
|
||||
stack = remaining;
|
||||
if(stop) break;
|
||||
}
|
||||
setInventorySlotContents(i+CRAFTING_SLOTS_BEGIN, stack.isEmpty() ? ItemStack.EMPTY : stack);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
private boolean increase_grid_stacks(SlotRange[] ranges, int limit, EntityPlayer player)
|
||||
{ return place_stacks(ranges, incr_crafting_grid_stacks(limit), player) != PlacementResult.UNCHANGED; }
|
||||
|
||||
// Networking.IPacketReceiver --------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
|
@ -1174,42 +1313,99 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
if(clear_grid_to_player(player)) { te_changed = true; player_inventory_changed = true; }
|
||||
} break;
|
||||
case BGui.BUTTON_FROM_STORAGE: {
|
||||
EnumRefabPlacement from_storage = place_refab_stacks(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN + NUM_OF_STORAGE_SLOTS, player);
|
||||
if(from_storage != EnumRefabPlacement.UNCHANGED) te_changed = true;
|
||||
if(place_stacks(new SlotRange[]{
|
||||
new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS)
|
||||
}, refab_crafting_stacks(), player) != PlacementResult.UNCHANGED) {
|
||||
te_changed = true;
|
||||
}
|
||||
} break;
|
||||
case BGui.BUTTON_FROM_PLAYER: {
|
||||
EnumRefabPlacement from_player_inv = place_refab_stacks(player.inventory, 9, 36, player);
|
||||
if(from_player_inv != EnumRefabPlacement.UNCHANGED) { te_changed = true; player_inventory_changed = true; }
|
||||
if(from_player_inv != EnumRefabPlacement.PLACED) {
|
||||
EnumRefabPlacement from_hotbar = place_refab_stacks(player.inventory, 0, 9, player);
|
||||
if(from_hotbar != EnumRefabPlacement.UNCHANGED) { te_changed = true; player_inventory_changed = true; }
|
||||
if(place_stacks(new SlotRange[]{
|
||||
new SlotRange(player.inventory, 9, 36),
|
||||
new SlotRange(player.inventory, 0, 9)
|
||||
}, refab_crafting_stacks(), player) != PlacementResult.UNCHANGED) {
|
||||
te_changed = true; player_inventory_changed = true;
|
||||
}
|
||||
} break;
|
||||
case BGui.ACTION_PLACE_CURRENT_HISTORY_SEL: {
|
||||
EnumRefabPlacement from_storage = place_refab_stacks(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN + NUM_OF_STORAGE_SLOTS, player);
|
||||
if(from_storage != EnumRefabPlacement.UNCHANGED) te_changed = true;
|
||||
if(from_storage != EnumRefabPlacement.PLACED) {
|
||||
EnumRefabPlacement from_player_inv = place_refab_stacks(player.inventory, 9, 36, player);
|
||||
if(from_player_inv != EnumRefabPlacement.UNCHANGED) { te_changed = true; player_inventory_changed = true; }
|
||||
if(from_player_inv != EnumRefabPlacement.PLACED) {
|
||||
EnumRefabPlacement from_hotbar = place_refab_stacks(player.inventory, 0, 9, player);
|
||||
if(from_hotbar != EnumRefabPlacement.UNCHANGED) { te_changed = true; player_inventory_changed = true; }
|
||||
}
|
||||
if(place_stacks(new SlotRange[]{
|
||||
new SlotRange(player.inventory, 0, 9),
|
||||
new SlotRange(player.inventory, 9, 36),
|
||||
new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS)
|
||||
}, refab_crafting_stacks(), player) != PlacementResult.UNCHANGED) {
|
||||
te_changed = true;
|
||||
}
|
||||
} break;
|
||||
case BGui.ACTION_PLACE_SHIFTCLICKED_STACK: {
|
||||
final int container_slot_id = nbt.getInteger("containerslot");
|
||||
if((container_slot_id < 10) || (container_slot_id > 53)) break; // out of range
|
||||
if((container_slot_id < 10) || (container_slot_id > 53)) {
|
||||
break; // out of range
|
||||
}
|
||||
if(container_slot_id >= 46) {
|
||||
// from storage
|
||||
final int storage_slot = container_slot_id - 46 + STORAGE_SLOTS_BEGIN;
|
||||
EnumRefabPlacement stat = distribute_stack(this, storage_slot);
|
||||
if(stat != EnumRefabPlacement.UNCHANGED) te_changed = true;
|
||||
PlacementResult stat = distribute_stack(this, storage_slot);
|
||||
if(stat != PlacementResult.UNCHANGED) te_changed = true;
|
||||
} else {
|
||||
// from player
|
||||
int player_slot = (container_slot_id >= 37) ? (container_slot_id-37) : (container_slot_id-10+9);
|
||||
EnumRefabPlacement stat = distribute_stack(player.inventory, player_slot);
|
||||
if(stat != EnumRefabPlacement.UNCHANGED) { player_inventory_changed = true; te_changed = true; }
|
||||
final ItemStack reference_stack = player.inventory.getStackInSlot(player_slot).copy();
|
||||
if((!reference_stack.isEmpty()) && (distribute_stack(player.inventory, player_slot) != PlacementResult.UNCHANGED)) {
|
||||
player_inventory_changed = true;
|
||||
te_changed = true;
|
||||
if(nbt.hasKey("move-all")) {
|
||||
for(int i=0; i < player.inventory.getSizeInventory(); ++i) {
|
||||
final ItemStack stack = player.inventory.getStackInSlot(i);
|
||||
if(!reference_stack.isItemEqual(stack)) continue;
|
||||
if(distribute_stack(player.inventory, i) == PlacementResult.UNCHANGED) break; // grid is full
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case BGui.ACTION_MOVE_ALL_STACKS: {
|
||||
final int container_slot_id = nbt.getInteger("containerslot");
|
||||
if((container_slot_id < 1) || (container_slot_id > 53)) {
|
||||
break; // out of range
|
||||
} else if(container_slot_id < 10) {
|
||||
// from crafting grid to player inventory, we clear the grid here as this is most likely
|
||||
// what is wanted in the end. Saves clicking the other grid stacks.
|
||||
if(clear_grid_to_player(player)) { te_changed = true; player_inventory_changed = true; }
|
||||
if(clear_grid_to_storage(player)) te_changed = true;
|
||||
break;
|
||||
}
|
||||
IInventory from_inventory;
|
||||
SlotRange[] to_ranges;
|
||||
int from_slot;
|
||||
if(container_slot_id >= 46) {
|
||||
// from storage to player inventory
|
||||
from_inventory = this;
|
||||
from_slot = container_slot_id - 46 + STORAGE_SLOTS_BEGIN;
|
||||
to_ranges = new SlotRange[] {new SlotRange(player.inventory, 9, 36), new SlotRange(player.inventory, 0, 9)};
|
||||
} else {
|
||||
// from player to storage (otherwise ACTION_PLACE_SHIFTCLICKED_STACK would have been used)
|
||||
from_inventory = player.inventory;
|
||||
from_slot = (container_slot_id >= 37) ? (container_slot_id-37) : (container_slot_id-10+9);
|
||||
to_ranges = new SlotRange[] {new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS)};
|
||||
}
|
||||
final ItemStack reference_stack = from_inventory.getStackInSlot(from_slot).copy();
|
||||
if(!reference_stack.isEmpty()) {
|
||||
boolean abort = false;
|
||||
for(int i=0; (i < from_inventory.getSizeInventory()) && (!abort); ++i) {
|
||||
final ItemStack stack = from_inventory.getStackInSlot(i);
|
||||
if(!reference_stack.isItemEqual(stack)) continue;
|
||||
ItemStack remaining = from_inventory.getStackInSlot(i);
|
||||
for(SlotRange range:to_ranges) {
|
||||
remaining = move_stack_to_inventory(remaining, range, false, 0);
|
||||
if(!remaining.isEmpty()) {
|
||||
abort = true; // no space left
|
||||
break;
|
||||
} else {
|
||||
te_changed = player_inventory_changed = true;
|
||||
}
|
||||
}
|
||||
from_inventory.setInventorySlotContents(i, remaining);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case BGui.BUTTON_NEXT_COLLISION_RECIPE: {
|
||||
|
@ -1217,6 +1413,20 @@ public class BlockDecorCraftingTable extends BlockDecorDirected
|
|||
((BContainer)player.openContainer).select_next_collision_recipe(this, player);
|
||||
}
|
||||
} break;
|
||||
case BGui.ACTION_DECREASE_CRAFTING_STACKS: {
|
||||
te_changed = player_inventory_changed = decrease_grid_stacks(new SlotRange[]{
|
||||
new SlotRange(player.inventory, 9, 36),
|
||||
new SlotRange(player.inventory, 0, 9),
|
||||
new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS)
|
||||
}, MathHelper.clamp(nbt.getInteger("limit"), 1, 8));
|
||||
} break;
|
||||
case BGui.ACTION_INCREASE_CRAFTING_STACKS: {
|
||||
te_changed = player_inventory_changed = increase_grid_stacks(new SlotRange[]{
|
||||
new SlotRange(player.inventory, 9, 36),
|
||||
new SlotRange(player.inventory, 0, 9),
|
||||
new SlotRange(this, STORAGE_SLOTS_BEGIN, STORAGE_SLOTS_BEGIN+NUM_OF_STORAGE_SLOTS)
|
||||
}, MathHelper.clamp(nbt.getInteger("limit"), 1, 8), player);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
if(te_changed) markDirty();
|
||||
|
|
|
@ -207,6 +207,9 @@ public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
|
|||
--active_timer_;
|
||||
}
|
||||
boolean active = (active_timer_ > 0);
|
||||
if(requires_power && !active) {
|
||||
proc_time_elapsed_ = Math.max(0, proc_time_elapsed_ - 2*TICK_INTERVAL);
|
||||
}
|
||||
if(proc_time_elapsed_ >= cutting_time_needed) {
|
||||
proc_time_elapsed_ = 0;
|
||||
TreeCutting.chopTree(world, tree_state, tree_pos, 2048, false);
|
||||
|
|
|
@ -76,6 +76,14 @@ public class ModAuxiliaries
|
|||
}
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static final boolean isShiftDown()
|
||||
{ return (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)||Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)); }
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static final boolean isCtrlDown()
|
||||
{ return ((Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)||Keyboard.isKeyDown(Keyboard.KEY_RCONTROL))); }
|
||||
|
||||
/**
|
||||
* Returns true if a given key is translated for the current language.
|
||||
*/
|
||||
|
@ -87,11 +95,11 @@ public class ModAuxiliaries
|
|||
{
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static boolean extendedTipCondition()
|
||||
{ return (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)||Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)); }
|
||||
{ return isShiftDown(); }
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static boolean helpCondition()
|
||||
{ return extendedTipCondition() && ((Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)||Keyboard.isKeyDown(Keyboard.KEY_RCONTROL))); }
|
||||
{ return isShiftDown() && isCtrlDown(); }
|
||||
|
||||
/**
|
||||
* Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT.
|
||||
|
|
|
@ -328,11 +328,15 @@ public class ModConfig
|
|||
@Config.RangeDouble(min=0.001, max=10)
|
||||
public double chair_mob_standup_probability_percent = 1;
|
||||
|
||||
@Config.Comment({"Disables increasing/decreasing the crafting grid items by scrolling over the crafting result slot."})
|
||||
@Config.Name("Crafting table: Move buttons")
|
||||
public boolean with_crafting_quickmove_buttons = false;
|
||||
|
||||
@Config.Comment({"Enables small quick-move arrows from/to player/block storage. " +
|
||||
"Makes the UI a bit too busy, therefore disabled by default."
|
||||
})
|
||||
@Config.Name("Crafting table: Move buttons")
|
||||
public boolean with_crafting_quickmove_buttons = false;
|
||||
@Config.Name("Crafting table: Mouse scrolling")
|
||||
public boolean without_crafting_mouse_scrolling = false;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how many millibuckets can be transferred (per tick) through the valves. " +
|
||||
|
@ -600,7 +604,7 @@ public class ModConfig
|
|||
BlockDecorFurnace.BTileEntity.on_config(tweaks.furnace_smelting_speed_percent, tweaks.furnace_fuel_efficiency_percent, tweaks.furnace_boost_energy_consumption);
|
||||
BlockDecorChair.on_config(optout.without_chair_sitting, optout.without_mob_chair_sitting, tweaks.chair_mob_sitting_probability_percent, tweaks.chair_mob_standup_probability_percent);
|
||||
BlockDecorLadder.on_config(optout.without_ladder_speed_boost);
|
||||
BlockDecorCraftingTable.on_config(optout.without_crafting_table_history, false, tweaks.with_crafting_quickmove_buttons);
|
||||
BlockDecorCraftingTable.on_config(optout.without_crafting_table_history, false, tweaks.with_crafting_quickmove_buttons, tweaks.without_crafting_mouse_scrolling);
|
||||
BlockDecorPipeValve.on_config(tweaks.pipevalve_max_flowrate, tweaks.pipevalve_redstone_slope);
|
||||
BlockDecorFurnaceElectrical.BTileEntity.on_config(tweaks.e_furnace_speed_percent, tweaks.e_furnace_power_consumption);
|
||||
BlockDecorSolarPanel.BTileEntity.on_config(tweaks.solar_panel_peak_power);
|
||||
|
|
|
@ -66,8 +66,8 @@ tile.engineersdecor.clinker_brick_stairs.name=Clinker Brick Stairs
|
|||
tile.engineersdecor.clinker_brick_stairs.help=§6Looks slightly darker and more color intensive than the vanilla brick block.
|
||||
tile.engineersdecor.clinker_brick_stained_stairs.name=Stained Clinker Brick Stairs
|
||||
tile.engineersdecor.clinker_brick_stained_stairs.help=§6Looks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.
|
||||
tile.engineersdecor.slag_brick_stairs.name=Clinker Brick Stairs
|
||||
tile.engineersdecor.slag_brick_stairs.help=§6Looks slightly darker and more color intensive than the vanilla brick block.
|
||||
tile.engineersdecor.slag_brick_stairs.name=Slag Brick Stairs
|
||||
tile.engineersdecor.slag_brick_stairs.help=§6Gray-brown brick stairs.
|
||||
tile.engineersdecor.rebar_concrete_stairs.name=Rebar Concrete Stairs
|
||||
tile.engineersdecor.rebar_concrete_stairs.help=§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.name=Rebar Concrete Tile Stairs
|
||||
|
@ -106,7 +106,8 @@ tile.engineersdecor.treated_wood_crafting_table.name=Treated Wood Crafting Table
|
|||
tile.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.
|
||||
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.
|
||||
tile.engineersdecor.treated_wood_side_table.name=Treated Wood Side Table
|
||||
tile.engineersdecor.treated_wood_side_table.help=§6Needed after the work's done.
|
||||
tile.engineersdecor.iron_inset_light.name=Inset Light
|
||||
|
|
|
@ -9,8 +9,8 @@ engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r Больше информа
|
|||
engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r Помощь§6]§r
|
||||
engineersdecor.tooltip.slabpickup.help=§rБыстрое поднятие щелчком ЛКМ, смотря вверх/вниз с этой плитой в руках.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
engineersdecor.tooltip.requires_rf_power=Requires RF power.
|
||||
engineersdecor.tooltip.massive_speed_boost_with_rf_power=Apply RF power to magnificently increase the speed.
|
||||
engineersdecor.tooltip.requires_rf_power=Требуется RF энергия.
|
||||
engineersdecor.tooltip.massive_speed_boost_with_rf_power=Подайте RF энергию, чтобы значительно увеличить скорость.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.clinker_brick_block.name=Клинкерный кирпич
|
||||
tile.engineersdecor.clinker_brick_block.help=§6Кирпичный блок с вариациями текстуры, зависящими от положения.§r\nВыглядит темнее и интенсивнее, чем Кирпичный блок.
|
||||
|
@ -20,8 +20,8 @@ tile.engineersdecor.slag_brick_block.name=Шлакоблок
|
|||
tile.engineersdecor.slag_brick_block.help=§6Серо-коричневый кирпичный блок с зависимыми от положения вариациями текстуры.
|
||||
tile.engineersdecor.rebar_concrete.name=Железобетон
|
||||
tile.engineersdecor.rebar_concrete.help=§6Стальной железобетонный блок.§r Дорогой, но взрывоустойчивый, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete.name=Gas Concrete Block
|
||||
#tile.engineersdecor.gas_concrete.help=§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.
|
||||
tile.engineersdecor.gas_concrete.name=Газобетон
|
||||
tile.engineersdecor.gas_concrete.help=§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.
|
||||
tile.engineersdecor.panzerglass_block.name=Бронированное стекло
|
||||
tile.engineersdecor.panzerglass_block.help=§6Усиленный стеклоблок.§r Дорогой, взрывоустойчивый. Имеет тёмно-серый оттенок, слегка видны структурные линии, мультитекстура для бесшовного отображения.
|
||||
tile.engineersdecor.rebar_concrete_tile.name=Железобетонная плита
|
||||
|
@ -37,19 +37,19 @@ tile.engineersdecor.rebar_concrete_slab.name=Железобетонная пли
|
|||
tile.engineersdecor.rebar_concrete_slab.help=§6Бетонная плита, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.name=Железобетонная плитка
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.help=§6Бетонная плитка, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete_slab.name=Gas Concrete Slab
|
||||
#tile.engineersdecor.gas_concrete_slab.help=§6Low hardness concrete slab.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.gas_concrete_slab.name=Газобетонная плита
|
||||
tile.engineersdecor.gas_concrete_slab.help=§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.
|
||||
tile.engineersdecor.panzerglass_slab.name=Плита из бронированного стекла
|
||||
tile.engineersdecor.panzerglass_slab.help=§6Усиленная стеклянная плита.§r Дорогая, взрывоустойчивая. Имеет тёмно-серый оттенок, слегка видны структурные линии.
|
||||
tile.engineersdecor.treated_wood_floor.name=Treated Wood Floor
|
||||
#tile.engineersdecor.treated_wood_floor.help=§6Decorative floor tiles with texture variations.§r
|
||||
tile.engineersdecor.treated_wood_floor.name=Пол из обработанного дерева
|
||||
tile.engineersdecor.treated_wood_floor.help=§6Декоративная напольная плитка с текстурными вариациями.§r
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.rebar_concrete_wall.name=Железобетонная стена
|
||||
tile.engineersdecor.rebar_concrete_wall.help=§6Стальная железобетонная стена.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.concrete_wall.name=Бетонная стена
|
||||
tile.engineersdecor.concrete_wall.help=§6Стена из твёрдого бетона.
|
||||
tile.engineersdecor.gas_concrete_wall.name=Gas Concrete Wall
|
||||
#tile.engineersdecor.gas_concrete_wall.help=§6Low hardness concrete wall.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.gas_concrete_wall.name=Газобетонная стена
|
||||
tile.engineersdecor.gas_concrete_wall.help=§6Бетонная стена низкой твердости.§r Легко ломающийся декоративный бетон.
|
||||
tile.engineersdecor.clinker_brick_wall.name=Клинкерная кирпичная стена
|
||||
tile.engineersdecor.clinker_brick_wall.help=§6Обыкновенная клинкерная кирпичная стена.
|
||||
tile.engineersdecor.slag_brick_wall.name=Кирпичная стена из шлакоблока
|
||||
|
@ -66,14 +66,14 @@ tile.engineersdecor.clinker_brick_stairs.name=Клинкерные кирпич
|
|||
tile.engineersdecor.clinker_brick_stairs.help=§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок
|
||||
tile.engineersdecor.clinker_brick_stained_stairs.name=Грязные кирпичные ступеньки
|
||||
tile.engineersdecor.clinker_brick_stained_stairs.help=§6Выглядят немного темнее и интенсивнее, чем Кирпичный блок. Имеют более заметные следы грязи или пятен.
|
||||
tile.engineersdecor.slag_brick_stairs.name=Клинкерные кирпичные ступеньки
|
||||
tile.engineersdecor.slag_brick_stairs.help=§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок.
|
||||
tile.engineersdecor.slag_brick_stairs.name=Кирпичные ступеньки из шлакоблока
|
||||
tile.engineersdecor.slag_brick_stairs.help=§6Серо-коричневые кирпичные ступеньки.
|
||||
tile.engineersdecor.rebar_concrete_stairs.name=Железобетонные ступеньки
|
||||
tile.engineersdecor.rebar_concrete_stairs.help=§6Железобетонные ступеньки.§r Дорогие, но взрывоустойчивые, как обсидиан.
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.name=Ступеньки из железобетонной плитки
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.help=§6Ступеньки из железобетонной плитки.§r Дорогие, но взрывоустойчивые, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete_stairs.name=Gas Concrete Stairs
|
||||
#tile.engineersdecor.gas_concrete_stairs.help=§6Low hardness concrete stairs.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.gas_concrete_stairs.name=Газобетонные ступеньки
|
||||
tile.engineersdecor.gas_concrete_stairs.help=§6Бетонные ступеньки низкой твёрдости.§r Легко ломающийся декоративный бетон.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.treated_wood_pole.name=Прямой обработанный деревянный столб
|
||||
tile.engineersdecor.treated_wood_pole.help=§6Надёжный столб с диаметром, схожим с реле.§r\n\
|
||||
|
@ -103,29 +103,36 @@ tile.engineersdecor.steel_floor_grating.help=§6Декоративное ста
|
|||
tile.engineersdecor.treated_wood_stool.name=Табурет из обработанного дерева
|
||||
tile.engineersdecor.treated_wood_stool.help=§6Крепкий деревянный табурет.§r Для использования в помещении и на улице.
|
||||
tile.engineersdecor.treated_wood_crafting_table.name=Верстак из обработанного дерева
|
||||
tile.engineersdecor.treated_wood_crafting_table.help=§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь.
|
||||
tile.engineersdecor.treated_wood_side_table.name=Treated Wood Side Table
|
||||
tile.engineersdecor.treated_wood_side_table.help=§6Needed after the work's done.
|
||||
tile.engineersdecor.treated_wood_crafting_table.help=§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. \
|
||||
Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка \
|
||||
очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании \
|
||||
если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. \
|
||||
Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.
|
||||
tile.engineersdecor.treated_wood_side_table.name=Столик из обработанного дерева
|
||||
tile.engineersdecor.treated_wood_side_table.help=§6Нужен после того, как работа выполнена.
|
||||
tile.engineersdecor.iron_inset_light.name=Встраиваемый осветитель
|
||||
tile.engineersdecor.iron_inset_light.help=§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n\
|
||||
Полезно для освещения мест, где проблематичны электрические осветительные установки.\
|
||||
Уровень света - как факел.
|
||||
tile.engineersdecor.iron_floor_edge_light.name=Inset Floor Edge Light
|
||||
#tile.engineersdecor.iron_floor_edge_light.help=§6Small glowstone light source, placed at the edge of a floor block.§r\n\
|
||||
Useful to light up places where electrical light installations are problematic.
|
||||
Полезно для освещения мест, где проблематичны электрические осветительные установки.
|
||||
tile.engineersdecor.iron_floor_edge_light.name=Встраиваемый снизу осветитель
|
||||
tile.engineersdecor.iron_floor_edge_light.help=§6Маленький источник света, интегрируемый в нижнюю грань блока.§r\n\
|
||||
Полезно для освещения мест, где проблематичны электрические осветительные установки.
|
||||
tile.engineersdecor.treated_wood_window.name=Обработанное деревянное окно
|
||||
tile.engineersdecor.treated_wood_window.help=§6Деревянный каркас окна с тройным остеклением. Ну и шумоизоляция.
|
||||
tile.engineersdecor.treated_wood_windowsill.name=Обработанный деревянный подоконник
|
||||
tile.engineersdecor.treated_wood_windowsill.help=§6Простое оформление окон.
|
||||
tile.engineersdecor.treated_wood_broad_windowsill.name=Broad Treated Wood Window Sill
|
||||
#tile.engineersdecor.treated_wood_broad_windowsill.help=§6Simple window decoration.
|
||||
tile.engineersdecor.treated_wood_broad_windowsill.name=Широкий обработанный деревянный подоконник
|
||||
tile.engineersdecor.treated_wood_broad_windowsill.help=§6Простое оформление окон.
|
||||
tile.engineersdecor.steel_framed_window.name=Окно со стальной рамой
|
||||
tile.engineersdecor.steel_framed_window.help=§6Стальной каркас окна с тройным остеклением. Хорошо изолирует. §r Не подключается к смежным блокам, таким как стеклянные панели.
|
||||
tile.engineersdecor.steel_mesh_fence.name=Steel Mesh Fence
|
||||
#tile.engineersdecor.steel_mesh_fence.help=§6Industrial style fence.§r\nDoes not connect do regular fences.
|
||||
tile.engineersdecor.steel_mesh_fence.name=Забор из стальной сетки
|
||||
tile.engineersdecor.steel_mesh_fence.help=§6Забор в индустриальном стиле.§r\nНе стыкуется с обычными заборами.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.small_lab_furnace.name=Компактная лабораторная печь
|
||||
tile.engineersdecor.small_lab_furnace.help=§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее, чем каменная, поэтому быстрее. Два внутренних слота для ввода, выхода и топлива.
|
||||
tile.engineersdecor.small_lab_furnace.help=§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. \
|
||||
Немного горячее и изолированней каменной, поэтому быстрее. \
|
||||
Два вспомогательных слота, например для хранения. Два слота-воронки для ввода, вывода, \
|
||||
и топлива. Поместите внешний нагреватель в слот AUX и подключите питание для электрического \
|
||||
повышения скорости обработки.
|
||||
tile.engineersdecor.small_electrical_furnace.name=Компактная конвейерная электрическая печь
|
||||
tile.engineersdecor.small_electrical_furnace.help=§6Компактная конвейерная печь в металлическом корпусе.§r \
|
||||
Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. \
|
||||
|
@ -140,8 +147,7 @@ tile.engineersdecor.small_waste_incinerator.help=§6Отходы с слотам
|
|||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.straight_pipe_valve.name=Одноканальный жидкостный клапан
|
||||
tile.engineersdecor.straight_pipe_valve.help=§6Фрагмент прямой трубы.§r Проводит жидкость только в одном направлении. \
|
||||
Не соединяется по бокам. Уменьшает пропускную способность. \
|
||||
SHIFT для размещения в противоположном направлении.
|
||||
Не соединяется по бокам. Уменьшает пропускную способность. SHIFT для размещения в обратном направлении.
|
||||
tile.engineersdecor.straight_pipe_valve_redstone.name=Краснокаменно-контролируемый жидкостный клапан
|
||||
tile.engineersdecor.straight_pipe_valve_redstone.help=§6Фрагмент прямой трубы.§r Проводит жидкости только в одном направлении. \
|
||||
Не соединяется по бокам. SHIFT для размещения в обратном направлении. \
|
||||
|
@ -154,11 +160,11 @@ tile.engineersdecor.straight_pipe_valve_redstone_analog.help=§6Фрагмент
|
|||
tile.engineersdecor.passive_fluid_accumulator.name=Пассивный жидкостный накопитель
|
||||
tile.engineersdecor.passive_fluid_accumulator.help=§6Вакуумный всасывающий жидкостный коллектор.§r Имеет один выход, все остальные стороны входные. \
|
||||
Сливает жидкости из соседних резервуаров при выкачивании жидкости из выходного порта.
|
||||
tile.engineersdecor.small_fluid_funnel.name=Small Fluid Collection Funnel
|
||||
#tile.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.
|
||||
tile.engineersdecor.small_fluid_funnel.name=Малая воронка для сбора жидкости
|
||||
tile.engineersdecor.small_fluid_funnel.help=§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости \
|
||||
к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости \
|
||||
или ведра. Заполняет только резервуары ниже (сила гравитации). \
|
||||
Совместим с ванильным источником бесконечной воды.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.factory_dropper.name=Фабричный выбрасыватель
|
||||
tile.engineersdecor.factory_dropper.help=§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. \
|
||||
|
@ -168,45 +174,45 @@ tile.engineersdecor.factory_dropper.help=§6Выбрасыватель подх
|
|||
Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, \
|
||||
когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. \
|
||||
Нажмите на все элементы в GUI, чтобы увидеть, как это работает.
|
||||
tile.engineersdecor.factory_hopper.name=Factory Hopper
|
||||
#tile.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).
|
||||
tile.engineersdecor.factory_placer.name=Factory Block Placer
|
||||
#tile.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.
|
||||
tile.engineersdecor.small_block_breaker.name=Factory Block Breaker
|
||||
#tile.engineersdecor.small_block_breaker.help=§6Breaks blocks in front of it.§r\n\
|
||||
Can be disabled by applying a redstone signal. \
|
||||
The time needed to destroy a block depends on the hardness of that block. \
|
||||
tile.engineersdecor.factory_hopper.name=Фабричная воронка
|
||||
tile.engineersdecor.factory_hopper.help=§6Воронка для продвинутой автоматизации производства.§r Может передавать полустеки, максимальный диапазон сбора 9x9.\n\
|
||||
GUI ползунки: Диапазон сбора (0 до 4), задержка помещения(0.5сек до 10сек), размер стека помещения (1 до 32).\n\
|
||||
GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).
|
||||
tile.engineersdecor.factory_placer.name=Фабричный разместитель блоков
|
||||
tile.engineersdecor.factory_placer.help=§6Позволяет размещать блоки и сажать урожай или деревья.§r\n\
|
||||
GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n\
|
||||
Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.
|
||||
tile.engineersdecor.small_block_breaker.name=Фабричный разбиватель блоков
|
||||
tile.engineersdecor.small_block_breaker.help=§6Разбивает блоки перед собой.§r\n\
|
||||
Можно отключить, подав сигнал красного камня. \
|
||||
Время, необходимое для разрушения блока, зависит от твердости этого блока. \
|
||||
${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace
|
||||
#tile.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.
|
||||
tile.engineersdecor.small_solar_panel.name=Small Solar Panel
|
||||
#tile.engineersdecor.small_solar_panel.help=§6Produces a small amount of power when exposed to sunlight.§r\n\
|
||||
Useful for charging LF capacitors in remote systems with low consumption. The \
|
||||
internal charge pump circuit accumulates and frequently transfers RF. Production \
|
||||
depends on day time and the weather.
|
||||
tile.engineersdecor.small_tree_cutter.name=Small Tree Cutter
|
||||
#tile.engineersdecor.small_tree_cutter.help=§6Chops grown trees in front of it.§r\n\
|
||||
Does not collect the lumbers. Deactivate with a redstone signal. \
|
||||
tile.engineersdecor.small_mineral_smelter.name=Малая плавильная печь минералов
|
||||
tile.engineersdecor.small_mineral_smelter.help=§6Высокотемпературная электрическая каменная плавильная печь с высокой изоляцией.§r\n\
|
||||
Нагревает минеральные блоки до магматических блоков и, наконец, до лавы. Нажмите с \
|
||||
минеральным блоком (камень, булыжник, и т.п.) или используйте другие способы загрузки. \
|
||||
Используйте ведро или жидкостные насосы для извлечения лавы. При охлаждении \
|
||||
лавы, генерируется обсидиан. Отключите RF питание или подайте сигнал красного \
|
||||
камня для отключения печи. Для автоматизации используйте редстоуновый компаратор, чтобы \
|
||||
увидеть, в какой фазе плавления находится минерал.
|
||||
tile.engineersdecor.small_solar_panel.name=Малая солнечная панель
|
||||
tile.engineersdecor.small_solar_panel.help=§6Вырабатывает небольшое количество энергии при воздействии солнечного света.§r\n\
|
||||
Полезно для зарядки низковольтных конденсаторов в удаленных системах с низким потреблением. \
|
||||
Внутренний контур насоса накапливает и часто передает RF. \
|
||||
Производство зависит от времени суток и погоды.
|
||||
tile.engineersdecor.small_tree_cutter.name=Малый лесоруб
|
||||
tile.engineersdecor.small_tree_cutter.help=§6Вырубает деревья перед ним.§r\n\
|
||||
Не собирает срубленное. Выключается с помощью сигнала красного камня. \
|
||||
${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_milking_machine.name=Small Milking Machine
|
||||
#tile.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.
|
||||
tile.engineersdecor.small_milking_machine.name=Малый доильный аппарат
|
||||
tile.engineersdecor.small_milking_machine.help=§6Изредка чистит и доит коров.§r\n\
|
||||
Имеет внутренний бак для жидкости. Не кормит животных. Используйте ведра для извлечения молока. \
|
||||
Извлекает/кладёт сосуды для молока из/в инвентарь сзади или снизу \
|
||||
(предпочитает извлекать сзади и класть снизу, но может также класть заполненные сосуды обратно в \
|
||||
тот же инвентарь). Поддерживает выход жидкости в резервуары или трубы снизу (только если молоко существует в виде жидкости). \
|
||||
Позаботьтесь, чтобы в загоне не было тесно, добровольно прогуливаются только счастливые животные.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.sign_decor.name=Табличка с надписью (Логотип Engineer's decor)
|
||||
tile.engineersdecor.sign_decor.help=§Это не должно быть крафтовым или видимым в JEI. Используется для творческой вкладки и скриншотов.
|
||||
|
@ -219,16 +225,16 @@ tile.engineersdecor.sign_danger.help=§6Общее предупреждение
|
|||
tile.engineersdecor.sign_defense.name=Знак «Осторожно, впереди система обороны»
|
||||
tile.engineersdecor.sign_defense.help=§6Предупреждающий знак для турелей, катушек Тесла и ловушек.
|
||||
tile.engineersdecor.sign_factoryarea.name=Знак «Заводская зона»
|
||||
tile.engineersdecor.sign_factoryarea.help=§6Там дверь, пожалуйста...
|
||||
tile.engineersdecor.sign_factoryarea.help=§6Маркерный знак для зданий или областей, где расположены действительно большие машины.
|
||||
tile.engineersdecor.sign_exit.name=Знак «Выход»
|
||||
#tile.engineersdecor.sign_exit.help=§6There's the door, please ...
|
||||
tile.engineersdecor.sign_exit.help=§6Там дверь, пожалуйста ...
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.halfslab_rebar_concrete.name=Арматура для бетона
|
||||
tile.engineersdecor.halfslab_rebar_concrete.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_concrete.name=Бетонный срез
|
||||
tile.engineersdecor.halfslab_concrete.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_gas_concrete.name=Gas Concrete Slice
|
||||
#tile.engineersdecor.halfslab_gas_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_gas_concrete.name=Газобетонный срез
|
||||
tile.engineersdecor.halfslab_gas_concrete.help=§6Вертикально наращиваемая часть.§r Правый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_treated_wood.name=Часть обработанного дерева
|
||||
tile.engineersdecor.halfslab_treated_wood.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_sheetmetal_iron.name=Часть железного листового металла
|
||||
|
@ -241,12 +247,12 @@ tile.engineersdecor.halfslab_sheetmetal_gold.name=Часть золотого л
|
|||
tile.engineersdecor.halfslab_sheetmetal_gold.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_sheetmetal_aluminum.name=Часть алюминиевого листового металла
|
||||
tile.engineersdecor.halfslab_sheetmetal_aluminum.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.testblock.name=ED Test Block (do NOT use)
|
||||
#tile.engineersdecor.testblock.help=§6Uncraftable mod testing block with changing experimental functionality. DO NOT USE, may even cause a crash in the worst case!!
|
||||
tile.engineersdecor.testblock.name=ED тестовый блок (НЕ ИСПОЛЬЗОВАТЬ)
|
||||
tile.engineersdecor.testblock.help=§6Несоздаваемый тестовый блок с изменениемизменяющейся экспериментальной функциональностью. НЕ ИСПОЛЬЗОВАТЬ, может даже крашнуть игру в худшем случае!!
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
engineersdecor.config.title=Конфигурация "Engineer's Decor"
|
||||
engineersdecor.config.pattern_excludes=Pattern excludes
|
||||
engineersdecor.config.pattern_includes=Pattern includes
|
||||
engineersdecor.config.pattern_excludes=Шаблон исключает
|
||||
engineersdecor.config.pattern_includes=Шаблон включает
|
||||
engineersdecor.config.without_clinker_bricks=Без клинкерных кирпичей
|
||||
engineersdecor.config.without_slag_bricks=Без шлаковых кирпичей
|
||||
engineersdecor.config.without_rebar_concrete=Без железобетона
|
||||
|
|
|
@ -68,6 +68,7 @@ sanatize:
|
|||
@echo "[1.14] Running sanatising tasks ..."
|
||||
@djs tasks.js trailing-whitespaces
|
||||
@djs tasks.js tabs-to-spaces
|
||||
@djs tasks.js lang-json-fixes
|
||||
@djs tasks.js sync-languages
|
||||
@djs tasks.js version-check
|
||||
@djs tasks.js update-json
|
||||
|
|
|
@ -19,12 +19,6 @@ version = "${version_engineersdecor}"
|
|||
group = "wile.engineersdecor"
|
||||
archivesBaseName = "engineersdecor-${version_minecraft}"
|
||||
|
||||
def signingData = { ->
|
||||
def sp = new Properties()
|
||||
if(file("signing.properties").exists()) file("signing.properties").withInputStream { sp.load(it) }
|
||||
return sp
|
||||
}()
|
||||
|
||||
repositories {
|
||||
maven { name = "Progwml6 maven"; url = "https://dvs1.progwml6.com/files/maven/" } // JEI files
|
||||
maven { name = "ModMaven"; url = "modmaven.k-4u.nl" } // JEI files, fallback
|
||||
|
@ -76,7 +70,7 @@ dependencies {
|
|||
|
||||
processResources {
|
||||
outputs.upToDateWhen { false } // thx to @tterrag for this hint
|
||||
doLast { file("${sourceSets.main.output.resourcesDir}/.gitversion").text = 'git log "-1" "--format=%h"'.execute().in.text.trim() }
|
||||
doLast { file("${sourceSets.main.output.resourcesDir}/.gitversion-engineersdecor").text = 'git log "-1" "--format=%h"'.execute().in.text.trim() }
|
||||
}
|
||||
|
||||
jar {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
org.gradle.daemon=false
|
||||
org.gradle.jvmargs=-Xmx8G
|
||||
version_minecraft=1.14.4
|
||||
version_forge_minecraft=1.14.4-28.1.109
|
||||
version_forge_minecraft=1.14.4-28.1.116
|
||||
version_fml_mappings=20190719-1.14.3
|
||||
version_jei=1.14.4:6.0.0.10
|
||||
version_engineersdecor=1.0.18-b1
|
||||
version_engineersdecor=1.0.18-b4
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"1.14.4": {
|
||||
"1.0.18-b4": "[M] Lang update ru_ru (PR#77, thanks Smollet777).\n[F] Fixed Milking machine cow path issue, added milking delay cow tracking.\n[F] Slab / Slab Slice placement adapted to vanilla standard.",
|
||||
"1.0.18-b3": "[A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).\n[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).",
|
||||
"1.0.18-b2": "[F] Fixed JEI integration warning if nothing is opt'ed out (thx @SDUBZ for reporting).\n[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.18-b1": "[U] Updated to Forge 1.14.4-28.1.109/20190719-1.14.3.\n[A] Added opt-out config for the Small Tree Cutter.",
|
||||
"1.0.17-b3": "[F] Double newline escapes in lang files fixed (\"\\n\" in a tooltip).\n[M] Updated zh_cn lang file (scikirbypoke).",
|
||||
"1.0.17-b2": "[A] Reverse recipes for slabs and slab slices added.\n[M] Inset Floor Edge Light slightly thinner, looks better.",
|
||||
|
@ -41,6 +44,6 @@
|
|||
},
|
||||
"promos": {
|
||||
"1.14.4-recommended": "",
|
||||
"1.14.4-latest": "1.0.18-b1"
|
||||
"1.14.4-latest": "1.0.18-b4"
|
||||
}
|
||||
}
|
|
@ -11,6 +11,19 @@ Mod sources for Minecraft version 1.14.4.
|
|||
|
||||
## Version history
|
||||
|
||||
- v1.0.18-b4 [M] Lang update ru_ru (PR#77, thanks Smollet777).
|
||||
[F] Fixed Milking machine cow path issue, added milking delay cow tracking.
|
||||
[F] Slab / Slab Slice placement adapted to vanilla standard.
|
||||
|
||||
- v1.0.18-b3 [A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the
|
||||
inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).
|
||||
[F] EN Lang file fixed (issue #76, thx Riverstar907).
|
||||
[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).
|
||||
[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).
|
||||
|
||||
- v1.0.18-b2 [F] Fixed JEI integration warning if nothing is opt'ed out (thx @SDUBZ for reporting).
|
||||
[M] Lang ru_ru updated (Smollet777).
|
||||
|
||||
- v1.0.18-b1 [U] Updated to Forge 1.14.4-28.1.109/20190719-1.14.3.
|
||||
[A] Added opt-out config for the Small Tree Cutter.
|
||||
|
||||
|
|
|
@ -371,7 +371,7 @@ public class ModContent
|
|||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final BlockDecorCraftingTable TREATED_WOOD_CRAFTING_TABLE = (BlockDecorCraftingTable)(new BlockDecorCraftingTable(
|
||||
public static final BlockDecorCraftingTable.CraftingTableBlock TREATED_WOOD_CRAFTING_TABLE = (BlockDecorCraftingTable.CraftingTableBlock)(new BlockDecorCraftingTable.CraftingTableBlock(
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1f, 15f).sound(SoundType.WOOD),
|
||||
ModAuxiliaries.getPixeledAABB(1,0,1, 15,15.9,15)
|
||||
|
@ -624,7 +624,7 @@ public class ModContent
|
|||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final TileEntityType<?> TET_TREATED_WOOD_CRAFTING_TABLE = TileEntityType.Builder
|
||||
.create(BlockDecorCraftingTable.BTileEntity::new, TREATED_WOOD_CRAFTING_TABLE)
|
||||
.create(BlockDecorCraftingTable.CraftingTableTileEntity::new, TREATED_WOOD_CRAFTING_TABLE)
|
||||
.build(null)
|
||||
.setRegistryName(ModEngineersDecor.MODID, "te_treated_wood_crafting_table");
|
||||
|
||||
|
@ -743,7 +743,7 @@ public class ModContent
|
|||
// Container registration
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final ContainerType<BlockDecorCraftingTable.BContainer> CT_TREATED_WOOD_CRAFTING_TABLE;
|
||||
public static final ContainerType<BlockDecorCraftingTable.CraftingTableContainer> CT_TREATED_WOOD_CRAFTING_TABLE;
|
||||
public static final ContainerType<BlockDecorDropper.BContainer> CT_FACTORY_DROPPER;
|
||||
public static final ContainerType<BlockDecorPlacer.BContainer> CT_FACTORY_PLACER;
|
||||
public static final ContainerType<BlockDecorHopper.BContainer> CT_FACTORY_HOPPER;
|
||||
|
@ -752,7 +752,7 @@ public class ModContent
|
|||
public static final ContainerType<BlockDecorWasteIncinerator.BContainer> CT_WASTE_INCINERATOR;
|
||||
|
||||
static {
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE = (new ContainerType<BlockDecorCraftingTable.BContainer>(BlockDecorCraftingTable.BContainer::new));
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE = (new ContainerType<BlockDecorCraftingTable.CraftingTableContainer>(BlockDecorCraftingTable.CraftingTableContainer::new));
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE.setRegistryName(ModEngineersDecor.MODID,"ct_treated_wood_crafting_table");
|
||||
CT_FACTORY_DROPPER = (new ContainerType<BlockDecorDropper.BContainer>(BlockDecorDropper.BContainer::new));
|
||||
CT_FACTORY_DROPPER.setRegistryName(ModEngineersDecor.MODID,"ct_factory_dropper");
|
||||
|
@ -853,7 +853,7 @@ public class ModContent
|
|||
@OnlyIn(Dist.CLIENT)
|
||||
public static final void registerContainerGuis(final FMLClientSetupEvent event)
|
||||
{
|
||||
ScreenManager.registerFactory(CT_TREATED_WOOD_CRAFTING_TABLE, BlockDecorCraftingTable.BGui::new);
|
||||
ScreenManager.registerFactory(CT_TREATED_WOOD_CRAFTING_TABLE, BlockDecorCraftingTable.CraftingTableGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_DROPPER, BlockDecorDropper.BGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_PLACER, BlockDecorPlacer.BGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_HOPPER, BlockDecorHopper.BGui::new);
|
||||
|
@ -865,6 +865,6 @@ public class ModContent
|
|||
@OnlyIn(Dist.CLIENT)
|
||||
public static final void registerTileEntityRenderers(final FMLClientSetupEvent event)
|
||||
{
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(BlockDecorCraftingTable.BTileEntity.class, new wile.engineersdecor.detail.ModTesrs.TesrDecorCraftingTable());
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(BlockDecorCraftingTable.CraftingTableTileEntity.class, new wile.engineersdecor.detail.ModTesrs.TesrDecorCraftingTable());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package wile.engineersdecor;
|
||||
|
||||
import net.minecraft.client.util.InputMappings;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import wile.engineersdecor.detail.ModConfig;
|
||||
import wile.engineersdecor.detail.Networking;
|
||||
import wile.engineersdecor.blocks.*;
|
||||
|
@ -32,18 +35,21 @@ import org.apache.logging.log4j.LogManager;
|
|||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
@Mod("engineersdecor")
|
||||
public class ModEngineersDecor
|
||||
{
|
||||
public static final String MODID = "engineersdecor";
|
||||
public static final String MODNAME = "Engineer's Decor";
|
||||
public static final int VERSION_DATAFIXER = 0;
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private static boolean config_loaded = false;
|
||||
|
||||
public ModEngineersDecor()
|
||||
{
|
||||
ModAuxiliaries.logGitVersion(MODNAME);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetup);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSendImc);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onRecvImc);
|
||||
|
@ -143,19 +149,17 @@ public class ModEngineersDecor
|
|||
default @Nullable PlayerEntity getPlayerClientSide() { return null; }
|
||||
default @Nullable World getWorldClientSide() { return null; }
|
||||
default @Nullable Minecraft mc() { return null; }
|
||||
default Optional<Boolean> isCtrlDown() { return Optional.empty(); }
|
||||
}
|
||||
public static final class ClientProxy implements ISidedProxy
|
||||
{
|
||||
public @Nullable PlayerEntity getPlayerClientSide() { return Minecraft.getInstance().player; }
|
||||
public @Nullable World getWorldClientSide() { return Minecraft.getInstance().world; }
|
||||
public @Nullable Minecraft mc() { return Minecraft.getInstance(); }
|
||||
public Optional<Boolean> isCtrlDown() { return Optional.of(ModAuxiliaries.isCtrlDown()); }
|
||||
}
|
||||
public static final class ServerProxy implements ISidedProxy
|
||||
{
|
||||
public @Nullable PlayerEntity getPlayerClientSide() { return null; }
|
||||
public @Nullable World getWorldClientSide() { return null; }
|
||||
public @Nullable Minecraft mc() { return null; }
|
||||
}
|
||||
{}
|
||||
|
||||
//
|
||||
// Item group / creative tab
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -9,6 +9,9 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.IFluidState;
|
||||
import net.minecraft.world.IWorld;
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
|
@ -40,7 +43,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
|
||||
public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
||||
public class BlockDecorHalfSlab extends BlockDecor.WaterLoggable
|
||||
{
|
||||
public static final IntegerProperty PARTS = IntegerProperty.create("parts", 0, 14);
|
||||
|
||||
|
@ -103,7 +106,7 @@ public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
|||
|
||||
@Override
|
||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, WATERLOGGED); }
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS); }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
|
@ -193,4 +196,13 @@ public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
|||
SoundType st = this.getSoundType(state, world, pos, null);
|
||||
world.playSound(player, pos, st.getPlaceSound(), SoundCategory.BLOCKS, (st.getVolume()+1f)/2.5f, 0.9f*st.getPitch());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean receiveFluid(IWorld world, BlockPos pos, BlockState state, IFluidState fluidState)
|
||||
{ return (state.get(PARTS)==14) ? false : super.receiveFluid(world, pos, state, fluidState); }
|
||||
|
||||
@Override
|
||||
public boolean canContainFluid(IBlockReader world, BlockPos pos, BlockState state, Fluid fluid)
|
||||
{ return (state.get(PARTS)==14) ? false : super.canContainFluid(world, pos, state, fluid); }
|
||||
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ import javax.annotation.Nonnull;
|
|||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
||||
|
@ -143,12 +144,14 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public static final int MAX_ENERGY_BUFFER = 16000;
|
||||
public static final int MAX_ENERGY_TRANSFER = 512;
|
||||
public static final int DEFAULT_ENERGY_CONSUMPTION = 0;
|
||||
public static final int DEFAULT_MILKING_DELAY_PER_COW = 4000;
|
||||
private static final Direction FLUID_TRANSFER_DIRECTRIONS[] = {Direction.DOWN,Direction.EAST,Direction.SOUTH,Direction.WEST,Direction.NORTH};
|
||||
private enum MilkingState { IDLE, PICKED, COMING, POSITIONING, MILKING, LEAVING, WAITING }
|
||||
|
||||
private static FluidStack milk_fluid_ = new FluidStack(Fluids.WATER, 0);
|
||||
private static HashMap<ItemStack, ItemStack> milk_containers_ = new HashMap<>();
|
||||
private static int energy_consumption = DEFAULT_ENERGY_CONSUMPTION;
|
||||
private static long min_milking_delay_per_cow_ticks = DEFAULT_MILKING_DELAY_PER_COW;
|
||||
private int tick_timer_;
|
||||
private int energy_stored_;
|
||||
private int tank_level_ = 0;
|
||||
|
@ -158,9 +161,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
private int state_timer_ = 0;
|
||||
private BlockPos tracked_cow_original_position_ = null;
|
||||
|
||||
public static void on_config(int energy_consumption_per_tick)
|
||||
public static void on_config(int energy_consumption_per_tick, int min_milking_delay_per_cow)
|
||||
{
|
||||
energy_consumption = MathHelper.clamp(energy_consumption_per_tick, 0, 128);
|
||||
min_milking_delay_per_cow_ticks = MathHelper.clamp(min_milking_delay_per_cow, 1000, 24000);
|
||||
{
|
||||
Fluid milk = null; // FluidRe.getFluid("milk");
|
||||
if(milk != null) milk_fluid_ = new FluidStack(milk, BUCKET_SIZE);
|
||||
|
@ -299,8 +303,9 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
|
||||
// ITickable ------------------------------------------------------------------------------------
|
||||
|
||||
private void log(String s)
|
||||
{} // println("Milker|" + s); may be enabled with config, for dev was println
|
||||
private void log(String s) {} // println("Milker|" + s); may be enabled with config, for dev was println
|
||||
|
||||
private static final HashMap<Integer, Long> tracked_cows_ = new HashMap<Integer, Long>();
|
||||
|
||||
private static ItemStack milk_filled_container_item(ItemStack stack)
|
||||
{ return milk_containers_.entrySet().stream().filter(e->e.getKey().isItemEqual(stack)).map(Map.Entry::getValue).findFirst().orElse(ItemStack.EMPTY); }
|
||||
|
@ -331,6 +336,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
if(cow != null) {
|
||||
cow.setNoAI(false);
|
||||
SingleMoveGoal.abortFor(cow);
|
||||
tracked_cows_.remove(cow.getEntityId());
|
||||
for(int id:tracked_cows_.keySet().stream().filter(i->cow.getEntityWorld().getEntityByID(i)==null).collect(Collectors.toList())) {
|
||||
tracked_cows_.remove(id);
|
||||
}
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
state_ = MilkingState.IDLE;
|
||||
|
@ -345,8 +354,15 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
CowEntity cow = null;
|
||||
{
|
||||
AxisAlignedBB aabb = new AxisAlignedBB(pos.offset(facing, 3)).grow(4, 2, 4);
|
||||
final long t = world.getGameTime();
|
||||
final List<CowEntity> cows = world.getEntitiesWithinAABB(CowEntity.class, aabb,
|
||||
e->( ((tracked_cow_==null) && ((!e.isChild()) && (!e.isInLove()) && (!e.isBeingRidden()))) || (e.getUniqueID().equals(tracked_cow_)) )
|
||||
e-> {
|
||||
if(e.getUniqueID().equals(tracked_cow_)) return true;
|
||||
if((tracked_cow_!=null) || e.isChild() || e.isInLove() || e.isBeingRidden()) return false;
|
||||
if(!e.getNavigator().noPath()) return false;
|
||||
if(Math.abs(tracked_cows_.getOrDefault(e.getEntityId(), 0L)-t) < min_milking_delay_per_cow_ticks) return false;
|
||||
return true;
|
||||
}
|
||||
);
|
||||
if(cows.size() == 1) {
|
||||
cow = cows.get(0); // tracked or only one
|
||||
|
@ -372,11 +388,12 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
BlockPos p = getPos().offset(facing,2);
|
||||
log("Idle: Shove off");
|
||||
blocker.setNoAI(false);
|
||||
SingleMoveGoal.startFor(blocker, p, 2, 1.0, (goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>49));
|
||||
SingleMoveGoal.startFor(blocker, p, 2, 1.0, (goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>100));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if(cow.getLeashed() || cow.isChild() || cow.isInLove() || (!cow.onGround) || cow.isBeingRidden() || cow.isSprinting()) return false;
|
||||
tracked_cows_.put(cow.getEntityId(), cow.getEntityWorld().getGameTime());
|
||||
tracked_cow_ = cow.getUniqueID();
|
||||
state_ = MilkingState.PICKED;
|
||||
state_timeout_ = 200;
|
||||
|
@ -387,13 +404,7 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
case PICKED: {
|
||||
SingleMoveGoal.startFor(
|
||||
cow, target_pos, 2, 1.0,
|
||||
(goal, world, pos)->{
|
||||
if(pos.distanceSq(goal.getCreature().getPosition())>100) return true;
|
||||
for(int i=0; i<4; ++i) {
|
||||
if(world.getBlockState(pos.offset(Direction.byHorizontalIndex(i))).getBlock() instanceof BlockDecorMilker) return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
(goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>100),
|
||||
(goal, world, pos)->{
|
||||
log("move: position reached");
|
||||
goal.getCreature().setLocationAndAngles(goal.getTargetPosition().getX(), goal.getTargetPosition().getY(), goal.getTargetPosition().getZ(), facing.getHorizontalAngle(), 0);
|
||||
|
@ -422,6 +433,7 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
}
|
||||
case POSITIONING: {
|
||||
log("Positioning: start milking");
|
||||
SingleMoveGoal.abortFor(cow);
|
||||
cow.setNoAI(true);
|
||||
cow.setLocationAndAngles(target_pos.getX(), target_pos.getY(), target_pos.getZ(), facing.getHorizontalAngle(), 0);
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_COW_MILK, SoundCategory.BLOCKS, 0.5f, 1f);
|
||||
|
@ -447,13 +459,18 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
state_timer_ = 500;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
state_ = MilkingState.WAITING;
|
||||
tracked_cows_.put(cow.getEntityId(), cow.getEntityWorld().getGameTime());
|
||||
log("Leaving: process done");
|
||||
return true;
|
||||
}
|
||||
case WAITING: {
|
||||
// wait for the timeout to kick in until starting with the next.
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
log("Waiting: ...");
|
||||
if(state_timer_ < 40) {
|
||||
tracked_cow_ = null;
|
||||
release_cow(null);
|
||||
}
|
||||
log("Waiting time elapsed");
|
||||
return true;
|
||||
}
|
||||
default: {
|
||||
|
@ -510,8 +527,9 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
{
|
||||
@FunctionalInterface public interface TargetPositionInValidCheck { boolean test(SingleMoveGoal goal, IWorldReader world, BlockPos pos); }
|
||||
@FunctionalInterface public interface StrollEvent { void apply(SingleMoveGoal goal, IWorldReader world, Vec3d pos); }
|
||||
private static void log(String s) {} // println(s);
|
||||
private static void log(String s) {} // println("SingleMoveGoal: "+s);
|
||||
|
||||
private static final HashMap<Integer, SingleMoveGoal> tracked_entities_ = new HashMap<Integer, SingleMoveGoal>();
|
||||
private static final int motion_timeout = 20*20;
|
||||
private boolean aborted_;
|
||||
private boolean in_position_;
|
||||
|
@ -538,14 +556,40 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public static void startFor(CreatureEntity entity, BlockPos target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition)
|
||||
{ startFor(entity, new Vec3d(target_pos.getX(),target_pos.getY(),target_pos.getZ()), priority, speed, abort_condition, null, null); }
|
||||
|
||||
public static void startFor(CreatureEntity entity, Vec3d target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{ entity.goalSelector.addGoal(priority, new SingleMoveGoal(entity, target_pos, speed, abort_condition, on_position_reached, on_aborted)); }
|
||||
public static boolean startFor(CreatureEntity entity, Vec3d target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{
|
||||
synchronized(tracked_entities_) {
|
||||
SingleMoveGoal goal = tracked_entities_.getOrDefault(entity.getEntityId(), null);
|
||||
if(goal != null) {
|
||||
if(!goal.aborted()) return false; // that is still running.
|
||||
entity.goalSelector.removeGoal(goal);
|
||||
}
|
||||
log("::start("+entity.getEntityId()+")");
|
||||
goal = new SingleMoveGoal(entity, target_pos, speed, abort_condition, on_position_reached, on_aborted);
|
||||
tracked_entities_.put(entity.getEntityId(), goal);
|
||||
entity.goalSelector.addGoal(priority, goal);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isActiveFor(CreatureEntity entity)
|
||||
{ return (entity != null) && (entity.goalSelector.getRunningGoals().anyMatch(g->(g.getGoal()) instanceof SingleMoveGoal)); }
|
||||
{ return (entity != null) && (entity.goalSelector.getRunningGoals().anyMatch(
|
||||
g->((g.getGoal()) instanceof SingleMoveGoal) && (!((SingleMoveGoal)(g.getGoal())).aborted())
|
||||
)); }
|
||||
|
||||
public static void abortFor(CreatureEntity entity)
|
||||
{ entity.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->((SingleMoveGoal)g.getGoal()).abort()); }
|
||||
{
|
||||
log("::abort("+entity.getEntityId()+")");
|
||||
if(entity.isAlive()) {
|
||||
entity.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->((SingleMoveGoal)g.getGoal()).abort());
|
||||
}
|
||||
final World world = entity.getEntityWorld();
|
||||
if(world != null) {
|
||||
// @todo: check nicer way to filter a map.
|
||||
List<Integer> to_remove = tracked_entities_.keySet().stream().filter(i->(world.getEntityByID(i) == null)).collect(Collectors.toList());
|
||||
for(int id:to_remove)tracked_entities_.remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
public Vec3d getTargetPosition()
|
||||
{ return target_pos_; }
|
||||
|
@ -553,34 +597,48 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public CreatureEntity getCreature()
|
||||
{ return creature; }
|
||||
|
||||
public void abort()
|
||||
public synchronized void abort()
|
||||
{ aborted_ = true; }
|
||||
|
||||
public synchronized boolean aborted()
|
||||
{ return aborted_; }
|
||||
|
||||
public synchronized void initialize(Vec3d target_pos, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{
|
||||
abort_condition_ = abort_condition;
|
||||
on_target_position_reached_ = on_position_reached;
|
||||
on_aborted_ = on_aborted;
|
||||
destinationBlock = new BlockPos(target_pos.getX(), target_pos.getY(), target_pos.getZ());
|
||||
timeoutCounter = 0;
|
||||
runDelay = 0;
|
||||
aborted_ = false;
|
||||
was_aborted_ = false;
|
||||
target_pos_ = new Vec3d(target_pos.getX(), target_pos.getY(), target_pos.getZ());
|
||||
// this.movementSpeed = speed; -> that is final, need to override tick and func_whatever
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetTask()
|
||||
{ runDelay = 0; timeoutCounter = 0; }
|
||||
|
||||
@Override
|
||||
public double getTargetDistanceSq()
|
||||
{ return 1.2; }
|
||||
{ return 0.7; }
|
||||
|
||||
@Override
|
||||
public boolean shouldMove()
|
||||
{ return (timeoutCounter & 0x7) == 0; }
|
||||
{ return (!aborted()) && (timeoutCounter & 0x7) == 0; }
|
||||
|
||||
@Override
|
||||
public boolean shouldExecute()
|
||||
{
|
||||
if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
aborted_ = true;
|
||||
return false;
|
||||
} else if(aborted_) {
|
||||
// shouldExecute is the point where in GoalSelector.tick() the goal is not in flagGoals and can be removed.
|
||||
creature.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->creature.goalSelector.removeGoal(g));
|
||||
creature.goalSelector.removeGoal(this);
|
||||
if(aborted_) {
|
||||
if((!was_aborted_) && (on_aborted_!=null)) on_aborted_.apply(this, creature.world, target_pos_);
|
||||
was_aborted_ = true;
|
||||
return false;
|
||||
} else if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
synchronized(this) { aborted_ = true; }
|
||||
return false;
|
||||
} else if(--runDelay > 0) {
|
||||
return false;
|
||||
} else {
|
||||
|
@ -592,32 +650,69 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
@Override
|
||||
public void startExecuting()
|
||||
{
|
||||
log("startExecuting()");
|
||||
timeoutCounter = 0;
|
||||
if(!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), this.movementSpeed)) abort();
|
||||
if(!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), this.movementSpeed)) {
|
||||
abort();
|
||||
log("startExecuting() -> abort, no path");
|
||||
} else {
|
||||
log("startExecuting() -> started");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shouldContinueExecuting()
|
||||
{
|
||||
if((aborted_) || (creature.getNavigator().noPath()) || (timeoutCounter > motion_timeout) || (!shouldMoveTo(creature.world, destinationBlock))) {
|
||||
if(aborted()) {
|
||||
log("shouldContinueExecuting() -> already aborted");
|
||||
return false;
|
||||
} else if(creature.getNavigator().noPath()) {
|
||||
if((!creature.getNavigator().setPath(creature.getNavigator().func_225466_a(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), 0), movementSpeed))) {
|
||||
log("shouldContinueExecuting() -> abort, no path");
|
||||
abort();
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if(timeoutCounter > motion_timeout) {
|
||||
log("shouldContinueExecuting() -> abort, timeout");
|
||||
abort();
|
||||
return false;
|
||||
} else if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
log("shouldContinueExecuting() -> abort, !shouldMoveTo()");
|
||||
abort();
|
||||
return false;
|
||||
} else {
|
||||
log("shouldContinueExecuting() -> yes");
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldMoveTo(IWorldReader world, BlockPos pos)
|
||||
{ if(!abort_condition_.test(this, world, pos)) { return true; } abort(); return false; }
|
||||
{
|
||||
if(abort_condition_.test(this, world, pos)) {
|
||||
log("shouldMoveTo() -> abort_condition");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
BlockPos testpos = new BlockPos(target_pos_.getX(), creature.getPositionVec().getY(), target_pos_.getZ());
|
||||
if(!testpos.withinDistance(creature.getPositionVec(), getTargetDistanceSq())) {
|
||||
if((++timeoutCounter > motion_timeout)) { abort(); return; }
|
||||
if(shouldMove() && (!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), movementSpeed))) abort();
|
||||
if((++timeoutCounter > motion_timeout)) {
|
||||
log("tick() -> abort, timeoutCounter");
|
||||
abort();
|
||||
return;
|
||||
}
|
||||
if(shouldMove() && (!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), movementSpeed))) {
|
||||
log("tick() -> abort, !tryMoveToXYZ()");
|
||||
abort();
|
||||
}
|
||||
} else {
|
||||
log("tick() -> abort, in position)");
|
||||
in_position_ = true;
|
||||
abort();
|
||||
if(on_target_position_reached_ != null) on_target_position_reached_.apply(this, creature.world, target_pos_);
|
||||
|
|
|
@ -8,7 +8,10 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.IFluidState;
|
||||
import net.minecraft.util.math.*;
|
||||
import net.minecraft.world.IWorld;
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
|
@ -36,7 +39,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
|
||||
public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
||||
public class BlockDecorSlab extends BlockDecor.WaterLoggable
|
||||
{
|
||||
public static final IntegerProperty PARTS = IntegerProperty.create("parts", 0, 2);
|
||||
public static final IntegerProperty TEXTURE_VARIANT = IntegerProperty.create("tvariant", 0, 3);
|
||||
|
@ -93,16 +96,37 @@ public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
|||
|
||||
@Override
|
||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, TEXTURE_VARIANT, WATERLOGGED); }
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, TEXTURE_VARIANT); }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context)
|
||||
{
|
||||
final Direction facing = context.getFace();
|
||||
double y = context.getHitVec().getY();
|
||||
int rnd = MathHelper.clamp((int)(MathHelper.getPositionRandom(context.getPos()) % 4), 0, 3);
|
||||
return super.getStateForPlacement(context).with(PARTS, ((facing==Direction.UP) || ((facing!=Direction.DOWN) && (y < 0.6))) ? 0 : 1).with(TEXTURE_VARIANT, rnd);
|
||||
BlockPos pos = context.getPos();
|
||||
if(context.getWorld().getBlockState(pos).getBlock() == this) return context.getWorld().getBlockState(pos).with(PARTS, 2).with(WATERLOGGED, false);
|
||||
final int rnd = MathHelper.clamp((int)(MathHelper.getPositionRandom(context.getPos()) & 0x3), 0, 3);
|
||||
final Direction face = context.getFace();
|
||||
final BlockState placement_state = super.getStateForPlacement(context).with(TEXTURE_VARIANT, rnd); // fluid state
|
||||
if(face == Direction.UP) return placement_state.with(PARTS, 0);
|
||||
if(face == Direction.DOWN) return placement_state.with(PARTS, 1);
|
||||
if(!face.getAxis().isHorizontal()) return placement_state;
|
||||
final boolean isupper = ((context.getHitVec().getY() - context.getPos().getY()) > 0.5);
|
||||
return placement_state.with(PARTS, isupper ? 1 : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean isReplaceable(BlockState state, BlockItemUseContext context)
|
||||
{
|
||||
if(context.getItem().getItem() != this.asItem()) return false;
|
||||
if(!context.replacingClickedOnBlock()) return true;
|
||||
final Direction face = context.getFace();
|
||||
final int parts = state.get(PARTS);
|
||||
if((face == Direction.UP) && (parts==0)) return true;
|
||||
if((face == Direction.DOWN) && (parts==1)) return true;
|
||||
if(!face.getAxis().isHorizontal()) return false;
|
||||
final boolean isupper = ((context.getHitVec().getY() - context.getPos().getY()) > 0.5);
|
||||
return isupper ? (parts==0) : (parts==1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -123,29 +147,6 @@ public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
|||
public List<ItemStack> dropList(BlockState state, World world, BlockPos pos, boolean explosion)
|
||||
{ return new ArrayList<ItemStack>(Collections.singletonList(new ItemStack(this.asItem(), num_slabs_contained_in_parts_[state.get(PARTS) & 0x3]))); }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult rayTraceResult)
|
||||
{
|
||||
Direction face = rayTraceResult.getFace();
|
||||
final ItemStack stack = player.getHeldItem(hand);
|
||||
if(stack.isEmpty() || (Block.getBlockFromItem(stack.getItem()) != this)) return false;
|
||||
int parts = state.get(PARTS);
|
||||
if(((face == Direction.UP) && (parts == 0)) || ((face == Direction.DOWN) && (parts == 1))) {
|
||||
world.setBlockState(pos, state.with(PARTS, 2), 3);
|
||||
} else {
|
||||
return false; // "not handled" -> let parent decide if a new slab has to be placed on top/bottom.
|
||||
}
|
||||
if(world.isRemote) return true;
|
||||
if(!player.isCreative()) {
|
||||
stack.shrink(1);
|
||||
if(player.inventory != null) player.inventory.markDirty();
|
||||
}
|
||||
SoundType st = this.getSoundType(state, world, pos, null);
|
||||
world.playSound(null, pos, st.getPlaceSound(), SoundCategory.BLOCKS, (st.getVolume()+1f)/2.5f, 0.9f*st.getPitch());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void onBlockClicked(BlockState state, World world, BlockPos pos, PlayerEntity player)
|
||||
|
@ -180,4 +181,11 @@ public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
|||
world.playSound(player, pos, st.getPlaceSound(), SoundCategory.BLOCKS, (st.getVolume()+1f)/2.5f, 0.9f*st.getPitch());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean receiveFluid(IWorld world, BlockPos pos, BlockState state, IFluidState fluidState)
|
||||
{ return (state.get(PARTS)==2) ? false : super.receiveFluid(world, pos, state, fluidState); }
|
||||
|
||||
public boolean canContainFluid(IBlockReader world, BlockPos pos, BlockState state, Fluid fluid)
|
||||
{ return (state.get(PARTS)==2) ? false : super.canContainFluid(world, pos, state, fluid); }
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.energy.CapabilityEnergy;
|
||||
import net.minecraftforge.energy.IEnergyStorage;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
|
@ -61,7 +63,7 @@ public class BlockDecorSolarPanel extends BlockDecor
|
|||
// Tile entity
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static class BTileEntity extends TileEntity implements ITickableTileEntity
|
||||
public static class BTileEntity extends TileEntity implements ITickableTileEntity, ICapabilityProvider, IEnergyStorage
|
||||
{
|
||||
public static final int DEFAULT_PEAK_POWER = 45;
|
||||
public static final int TICK_INTERVAL = 8;
|
||||
|
@ -93,6 +95,51 @@ public class BlockDecorSolarPanel extends BlockDecor
|
|||
protected void writenbt(CompoundNBT nbt, boolean update_packet)
|
||||
{ nbt.putInt("energy", accumulated_power_); }
|
||||
|
||||
// IEnergyStorage --------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean canExtract()
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
public boolean canReceive()
|
||||
{ return false; }
|
||||
|
||||
@Override
|
||||
public int getMaxEnergyStored()
|
||||
{ return max_power_storage_; }
|
||||
|
||||
@Override
|
||||
public int getEnergyStored()
|
||||
{ return accumulated_power_; }
|
||||
|
||||
@Override
|
||||
public int extractEnergy(int maxExtract, boolean simulate)
|
||||
{
|
||||
int p = Math.min(accumulated_power_, maxExtract);
|
||||
if(!simulate) accumulated_power_ -= p;
|
||||
return p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int receiveEnergy(int maxReceive, boolean simulate)
|
||||
{ return 0; }
|
||||
|
||||
// ICapabilityProvider ---------------------------------------------------------------------
|
||||
|
||||
protected LazyOptional<IEnergyStorage> energy_handler_ = LazyOptional.of(() -> (IEnergyStorage)this);
|
||||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing)
|
||||
{
|
||||
if(!this.removed && (facing != null)) {
|
||||
if(capability== CapabilityEnergy.ENERGY) {
|
||||
return energy_handler_.cast();
|
||||
}
|
||||
}
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
|
||||
// TileEntity ------------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
|
|
|
@ -192,6 +192,9 @@ public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
|
|||
--active_timer_;
|
||||
}
|
||||
boolean active = (active_timer_ > 0);
|
||||
if(requires_power && !active) {
|
||||
proc_time_elapsed_ = Math.max(0, proc_time_elapsed_ - 2*TICK_INTERVAL);
|
||||
}
|
||||
if(proc_time_elapsed_ >= cutting_time_needed) {
|
||||
proc_time_elapsed_ = 0;
|
||||
TreeCutting.chopTree(world, tree_state, tree_pos, 512, false);
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
* @license MIT (see https://opensource.org/licenses/MIT)
|
||||
*
|
||||
* General commonly used functionality.
|
||||
*
|
||||
* @TODO KEYBOARD INPUT
|
||||
*/
|
||||
package wile.engineersdecor.detail;
|
||||
|
||||
|
@ -26,23 +24,74 @@ import net.minecraft.util.math.AxisAlignedBB;
|
|||
import net.minecraftforge.fml.ModList;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ModAuxiliaries
|
||||
{
|
||||
public static final String MODID = ModEngineersDecor.MODID;
|
||||
public static final Logger LOGGER = ModEngineersDecor.logger();
|
||||
public static final ModEngineersDecor.ISidedProxy PROXY = ModEngineersDecor.proxy;
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Sideness, system/environment, tagging interfaces
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public interface IExperimentalFeature {}
|
||||
|
||||
public static final boolean isModLoaded(final String registry_name)
|
||||
{ return ModList.get().isLoaded(registry_name); }
|
||||
|
||||
public static final boolean isDevelopmentMode()
|
||||
{ return SharedConstants.developmentMode; }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static final boolean isShiftDown()
|
||||
{
|
||||
return (InputMappings.isKeyDown(PROXY.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) ||
|
||||
InputMappings.isKeyDown(PROXY.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_RIGHT_SHIFT));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static final boolean isCtrlDown()
|
||||
{
|
||||
return (InputMappings.isKeyDown(PROXY.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) ||
|
||||
InputMappings.isKeyDown(PROXY.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Logging
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final void logInfo(final String msg)
|
||||
{ LOGGER.info(msg); }
|
||||
|
||||
public static final void logWarn(final String msg)
|
||||
{ LOGGER.warn(msg); }
|
||||
|
||||
public static final void logError(final String msg)
|
||||
{ LOGGER.error(msg); }
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Localization, text formatting
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Text localisation wrapper, implicitly prepends `ModEngineersDecor.MODID` to the
|
||||
* Text localisation wrapper, implicitly prepends `MODID` to the
|
||||
* translation keys. Forces formatting argument, nullable if no special formatting shall be applied..
|
||||
*/
|
||||
public static TranslationTextComponent localizable(String modtrkey, @Nullable TextFormatting color, Object... args)
|
||||
{
|
||||
TranslationTextComponent tr = new TranslationTextComponent(ModEngineersDecor.MODID+"."+modtrkey, args);
|
||||
TranslationTextComponent tr = new TranslationTextComponent(MODID+"."+modtrkey, args);
|
||||
if(color!=null) tr.getStyle().setColor(color);
|
||||
return tr;
|
||||
}
|
||||
|
@ -51,7 +100,7 @@ public class ModAuxiliaries
|
|||
{ return localizable(modtrkey, null); }
|
||||
|
||||
public static TranslationTextComponent localizable_block_key(String blocksubkey)
|
||||
{ return new TranslationTextComponent("block."+ModEngineersDecor.MODID+"."+blocksubkey); }
|
||||
{ return new TranslationTextComponent("block."+MODID+"."+blocksubkey); }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static String localize(String translationKey, Object... args)
|
||||
|
@ -100,21 +149,11 @@ public class ModAuxiliaries
|
|||
{
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static boolean extendedTipCondition()
|
||||
{
|
||||
return (
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) ||
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_RIGHT_SHIFT)
|
||||
);
|
||||
}
|
||||
{ return isShiftDown(); }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static boolean helpCondition()
|
||||
{
|
||||
return extendedTipCondition() && (
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) ||
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().mainWindow.getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL)
|
||||
);
|
||||
}
|
||||
{ return isShiftDown() && isCtrlDown(); }
|
||||
|
||||
/**
|
||||
* Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT.
|
||||
|
@ -143,8 +182,8 @@ public class ModAuxiliaries
|
|||
return true;
|
||||
} else if(addAdvancedTooltipHints) {
|
||||
String s = "";
|
||||
if(tip_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
|
||||
if(help_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.help");
|
||||
if(tip_available) s += localize(MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
|
||||
if(help_available) s += localize(MODID + ".tooltip.hint.help");
|
||||
tooltip.add(new StringTextComponent(s));
|
||||
}
|
||||
return false;
|
||||
|
@ -160,6 +199,10 @@ public class ModAuxiliaries
|
|||
{ return addInformation(stack.getTranslationKey(), stack.getTranslationKey(), tooltip, flag, addAdvancedTooltipHints); }
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Block handling
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1)
|
||||
{ return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); }
|
||||
|
||||
|
@ -187,18 +230,6 @@ public class ModAuxiliaries
|
|||
return bb;
|
||||
}
|
||||
|
||||
public static final boolean isModLoaded(final String registry_name)
|
||||
{ return ModList.get().isLoaded(registry_name); }
|
||||
|
||||
public static final void logInfo(final String msg)
|
||||
{ ModEngineersDecor.logger().info(msg); }
|
||||
|
||||
public static final void logWarn(final String msg)
|
||||
{ ModEngineersDecor.logger().warn(msg); }
|
||||
|
||||
public static final void logError(final String msg)
|
||||
{ ModEngineersDecor.logger().error(msg); }
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static void playerChatMessage(final PlayerEntity player, final String message)
|
||||
{
|
||||
|
@ -206,10 +237,30 @@ public class ModAuxiliaries
|
|||
if(!s.isEmpty()) player.sendMessage(new TranslationTextComponent(s));
|
||||
}
|
||||
|
||||
public static final boolean isDevelopmentMode()
|
||||
{ return SharedConstants.developmentMode; }
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// JAR resource related
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static String loadResourceText(String path)
|
||||
{
|
||||
try {
|
||||
InputStream is = ModAuxiliaries.class.getResourceAsStream(path);
|
||||
if(is==null) return "";
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
|
||||
return br.lines().collect(Collectors.joining("\n"));
|
||||
} catch(Throwable e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public interface IExperimentalFeature {}
|
||||
|
||||
public static void logGitVersion(String mod_name)
|
||||
{
|
||||
try {
|
||||
// Done during construction to have an exact version in case of a crash while registering.
|
||||
String version = ModAuxiliaries.loadResourceText("/.gitversion-" + MODID).trim();
|
||||
logInfo(mod_name+((version.isEmpty())?(" (dev build)"):(" GIT id #"+version)) + ".");
|
||||
} catch(Throwable e) {
|
||||
// (void)e; well, then not. Priority is not to get unneeded crashes because of version logging.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -143,6 +143,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.DoubleValue chair_mob_sitting_probability_percent;
|
||||
public final ForgeConfigSpec.DoubleValue chair_mob_standup_probability_percent;
|
||||
public final ForgeConfigSpec.BooleanValue with_crafting_quickmove_buttons;
|
||||
public final ForgeConfigSpec.BooleanValue without_crafting_mouse_scrolling;
|
||||
public final ForgeConfigSpec.IntValue pipevalve_max_flowrate;
|
||||
public final ForgeConfigSpec.IntValue pipevalve_redstone_gain;
|
||||
public final ForgeConfigSpec.IntValue block_breaker_power_consumption;
|
||||
|
@ -153,6 +154,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.IntValue tree_cuttter_cutting_time_needed;
|
||||
public final ForgeConfigSpec.BooleanValue tree_cuttter_requires_power;
|
||||
public final ForgeConfigSpec.IntValue milking_machine_energy_consumption;
|
||||
public final ForgeConfigSpec.IntValue milking_machine_milking_delay;
|
||||
|
||||
CommonConfig(ForgeConfigSpec.Builder builder)
|
||||
{
|
||||
|
@ -389,6 +391,10 @@ public class ModConfig
|
|||
.comment("Enables small quick-move arrows from/to player/block storage. " +
|
||||
"Makes the UI a bit too busy, therefore disabled by default.")
|
||||
.define("with_crafting_quickmove_buttons", false);
|
||||
without_crafting_mouse_scrolling = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.without_crafting_mouse_scrolling")
|
||||
.comment("Disables increasing/decreasing the crafting grid items by scrolling over the crafting result slot.")
|
||||
.define("without_crafting_mouse_scrolling", false);
|
||||
pipevalve_max_flowrate = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.pipevalve_max_flowrate")
|
||||
.comment("Defines how many millibuckets can be transferred (per tick) through the valves. " +
|
||||
|
@ -471,6 +477,10 @@ public class ModConfig
|
|||
"Use zero to disable energy dependency and energy handling of the machine. " +
|
||||
"The config value can be changed on-the-fly for tuning.")
|
||||
.defineInRange("milking_machine_energy_consumption", BlockDecorMilker.BTileEntity.DEFAULT_ENERGY_CONSUMPTION, 0, 128);
|
||||
milking_machine_milking_delay = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.milking_machine_milking_delay")
|
||||
.comment("Defines (for each individual cow) the minimum time between milking." )
|
||||
.defineInRange("milking_machine_milking_delay", BlockDecorMilker.BTileEntity.DEFAULT_MILKING_DELAY_PER_COW, 1000, 24000);
|
||||
builder.pop();
|
||||
}
|
||||
}
|
||||
|
@ -519,7 +529,7 @@ public class ModConfig
|
|||
excludes_.clear();
|
||||
}
|
||||
// Early non-opt out type based evaluation
|
||||
if(block instanceof BlockDecorCraftingTable) return COMMON.without_crafting_table.get();
|
||||
if(block instanceof BlockDecorCraftingTable.CraftingTableBlock) return COMMON.without_crafting_table.get();
|
||||
if(block instanceof BlockDecorFurnaceElectrical) return COMMON.without_electrical_furnace.get();
|
||||
if((block instanceof BlockDecorFurnace) && (!(block instanceof BlockDecorFurnaceElectrical))) return COMMON.without_lab_furnace.get();
|
||||
if(block instanceof BlockDecorPassiveFluidAccumulator) return COMMON.without_passive_fluid_accumulator.get();
|
||||
|
@ -598,13 +608,13 @@ public class ModConfig
|
|||
BlockDecorFurnace.BTileEntity.on_config(COMMON.furnace_smelting_speed_percent.get(), COMMON.furnace_fuel_efficiency_percent.get(), COMMON.furnace_boost_energy_consumption.get());
|
||||
BlockDecorChair.on_config(COMMON.without_chair_sitting.get(), COMMON.without_mob_chair_sitting.get(), COMMON.chair_mob_sitting_probability_percent.get(), COMMON.chair_mob_standup_probability_percent.get());
|
||||
BlockDecorLadder.on_config(COMMON.without_ladder_speed_boost.get());
|
||||
BlockDecorCraftingTable.on_config(COMMON.without_crafting_table_history.get(), false, COMMON.with_crafting_quickmove_buttons.get());
|
||||
BlockDecorCraftingTable.on_config(COMMON.without_crafting_table_history.get(), false, COMMON.with_crafting_quickmove_buttons.get(), COMMON.without_crafting_mouse_scrolling.get());
|
||||
BlockDecorPipeValve.on_config(COMMON.pipevalve_max_flowrate.get(), COMMON.pipevalve_redstone_gain.get());
|
||||
BlockDecorFurnaceElectrical.BTileEntity.on_config(COMMON.e_furnace_speed_percent.get(), COMMON.e_furnace_power_consumption.get(), COMMON.e_furnace_automatic_pulling.get());
|
||||
BlockDecorSolarPanel.BTileEntity.on_config(COMMON.small_solar_panel_peak_production.get());
|
||||
BlockDecorBreaker.BTileEntity.on_config(COMMON.block_breaker_power_consumption.get(), COMMON.block_breaker_reluctance.get(), COMMON.block_breaker_min_breaking_time.get(), COMMON.block_breaker_requires_power.get());
|
||||
BlockDecorTreeCutter.BTileEntity.on_config(COMMON.tree_cuttter_energy_consumption.get(), COMMON.tree_cuttter_cutting_time_needed.get(), COMMON.tree_cuttter_requires_power.get());
|
||||
BlockDecorMilker.BTileEntity.on_config(COMMON.milking_machine_energy_consumption.get());
|
||||
BlockDecorMilker.BTileEntity.on_config(COMMON.milking_machine_energy_consumption.get(), COMMON.milking_machine_milking_delay.get());
|
||||
without_crafting_table = isOptedOut(ModContent.TREATED_WOOD_CRAFTING_TABLE);
|
||||
immersiveengineering_installed = ModAuxiliaries.isModLoaded("immersiveengineering");
|
||||
with_experimental_features_ = COMMON.with_experimental.get();
|
||||
|
|
|
@ -28,7 +28,7 @@ public class ModTesrs
|
|||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static class TesrDecorCraftingTable extends TileEntityRenderer<BlockDecorCraftingTable.BTileEntity>
|
||||
public static class TesrDecorCraftingTable extends TileEntityRenderer<BlockDecorCraftingTable.CraftingTableTileEntity>
|
||||
{
|
||||
private static int tesr_error_counter = 4;
|
||||
private static double scaler = 0.10;
|
||||
|
@ -43,11 +43,11 @@ public class ModTesrs
|
|||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void render(final BlockDecorCraftingTable.BTileEntity te, double x, double y, double z, float partialTicks, int destroyStage)
|
||||
public void render(final BlockDecorCraftingTable.CraftingTableTileEntity te, double x, double y, double z, float partialTicks, int destroyStage)
|
||||
{
|
||||
if(tesr_error_counter<=0) return;
|
||||
try {
|
||||
int di = MathHelper.clamp(te.getWorld().getBlockState(te.getPos()).get(BlockDecorCraftingTable.FACING).getHorizontalIndex(), 0, 3);
|
||||
int di = MathHelper.clamp(te.getWorld().getBlockState(te.getPos()).get(BlockDecorCraftingTable.CraftingTableBlock.FACING).getHorizontalIndex(), 0, 3);
|
||||
long posrnd = te.getPos().toLong();
|
||||
posrnd = (posrnd>>16)^(posrnd<<1);
|
||||
for(int i=0; i<9; ++i) {
|
||||
|
|
|
@ -204,16 +204,14 @@ public class Networking
|
|||
DEFAULT_CHANNEL.sendTo(new PacketContainerSyncServerToClient(container.windowId, nbt), ((ServerPlayerEntity)player).connection.netManager, NetworkDirection.PLAY_TO_CLIENT);
|
||||
}
|
||||
|
||||
// Container listners are private, and add/remove listener overriding seems not too nice, as
|
||||
// removeListner is client only???
|
||||
|
||||
//public static <C extends Container & INetworkSynchronisableContainer> void sendToListeners(C container, CompoundNBT nbt)
|
||||
//{
|
||||
// for(IContainerListener listener: container.getListeners()) {
|
||||
// if(!(listener instanceof ServerPlayerEntity)) continue;
|
||||
// DEFAULT_CHANNEL.sendTo(new PacketContainerSyncServerToClient(container.windowId, nbt), ((ServerPlayerEntity)listener).connection.netManager, NetworkDirection.PLAY_TO_CLIENT);
|
||||
// }
|
||||
//}
|
||||
public static <C extends Container & INetworkSynchronisableContainer>
|
||||
void sendToListeners(World world, C container, CompoundNBT nbt)
|
||||
{
|
||||
for(PlayerEntity player: world.getPlayers()) {
|
||||
if(player.openContainer.windowId != container.windowId) continue;
|
||||
sendToPlayer(player, container.windowId, nbt);
|
||||
}
|
||||
}
|
||||
|
||||
public PacketContainerSyncServerToClient()
|
||||
{}
|
||||
|
|
|
@ -8,12 +8,12 @@
|
|||
*/
|
||||
package wile.engineersdecor.eapi.jei;
|
||||
|
||||
import mezz.jei.api.constants.VanillaRecipeCategoryUid;
|
||||
import mezz.jei.api.registration.IRecipeTransferRegistration;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.blocks.BlockDecorCraftingTable;
|
||||
import wile.engineersdecor.detail.ModConfig;
|
||||
import wile.engineersdecor.ModContent;
|
||||
import mezz.jei.api.constants.VanillaRecipeCategoryUid;
|
||||
import mezz.jei.api.registration.IRecipeTransferRegistration;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.runtime.IJeiRuntime;
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -35,7 +35,7 @@ public class JEIPlugin implements mezz.jei.api.IModPlugin
|
|||
if(!ModConfig.without_crafting_table) {
|
||||
try {
|
||||
registration.addRecipeTransferHandler(
|
||||
BlockDecorCraftingTable.BContainer.class,
|
||||
BlockDecorCraftingTable.CraftingTableContainer.class,
|
||||
VanillaRecipeCategoryUid.CRAFTING,
|
||||
1, 9, 10, 44
|
||||
);
|
||||
|
@ -54,10 +54,12 @@ public class JEIPlugin implements mezz.jei.api.IModPlugin
|
|||
blacklisted.add(new ItemStack(e.asItem()));
|
||||
}
|
||||
}
|
||||
try {
|
||||
jeiRuntime.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM, blacklisted);
|
||||
} catch(Exception e) {
|
||||
ModEngineersDecor.logger().warn("Exception in JEI opt-out processing: '" + e.getMessage() + "', skipping further JEI optout processing.");
|
||||
if(!blacklisted.isEmpty()) {
|
||||
try {
|
||||
jeiRuntime.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM, blacklisted);
|
||||
} catch(Exception e) {
|
||||
ModEngineersDecor.logger().warn("Exception in JEI opt-out processing: '" + e.getMessage() + "', skipping further JEI optout processing.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,8 +101,8 @@
|
|||
"block.engineersdecor.clinker_brick_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs": "Stained Clinker Brick Stairs",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Clinker Brick Stairs",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Slag Brick Stairs",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Gray-brown brick stairs.",
|
||||
"block.engineersdecor.rebar_concrete_stairs": "Rebar Concrete Stairs",
|
||||
"block.engineersdecor.rebar_concrete_stairs.help": "§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs": "Rebar Concrete Tile Stairs",
|
||||
|
@ -134,7 +134,7 @@
|
|||
"block.engineersdecor.treated_wood_stool": "Treated Wood Stool",
|
||||
"block.engineersdecor.treated_wood_stool.help": "§6Robust Wood Stool.§r Indoor and outdoor use.",
|
||||
"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.",
|
||||
"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_side_table": "Treated Wood Side Table",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.",
|
||||
"block.engineersdecor.iron_inset_light": "Inset Light",
|
||||
|
|
|
@ -7,10 +7,10 @@
|
|||
"engineersdecor.tooltip.hint.extended": "§6[§9SHIFT§r Больше информации§6]§r",
|
||||
"engineersdecor.tooltip.hint.help": "§6[§9CTRL-SHIFT§r Помощь§6]§r",
|
||||
"engineersdecor.tooltip.slabpickup.help": "§rБыстрое поднятие щелчком ЛКМ, смотря вверх/вниз с этой плитой в руках.",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Requires RF power.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Apply RF power to magnificently increase the speed.",
|
||||
"engineersdecor.config.pattern_excludes": "Pattern excludes",
|
||||
"engineersdecor.config.pattern_includes": "Pattern includes",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Требуется RF энергия.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Подайте RF энергию, чтобы значительно увеличить скорость.",
|
||||
"engineersdecor.config.pattern_excludes": "Шаблон исключает",
|
||||
"engineersdecor.config.pattern_includes": "Шаблон включает",
|
||||
"engineersdecor.config.without_clinker_bricks": "Без клинкерных кирпичей",
|
||||
"engineersdecor.config.without_slag_bricks": "Без шлаковых кирпичей",
|
||||
"engineersdecor.config.without_rebar_concrete": "Без железобетона",
|
||||
|
@ -59,7 +59,8 @@
|
|||
"block.engineersdecor.slag_brick_block.help": "§6Серо-коричневый кирпичный блок с зависимыми от положения вариациями текстуры.",
|
||||
"block.engineersdecor.rebar_concrete": "Железобетон",
|
||||
"block.engineersdecor.rebar_concrete.help": "§6Стальной железобетонный блок.§r Дорогой, но взрывоустойчивый, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete": "Gas Concrete Block",
|
||||
"block.engineersdecor.gas_concrete": "Газобетон",
|
||||
"block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
|
||||
"block.engineersdecor.panzerglass_block": "Бронированное стекло",
|
||||
"block.engineersdecor.panzerglass_block.help": "§6Усиленный стеклоблок.§r Дорогой, взрывоустойчивый. Имеет тёмно-серый оттенок, слегка видны структурные линии, мультитекстура для бесшовного отображения.",
|
||||
"block.engineersdecor.rebar_concrete_tile": "Железобетонная плита",
|
||||
|
@ -74,15 +75,18 @@
|
|||
"block.engineersdecor.rebar_concrete_slab.help": "§6Бетонная плита, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab": "Железобетонная плитка",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab.help": "§6Бетонная плитка, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
|
||||
"block.engineersdecor.gas_concrete_slab": "Газобетонная плита",
|
||||
"block.engineersdecor.gas_concrete_slab.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
|
||||
"block.engineersdecor.panzerglass_slab": "Плита из бронированного стекла",
|
||||
"block.engineersdecor.panzerglass_slab.help": "§6Усиленная стеклянная плита.§r Дорогая, взрывоустойчивая. Имеет тёмно-серый оттенок, слегка видны структурные линии.",
|
||||
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
|
||||
"block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r",
|
||||
"block.engineersdecor.rebar_concrete_wall": "Железобетонная стена",
|
||||
"block.engineersdecor.rebar_concrete_wall.help": "§6Стальная железобетонная стена.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.concrete_wall": "Бетонная стена",
|
||||
"block.engineersdecor.concrete_wall.help": "§6Стена из твёрдого бетона.",
|
||||
"block.engineersdecor.gas_concrete_wall": "Gas Concrete Wall",
|
||||
"block.engineersdecor.gas_concrete_wall": "Газобетонная стена",
|
||||
"block.engineersdecor.gas_concrete_wall.help": "§6Бетонная стена низкой твердости.§r Легко ломающийся декоративный бетон.",
|
||||
"block.engineersdecor.clinker_brick_wall": "Клинкерная кирпичная стена",
|
||||
"block.engineersdecor.clinker_brick_wall.help": "§6Обыкновенная клинкерная кирпичная стена.",
|
||||
"block.engineersdecor.slag_brick_wall": "Кирпичная стена из шлакоблока",
|
||||
|
@ -97,13 +101,14 @@
|
|||
"block.engineersdecor.clinker_brick_stairs.help": "§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs": "Грязные кирпичные ступеньки",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs.help": "§6Выглядят немного темнее и интенсивнее, чем Кирпичный блок. Имеют более заметные следы грязи или пятен.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Клинкерные кирпичные ступеньки",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Кирпичные ступеньки из шлакоблока",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Серо-коричневые кирпичные ступеньки.",
|
||||
"block.engineersdecor.rebar_concrete_stairs": "Железобетонные ступеньки",
|
||||
"block.engineersdecor.rebar_concrete_stairs.help": "§6Железобетонные ступеньки.§r Дорогие, но взрывоустойчивые, как обсидиан.",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs": "Ступеньки из железобетонной плитки",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs.help": "§6Ступеньки из железобетонной плитки.§r Дорогие, но взрывоустойчивые, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Gas Concrete Stairs",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Газобетонные ступеньки",
|
||||
"block.engineersdecor.gas_concrete_stairs.help": "§6Бетонные ступеньки низкой твёрдости.§r Легко ломающийся декоративный бетон.",
|
||||
"block.engineersdecor.treated_wood_pole": "Прямой обработанный деревянный столб",
|
||||
"block.engineersdecor.treated_wood_pole.help": "§6Надёжный столб с диаметром, схожим с реле.§r\n Может быть полезен в качестве альтернативы столбам для проводов, если требуется особая специальная длина, или как опора для конструкций.",
|
||||
"block.engineersdecor.treated_wood_pole_head": "Прямой обработанный деревянный столб (верхняя часть/основание)",
|
||||
|
@ -129,44 +134,55 @@
|
|||
"block.engineersdecor.treated_wood_stool": "Табурет из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_stool.help": "§6Крепкий деревянный табурет.§r Для использования в помещении и на улице.",
|
||||
"block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь.",
|
||||
"block.engineersdecor.treated_wood_side_table": "Treated Wood Side Table",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.",
|
||||
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.",
|
||||
"block.engineersdecor.treated_wood_side_table": "Столик из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Нужен после того, как работа выполнена.",
|
||||
"block.engineersdecor.iron_inset_light": "Встраиваемый осветитель",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки. Уровень света - как факел.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Встраиваемый снизу осветитель",
|
||||
"block.engineersdecor.iron_floor_edge_light.help": "§6Маленький источник света, интегрируемый в нижнюю грань блока.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки.",
|
||||
"block.engineersdecor.treated_wood_window": "Обработанное деревянное окно",
|
||||
"block.engineersdecor.treated_wood_window.help": "§6Деревянный каркас окна с тройным остеклением. Ну и шумоизоляция.",
|
||||
"block.engineersdecor.treated_wood_windowsill": "Обработанный деревянный подоконник",
|
||||
"block.engineersdecor.treated_wood_windowsill.help": "§6Простое оформление окон.",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Broad Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Широкий обработанный деревянный подоконник",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.",
|
||||
"block.engineersdecor.steel_framed_window": "Окно со стальной рамой",
|
||||
"block.engineersdecor.steel_framed_window.help": "§6Стальной каркас окна с тройным остеклением. Хорошо изолирует. §r Не подключается к смежным блокам, таким как стеклянные панели.",
|
||||
"block.engineersdecor.steel_mesh_fence": "Steel Mesh Fence",
|
||||
"block.engineersdecor.steel_mesh_fence": "Забор из стальной сетки",
|
||||
"block.engineersdecor.steel_mesh_fence.help": "§6Забор в индустриальном стиле.§r\nНе стыкуется с обычными заборами.",
|
||||
"block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь",
|
||||
"block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее, чем каменная, поэтому быстрее. Два внутренних слота для ввода, выхода и топлива.",
|
||||
"block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее и изолированней каменной, поэтому быстрее. Два вспомогательных слота, например для хранения. Два слота-воронки для ввода, вывода, и топлива. Поместите внешний нагреватель в слот AUX и подключите питание для электрического повышения скорости обработки.",
|
||||
"block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь",
|
||||
"block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.",
|
||||
"block.engineersdecor.small_waste_incinerator": "Компактный сжигатель отходов",
|
||||
"block.engineersdecor.small_waste_incinerator.help": "§6Отходы с слотами для очереди.§r Предметы могут помещаться с любой стороны, и храниться до тех пор, пока в очереди не останется свободного места. После этого самый старый стек будет сожжен. Подключите электричество (RF/FE) для увеличения скорости обработки. Сохраняет инвентарь при перемещении.",
|
||||
"block.engineersdecor.straight_pipe_valve": "Одноканальный жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Фрагмент прямой трубы.§r Проводит жидкость только в одном направлении. Не соединяется по бокам. Уменьшает пропускную способность. SHIFT для размещения в противоположном направлении.",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Фрагмент прямой трубы.§r Проводит жидкость только в одном направлении. Не соединяется по бокам. Уменьшает пропускную способность. SHIFT для размещения в обратном направлении.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone": "Краснокаменно-контролируемый жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone.help": "§6Фрагмент прямой трубы.§r Проводит жидкости только в одном направлении. Не соединяется по бокам. SHIFT для размещения в обратном направлении. Блокирует поток, если присутствует сигнал красного камня.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog": "Краснокаменно-аналоговый жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog.help": "§6Фрагмент прямой трубы.§r Проводит жидкости только в одном направлении. Не соединяется по бокам. SHIFT для размещения в обратном направлении. Не пропускает при отсутствии сигнала красного камня, уменьшает расход линейно с мощности 1 до 14, открывается максимально-возможно при уровне сигнала красного камня 15.",
|
||||
"block.engineersdecor.passive_fluid_accumulator": "Пассивный жидкостный накопитель",
|
||||
"block.engineersdecor.passive_fluid_accumulator.help": "§6Вакуумный всасывающий жидкостный коллектор.§r Имеет один выход, все остальные стороны входные. Сливает жидкости из соседних резервуаров при выкачивании жидкости из выходного порта.",
|
||||
"block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel",
|
||||
"block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости",
|
||||
"block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.",
|
||||
"block.engineersdecor.factory_dropper": "Фабричный выбрасыватель",
|
||||
"block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.",
|
||||
"block.engineersdecor.factory_hopper": "Factory Hopper",
|
||||
"block.engineersdecor.factory_placer": "Factory Block Placer",
|
||||
"block.engineersdecor.small_block_breaker": "Factory Block Breaker",
|
||||
"block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace",
|
||||
"block.engineersdecor.small_solar_panel": "Small Solar Panel",
|
||||
"block.engineersdecor.small_tree_cutter": "Small Tree Cutter",
|
||||
"block.engineersdecor.small_milking_machine": "Small Milking Machine",
|
||||
"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_placer": "Фабричный разместитель блоков",
|
||||
"block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.",
|
||||
"block.engineersdecor.small_block_breaker": "Фабричный разбиватель блоков",
|
||||
"block.engineersdecor.small_block_breaker.help": "§6Разбивает блоки перед собой.§r\n Можно отключить, подав сигнал красного камня. Время, необходимое для разрушения блока, зависит от твердости этого блока. ${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_mineral_smelter": "Малая плавильная печь минералов",
|
||||
"block.engineersdecor.small_mineral_smelter.help": "§6Высокотемпературная электрическая каменная плавильная печь с высокой изоляцией.§r\n Нагревает минеральные блоки до магматических блоков и, наконец, до лавы. Нажмите с минеральным блоком (камень, булыжник, и т.п.) или используйте другие способы загрузки. Используйте ведро или жидкостные насосы для извлечения лавы. При охлаждении лавы, генерируется обсидиан. Отключите RF питание или подайте сигнал красного камня для отключения печи. Для автоматизации используйте редстоуновый компаратор, чтобы увидеть, в какой фазе плавления находится минерал.",
|
||||
"block.engineersdecor.small_solar_panel": "Малая солнечная панель",
|
||||
"block.engineersdecor.small_solar_panel.help": "§6Вырабатывает небольшое количество энергии при воздействии солнечного света.§r\n Полезно для зарядки низковольтных конденсаторов в удаленных системах с низким потреблением. Внутренний контур насоса накапливает и часто передает RF. Производство зависит от времени суток и погоды.",
|
||||
"block.engineersdecor.small_tree_cutter": "Малый лесоруб",
|
||||
"block.engineersdecor.small_tree_cutter.help": "§6Вырубает деревья перед ним.§r\n Не собирает срубленное. Выключается с помощью сигнала красного камня. ${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_milking_machine": "Малый доильный аппарат",
|
||||
"block.engineersdecor.small_milking_machine.help": "§6Изредка чистит и доит коров.§r\n Имеет внутренний бак для жидкости. Не кормит животных. Используйте ведра для извлечения молока. Извлекает/кладёт сосуды для молока из/в инвентарь сзади или снизу (предпочитает извлекать сзади и класть снизу, но может также класть заполненные сосуды обратно в тот же инвентарь). Поддерживает выход жидкости в резервуары или трубы снизу (только если молоко существует в виде жидкости). Позаботьтесь, чтобы в загоне не было тесно, добровольно прогуливаются только счастливые животные.",
|
||||
"block.engineersdecor.sign_decor": "Табличка с надписью (Логотип Engineer's decor)",
|
||||
"block.engineersdecor.sign_decor.help": "§Это не должно быть крафтовым или видимым в JEI. Используется для творческой вкладки и скриншотов.",
|
||||
"block.engineersdecor.sign_hotwire": "Знак «Осторожно, под напряжением»",
|
||||
|
@ -178,13 +194,15 @@
|
|||
"block.engineersdecor.sign_defense": "Знак «Осторожно, впереди система обороны»",
|
||||
"block.engineersdecor.sign_defense.help": "§6Предупреждающий знак для турелей, катушек Тесла и ловушек.",
|
||||
"block.engineersdecor.sign_factoryarea": "Знак «Заводская зона»",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Там дверь, пожалуйста...",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Маркерный знак для зданий или областей, где расположены действительно большие машины.",
|
||||
"block.engineersdecor.sign_exit": "Знак «Выход»",
|
||||
"block.engineersdecor.sign_exit.help": "§6Там дверь, пожалуйста ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "Арматура для бетона",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_concrete": "Бетонный срез",
|
||||
"block.engineersdecor.halfslab_concrete.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Gas Concrete Slice",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Газобетонный срез",
|
||||
"block.engineersdecor.halfslab_gas_concrete.help": "§6Вертикально наращиваемая часть.§r Правый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_treated_wood": "Часть обработанного дерева",
|
||||
"block.engineersdecor.halfslab_treated_wood.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron": "Часть железного листового металла",
|
||||
|
@ -197,5 +215,6 @@
|
|||
"block.engineersdecor.halfslab_sheetmetal_gold.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum": "Часть алюминиевого листового металла",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.testblock": "ED Test Block (do NOT use)"
|
||||
"block.engineersdecor.testblock": "ED тестовый блок (НЕ ИСПОЛЬЗОВАТЬ)",
|
||||
"block.engineersdecor.testblock.help": "§6Несоздаваемый тестовый блок с изменениемизменяющейся экспериментальной функциональностью. НЕ ИСПОЛЬЗОВАТЬ, может даже крашнуть игру в худшем случае!!"
|
||||
}
|
|
@ -196,6 +196,7 @@
|
|||
"block.engineersdecor.sign_factoryarea": "指示牌 \"工厂区域\"",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6用于指示真的很大的机器所在的建筑和区域。",
|
||||
"block.engineersdecor.sign_exit": "出口指示牌",
|
||||
"block.engineersdecor.sign_exit.help": "§6There's the door, please ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "强化混凝土切片",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6可垂直堆叠的切片。§r手持切片右/左击切片堆叠的顶端或底部来添加/移除切片。",
|
||||
"block.engineersdecor.halfslab_concrete": "混凝土切片",
|
||||
|
|
|
@ -48,4 +48,8 @@ tasks["create-half-slab-assets"] = function() {
|
|||
for(var i in block_data) halfslab_assets.create(block_data[i]);
|
||||
}
|
||||
|
||||
tasks["lang-json-fixes"] = function() {
|
||||
libtask114.stdtasks["lang-json-fixes"]();
|
||||
};
|
||||
|
||||
libtask.run(tasks, sys.args);
|
||||
|
|
|
@ -68,6 +68,7 @@ sanatize:
|
|||
@echo "[1.15] Running sanatising tasks ..."
|
||||
@djs tasks.js trailing-whitespaces
|
||||
@djs tasks.js tabs-to-spaces
|
||||
@djs tasks.js lang-json-fixes
|
||||
@djs tasks.js sync-languages
|
||||
@djs tasks.js version-check
|
||||
@djs tasks.js update-json
|
||||
|
|
|
@ -19,12 +19,6 @@ version = "${version_engineersdecor}"
|
|||
group = "wile.engineersdecor"
|
||||
archivesBaseName = "engineersdecor-${version_minecraft}"
|
||||
|
||||
def signingData = { ->
|
||||
def sp = new Properties()
|
||||
if(file("signing.properties").exists()) file("signing.properties").withInputStream { sp.load(it) }
|
||||
return sp
|
||||
}()
|
||||
|
||||
repositories {
|
||||
maven { name = "Progwml6 maven"; url = "https://dvs1.progwml6.com/files/maven/" } // JEI files
|
||||
maven { name = "ModMaven"; url = "modmaven.k-4u.nl" } // JEI files, fallback
|
||||
|
@ -76,7 +70,7 @@ dependencies {
|
|||
|
||||
processResources {
|
||||
outputs.upToDateWhen { false } // thx to @tterrag for this hint
|
||||
doLast { file("${sourceSets.main.output.resourcesDir}/.gitversion").text = 'git log "-1" "--format=%h"'.execute().in.text.trim() }
|
||||
doLast { file("${sourceSets.main.output.resourcesDir}/.gitversion-engineersdecor").text = 'git log "-1" "--format=%h"'.execute().in.text.trim() }
|
||||
}
|
||||
|
||||
jar {
|
||||
|
@ -94,7 +88,7 @@ jar {
|
|||
}
|
||||
|
||||
def reobfFile = file("$buildDir/reobfJar/output.jar")
|
||||
def reobfArtifact = artifacts.add('default', reobfFile) { type 'jar'; builtBy 'reobfJar'; }
|
||||
def reobfArtifact = artifacts.add('default', reobfFile) { type 'jar'; builtBy 'reobfJar' }
|
||||
|
||||
publishing {
|
||||
publications { mavenJava(MavenPublication) { artifact reobfArtifact } }
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
org.gradle.daemon=false
|
||||
org.gradle.jvmargs=-Xmx8G
|
||||
version_minecraft=1.15.1
|
||||
version_forge_minecraft=1.15.1-30.0.16
|
||||
version_fml_mappings=20190719-1.14.3
|
||||
version_jei=1.14.4:6.0.0.10
|
||||
version_engineersdecor=1.0.18-b1
|
||||
version_forge_minecraft=1.15.1-30.0.51
|
||||
version_fml_mappings=20191105-1.14.3
|
||||
version_jei=1.15.1-6.0.0.1
|
||||
version_engineersdecor=1.0.18-b4
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"1.15.1": {
|
||||
"1.0.18-b4": "[A] Ported Treated Wood Crafting Table item rendering.\n[F] Fixed Milking machine cow path issue, added milking delay cow tracking.\n[F] Slab / Slab Slice placement adapted to vanilla standard.\n[M] Lang update ru_ru (PR#77, thanks Smollet777).",
|
||||
"1.0.18-b3": "[A] Added Treated Wood Crafting Table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).\n[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).",
|
||||
"1.0.18-b2": "[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.18-b1": "[U] Updated to Forge 1.15.1-30.0.16/20190719-1.14.3.\n[F] Client setup Dist annotation fixed (issue #73, thx hitsu420).\n[F] Double newline escapes in lang files fixed (\"\\n\" in a tooltip).\n[M] Updated zh_cn lang file (scikirbypoke).\n[A] Added opt-out config for the Small Tree Cutter",
|
||||
"1.0.17-b2": "[A] Initial port."
|
||||
},
|
||||
"promos": {
|
||||
"1.15.1-recommended": "",
|
||||
"1.15.1-latest": "1.0.18-b1"
|
||||
"1.15.1-latest": "1.0.18-b4"
|
||||
}
|
||||
}
|
|
@ -11,6 +11,19 @@ Mod sources for Minecraft version 1.15.1.
|
|||
|
||||
## Version history
|
||||
|
||||
- v1.0.18-b4 [A] Ported Treated Wood Crafting Table item rendering.
|
||||
[F] Fixed Milking machine cow path issue, added milking delay cow tracking.
|
||||
[F] Slab / Slab Slice placement adapted to vanilla standard.
|
||||
[M] Lang update ru_ru (PR#77, thanks Smollet777).
|
||||
|
||||
- v1.0.18-b3 [A] Added Treated Wood Crafting Table tweaks (ctrl-shift moves all same stacks from the
|
||||
inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).
|
||||
[F] EN Lang file fixed (issue #76, thx Riverstar907).
|
||||
[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).
|
||||
[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).
|
||||
|
||||
- v1.0.18-b2 [M] Lang ru_ru updated (Smollet777).
|
||||
|
||||
- v1.0.18-b1 [U] Updated to Forge 1.15.1-30.0.16/20190719-1.14.3.
|
||||
[F] Client setup Dist annotation fixed (issue #73, thx hitsu420).
|
||||
[F] Double newline escapes in lang files fixed ("\n" in a tooltip).
|
||||
|
|
|
@ -33,6 +33,7 @@ import net.minecraftforge.event.RegistryEvent;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
||||
import net.minecraftforge.fml.client.registry.ClientRegistry;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import java.util.ArrayList;
|
||||
|
@ -373,7 +374,7 @@ public class ModContent
|
|||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final BlockDecorCraftingTable TREATED_WOOD_CRAFTING_TABLE = (BlockDecorCraftingTable)(new BlockDecorCraftingTable(
|
||||
public static final BlockDecorCraftingTable.CraftingTableBlock TREATED_WOOD_CRAFTING_TABLE = (BlockDecorCraftingTable.CraftingTableBlock)(new BlockDecorCraftingTable.CraftingTableBlock(
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(1f, 15f).sound(SoundType.WOOD),
|
||||
ModAuxiliaries.getPixeledAABB(1,0,1, 15,15.9,15)
|
||||
|
@ -626,7 +627,7 @@ public class ModContent
|
|||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final TileEntityType<?> TET_TREATED_WOOD_CRAFTING_TABLE = TileEntityType.Builder
|
||||
.create(BlockDecorCraftingTable.BTileEntity::new, TREATED_WOOD_CRAFTING_TABLE)
|
||||
.create(BlockDecorCraftingTable.CraftingTableTileEntity::new, TREATED_WOOD_CRAFTING_TABLE)
|
||||
.build(null)
|
||||
.setRegistryName(ModEngineersDecor.MODID, "te_treated_wood_crafting_table");
|
||||
|
||||
|
@ -747,7 +748,7 @@ public class ModContent
|
|||
// Container registration
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final ContainerType<BlockDecorCraftingTable.BContainer> CT_TREATED_WOOD_CRAFTING_TABLE;
|
||||
public static final ContainerType<BlockDecorCraftingTable.CraftingTableContainer> CT_TREATED_WOOD_CRAFTING_TABLE;
|
||||
public static final ContainerType<BlockDecorDropper.BContainer> CT_FACTORY_DROPPER;
|
||||
public static final ContainerType<BlockDecorPlacer.BContainer> CT_FACTORY_PLACER;
|
||||
public static final ContainerType<BlockDecorHopper.BContainer> CT_FACTORY_HOPPER;
|
||||
|
@ -756,7 +757,7 @@ public class ModContent
|
|||
public static final ContainerType<BlockDecorWasteIncinerator.BContainer> CT_WASTE_INCINERATOR;
|
||||
|
||||
static {
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE = (new ContainerType<BlockDecorCraftingTable.BContainer>(BlockDecorCraftingTable.BContainer::new));
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE = (new ContainerType<BlockDecorCraftingTable.CraftingTableContainer>(BlockDecorCraftingTable.CraftingTableContainer::new));
|
||||
CT_TREATED_WOOD_CRAFTING_TABLE.setRegistryName(ModEngineersDecor.MODID,"ct_treated_wood_crafting_table");
|
||||
CT_FACTORY_DROPPER = (new ContainerType<BlockDecorDropper.BContainer>(BlockDecorDropper.BContainer::new));
|
||||
CT_FACTORY_DROPPER.setRegistryName(ModEngineersDecor.MODID,"ct_factory_dropper");
|
||||
|
@ -857,7 +858,7 @@ public class ModContent
|
|||
@OnlyIn(Dist.CLIENT)
|
||||
public static final void registerContainerGuis(final FMLClientSetupEvent event)
|
||||
{
|
||||
ScreenManager.registerFactory(CT_TREATED_WOOD_CRAFTING_TABLE, BlockDecorCraftingTable.BGui::new);
|
||||
ScreenManager.registerFactory(CT_TREATED_WOOD_CRAFTING_TABLE, BlockDecorCraftingTable.CraftingTableGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_DROPPER, BlockDecorDropper.BGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_PLACER, BlockDecorPlacer.BGui::new);
|
||||
ScreenManager.registerFactory(CT_FACTORY_HOPPER, BlockDecorHopper.BGui::new);
|
||||
|
@ -867,10 +868,13 @@ public class ModContent
|
|||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@SuppressWarnings("unchecked")
|
||||
public static final void registerTileEntityRenderers(final FMLClientSetupEvent event)
|
||||
{
|
||||
// @todo: re-enable
|
||||
//ClientRegistry.bindTileEntityRenderer(TET_TREATED_WOOD_CRAFTING_TABLE, new wile.engineersdecor.detail.ModRenderers.TesrDecorCraftingTable());
|
||||
ClientRegistry.bindTileEntityRenderer(
|
||||
(TileEntityType<BlockDecorCraftingTable.CraftingTableTileEntity>)TET_TREATED_WOOD_CRAFTING_TABLE,
|
||||
wile.engineersdecor.detail.ModRenderers.CraftingTableTer::new
|
||||
);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package wile.engineersdecor;
|
||||
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import wile.engineersdecor.detail.ModConfig;
|
||||
import wile.engineersdecor.detail.Networking;
|
||||
import wile.engineersdecor.blocks.*;
|
||||
|
@ -38,12 +39,14 @@ import javax.annotation.Nullable;
|
|||
public class ModEngineersDecor
|
||||
{
|
||||
public static final String MODID = "engineersdecor";
|
||||
public static final String MODNAME = "Engineer's Decor";
|
||||
public static final int VERSION_DATAFIXER = 0;
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private static boolean config_loaded = false;
|
||||
|
||||
public ModEngineersDecor()
|
||||
{
|
||||
ModAuxiliaries.logGitVersion(MODNAME);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetup);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSendImc);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onRecvImc);
|
||||
|
@ -121,7 +124,7 @@ public class ModEngineersDecor
|
|||
{ config_loaded = true; }
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onConfigFileChange(net.minecraftforge.fml.config.ModConfig.ConfigReloading configEvent)
|
||||
public static void onConfigReload(net.minecraftforge.fml.config.ModConfig.Reloading configEvent)
|
||||
{
|
||||
try {
|
||||
ModEngineersDecor.logger().info("Config file changed {}", configEvent.getConfig().getFileName());
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,7 +11,7 @@ package wile.engineersdecor.blocks;
|
|||
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.state.IntegerProperty;
|
||||
|
@ -20,9 +20,12 @@ import net.minecraft.util.math.BlockRayTraceResult;
|
|||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.IFluidState;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -40,7 +43,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
|
||||
public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
||||
public class BlockDecorHalfSlab extends BlockDecor.WaterLoggable
|
||||
{
|
||||
public static final IntegerProperty PARTS = IntegerProperty.create("parts", 0, 14);
|
||||
|
||||
|
@ -102,7 +105,7 @@ public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
|||
|
||||
@Override
|
||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, WATERLOGGED); }
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS); }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
|
@ -192,4 +195,13 @@ public class BlockDecorHalfSlab extends BlockDecor implements IWaterLoggable
|
|||
SoundType st = this.getSoundType(state, world, pos, null);
|
||||
world.playSound(player, pos, st.getPlaceSound(), SoundCategory.BLOCKS, (st.getVolume()+1f)/2.5f, 0.9f*st.getPitch());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean receiveFluid(IWorld world, BlockPos pos, BlockState state, IFluidState fluidState)
|
||||
{ return (state.get(PARTS)==14) ? false : super.receiveFluid(world, pos, state, fluidState); }
|
||||
|
||||
@Override
|
||||
public boolean canContainFluid(IBlockReader world, BlockPos pos, BlockState state, Fluid fluid)
|
||||
{ return (state.get(PARTS)==14) ? false : super.canContainFluid(world, pos, state, fluid); }
|
||||
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ import javax.annotation.Nonnull;
|
|||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
||||
|
@ -143,12 +144,14 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public static final int MAX_ENERGY_BUFFER = 16000;
|
||||
public static final int MAX_ENERGY_TRANSFER = 512;
|
||||
public static final int DEFAULT_ENERGY_CONSUMPTION = 0;
|
||||
public static final int DEFAULT_MILKING_DELAY_PER_COW = 4000;
|
||||
private static final Direction FLUID_TRANSFER_DIRECTRIONS[] = {Direction.DOWN,Direction.EAST,Direction.SOUTH,Direction.WEST,Direction.NORTH};
|
||||
private enum MilkingState { IDLE, PICKED, COMING, POSITIONING, MILKING, LEAVING, WAITING }
|
||||
|
||||
private static FluidStack milk_fluid_ = new FluidStack(Fluids.WATER, 0);
|
||||
private static HashMap<ItemStack, ItemStack> milk_containers_ = new HashMap<>();
|
||||
private static int energy_consumption = DEFAULT_ENERGY_CONSUMPTION;
|
||||
private static long min_milking_delay_per_cow_ticks = DEFAULT_MILKING_DELAY_PER_COW;
|
||||
private int tick_timer_;
|
||||
private int energy_stored_;
|
||||
private int tank_level_ = 0;
|
||||
|
@ -158,9 +161,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
private int state_timer_ = 0;
|
||||
private BlockPos tracked_cow_original_position_ = null;
|
||||
|
||||
public static void on_config(int energy_consumption_per_tick)
|
||||
public static void on_config(int energy_consumption_per_tick, int min_milking_delay_per_cow)
|
||||
{
|
||||
energy_consumption = MathHelper.clamp(energy_consumption_per_tick, 0, 128);
|
||||
min_milking_delay_per_cow_ticks = MathHelper.clamp(min_milking_delay_per_cow, 1000, 24000);
|
||||
{
|
||||
Fluid milk = null; // FluidRe.getFluid("milk");
|
||||
if(milk != null) milk_fluid_ = new FluidStack(milk, BUCKET_SIZE);
|
||||
|
@ -299,8 +303,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
|
||||
// ITickable ------------------------------------------------------------------------------------
|
||||
|
||||
private static final HashMap<Integer, Long> tracked_cows_ = new HashMap<Integer, Long>();
|
||||
|
||||
private void log(String s)
|
||||
{} // println("Milker|" + s); may be enabled with config, for dev was println
|
||||
{ System.out.println("Milker|" + s); } // println("Milker|" + s); may be enabled with config, for dev was println
|
||||
|
||||
private static ItemStack milk_filled_container_item(ItemStack stack)
|
||||
{ return milk_containers_.entrySet().stream().filter(e->e.getKey().isItemEqual(stack)).map(Map.Entry::getValue).findFirst().orElse(ItemStack.EMPTY); }
|
||||
|
@ -331,6 +337,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
if(cow != null) {
|
||||
cow.setNoAI(false);
|
||||
SingleMoveGoal.abortFor(cow);
|
||||
tracked_cows_.remove(cow.getEntityId());
|
||||
for(int id:tracked_cows_.keySet().stream().filter(i->cow.getEntityWorld().getEntityByID(i)==null).collect(Collectors.toList())) {
|
||||
tracked_cows_.remove(id);
|
||||
}
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
state_ = MilkingState.IDLE;
|
||||
|
@ -345,8 +355,15 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
CowEntity cow = null;
|
||||
{
|
||||
AxisAlignedBB aabb = new AxisAlignedBB(pos.offset(facing, 3)).grow(4, 2, 4);
|
||||
final long t = world.getGameTime();
|
||||
final List<CowEntity> cows = world.getEntitiesWithinAABB(CowEntity.class, aabb,
|
||||
e->( ((tracked_cow_==null) && ((!e.isChild()) && (!e.isInLove()) && (!e.isBeingRidden()))) || (e.getUniqueID().equals(tracked_cow_)) )
|
||||
e-> {
|
||||
if(e.getUniqueID().equals(tracked_cow_)) return true;
|
||||
if((tracked_cow_!=null) || e.isChild() || e.isInLove() || e.isBeingRidden()) return false;
|
||||
if(!e.getNavigator().noPath()) return false;
|
||||
if(Math.abs(tracked_cows_.getOrDefault(e.getEntityId(), 0L)-t) < min_milking_delay_per_cow_ticks) return false;
|
||||
return true;
|
||||
}
|
||||
);
|
||||
if(cows.size() == 1) {
|
||||
cow = cows.get(0); // tracked or only one
|
||||
|
@ -372,11 +389,12 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
BlockPos p = getPos().offset(facing,2);
|
||||
log("Idle: Shove off");
|
||||
blocker.setNoAI(false);
|
||||
SingleMoveGoal.startFor(blocker, p, 2, 1.0, (goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>49));
|
||||
SingleMoveGoal.startFor(blocker, p, 2, 1.0, (goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>100));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if(cow.getLeashed() || cow.isChild() || cow.isInLove() || (!cow.onGround) || cow.isBeingRidden() || cow.isSprinting()) return false;
|
||||
tracked_cows_.put(cow.getEntityId(), cow.getEntityWorld().getGameTime());
|
||||
tracked_cow_ = cow.getUniqueID();
|
||||
state_ = MilkingState.PICKED;
|
||||
state_timeout_ = 200;
|
||||
|
@ -387,13 +405,7 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
case PICKED: {
|
||||
SingleMoveGoal.startFor(
|
||||
cow, target_pos, 2, 1.0,
|
||||
(goal, world, pos)->{
|
||||
if(pos.distanceSq(goal.getCreature().getPosition())>100) return true;
|
||||
for(int i=0; i<4; ++i) {
|
||||
if(world.getBlockState(pos.offset(Direction.byHorizontalIndex(i))).getBlock() instanceof BlockDecorMilker) return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
(goal, world, pos)->(pos.distanceSq(goal.getCreature().getPosition())>100),
|
||||
(goal, world, pos)->{
|
||||
log("move: position reached");
|
||||
goal.getCreature().setLocationAndAngles(goal.getTargetPosition().getX(), goal.getTargetPosition().getY(), goal.getTargetPosition().getZ(), facing.getHorizontalAngle(), 0);
|
||||
|
@ -422,6 +434,7 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
}
|
||||
case POSITIONING: {
|
||||
log("Positioning: start milking");
|
||||
SingleMoveGoal.abortFor(cow);
|
||||
cow.setNoAI(true);
|
||||
cow.setLocationAndAngles(target_pos.getX(), target_pos.getY(), target_pos.getZ(), facing.getHorizontalAngle(), 0);
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_COW_MILK, SoundCategory.BLOCKS, 0.5f, 1f);
|
||||
|
@ -447,13 +460,18 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
state_timer_ = 500;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
state_ = MilkingState.WAITING;
|
||||
tracked_cows_.put(cow.getEntityId(), cow.getEntityWorld().getGameTime());
|
||||
log("Leaving: process done");
|
||||
return true;
|
||||
}
|
||||
case WAITING: {
|
||||
// wait for the timeout to kick in until starting with the next.
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
log("Waiting: ...");
|
||||
if(state_timer_ < 40) {
|
||||
tracked_cow_ = null;
|
||||
release_cow(null);
|
||||
}
|
||||
log("Waiting time elapsed");
|
||||
return true;
|
||||
}
|
||||
default: {
|
||||
|
@ -510,8 +528,9 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
{
|
||||
@FunctionalInterface public interface TargetPositionInValidCheck { boolean test(SingleMoveGoal goal, IWorldReader world, BlockPos pos); }
|
||||
@FunctionalInterface public interface StrollEvent { void apply(SingleMoveGoal goal, IWorldReader world, Vec3d pos); }
|
||||
private static void log(String s) {} // println(s);
|
||||
private static void log(String s) {} // println("SingleMoveGoal: "+s);
|
||||
|
||||
private static final HashMap<Integer, SingleMoveGoal> tracked_entities_ = new HashMap<Integer, SingleMoveGoal>();
|
||||
private static final int motion_timeout = 20*20;
|
||||
private boolean aborted_;
|
||||
private boolean in_position_;
|
||||
|
@ -538,14 +557,40 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public static void startFor(CreatureEntity entity, BlockPos target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition)
|
||||
{ startFor(entity, new Vec3d(target_pos.getX(),target_pos.getY(),target_pos.getZ()), priority, speed, abort_condition, null, null); }
|
||||
|
||||
public static void startFor(CreatureEntity entity, Vec3d target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{ entity.goalSelector.addGoal(priority, new SingleMoveGoal(entity, target_pos, speed, abort_condition, on_position_reached, on_aborted)); }
|
||||
public static boolean startFor(CreatureEntity entity, Vec3d target_pos, int priority, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{
|
||||
synchronized(tracked_entities_) {
|
||||
SingleMoveGoal goal = tracked_entities_.getOrDefault(entity.getEntityId(), null);
|
||||
if(goal != null) {
|
||||
if(!goal.aborted()) return false; // that is still running.
|
||||
entity.goalSelector.removeGoal(goal);
|
||||
}
|
||||
log("::start("+entity.getEntityId()+")");
|
||||
goal = new SingleMoveGoal(entity, target_pos, speed, abort_condition, on_position_reached, on_aborted);
|
||||
tracked_entities_.put(entity.getEntityId(), goal);
|
||||
entity.goalSelector.addGoal(priority, goal);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isActiveFor(CreatureEntity entity)
|
||||
{ return (entity != null) && (entity.goalSelector.getRunningGoals().anyMatch(g->(g.getGoal()) instanceof SingleMoveGoal)); }
|
||||
{ return (entity != null) && (entity.goalSelector.getRunningGoals().anyMatch(
|
||||
g->((g.getGoal()) instanceof SingleMoveGoal) && (!((SingleMoveGoal)(g.getGoal())).aborted())
|
||||
)); }
|
||||
|
||||
public static void abortFor(CreatureEntity entity)
|
||||
{ entity.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->((SingleMoveGoal)g.getGoal()).abort()); }
|
||||
{
|
||||
log("::abort("+entity.getEntityId()+")");
|
||||
if(entity.isAlive()) {
|
||||
entity.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->((SingleMoveGoal)g.getGoal()).abort());
|
||||
}
|
||||
final World world = entity.getEntityWorld();
|
||||
if(world != null) {
|
||||
// @todo: check nicer way to filter a map.
|
||||
List<Integer> to_remove = tracked_entities_.keySet().stream().filter(i->(world.getEntityByID(i) == null)).collect(Collectors.toList());
|
||||
for(int id:to_remove)tracked_entities_.remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
public Vec3d getTargetPosition()
|
||||
{ return target_pos_; }
|
||||
|
@ -553,34 +598,48 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
public CreatureEntity getCreature()
|
||||
{ return creature; }
|
||||
|
||||
public void abort()
|
||||
public synchronized void abort()
|
||||
{ aborted_ = true; }
|
||||
|
||||
public synchronized boolean aborted()
|
||||
{ return aborted_; }
|
||||
|
||||
public synchronized void initialize(Vec3d target_pos, double speed, TargetPositionInValidCheck abort_condition, @Nullable StrollEvent on_position_reached, @Nullable StrollEvent on_aborted)
|
||||
{
|
||||
abort_condition_ = abort_condition;
|
||||
on_target_position_reached_ = on_position_reached;
|
||||
on_aborted_ = on_aborted;
|
||||
destinationBlock = new BlockPos(target_pos.getX(), target_pos.getY(), target_pos.getZ());
|
||||
timeoutCounter = 0;
|
||||
runDelay = 0;
|
||||
aborted_ = false;
|
||||
was_aborted_ = false;
|
||||
target_pos_ = new Vec3d(target_pos.getX(), target_pos.getY(), target_pos.getZ());
|
||||
// this.movementSpeed = speed; -> that is final, need to override tick and func_whatever
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetTask()
|
||||
{ runDelay = 0; timeoutCounter = 0; }
|
||||
|
||||
@Override
|
||||
public double getTargetDistanceSq()
|
||||
{ return 1.2; }
|
||||
{ return 0.7; }
|
||||
|
||||
@Override
|
||||
public boolean shouldMove()
|
||||
{ return (timeoutCounter & 0x7) == 0; }
|
||||
{ return (!aborted()) && (timeoutCounter & 0x7) == 0; }
|
||||
|
||||
@Override
|
||||
public boolean shouldExecute()
|
||||
{
|
||||
if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
aborted_ = true;
|
||||
return false;
|
||||
} else if(aborted_) {
|
||||
// shouldExecute is the point where in GoalSelector.tick() the goal is not in flagGoals and can be removed.
|
||||
creature.goalSelector.getRunningGoals().filter(g->(g.getGoal()) instanceof SingleMoveGoal).forEach(g->creature.goalSelector.removeGoal(g));
|
||||
creature.goalSelector.removeGoal(this);
|
||||
if(aborted_) {
|
||||
if((!was_aborted_) && (on_aborted_!=null)) on_aborted_.apply(this, creature.world, target_pos_);
|
||||
was_aborted_ = true;
|
||||
return false;
|
||||
} else if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
synchronized(this) { aborted_ = true; }
|
||||
return false;
|
||||
} else if(--runDelay > 0) {
|
||||
return false;
|
||||
} else {
|
||||
|
@ -592,32 +651,69 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
@Override
|
||||
public void startExecuting()
|
||||
{
|
||||
log("startExecuting()");
|
||||
timeoutCounter = 0;
|
||||
if(!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), this.movementSpeed)) abort();
|
||||
if(!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), this.movementSpeed)) {
|
||||
abort();
|
||||
log("startExecuting() -> abort, no path");
|
||||
} else {
|
||||
log("startExecuting() -> started");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shouldContinueExecuting()
|
||||
{
|
||||
if((aborted_) || (creature.getNavigator().noPath()) || (timeoutCounter > motion_timeout) || (!shouldMoveTo(creature.world, destinationBlock))) {
|
||||
if(aborted()) {
|
||||
log("shouldContinueExecuting() -> already aborted");
|
||||
return false;
|
||||
} else if(creature.getNavigator().noPath()) {
|
||||
if((!creature.getNavigator().setPath(creature.getNavigator().func_225466_a(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), 0), movementSpeed))) {
|
||||
log("shouldContinueExecuting() -> abort, no path");
|
||||
abort();
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if(timeoutCounter > motion_timeout) {
|
||||
log("shouldContinueExecuting() -> abort, timeout");
|
||||
abort();
|
||||
return false;
|
||||
} else if(!shouldMoveTo(creature.world, destinationBlock)) {
|
||||
log("shouldContinueExecuting() -> abort, !shouldMoveTo()");
|
||||
abort();
|
||||
return false;
|
||||
} else {
|
||||
log("shouldContinueExecuting() -> yes");
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldMoveTo(IWorldReader world, BlockPos pos)
|
||||
{ if(!abort_condition_.test(this, world, pos)) { return true; } abort(); return false; }
|
||||
{
|
||||
if(abort_condition_.test(this, world, pos)) {
|
||||
log("shouldMoveTo() -> abort_condition");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
BlockPos testpos = new BlockPos(target_pos_.getX(), creature.getPositionVec().getY(), target_pos_.getZ());
|
||||
if(!testpos.withinDistance(creature.getPositionVec(), getTargetDistanceSq())) {
|
||||
if((++timeoutCounter > motion_timeout)) { abort(); return; }
|
||||
if(shouldMove() && (!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), movementSpeed))) abort();
|
||||
if((++timeoutCounter > motion_timeout)) {
|
||||
log("tick() -> abort, timeoutCounter");
|
||||
abort();
|
||||
return;
|
||||
}
|
||||
if(shouldMove() && (!creature.getNavigator().tryMoveToXYZ(target_pos_.getX(), target_pos_.getY(), target_pos_.getZ(), movementSpeed))) {
|
||||
log("tick() -> abort, !tryMoveToXYZ()");
|
||||
abort();
|
||||
}
|
||||
} else {
|
||||
log("tick() -> abort, in position)");
|
||||
in_position_ = true;
|
||||
abort();
|
||||
if(on_target_position_reached_ != null) on_target_position_reached_.apply(this, creature.world, target_pos_);
|
||||
|
|
|
@ -36,7 +36,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
|
||||
public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
||||
public class BlockDecorSlab extends BlockDecor.WaterLoggable
|
||||
{
|
||||
public static final IntegerProperty PARTS = IntegerProperty.create("parts", 0, 2);
|
||||
public static final IntegerProperty TEXTURE_VARIANT = IntegerProperty.create("tvariant", 0, 3);
|
||||
|
@ -92,16 +92,37 @@ public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
|||
|
||||
@Override
|
||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, TEXTURE_VARIANT, WATERLOGGED); }
|
||||
{ super.fillStateContainer(builder); builder.add(PARTS, TEXTURE_VARIANT); }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context)
|
||||
{
|
||||
final Direction facing = context.getFace();
|
||||
double y = context.getHitVec().getY();
|
||||
int rnd = MathHelper.clamp((int)(MathHelper.getPositionRandom(context.getPos()) % 4), 0, 3);
|
||||
return super.getStateForPlacement(context).with(PARTS, ((facing==Direction.UP) || ((facing!=Direction.DOWN) && (y < 0.6))) ? 0 : 1).with(TEXTURE_VARIANT, rnd);
|
||||
BlockPos pos = context.getPos();
|
||||
if(context.getWorld().getBlockState(pos).getBlock() == this) return context.getWorld().getBlockState(pos).with(PARTS, 2).with(WATERLOGGED, false);
|
||||
final int rnd = MathHelper.clamp((int)(MathHelper.getPositionRandom(context.getPos()) & 0x3), 0, 3);
|
||||
final Direction face = context.getFace();
|
||||
final BlockState placement_state = super.getStateForPlacement(context).with(TEXTURE_VARIANT, rnd); // fluid state
|
||||
if(face == Direction.UP) return placement_state.with(PARTS, 0);
|
||||
if(face == Direction.DOWN) return placement_state.with(PARTS, 1);
|
||||
if(!face.getAxis().isHorizontal()) return placement_state;
|
||||
final boolean isupper = ((context.getHitVec().getY() - context.getPos().getY()) > 0.5);
|
||||
return placement_state.with(PARTS, isupper ? 1 : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean isReplaceable(BlockState state, BlockItemUseContext context)
|
||||
{
|
||||
if(context.getItem().getItem() != this.asItem()) return false;
|
||||
if(!context.replacingClickedOnBlock()) return true;
|
||||
final Direction face = context.getFace();
|
||||
final int parts = state.get(PARTS);
|
||||
if((face == Direction.UP) && (parts==0)) return true;
|
||||
if((face == Direction.DOWN) && (parts==1)) return true;
|
||||
if(!face.getAxis().isHorizontal()) return false;
|
||||
final boolean isupper = ((context.getHitVec().getY() - context.getPos().getY()) > 0.5);
|
||||
return isupper ? (parts==0) : (parts==1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -122,29 +143,6 @@ public class BlockDecorSlab extends BlockDecor implements IWaterLoggable
|
|||
public List<ItemStack> dropList(BlockState state, World world, BlockPos pos, boolean explosion)
|
||||
{ return new ArrayList<ItemStack>(Collections.singletonList(new ItemStack(this.asItem(), num_slabs_contained_in_parts_[state.get(PARTS) & 0x3]))); }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult rayTraceResult)
|
||||
{
|
||||
Direction face = rayTraceResult.getFace();
|
||||
final ItemStack stack = player.getHeldItem(hand);
|
||||
if(stack.isEmpty() || (Block.getBlockFromItem(stack.getItem()) != this)) return false;
|
||||
int parts = state.get(PARTS);
|
||||
if(((face == Direction.UP) && (parts == 0)) || ((face == Direction.DOWN) && (parts == 1))) {
|
||||
world.setBlockState(pos, state.with(PARTS, 2), 3);
|
||||
} else {
|
||||
return false; // "not handled" -> let parent decide if a new slab has to be placed on top/bottom.
|
||||
}
|
||||
if(world.isRemote) return true;
|
||||
if(!player.isCreative()) {
|
||||
stack.shrink(1);
|
||||
if(player.inventory != null) player.inventory.markDirty();
|
||||
}
|
||||
SoundType st = this.getSoundType(state, world, pos, null);
|
||||
world.playSound(null, pos, st.getPlaceSound(), SoundCategory.BLOCKS, (st.getVolume()+1f)/2.5f, 0.9f*st.getPitch());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void onBlockClicked(BlockState state, World world, BlockPos pos, PlayerEntity player)
|
||||
|
|
|
@ -26,6 +26,8 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.energy.CapabilityEnergy;
|
||||
import net.minecraftforge.energy.IEnergyStorage;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
|
@ -62,7 +64,7 @@ public class BlockDecorSolarPanel extends BlockDecor
|
|||
// Tile entity
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static class BTileEntity extends TileEntity implements ITickableTileEntity
|
||||
public static class BTileEntity extends TileEntity implements ITickableTileEntity, ICapabilityProvider, IEnergyStorage
|
||||
{
|
||||
public static final int DEFAULT_PEAK_POWER = 45;
|
||||
public static final int TICK_INTERVAL = 8;
|
||||
|
@ -94,6 +96,51 @@ public class BlockDecorSolarPanel extends BlockDecor
|
|||
protected void writenbt(CompoundNBT nbt, boolean update_packet)
|
||||
{ nbt.putInt("energy", accumulated_power_); }
|
||||
|
||||
// IEnergyStorage --------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean canExtract()
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
public boolean canReceive()
|
||||
{ return false; }
|
||||
|
||||
@Override
|
||||
public int getMaxEnergyStored()
|
||||
{ return max_power_storage_; }
|
||||
|
||||
@Override
|
||||
public int getEnergyStored()
|
||||
{ return accumulated_power_; }
|
||||
|
||||
@Override
|
||||
public int extractEnergy(int maxExtract, boolean simulate)
|
||||
{
|
||||
int p = Math.min(accumulated_power_, maxExtract);
|
||||
if(!simulate) accumulated_power_ -= p;
|
||||
return p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int receiveEnergy(int maxReceive, boolean simulate)
|
||||
{ return 0; }
|
||||
|
||||
// ICapabilityProvider ---------------------------------------------------------------------
|
||||
|
||||
protected LazyOptional<IEnergyStorage> energy_handler_ = LazyOptional.of(() -> (IEnergyStorage)this);
|
||||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing)
|
||||
{
|
||||
if(!this.removed && (facing != null)) {
|
||||
if(capability== CapabilityEnergy.ENERGY) {
|
||||
return energy_handler_.cast();
|
||||
}
|
||||
}
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
|
||||
// TileEntity ------------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
|
|
|
@ -192,6 +192,9 @@ public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
|
|||
--active_timer_;
|
||||
}
|
||||
boolean active = (active_timer_ > 0);
|
||||
if(requires_power && !active) {
|
||||
proc_time_elapsed_ = Math.max(0, proc_time_elapsed_ - 2*TICK_INTERVAL);
|
||||
}
|
||||
if(proc_time_elapsed_ >= cutting_time_needed) {
|
||||
proc_time_elapsed_ = 0;
|
||||
TreeCutting.chopTree(world, tree_state, tree_pos, 512, false);
|
||||
|
|
|
@ -82,7 +82,7 @@ public class ModLootTables extends LootTableProvider
|
|||
private LootTable.Builder defaultBlockDrops(String rl_path, Block block)
|
||||
{
|
||||
ItemLootEntry.Builder iltb = ItemLootEntry.builder(block);
|
||||
iltb.acceptFunction(CopyName.func_215893_a(Source.BLOCK_ENTITY));
|
||||
iltb.acceptFunction(CopyName.builder(Source.BLOCK_ENTITY));
|
||||
if(block.hasTileEntity(block.getDefaultState())) {
|
||||
iltb.acceptFunction(CopyNbt.func_215881_a(CopyNbt.Source.BLOCK_ENTITY));
|
||||
}
|
||||
|
|
|
@ -24,23 +24,106 @@ import net.minecraft.util.math.AxisAlignedBB;
|
|||
import net.minecraftforge.fml.ModList;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
public class ModAuxiliaries
|
||||
{
|
||||
public static final String MODID = ModEngineersDecor.MODID;
|
||||
public static final Logger LOGGER = ModEngineersDecor.logger();
|
||||
public static final ModEngineersDecor.ISidedProxy PROXY = ModEngineersDecor.proxy;
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Sideness, system/environment, tagging interfaces
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public interface IExperimentalFeature {}
|
||||
|
||||
public static final boolean isModLoaded(final String registry_name)
|
||||
{ return ModList.get().isLoaded(registry_name); }
|
||||
|
||||
public static final boolean isDevelopmentMode()
|
||||
{ return SharedConstants.developmentMode; }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static final boolean isShiftDown()
|
||||
{
|
||||
return (InputMappings.isKeyDown(PROXY.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) ||
|
||||
InputMappings.isKeyDown(PROXY.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_RIGHT_SHIFT));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static final boolean isCtrlDown()
|
||||
{
|
||||
return (InputMappings.isKeyDown(PROXY.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) ||
|
||||
InputMappings.isKeyDown(PROXY.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Logging
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final void logInfo(final String msg)
|
||||
{ LOGGER.info(msg); }
|
||||
|
||||
public static final void logWarn(final String msg)
|
||||
{ LOGGER.warn(msg); }
|
||||
|
||||
public static final void logError(final String msg)
|
||||
{ LOGGER.error(msg); }
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Block handling
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1)
|
||||
{ return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); }
|
||||
|
||||
public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, Direction new_facing, boolean horizontal_rotation)
|
||||
{
|
||||
if(!horizontal_rotation) {
|
||||
switch(new_facing.getIndex()) {
|
||||
case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D
|
||||
case 1: return new AxisAlignedBB(1-bb.maxX, bb.minZ, bb.minY, 1-bb.minX, bb.maxZ, bb.maxY); // U
|
||||
case 2: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // N
|
||||
case 3: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // S --> bb
|
||||
case 4: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // W
|
||||
case 5: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // E
|
||||
}
|
||||
} else {
|
||||
switch(new_facing.getIndex()) {
|
||||
case 0: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // D --> bb
|
||||
case 1: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // U --> bb
|
||||
case 2: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // N --> bb
|
||||
case 3: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // S
|
||||
case 4: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // W
|
||||
case 5: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // E
|
||||
}
|
||||
}
|
||||
return bb;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// Localization, text formatting
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Text localisation wrapper, implicitly prepends `ModEngineersDecor.MODID` to the
|
||||
* Text localisation wrapper, implicitly prepends `MODID` to the
|
||||
* translation keys. Forces formatting argument, nullable if no special formatting shall be applied..
|
||||
*/
|
||||
public static TranslationTextComponent localizable(String modtrkey, @Nullable TextFormatting color, Object... args)
|
||||
{
|
||||
TranslationTextComponent tr = new TranslationTextComponent(ModEngineersDecor.MODID+"."+modtrkey, args);
|
||||
TranslationTextComponent tr = new TranslationTextComponent(MODID+"."+modtrkey, args);
|
||||
if(color!=null) tr.getStyle().setColor(color);
|
||||
return tr;
|
||||
}
|
||||
|
@ -49,7 +132,7 @@ public class ModAuxiliaries
|
|||
{ return localizable(modtrkey, null); }
|
||||
|
||||
public static TranslationTextComponent localizable_block_key(String blocksubkey)
|
||||
{ return new TranslationTextComponent("block."+ModEngineersDecor.MODID+"."+blocksubkey); }
|
||||
{ return new TranslationTextComponent("block."+MODID+"."+blocksubkey); }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static String localize(String translationKey, Object... args)
|
||||
|
@ -98,21 +181,11 @@ public class ModAuxiliaries
|
|||
{
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static boolean extendedTipCondition()
|
||||
{
|
||||
return (
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) ||
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_RIGHT_SHIFT)
|
||||
);
|
||||
}
|
||||
{ return isShiftDown(); }
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static boolean helpCondition()
|
||||
{
|
||||
return extendedTipCondition() && (
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) ||
|
||||
InputMappings.isKeyDown(ModEngineersDecor.proxy.mc().func_228018_at_()/*getMainWindow()*/.getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL)
|
||||
);
|
||||
}
|
||||
{ return isShiftDown() && isCtrlDown(); }
|
||||
|
||||
/**
|
||||
* Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT.
|
||||
|
@ -141,8 +214,8 @@ public class ModAuxiliaries
|
|||
return true;
|
||||
} else if(addAdvancedTooltipHints) {
|
||||
String s = "";
|
||||
if(tip_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
|
||||
if(help_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.help");
|
||||
if(tip_available) s += localize(MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
|
||||
if(help_available) s += localize(MODID + ".tooltip.hint.help");
|
||||
tooltip.add(new StringTextComponent(s));
|
||||
}
|
||||
return false;
|
||||
|
@ -158,45 +231,6 @@ public class ModAuxiliaries
|
|||
{ return addInformation(stack.getTranslationKey(), stack.getTranslationKey(), tooltip, flag, addAdvancedTooltipHints); }
|
||||
}
|
||||
|
||||
public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1)
|
||||
{ return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); }
|
||||
|
||||
public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, Direction new_facing, boolean horizontal_rotation)
|
||||
{
|
||||
if(!horizontal_rotation) {
|
||||
switch(new_facing.getIndex()) {
|
||||
case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D
|
||||
case 1: return new AxisAlignedBB(1-bb.maxX, bb.minZ, bb.minY, 1-bb.minX, bb.maxZ, bb.maxY); // U
|
||||
case 2: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // N
|
||||
case 3: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // S --> bb
|
||||
case 4: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // W
|
||||
case 5: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // E
|
||||
}
|
||||
} else {
|
||||
switch(new_facing.getIndex()) {
|
||||
case 0: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // D --> bb
|
||||
case 1: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // U --> bb
|
||||
case 2: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // N --> bb
|
||||
case 3: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // S
|
||||
case 4: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // W
|
||||
case 5: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // E
|
||||
}
|
||||
}
|
||||
return bb;
|
||||
}
|
||||
|
||||
public static final boolean isModLoaded(final String registry_name)
|
||||
{ return ModList.get().isLoaded(registry_name); }
|
||||
|
||||
public static final void logInfo(final String msg)
|
||||
{ ModEngineersDecor.logger().info(msg); }
|
||||
|
||||
public static final void logWarn(final String msg)
|
||||
{ ModEngineersDecor.logger().warn(msg); }
|
||||
|
||||
public static final void logError(final String msg)
|
||||
{ ModEngineersDecor.logger().error(msg); }
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static void playerChatMessage(final PlayerEntity player, final String message)
|
||||
{
|
||||
|
@ -204,10 +238,31 @@ public class ModAuxiliaries
|
|||
if(!s.isEmpty()) player.sendMessage(new TranslationTextComponent(s));
|
||||
}
|
||||
|
||||
public static final boolean isDevelopmentMode()
|
||||
{ return SharedConstants.developmentMode; }
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
// JAR resource related
|
||||
// -------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static String loadResourceText(String path)
|
||||
{
|
||||
try {
|
||||
InputStream is = ModAuxiliaries.class.getResourceAsStream(path);
|
||||
if(is==null) return "";
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
|
||||
return br.lines().collect(Collectors.joining("\n"));
|
||||
} catch(Throwable e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public interface IExperimentalFeature {}
|
||||
public static void logGitVersion(String mod_name)
|
||||
{
|
||||
try {
|
||||
// Done during construction to have an exact version in case of a crash while registering.
|
||||
String version = ModAuxiliaries.loadResourceText("/.gitversion-" + MODID).trim();
|
||||
logInfo(mod_name+((version.isEmpty())?(" (dev build)"):(" GIT id #"+version)) + ".");
|
||||
} catch(Throwable e) {
|
||||
// (void)e; well, then not. Priority is not to get unneeded crashes because of version logging.
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -143,6 +143,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.DoubleValue chair_mob_sitting_probability_percent;
|
||||
public final ForgeConfigSpec.DoubleValue chair_mob_standup_probability_percent;
|
||||
public final ForgeConfigSpec.BooleanValue with_crafting_quickmove_buttons;
|
||||
public final ForgeConfigSpec.BooleanValue without_crafting_mouse_scrolling;
|
||||
public final ForgeConfigSpec.IntValue pipevalve_max_flowrate;
|
||||
public final ForgeConfigSpec.IntValue pipevalve_redstone_gain;
|
||||
public final ForgeConfigSpec.IntValue block_breaker_power_consumption;
|
||||
|
@ -153,6 +154,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.IntValue tree_cuttter_cutting_time_needed;
|
||||
public final ForgeConfigSpec.BooleanValue tree_cuttter_requires_power;
|
||||
public final ForgeConfigSpec.IntValue milking_machine_energy_consumption;
|
||||
public final ForgeConfigSpec.IntValue milking_machine_milking_delay;
|
||||
|
||||
CommonConfig(ForgeConfigSpec.Builder builder)
|
||||
{
|
||||
|
@ -389,6 +391,10 @@ public class ModConfig
|
|||
.comment("Enables small quick-move arrows from/to player/block storage. " +
|
||||
"Makes the UI a bit too busy, therefore disabled by default.")
|
||||
.define("with_crafting_quickmove_buttons", false);
|
||||
without_crafting_mouse_scrolling = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.without_crafting_mouse_scrolling")
|
||||
.comment("Disables increasing/decreasing the crafting grid items by scrolling over the crafting result slot.")
|
||||
.define("without_crafting_mouse_scrolling", false);
|
||||
pipevalve_max_flowrate = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.pipevalve_max_flowrate")
|
||||
.comment("Defines how many millibuckets can be transferred (per tick) through the valves. " +
|
||||
|
@ -471,6 +477,10 @@ public class ModConfig
|
|||
"Use zero to disable energy dependency and energy handling of the machine. " +
|
||||
"The config value can be changed on-the-fly for tuning.")
|
||||
.defineInRange("milking_machine_energy_consumption", BlockDecorMilker.BTileEntity.DEFAULT_ENERGY_CONSUMPTION, 0, 128);
|
||||
milking_machine_milking_delay = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.milking_machine_milking_delay")
|
||||
.comment("Defines (for each individual cow) the minimum time between milking." )
|
||||
.defineInRange("milking_machine_milking_delay", BlockDecorMilker.BTileEntity.DEFAULT_MILKING_DELAY_PER_COW, 1000, 24000);
|
||||
builder.pop();
|
||||
}
|
||||
}
|
||||
|
@ -519,7 +529,7 @@ public class ModConfig
|
|||
excludes_.clear();
|
||||
}
|
||||
// Early non-opt out type based evaluation
|
||||
if(block instanceof BlockDecorCraftingTable) return COMMON.without_crafting_table.get();
|
||||
if(block instanceof BlockDecorCraftingTable.CraftingTableBlock) return COMMON.without_crafting_table.get();
|
||||
if(block instanceof BlockDecorFurnaceElectrical) return COMMON.without_electrical_furnace.get();
|
||||
if((block instanceof BlockDecorFurnace) && (!(block instanceof BlockDecorFurnaceElectrical))) return COMMON.without_lab_furnace.get();
|
||||
if(block instanceof BlockDecorPassiveFluidAccumulator) return COMMON.without_passive_fluid_accumulator.get();
|
||||
|
@ -598,13 +608,13 @@ public class ModConfig
|
|||
BlockDecorFurnace.BTileEntity.on_config(COMMON.furnace_smelting_speed_percent.get(), COMMON.furnace_fuel_efficiency_percent.get(), COMMON.furnace_boost_energy_consumption.get());
|
||||
BlockDecorChair.on_config(COMMON.without_chair_sitting.get(), COMMON.without_mob_chair_sitting.get(), COMMON.chair_mob_sitting_probability_percent.get(), COMMON.chair_mob_standup_probability_percent.get());
|
||||
BlockDecorLadder.on_config(COMMON.without_ladder_speed_boost.get());
|
||||
BlockDecorCraftingTable.on_config(COMMON.without_crafting_table_history.get(), false, COMMON.with_crafting_quickmove_buttons.get());
|
||||
BlockDecorCraftingTable.on_config(COMMON.without_crafting_table_history.get(), false, COMMON.with_crafting_quickmove_buttons.get(), COMMON.without_crafting_mouse_scrolling.get());
|
||||
BlockDecorPipeValve.on_config(COMMON.pipevalve_max_flowrate.get(), COMMON.pipevalve_redstone_gain.get());
|
||||
BlockDecorFurnaceElectrical.BTileEntity.on_config(COMMON.e_furnace_speed_percent.get(), COMMON.e_furnace_power_consumption.get(), COMMON.e_furnace_automatic_pulling.get());
|
||||
BlockDecorSolarPanel.BTileEntity.on_config(COMMON.small_solar_panel_peak_production.get());
|
||||
BlockDecorBreaker.BTileEntity.on_config(COMMON.block_breaker_power_consumption.get(), COMMON.block_breaker_reluctance.get(), COMMON.block_breaker_min_breaking_time.get(), COMMON.block_breaker_requires_power.get());
|
||||
BlockDecorTreeCutter.BTileEntity.on_config(COMMON.tree_cuttter_energy_consumption.get(), COMMON.tree_cuttter_cutting_time_needed.get(), COMMON.tree_cuttter_requires_power.get());
|
||||
BlockDecorMilker.BTileEntity.on_config(COMMON.milking_machine_energy_consumption.get());
|
||||
BlockDecorMilker.BTileEntity.on_config(COMMON.milking_machine_energy_consumption.get(), COMMON.milking_machine_milking_delay.get());
|
||||
without_crafting_table = isOptedOut(ModContent.TREATED_WOOD_CRAFTING_TABLE);
|
||||
immersiveengineering_installed = ModAuxiliaries.isModLoaded("immersiveengineering");
|
||||
with_experimental_features_ = COMMON.with_experimental.get();
|
||||
|
|
|
@ -10,32 +10,24 @@
|
|||
package wile.engineersdecor.detail;
|
||||
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.blocks.BlockDecorChair;
|
||||
import wile.engineersdecor.blocks.BlockDecorCraftingTable;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.*;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererManager;
|
||||
import net.minecraft.client.renderer.model.ModelManager;
|
||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
|
||||
import net.minecraft.client.renderer.texture.AtlasTexture;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemFrameEntity;
|
||||
import net.minecraft.item.FilledMapItem;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.storage.MapData;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
|
||||
|
||||
public class ModRenderers
|
||||
{
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -71,56 +63,55 @@ public class ModRenderers
|
|||
// Crafting table
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static class TesrDecorCraftingTable extends TileEntityRenderer<BlockDecorCraftingTable.BTileEntity>
|
||||
public static class CraftingTableTer extends TileEntityRenderer<BlockDecorCraftingTable.CraftingTableTileEntity>
|
||||
{
|
||||
private static int tesr_error_counter = 4;
|
||||
private static double scaler = 0.10;
|
||||
private static double gap = 0.19;
|
||||
private static double yrotations[] = {0, 90, 180, 270}; // [hdirection] S-W-N-E
|
||||
private static double offsets[][][] = { // [hdirection][slotindex][xz]
|
||||
private static float scaler = 0.1f;
|
||||
private static float gap = 0.19f;
|
||||
private static float yrotations[] = {0, 90, 180, 270}; // [hdirection] S-W-N-E
|
||||
private static float offsets[][][] = { // [hdirection][slotindex][xz]
|
||||
{ {-1,-1},{+0,-1},{+1,-1}, {-1,+0},{+0,+0},{+1,+0}, {-1,+1},{+0,+1},{+1,+1} }, // S
|
||||
{ {+1,-1},{+1,+0},{+1,+1}, {+0,-1},{+0,+0},{+0,+1}, {-1,-1},{-1,+0},{-1,+1} }, // W
|
||||
{ {+1,+1},{+0,+1},{-1,+1}, {+1,+0},{+0,+0},{-1,+0}, {+1,-1},{+0,-1},{-1,-1} }, // N
|
||||
{ {-1,+1},{-1,+0},{-1,-1}, {+0,+1},{+0,+0},{+0,-1}, {+1,+1},{+1,+0},{+1,-1} }, // E
|
||||
};
|
||||
|
||||
public CraftingTableTer(TileEntityRendererDispatcher dispatcher)
|
||||
{ super(dispatcher); }
|
||||
|
||||
@Override
|
||||
public void func_225616_a_(final BlockDecorCraftingTable.BTileEntity te, float p_225616_2_, MatrixStack p_225616_3_, IRenderTypeBuffer p_225616_4_, int p_225616_5_, int p_225616_6_)
|
||||
{
|
||||
render(final BlockDecorCraftingTable.BTileEntity te, double x, double y, double z, float partialTicks, int destroyStage);
|
||||
}
|
||||
public void func_225616_a_(final BlockDecorCraftingTable.CraftingTableTileEntity te, float f2, MatrixStack mxs, IRenderTypeBuffer buf, int i5, int i6)
|
||||
{ render(te, f2, mxs, buf, i5, i6); }
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public void render(final BlockDecorCraftingTable.BTileEntity te, double x, double y, double z, float partialTicks, int destroyStage)
|
||||
public void render(final BlockDecorCraftingTable.CraftingTableTileEntity te, float unused1, MatrixStack mxs, IRenderTypeBuffer buf, int i5, int i6)
|
||||
{
|
||||
if(tesr_error_counter<=0) return;
|
||||
if(tesr_error_counter <= 0) return;
|
||||
try {
|
||||
int di = MathHelper.clamp(te.getWorld().getBlockState(te.getPos()).get(BlockDecorCraftingTable.FACING).getHorizontalIndex(), 0, 3);
|
||||
final int di = MathHelper.clamp(te.getWorld().getBlockState(te.getPos()).get(BlockDecorCraftingTable.CraftingTableBlock.FACING).getHorizontalIndex(), 0, 3);
|
||||
long posrnd = te.getPos().toLong();
|
||||
posrnd = (posrnd>>16)^(posrnd<<1);
|
||||
for(int i=0; i<9; ++i) {
|
||||
final ItemStack stack = te.getStackInSlot(i);
|
||||
if(stack.isEmpty()) continue;
|
||||
double prnd = ((double)(((Integer.rotateRight(stack.getItem().hashCode()^(int)posrnd,(stack.getCount()+i)&31)))&1023))/1024.0;
|
||||
double rndo = gap * ((prnd*0.1)-0.05);
|
||||
double ox = gap * offsets[di][i][0], oz = gap * offsets[di][i][1];
|
||||
double oy = 0.5;
|
||||
double ry = ((yrotations[di]+180) + ((prnd*60)-30)) % 360;
|
||||
float prnd = ((float)(((Integer.rotateRight(stack.getItem().hashCode()^(int)posrnd,(stack.getCount()+i)&31)))&1023))/1024f;
|
||||
float rndo = gap * ((prnd*0.1f)-0.05f);
|
||||
float ox = gap * offsets[di][i][0], oz = gap * offsets[di][i][1];
|
||||
float oy = 0.5f;
|
||||
float ry = ((yrotations[di]+180) + ((prnd*60)-30)) % 360;
|
||||
if(stack.isEmpty()) return;
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.disableLighting();
|
||||
RenderHelper.enableStandardItemLighting();
|
||||
GlStateManager.translated(x+0.5+ox, y+0.5+oy, z+0.5+oz);
|
||||
GlStateManager.rotated(90, 1, 0, 0);
|
||||
GlStateManager.rotated(ry, 0, 0, 1);
|
||||
GlStateManager.translated(rndo, rndo, 0);
|
||||
GlStateManager.scaled(scaler, scaler, scaler);
|
||||
Minecraft.getInstance().getItemRenderer().renderItem(stack, net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType.FIXED);
|
||||
RenderHelper.disableStandardItemLighting();
|
||||
GlStateManager.enableLighting();
|
||||
GlStateManager.popMatrix();
|
||||
mxs.func_227860_a_(); // mxs.push()
|
||||
mxs.func_227861_a_(0.5+ox, 0.5+oy, 0.5+oz); // mxs.translate()
|
||||
|
||||
mxs.func_227863_a_(Vector3f.field_229179_b_.func_229187_a_(90.0f)); // mxs.transform(Vector3f.x_plus.rotation(90))
|
||||
|
||||
mxs.func_227863_a_(Vector3f.field_229183_f_.func_229187_a_(ry)); // mxs.transform(Vector3f.z_plus.rotation(ry))
|
||||
|
||||
mxs.func_227861_a_(rndo, rndo, 0); // mxs.translate()
|
||||
mxs.func_227862_a_(scaler, scaler, scaler); // mxs.scale()
|
||||
Minecraft.getInstance().getItemRenderer().func_229110_a_(stack, net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType.FIXED, i5, i6, mxs, buf);
|
||||
mxs.func_227865_b_(); // mxs.pop()
|
||||
}
|
||||
} catch(Throwable e) {
|
||||
if(--tesr_error_counter<=0) {
|
||||
|
@ -130,5 +121,4 @@ public class ModRenderers
|
|||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -204,16 +204,14 @@ public class Networking
|
|||
DEFAULT_CHANNEL.sendTo(new PacketContainerSyncServerToClient(container.windowId, nbt), ((ServerPlayerEntity)player).connection.netManager, NetworkDirection.PLAY_TO_CLIENT);
|
||||
}
|
||||
|
||||
// Container listners are private, and add/remove listener overriding seems not too nice, as
|
||||
// removeListner is client only???
|
||||
|
||||
//public static <C extends Container & INetworkSynchronisableContainer> void sendToListeners(C container, CompoundNBT nbt)
|
||||
//{
|
||||
// for(IContainerListener listener: container.getListeners()) {
|
||||
// if(!(listener instanceof ServerPlayerEntity)) continue;
|
||||
// DEFAULT_CHANNEL.sendTo(new PacketContainerSyncServerToClient(container.windowId, nbt), ((ServerPlayerEntity)listener).connection.netManager, NetworkDirection.PLAY_TO_CLIENT);
|
||||
// }
|
||||
//}
|
||||
public static <C extends Container & INetworkSynchronisableContainer>
|
||||
void sendToListeners(World world, C container, CompoundNBT nbt)
|
||||
{
|
||||
for(PlayerEntity player: world.getPlayers()) {
|
||||
if(player.openContainer.windowId != container.windowId) continue;
|
||||
sendToPlayer(player, container.windowId, nbt);
|
||||
}
|
||||
}
|
||||
|
||||
public PacketContainerSyncServerToClient()
|
||||
{}
|
||||
|
|
|
@ -56,10 +56,12 @@ public class JEIPlugin implements mezz.jei.api.IModPlugin
|
|||
blacklisted.add(new ItemStack(e.asItem()));
|
||||
}
|
||||
}
|
||||
try {
|
||||
jeiRuntime.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM, blacklisted);
|
||||
} catch(Exception e) {
|
||||
ModEngineersDecor.logger().warn("Exception in JEI opt-out processing: '" + e.getMessage() + "', skipping further JEI optout processing.");
|
||||
if(!blacklisted.isEmpty()) {
|
||||
try {
|
||||
jeiRuntime.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM, blacklisted);
|
||||
} catch(Exception e) {
|
||||
ModEngineersDecor.logger().warn("Exception in JEI opt-out processing: '" + e.getMessage() + "', skipping further JEI optout processing.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,220 +1,220 @@
|
|||
{
|
||||
"language": "English",
|
||||
"language.code": "en_us",
|
||||
"language.region": "United States",
|
||||
"itemGroup.tabengineersdecor": "Engineer's Decor",
|
||||
"engineersdecor.config.title": "Engineer's Decor Config",
|
||||
"engineersdecor.tooltip.hint.extended": "§6[§9SHIFT§r More Info§6]§r",
|
||||
"engineersdecor.tooltip.hint.help": "§6[§9CTRL-SHIFT§r Help§6]§r",
|
||||
"engineersdecor.tooltip.slabpickup.help": "§rFast pickup by left-clicking while looking up/down and holding this slab.",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Requires RF power.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Apply RF power to magnificently increase the speed.",
|
||||
"engineersdecor.config.pattern_excludes": "Pattern excludes",
|
||||
"engineersdecor.config.pattern_includes": "Pattern includes",
|
||||
"engineersdecor.config.without_clinker_bricks": "Without clinker bricks",
|
||||
"engineersdecor.config.without_slag_bricks": "Without slag bricks",
|
||||
"engineersdecor.config.without_rebar_concrete": "Without rebar concrete",
|
||||
"engineersdecor.config.without_walls": "Without walls",
|
||||
"engineersdecor.config.without_stairs": "Without stairs",
|
||||
"engineersdecor.config.without_ie_concrete_wall": "Without concrete wall",
|
||||
"engineersdecor.config.without_panzer_glass": "Without panzer glass",
|
||||
"engineersdecor.config.without_crafting_table": "Without crafting table",
|
||||
"engineersdecor.config.without_lab_furnace": "Without lab furnace",
|
||||
"engineersdecor.config.without_electrical_furnace": "Without electrical furnace",
|
||||
"engineersdecor.config.without_treated_wood_furniture": "Without tr. wood furniture",
|
||||
"engineersdecor.config.without_windows": "Without windows",
|
||||
"engineersdecor.config.without_light_sources": "Without lights",
|
||||
"engineersdecor.config.without_ladders": "Without ladders",
|
||||
"engineersdecor.config.without_chair_sitting": "Without chair sitting",
|
||||
"engineersdecor.config.without_mob_chair_sitting": "Without chair mob sitting",
|
||||
"engineersdecor.config.without_ladder_speed_boost": "Without ladder speed boost",
|
||||
"engineersdecor.config.without_crafting_table_history": "Without crafting table history",
|
||||
"engineersdecor.config.without_valves": "Without valves",
|
||||
"engineersdecor.config.without_passive_fluid_accumulator": "Without fluid accumulator",
|
||||
"engineersdecor.config.without_waste_incinerator": "Without waste incinerator",
|
||||
"engineersdecor.config.without_sign_plates": "Without signs",
|
||||
"engineersdecor.config.without_factory_dropper": "Without factory dropper",
|
||||
"engineersdecor.config.without_slabs": "Without slabs",
|
||||
"engineersdecor.config.without_halfslabs": "Without slab slices",
|
||||
"engineersdecor.config.without_direct_slab_pickup": "Without slab pickup",
|
||||
"engineersdecor.config.without_poles": "Without poles",
|
||||
"engineersdecor.config.without_hsupports": "Without h. supports",
|
||||
"engineersdecor.config.without_tooltips": "Without tooltips",
|
||||
"engineersdecor.config.without_recipes": "Without recipes",
|
||||
"engineersdecor.config.furnace_smelting_speed_percent": "Furnace: Smelting speed %",
|
||||
"engineersdecor.config.furnace_fuel_efficiency_percent": "Furnace: Fuel efficiency %",
|
||||
"engineersdecor.config.furnace_boost_energy_consumption": "Furnace: Boost energy",
|
||||
"engineersdecor.config.chair_mob_sitting_probability_percent": "Chairs: Sitting chance %",
|
||||
"engineersdecor.config.chair_mob_standup_probability_percent": "\"Chairs: Stand up chance %\"",
|
||||
"engineersdecor.config.with_crafting_quickmove_buttons": "Crafting table: Move buttons",
|
||||
"engineersdecor.config.pipevalve_max_flowrate": "Valves: Max flow rate",
|
||||
"engineersdecor.config.pipevalve_redstone_gain": "Valves: Redstone slope",
|
||||
"engineersdecor.config.e_furnace_speed_percent": "E-furnace: Smelting speed %",
|
||||
"engineersdecor.config.e_furnace_power_consumption": "E-furnace: Power consumption",
|
||||
"block.engineersdecor.clinker_brick_block": "Clinker Brick Block",
|
||||
"block.engineersdecor.clinker_brick_block.help": "§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.clinker_brick_stained_block": "Stained Clinker Brick Block",
|
||||
"block.engineersdecor.clinker_brick_stained_block.help": "§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.",
|
||||
"block.engineersdecor.slag_brick_block": "Slag Brick Block",
|
||||
"block.engineersdecor.slag_brick_block.help": "§6A gray-brown brick block with position dependent texture variations.",
|
||||
"block.engineersdecor.rebar_concrete": "Rebar Concrete Block",
|
||||
"block.engineersdecor.rebar_concrete.help": "§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian.",
|
||||
"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.panzerglass_block": "Panzer Glass Block",
|
||||
"block.engineersdecor.panzerglass_block.help": "§6Reinforced glass block.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible, multi texture for seemless look.",
|
||||
"block.engineersdecor.rebar_concrete_tile": "Rebar Concrete Tile",
|
||||
"block.engineersdecor.rebar_concrete_tile.help": "§6Steel reinforced concrete tile.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.clinker_brick_slab": "Clinker Brick Slab",
|
||||
"block.engineersdecor.clinker_brick_slab.help": "§6Slab made from a Clinker Block.§r\nLooks slightly darker and more color intensive than the vanilla brick.",
|
||||
"block.engineersdecor.clinker_brick_stained_slab": "Stained Clinker Brick Slab",
|
||||
"block.engineersdecor.clinker_brick_stained_slab.help": "§6Slab made from a Stained Clinker Block.",
|
||||
"block.engineersdecor.slag_brick_slab": "Slag Brick Slab",
|
||||
"block.engineersdecor.slag_brick_slab.help": "§6A gray-brown brick slab.",
|
||||
"block.engineersdecor.rebar_concrete_slab": "Rebar Concrete Slab",
|
||||
"block.engineersdecor.rebar_concrete_slab.help": "§6Steel reinforced concrete slab.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab": "Rebar Concrete Tile Slab",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab.help": "§6Steel reinforced concrete tile slab.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
|
||||
"block.engineersdecor.gas_concrete_slab.help": "§6Low hardness concrete slab.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.panzerglass_slab": "Panzer Glass Slab",
|
||||
"block.engineersdecor.panzerglass_slab.help": "§6Reinforced glass slab.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible.",
|
||||
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
|
||||
"block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r",
|
||||
"block.engineersdecor.rebar_concrete_wall": "Rebar Concrete Wall",
|
||||
"block.engineersdecor.rebar_concrete_wall.help": "§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.concrete_wall": "Concrete Wall",
|
||||
"block.engineersdecor.concrete_wall.help": "§6Wall made of solid concrete.",
|
||||
"block.engineersdecor.gas_concrete_wall": "Gas Concrete Wall",
|
||||
"block.engineersdecor.gas_concrete_wall.help": "§6Low hardness concrete wall.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.clinker_brick_wall": "Clinker Brick Wall",
|
||||
"block.engineersdecor.clinker_brick_wall.help": "§6Simplistic Clinker Brick Wall.",
|
||||
"block.engineersdecor.slag_brick_wall": "Slag Brick Wall",
|
||||
"block.engineersdecor.slag_brick_wall.help": "§6Simplistic Slag Brick Wall.",
|
||||
"block.engineersdecor.metal_rung_ladder": "Metal Rung Ladder",
|
||||
"block.engineersdecor.metal_rung_ladder.help": "§6Typical industrial wall ladder, consisting of horizontal metal rod rungs.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.metal_rung_steps": "Staggered Metal Steps",
|
||||
"block.engineersdecor.metal_rung_steps.help": "§6Staggered rod rungs affixed to a wall, allowing to climb up, fall down, and so on.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder",
|
||||
"block.engineersdecor.treated_wood_ladder.help": "§6Weather-proof wooden ladder.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.clinker_brick_stairs": "Clinker Brick Stairs",
|
||||
"block.engineersdecor.clinker_brick_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs": "Stained Clinker Brick Stairs",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Clinker Brick Stairs",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.rebar_concrete_stairs": "Rebar Concrete Stairs",
|
||||
"block.engineersdecor.rebar_concrete_stairs.help": "§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs": "Rebar Concrete Tile Stairs",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs.help": "§6Steel reinforced concrete tile stairs.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Gas Concrete Stairs",
|
||||
"block.engineersdecor.gas_concrete_stairs.help": "§6Low hardness concrete stairs.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.treated_wood_pole": "Straight Treated Wood Pole",
|
||||
"block.engineersdecor.treated_wood_pole.help": "§6Straight pole fragment with a diameter of a wire relay.§r\n Can be useful as alternative to the wire posts if special lengths are needed, or as support for structures.",
|
||||
"block.engineersdecor.treated_wood_pole_head": "Straight Treated Wood Pole Head/Foot",
|
||||
"block.engineersdecor.treated_wood_pole_head.help": "§6Wooden part fitting as foot or head of straight poles.",
|
||||
"block.engineersdecor.treated_wood_pole_support": "Straight Treated Wood Pole Support",
|
||||
"block.engineersdecor.treated_wood_pole_support.help": "§6Heavy duty wooden support part fitting as foot or head of straight poles.",
|
||||
"block.engineersdecor.thick_steel_pole": "Straight Thick Steel Pole",
|
||||
"block.engineersdecor.thick_steel_pole.help": "§6Straight hollow pole fragment (6x6x16) for structural support purposes.",
|
||||
"block.engineersdecor.thin_steel_pole": "Straight Thin Steel Pole",
|
||||
"block.engineersdecor.thin_steel_pole.help": "§6Straight hollow pole fragment (4x4x16) for structural support purposes.",
|
||||
"block.engineersdecor.thin_steel_pole_head": "Straight Thin Steel Pole head/foot",
|
||||
"block.engineersdecor.thin_steel_pole_head.help": "§6Steel part fitting as foot or head of the thin steel pole (4x4x16).",
|
||||
"block.engineersdecor.thick_steel_pole_head": "Straight Thick Steel Pole Head/Foot",
|
||||
"block.engineersdecor.thick_steel_pole_head.help": "§6Steel part fitting as foot or head of the thick steel pole (6x6x16).",
|
||||
"block.engineersdecor.steel_double_t_support": "Steel Double T Support",
|
||||
"block.engineersdecor.steel_double_t_support.help": "§6Horizontal ceiling support beam fragment.",
|
||||
"block.engineersdecor.treated_wood_table": "Treated Wood Table",
|
||||
"block.engineersdecor.treated_wood_table.help": "§6Robust four-legged wood table.§r Indoor and outdoor use.",
|
||||
"block.engineersdecor.steel_table": "Steel Table",
|
||||
"block.engineersdecor.steel_table.help": "§6Robust four-legged steel table.",
|
||||
"block.engineersdecor.steel_floor_grating": "Steel Floor Grating",
|
||||
"block.engineersdecor.steel_floor_grating.help": "§6Decorative steel floor covering.§r Top aligned. Items fall through.",
|
||||
"block.engineersdecor.treated_wood_stool": "Treated Wood Stool",
|
||||
"block.engineersdecor.treated_wood_stool.help": "§6Robust Wood Stool.§r Indoor and outdoor use.",
|
||||
"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.",
|
||||
"block.engineersdecor.treated_wood_side_table": "Treated Wood Side Table",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.",
|
||||
"block.engineersdecor.iron_inset_light": "Inset Light",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Small glowstone light source, sunk into the floor, ceiling or wall.§r\n Useful to light up places where electrical light installations are problematic.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light",
|
||||
"block.engineersdecor.iron_floor_edge_light.help": "§6Small glowstone light source, placed at the edge of a floor block.§r\n Useful to light up places where electrical light installations are problematic.",
|
||||
"block.engineersdecor.treated_wood_window": "Treated Wood Window",
|
||||
"block.engineersdecor.treated_wood_window.help": "§6Wood framed triple glazed window. Well insulating.§r Does not connect to adjacent blocks like glass panes.",
|
||||
"block.engineersdecor.treated_wood_windowsill": "Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_windowsill.help": "§6Simple window decoration.",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Broad Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.",
|
||||
"block.engineersdecor.steel_framed_window": "Steel Framed Window",
|
||||
"block.engineersdecor.steel_framed_window.help": "§6Steel framed triple glazed window. Well insulating. §r Does not connect to adjacent blocks like glass panes.",
|
||||
"block.engineersdecor.steel_mesh_fence": "Steel Mesh Fence",
|
||||
"block.engineersdecor.steel_mesh_fence.help": "§6Industrial style fence.§r\nDoes not connect do regular fences.",
|
||||
"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_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_waste_incinerator": "Small Waste Incinerator",
|
||||
"block.engineersdecor.small_waste_incinerator.help": "§6Trash with internal fifo slots.§r Items can be inserted on all sides, and are kept until there is no space left in the fifo. After that the oldest stack will be incinerated. Apply electrical RF/FE power to increase the processing speed. Keeps its inventory when being relocated.",
|
||||
"block.engineersdecor.straight_pipe_valve": "Fluid Pipe Check Valve",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Reduces flow rate. Sneak to place in reverse direction.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone": "Redstone Controlled Fluid Valve",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Sneak to place in reverse direction. Blocks if not redstone powered.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog": "Redstone Analog Fluid Valve",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Sneak to place in reverse direction. Blocks if not redstone powered, reduces the flow rate linear from power 1 to 14, opens to maximum possible valve flow rate for power 15.",
|
||||
"block.engineersdecor.passive_fluid_accumulator": "Passive Fluid Accumulator",
|
||||
"block.engineersdecor.passive_fluid_accumulator.help": "§6Vacuum suction based fluid collector.§r Has one output, all other sides are input. Drains fluids from adjacent tanks when being drained from the output port by a pump.",
|
||||
"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.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_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_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.small_block_breaker": "Small Block Breaker",
|
||||
"block.engineersdecor.small_block_breaker.help": "§6Breaks blocks in front of it.§r\n Can be disabled by applying a redstone signal. The time needed to destroy a block depends on the hardness of that block. ${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_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_solar_panel": "Small Solar Panel",
|
||||
"block.engineersdecor.small_solar_panel.help": "§6Produces a small amount of power when exposed to sunlight.§r\n Useful for charging LF capacitors in remote systems with low consumption. The internal charge pump circuit accumulates and frequently transfers RF. Production depends on day time and the weather.",
|
||||
"block.engineersdecor.small_tree_cutter": "Small Tree Cutter",
|
||||
"block.engineersdecor.small_tree_cutter.help": "§6Chops grown trees in front of it.§r\n Does not collect the lumbers. Deactivate with a redstone signal. ${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"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.sign_decor": "Sign Plate (Engineer's decor)",
|
||||
"block.engineersdecor.sign_decor.help": "§6This should not be craftable or visible in JEI. Used for creative tab and screenshots.",
|
||||
"block.engineersdecor.sign_hotwire": "Sign \"Caution Hot Wire\"",
|
||||
"block.engineersdecor.sign_hotwire.help": "§6Electrical hazard warning. Don't forget to place around HV, or you will have a nonconformity in the next audit.",
|
||||
"block.engineersdecor.sign_mindstep": "Sign \"Mind The Step\"",
|
||||
"block.engineersdecor.sign_mindstep.help": "§6Placable on walls (horizontally).",
|
||||
"block.engineersdecor.sign_danger": "Sign \"Caution Really Dangerous There\"",
|
||||
"block.engineersdecor.sign_danger.help": "§6General danger warning.",
|
||||
"block.engineersdecor.sign_defense": "Sign \"Caution Defense System Ahead\"",
|
||||
"block.engineersdecor.sign_defense.help": "§6Warning sign for turrets, Tesla Coils, and traps.",
|
||||
"block.engineersdecor.sign_factoryarea": "Sign \"Factory Area\"",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Marker sign for buildings or areas where the really big machines are located.",
|
||||
"block.engineersdecor.sign_exit": "Exit Sign",
|
||||
"block.engineersdecor.sign_exit.help": "§6There's the door, please ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "Rebar Concrete Slice",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_concrete": "Concrete Slice",
|
||||
"block.engineersdecor.halfslab_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Gas Concrete Slice",
|
||||
"block.engineersdecor.halfslab_gas_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_treated_wood": "Treated Wood Slice",
|
||||
"block.engineersdecor.halfslab_treated_wood.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron": "Iron Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_steel": "Steel Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_steel.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_copper": "Copper Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_copper.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_gold": "Gold Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_gold.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum": "Aluminum Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.testblock": "ED Test Block (do NOT use)",
|
||||
"block.engineersdecor.testblock.help": "§6Uncraftable mod testing block with changing experimental functionality. DO NOT USE, may even cause a crash in the worst case!!"
|
||||
"language": "English",
|
||||
"language.code": "en_us",
|
||||
"language.region": "United States",
|
||||
"itemGroup.tabengineersdecor": "Engineer's Decor",
|
||||
"engineersdecor.config.title": "Engineer's Decor Config",
|
||||
"engineersdecor.tooltip.hint.extended": "§6[§9SHIFT§r More Info§6]§r",
|
||||
"engineersdecor.tooltip.hint.help": "§6[§9CTRL-SHIFT§r Help§6]§r",
|
||||
"engineersdecor.tooltip.slabpickup.help": "§rFast pickup by left-clicking while looking up/down and holding this slab.",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Requires RF power.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Apply RF power to magnificently increase the speed.",
|
||||
"engineersdecor.config.pattern_excludes": "Pattern excludes",
|
||||
"engineersdecor.config.pattern_includes": "Pattern includes",
|
||||
"engineersdecor.config.without_clinker_bricks": "Without clinker bricks",
|
||||
"engineersdecor.config.without_slag_bricks": "Without slag bricks",
|
||||
"engineersdecor.config.without_rebar_concrete": "Without rebar concrete",
|
||||
"engineersdecor.config.without_walls": "Without walls",
|
||||
"engineersdecor.config.without_stairs": "Without stairs",
|
||||
"engineersdecor.config.without_ie_concrete_wall": "Without concrete wall",
|
||||
"engineersdecor.config.without_panzer_glass": "Without panzer glass",
|
||||
"engineersdecor.config.without_crafting_table": "Without crafting table",
|
||||
"engineersdecor.config.without_lab_furnace": "Without lab furnace",
|
||||
"engineersdecor.config.without_electrical_furnace": "Without electrical furnace",
|
||||
"engineersdecor.config.without_treated_wood_furniture": "Without tr. wood furniture",
|
||||
"engineersdecor.config.without_windows": "Without windows",
|
||||
"engineersdecor.config.without_light_sources": "Without lights",
|
||||
"engineersdecor.config.without_ladders": "Without ladders",
|
||||
"engineersdecor.config.without_chair_sitting": "Without chair sitting",
|
||||
"engineersdecor.config.without_mob_chair_sitting": "Without chair mob sitting",
|
||||
"engineersdecor.config.without_ladder_speed_boost": "Without ladder speed boost",
|
||||
"engineersdecor.config.without_crafting_table_history": "Without crafting table history",
|
||||
"engineersdecor.config.without_valves": "Without valves",
|
||||
"engineersdecor.config.without_passive_fluid_accumulator": "Without fluid accumulator",
|
||||
"engineersdecor.config.without_waste_incinerator": "Without waste incinerator",
|
||||
"engineersdecor.config.without_sign_plates": "Without signs",
|
||||
"engineersdecor.config.without_factory_dropper": "Without factory dropper",
|
||||
"engineersdecor.config.without_slabs": "Without slabs",
|
||||
"engineersdecor.config.without_halfslabs": "Without slab slices",
|
||||
"engineersdecor.config.without_direct_slab_pickup": "Without slab pickup",
|
||||
"engineersdecor.config.without_poles": "Without poles",
|
||||
"engineersdecor.config.without_hsupports": "Without h. supports",
|
||||
"engineersdecor.config.without_tooltips": "Without tooltips",
|
||||
"engineersdecor.config.without_recipes": "Without recipes",
|
||||
"engineersdecor.config.furnace_smelting_speed_percent": "Furnace: Smelting speed %",
|
||||
"engineersdecor.config.furnace_fuel_efficiency_percent": "Furnace: Fuel efficiency %",
|
||||
"engineersdecor.config.furnace_boost_energy_consumption": "Furnace: Boost energy",
|
||||
"engineersdecor.config.chair_mob_sitting_probability_percent": "Chairs: Sitting chance %",
|
||||
"engineersdecor.config.chair_mob_standup_probability_percent": "\"Chairs: Stand up chance %\"",
|
||||
"engineersdecor.config.with_crafting_quickmove_buttons": "Crafting table: Move buttons",
|
||||
"engineersdecor.config.pipevalve_max_flowrate": "Valves: Max flow rate",
|
||||
"engineersdecor.config.pipevalve_redstone_gain": "Valves: Redstone slope",
|
||||
"engineersdecor.config.e_furnace_speed_percent": "E-furnace: Smelting speed %",
|
||||
"engineersdecor.config.e_furnace_power_consumption": "E-furnace: Power consumption",
|
||||
"block.engineersdecor.clinker_brick_block": "Clinker Brick Block",
|
||||
"block.engineersdecor.clinker_brick_block.help": "§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.clinker_brick_stained_block": "Stained Clinker Brick Block",
|
||||
"block.engineersdecor.clinker_brick_stained_block.help": "§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.",
|
||||
"block.engineersdecor.slag_brick_block": "Slag Brick Block",
|
||||
"block.engineersdecor.slag_brick_block.help": "§6A gray-brown brick block with position dependent texture variations.",
|
||||
"block.engineersdecor.rebar_concrete": "Rebar Concrete Block",
|
||||
"block.engineersdecor.rebar_concrete.help": "§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian.",
|
||||
"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.panzerglass_block": "Panzer Glass Block",
|
||||
"block.engineersdecor.panzerglass_block.help": "§6Reinforced glass block.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible, multi texture for seemless look.",
|
||||
"block.engineersdecor.rebar_concrete_tile": "Rebar Concrete Tile",
|
||||
"block.engineersdecor.rebar_concrete_tile.help": "§6Steel reinforced concrete tile.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.clinker_brick_slab": "Clinker Brick Slab",
|
||||
"block.engineersdecor.clinker_brick_slab.help": "§6Slab made from a Clinker Block.§r\nLooks slightly darker and more color intensive than the vanilla brick.",
|
||||
"block.engineersdecor.clinker_brick_stained_slab": "Stained Clinker Brick Slab",
|
||||
"block.engineersdecor.clinker_brick_stained_slab.help": "§6Slab made from a Stained Clinker Block.",
|
||||
"block.engineersdecor.slag_brick_slab": "Slag Brick Slab",
|
||||
"block.engineersdecor.slag_brick_slab.help": "§6A gray-brown brick slab.",
|
||||
"block.engineersdecor.rebar_concrete_slab": "Rebar Concrete Slab",
|
||||
"block.engineersdecor.rebar_concrete_slab.help": "§6Steel reinforced concrete slab.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab": "Rebar Concrete Tile Slab",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab.help": "§6Steel reinforced concrete tile slab.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
|
||||
"block.engineersdecor.gas_concrete_slab.help": "§6Low hardness concrete slab.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.panzerglass_slab": "Panzer Glass Slab",
|
||||
"block.engineersdecor.panzerglass_slab.help": "§6Reinforced glass slab.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible.",
|
||||
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
|
||||
"block.engineersdecor.treated_wood_floor.help": "§6Decorative floor tiles with texture variations.§r",
|
||||
"block.engineersdecor.rebar_concrete_wall": "Rebar Concrete Wall",
|
||||
"block.engineersdecor.rebar_concrete_wall.help": "§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.concrete_wall": "Concrete Wall",
|
||||
"block.engineersdecor.concrete_wall.help": "§6Wall made of solid concrete.",
|
||||
"block.engineersdecor.gas_concrete_wall": "Gas Concrete Wall",
|
||||
"block.engineersdecor.gas_concrete_wall.help": "§6Low hardness concrete wall.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.clinker_brick_wall": "Clinker Brick Wall",
|
||||
"block.engineersdecor.clinker_brick_wall.help": "§6Simplistic Clinker Brick Wall.",
|
||||
"block.engineersdecor.slag_brick_wall": "Slag Brick Wall",
|
||||
"block.engineersdecor.slag_brick_wall.help": "§6Simplistic Slag Brick Wall.",
|
||||
"block.engineersdecor.metal_rung_ladder": "Metal Rung Ladder",
|
||||
"block.engineersdecor.metal_rung_ladder.help": "§6Typical industrial wall ladder, consisting of horizontal metal rod rungs.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.metal_rung_steps": "Staggered Metal Steps",
|
||||
"block.engineersdecor.metal_rung_steps.help": "§6Staggered rod rungs affixed to a wall, allowing to climb up, fall down, and so on.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.treated_wood_ladder": "Treated Wood Ladder",
|
||||
"block.engineersdecor.treated_wood_ladder.help": "§6Weather-proof wooden ladder.§r Look up/down to climb faster.",
|
||||
"block.engineersdecor.clinker_brick_stairs": "Clinker Brick Stairs",
|
||||
"block.engineersdecor.clinker_brick_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block.",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs": "Stained Clinker Brick Stairs",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs.help": "§6Looks slightly darker and more color intensive than the vanilla brick block. Has more visible traces of grime or stain.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Slag Brick Stairs",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Gray-brown brick stairs.",
|
||||
"block.engineersdecor.rebar_concrete_stairs": "Rebar Concrete Stairs",
|
||||
"block.engineersdecor.rebar_concrete_stairs.help": "§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs": "Rebar Concrete Tile Stairs",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs.help": "§6Steel reinforced concrete tile stairs.§r Expensive but Creeper-proof like obsidian.",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Gas Concrete Stairs",
|
||||
"block.engineersdecor.gas_concrete_stairs.help": "§6Low hardness concrete stairs.§r Easy to break decorative concrete.",
|
||||
"block.engineersdecor.treated_wood_pole": "Straight Treated Wood Pole",
|
||||
"block.engineersdecor.treated_wood_pole.help": "§6Straight pole fragment with a diameter of a wire relay.§r\n Can be useful as alternative to the wire posts if special lengths are needed, or as support for structures.",
|
||||
"block.engineersdecor.treated_wood_pole_head": "Straight Treated Wood Pole Head/Foot",
|
||||
"block.engineersdecor.treated_wood_pole_head.help": "§6Wooden part fitting as foot or head of straight poles.",
|
||||
"block.engineersdecor.treated_wood_pole_support": "Straight Treated Wood Pole Support",
|
||||
"block.engineersdecor.treated_wood_pole_support.help": "§6Heavy duty wooden support part fitting as foot or head of straight poles.",
|
||||
"block.engineersdecor.thick_steel_pole": "Straight Thick Steel Pole",
|
||||
"block.engineersdecor.thick_steel_pole.help": "§6Straight hollow pole fragment (6x6x16) for structural support purposes.",
|
||||
"block.engineersdecor.thin_steel_pole": "Straight Thin Steel Pole",
|
||||
"block.engineersdecor.thin_steel_pole.help": "§6Straight hollow pole fragment (4x4x16) for structural support purposes.",
|
||||
"block.engineersdecor.thin_steel_pole_head": "Straight Thin Steel Pole head/foot",
|
||||
"block.engineersdecor.thin_steel_pole_head.help": "§6Steel part fitting as foot or head of the thin steel pole (4x4x16).",
|
||||
"block.engineersdecor.thick_steel_pole_head": "Straight Thick Steel Pole Head/Foot",
|
||||
"block.engineersdecor.thick_steel_pole_head.help": "§6Steel part fitting as foot or head of the thick steel pole (6x6x16).",
|
||||
"block.engineersdecor.steel_double_t_support": "Steel Double T Support",
|
||||
"block.engineersdecor.steel_double_t_support.help": "§6Horizontal ceiling support beam fragment.",
|
||||
"block.engineersdecor.treated_wood_table": "Treated Wood Table",
|
||||
"block.engineersdecor.treated_wood_table.help": "§6Robust four-legged wood table.§r Indoor and outdoor use.",
|
||||
"block.engineersdecor.steel_table": "Steel Table",
|
||||
"block.engineersdecor.steel_table.help": "§6Robust four-legged steel table.",
|
||||
"block.engineersdecor.steel_floor_grating": "Steel Floor Grating",
|
||||
"block.engineersdecor.steel_floor_grating.help": "§6Decorative steel floor covering.§r Top aligned. Items fall through.",
|
||||
"block.engineersdecor.treated_wood_stool": "Treated Wood Stool",
|
||||
"block.engineersdecor.treated_wood_stool.help": "§6Robust Wood Stool.§r Indoor and outdoor use.",
|
||||
"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_side_table": "Treated Wood Side Table",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.",
|
||||
"block.engineersdecor.iron_inset_light": "Inset Light",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Small glowstone light source, sunk into the floor, ceiling or wall.§r\n Useful to light up places where electrical light installations are problematic.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light",
|
||||
"block.engineersdecor.iron_floor_edge_light.help": "§6Small glowstone light source, placed at the edge of a floor block.§r\n Useful to light up places where electrical light installations are problematic.",
|
||||
"block.engineersdecor.treated_wood_window": "Treated Wood Window",
|
||||
"block.engineersdecor.treated_wood_window.help": "§6Wood framed triple glazed window. Well insulating.§r Does not connect to adjacent blocks like glass panes.",
|
||||
"block.engineersdecor.treated_wood_windowsill": "Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_windowsill.help": "§6Simple window decoration.",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Broad Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Simple window decoration.",
|
||||
"block.engineersdecor.steel_framed_window": "Steel Framed Window",
|
||||
"block.engineersdecor.steel_framed_window.help": "§6Steel framed triple glazed window. Well insulating. §r Does not connect to adjacent blocks like glass panes.",
|
||||
"block.engineersdecor.steel_mesh_fence": "Steel Mesh Fence",
|
||||
"block.engineersdecor.steel_mesh_fence.help": "§6Industrial style fence.§r\nDoes not connect do regular fences.",
|
||||
"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_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_waste_incinerator": "Small Waste Incinerator",
|
||||
"block.engineersdecor.small_waste_incinerator.help": "§6Trash with internal fifo slots.§r Items can be inserted on all sides, and are kept until there is no space left in the fifo. After that the oldest stack will be incinerated. Apply electrical RF/FE power to increase the processing speed. Keeps its inventory when being relocated.",
|
||||
"block.engineersdecor.straight_pipe_valve": "Fluid Pipe Check Valve",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Reduces flow rate. Sneak to place in reverse direction.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone": "Redstone Controlled Fluid Valve",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Sneak to place in reverse direction. Blocks if not redstone powered.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog": "Redstone Analog Fluid Valve",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog.help": "§6Straight fluid pipe fragment.§r Conducts fluids only in one direction. Does not connect to the sides. Sneak to place in reverse direction. Blocks if not redstone powered, reduces the flow rate linear from power 1 to 14, opens to maximum possible valve flow rate for power 15.",
|
||||
"block.engineersdecor.passive_fluid_accumulator": "Passive Fluid Accumulator",
|
||||
"block.engineersdecor.passive_fluid_accumulator.help": "§6Vacuum suction based fluid collector.§r Has one output, all other sides are input. Drains fluids from adjacent tanks when being drained from the output port by a pump.",
|
||||
"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.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_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_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.small_block_breaker": "Small Block Breaker",
|
||||
"block.engineersdecor.small_block_breaker.help": "§6Breaks blocks in front of it.§r\n Can be disabled by applying a redstone signal. The time needed to destroy a block depends on the hardness of that block. ${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_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_solar_panel": "Small Solar Panel",
|
||||
"block.engineersdecor.small_solar_panel.help": "§6Produces a small amount of power when exposed to sunlight.§r\n Useful for charging LF capacitors in remote systems with low consumption. The internal charge pump circuit accumulates and frequently transfers RF. Production depends on day time and the weather.",
|
||||
"block.engineersdecor.small_tree_cutter": "Small Tree Cutter",
|
||||
"block.engineersdecor.small_tree_cutter.help": "§6Chops grown trees in front of it.§r\n Does not collect the lumbers. Deactivate with a redstone signal. ${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"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.sign_decor": "Sign Plate (Engineer's decor)",
|
||||
"block.engineersdecor.sign_decor.help": "§6This should not be craftable or visible in JEI. Used for creative tab and screenshots.",
|
||||
"block.engineersdecor.sign_hotwire": "Sign \"Caution Hot Wire\"",
|
||||
"block.engineersdecor.sign_hotwire.help": "§6Electrical hazard warning. Don't forget to place around HV, or you will have a nonconformity in the next audit.",
|
||||
"block.engineersdecor.sign_mindstep": "Sign \"Mind The Step\"",
|
||||
"block.engineersdecor.sign_mindstep.help": "§6Placable on walls (horizontally).",
|
||||
"block.engineersdecor.sign_danger": "Sign \"Caution Really Dangerous There\"",
|
||||
"block.engineersdecor.sign_danger.help": "§6General danger warning.",
|
||||
"block.engineersdecor.sign_defense": "Sign \"Caution Defense System Ahead\"",
|
||||
"block.engineersdecor.sign_defense.help": "§6Warning sign for turrets, Tesla Coils, and traps.",
|
||||
"block.engineersdecor.sign_factoryarea": "Sign \"Factory Area\"",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Marker sign for buildings or areas where the really big machines are located.",
|
||||
"block.engineersdecor.sign_exit": "Exit Sign",
|
||||
"block.engineersdecor.sign_exit.help": "§6There's the door, please ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "Rebar Concrete Slice",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_concrete": "Concrete Slice",
|
||||
"block.engineersdecor.halfslab_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Gas Concrete Slice",
|
||||
"block.engineersdecor.halfslab_gas_concrete.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_treated_wood": "Treated Wood Slice",
|
||||
"block.engineersdecor.halfslab_treated_wood.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron": "Iron Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_steel": "Steel Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_steel.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_copper": "Copper Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_copper.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_gold": "Gold Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_gold.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum": "Aluminum Sheet Metal Slice",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum.help": "§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.",
|
||||
"block.engineersdecor.testblock": "ED Test Block (do NOT use)",
|
||||
"block.engineersdecor.testblock.help": "§6Uncraftable mod testing block with changing experimental functionality. DO NOT USE, may even cause a crash in the worst case!!"
|
||||
}
|
|
@ -7,10 +7,10 @@
|
|||
"engineersdecor.tooltip.hint.extended": "§6[§9SHIFT§r Больше информации§6]§r",
|
||||
"engineersdecor.tooltip.hint.help": "§6[§9CTRL-SHIFT§r Помощь§6]§r",
|
||||
"engineersdecor.tooltip.slabpickup.help": "§rБыстрое поднятие щелчком ЛКМ, смотря вверх/вниз с этой плитой в руках.",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Requires RF power.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Apply RF power to magnificently increase the speed.",
|
||||
"engineersdecor.config.pattern_excludes": "Pattern excludes",
|
||||
"engineersdecor.config.pattern_includes": "Pattern includes",
|
||||
"engineersdecor.tooltip.requires_rf_power": "Требуется RF энергия.",
|
||||
"engineersdecor.tooltip.massive_speed_boost_with_rf_power": "Подайте RF энергию, чтобы значительно увеличить скорость.",
|
||||
"engineersdecor.config.pattern_excludes": "Шаблон исключает",
|
||||
"engineersdecor.config.pattern_includes": "Шаблон включает",
|
||||
"engineersdecor.config.without_clinker_bricks": "Без клинкерных кирпичей",
|
||||
"engineersdecor.config.without_slag_bricks": "Без шлаковых кирпичей",
|
||||
"engineersdecor.config.without_rebar_concrete": "Без железобетона",
|
||||
|
@ -59,7 +59,8 @@
|
|||
"block.engineersdecor.slag_brick_block.help": "§6Серо-коричневый кирпичный блок с зависимыми от положения вариациями текстуры.",
|
||||
"block.engineersdecor.rebar_concrete": "Железобетон",
|
||||
"block.engineersdecor.rebar_concrete.help": "§6Стальной железобетонный блок.§r Дорогой, но взрывоустойчивый, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete": "Gas Concrete Block",
|
||||
"block.engineersdecor.gas_concrete": "Газобетон",
|
||||
"block.engineersdecor.gas_concrete.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
|
||||
"block.engineersdecor.panzerglass_block": "Бронированное стекло",
|
||||
"block.engineersdecor.panzerglass_block.help": "§6Усиленный стеклоблок.§r Дорогой, взрывоустойчивый. Имеет тёмно-серый оттенок, слегка видны структурные линии, мультитекстура для бесшовного отображения.",
|
||||
"block.engineersdecor.rebar_concrete_tile": "Железобетонная плита",
|
||||
|
@ -74,15 +75,18 @@
|
|||
"block.engineersdecor.rebar_concrete_slab.help": "§6Бетонная плита, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab": "Железобетонная плитка",
|
||||
"block.engineersdecor.rebar_concrete_tile_slab.help": "§6Бетонная плитка, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete_slab": "Gas Concrete Slab",
|
||||
"block.engineersdecor.gas_concrete_slab": "Газобетонная плита",
|
||||
"block.engineersdecor.gas_concrete_slab.help": "§6Низкая твердость, высокая производительность бетона.§r Легко ломающийся декоративный бетонный блок.",
|
||||
"block.engineersdecor.panzerglass_slab": "Плита из бронированного стекла",
|
||||
"block.engineersdecor.panzerglass_slab.help": "§6Усиленная стеклянная плита.§r Дорогая, взрывоустойчивая. Имеет тёмно-серый оттенок, слегка видны структурные линии.",
|
||||
"block.engineersdecor.treated_wood_floor": "Treated Wood Floor",
|
||||
"block.engineersdecor.treated_wood_floor": "Пол из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_floor.help": "§6Декоративная напольная плитка с текстурными вариациями.§r",
|
||||
"block.engineersdecor.rebar_concrete_wall": "Железобетонная стена",
|
||||
"block.engineersdecor.rebar_concrete_wall.help": "§6Стальная железобетонная стена.§r Дорогая, но взрывоустойчивая, как обсидиан.",
|
||||
"block.engineersdecor.concrete_wall": "Бетонная стена",
|
||||
"block.engineersdecor.concrete_wall.help": "§6Стена из твёрдого бетона.",
|
||||
"block.engineersdecor.gas_concrete_wall": "Gas Concrete Wall",
|
||||
"block.engineersdecor.gas_concrete_wall": "Газобетонная стена",
|
||||
"block.engineersdecor.gas_concrete_wall.help": "§6Бетонная стена низкой твердости.§r Легко ломающийся декоративный бетон.",
|
||||
"block.engineersdecor.clinker_brick_wall": "Клинкерная кирпичная стена",
|
||||
"block.engineersdecor.clinker_brick_wall.help": "§6Обыкновенная клинкерная кирпичная стена.",
|
||||
"block.engineersdecor.slag_brick_wall": "Кирпичная стена из шлакоблока",
|
||||
|
@ -97,13 +101,14 @@
|
|||
"block.engineersdecor.clinker_brick_stairs.help": "§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs": "Грязные кирпичные ступеньки",
|
||||
"block.engineersdecor.clinker_brick_stained_stairs.help": "§6Выглядят немного темнее и интенсивнее, чем Кирпичный блок. Имеют более заметные следы грязи или пятен.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Клинкерные кирпичные ступеньки",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6По цвету выглядят немного темнее и интенсивнее, чем Кирпичный блок.",
|
||||
"block.engineersdecor.slag_brick_stairs": "Кирпичные ступеньки из шлакоблока",
|
||||
"block.engineersdecor.slag_brick_stairs.help": "§6Серо-коричневые кирпичные ступеньки.",
|
||||
"block.engineersdecor.rebar_concrete_stairs": "Железобетонные ступеньки",
|
||||
"block.engineersdecor.rebar_concrete_stairs.help": "§6Железобетонные ступеньки.§r Дорогие, но взрывоустойчивые, как обсидиан.",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs": "Ступеньки из железобетонной плитки",
|
||||
"block.engineersdecor.rebar_concrete_tile_stairs.help": "§6Ступеньки из железобетонной плитки.§r Дорогие, но взрывоустойчивые, как обсидиан.",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Gas Concrete Stairs",
|
||||
"block.engineersdecor.gas_concrete_stairs": "Газобетонные ступеньки",
|
||||
"block.engineersdecor.gas_concrete_stairs.help": "§6Бетонные ступеньки низкой твёрдости.§r Легко ломающийся декоративный бетон.",
|
||||
"block.engineersdecor.treated_wood_pole": "Прямой обработанный деревянный столб",
|
||||
"block.engineersdecor.treated_wood_pole.help": "§6Надёжный столб с диаметром, схожим с реле.§r\n Может быть полезен в качестве альтернативы столбам для проводов, если требуется особая специальная длина, или как опора для конструкций.",
|
||||
"block.engineersdecor.treated_wood_pole_head": "Прямой обработанный деревянный столб (верхняя часть/основание)",
|
||||
|
@ -129,44 +134,55 @@
|
|||
"block.engineersdecor.treated_wood_stool": "Табурет из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_stool.help": "§6Крепкий деревянный табурет.§r Для использования в помещении и на улице.",
|
||||
"block.engineersdecor.treated_wood_crafting_table": "Верстак из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь.",
|
||||
"block.engineersdecor.treated_wood_side_table": "Treated Wood Side Table",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.",
|
||||
"block.engineersdecor.treated_wood_crafting_table.help": "§6Прочный и устойчивый к погодным условиям. Восемь слотов для хранения. Хранит инвентарь. Нажимайте кнопки со стрелками вверх/вниз для выбора из истории, выходной слот для размещения предметов, X-кнопка очистить сетку крафта и историю. Shift-клик по стеку: передача стека от игрока в хранилище при создании если сетка пуста, в противном случае перенос от игрока в сетку. Автоматически распределяет кликаемый стек. Shift-Ctrl-клик по стаку: перемещает одинаковые стаки. Колёсико мыши: добавляет/отнимает предметы в сетке.",
|
||||
"block.engineersdecor.treated_wood_side_table": "Столик из обработанного дерева",
|
||||
"block.engineersdecor.treated_wood_side_table.help": "§6Нужен после того, как работа выполнена.",
|
||||
"block.engineersdecor.iron_inset_light": "Встраиваемый осветитель",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки. Уровень света - как факел.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light",
|
||||
"block.engineersdecor.iron_inset_light.help": "§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки.",
|
||||
"block.engineersdecor.iron_floor_edge_light": "Встраиваемый снизу осветитель",
|
||||
"block.engineersdecor.iron_floor_edge_light.help": "§6Маленький источник света, интегрируемый в нижнюю грань блока.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки.",
|
||||
"block.engineersdecor.treated_wood_window": "Обработанное деревянное окно",
|
||||
"block.engineersdecor.treated_wood_window.help": "§6Деревянный каркас окна с тройным остеклением. Ну и шумоизоляция.",
|
||||
"block.engineersdecor.treated_wood_windowsill": "Обработанный деревянный подоконник",
|
||||
"block.engineersdecor.treated_wood_windowsill.help": "§6Простое оформление окон.",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Broad Treated Wood Window Sill",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill": "Широкий обработанный деревянный подоконник",
|
||||
"block.engineersdecor.treated_wood_broad_windowsill.help": "§6Простое оформление окон.",
|
||||
"block.engineersdecor.steel_framed_window": "Окно со стальной рамой",
|
||||
"block.engineersdecor.steel_framed_window.help": "§6Стальной каркас окна с тройным остеклением. Хорошо изолирует. §r Не подключается к смежным блокам, таким как стеклянные панели.",
|
||||
"block.engineersdecor.steel_mesh_fence": "Steel Mesh Fence",
|
||||
"block.engineersdecor.steel_mesh_fence": "Забор из стальной сетки",
|
||||
"block.engineersdecor.steel_mesh_fence.help": "§6Забор в индустриальном стиле.§r\nНе стыкуется с обычными заборами.",
|
||||
"block.engineersdecor.small_lab_furnace": "Компактная лабораторная печь",
|
||||
"block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее, чем каменная, поэтому быстрее. Два внутренних слота для ввода, выхода и топлива.",
|
||||
"block.engineersdecor.small_lab_furnace.help": "§6Лабораторная печь в металлическом корпусе.§r Подача твёрдого топлива сверху. Немного горячее и изолированней каменной, поэтому быстрее. Два вспомогательных слота, например для хранения. Два слота-воронки для ввода, вывода, и топлива. Поместите внешний нагреватель в слот AUX и подключите питание для электрического повышения скорости обработки.",
|
||||
"block.engineersdecor.small_electrical_furnace": "Компактная конвейерная электрическая печь",
|
||||
"block.engineersdecor.small_electrical_furnace.help": "§6Компактная конвейерная печь в металлическом корпусе.§r Автоматически принимает предметы со стороны ввода и складывает в инвентарь со стороны вывода. Предметы можно помещать/забирать со всех сторон с помощью воронок. Без проблем пропускает элементы, которые нельзя выплавить или приготовить. Чуть более энергоэффективная и быстрая, чем утеплённая булыжная печь. Транспортировка работает стеками. Механизм требует мало энергии.",
|
||||
"block.engineersdecor.small_waste_incinerator": "Компактный сжигатель отходов",
|
||||
"block.engineersdecor.small_waste_incinerator.help": "§6Отходы с слотами для очереди.§r Предметы могут помещаться с любой стороны, и храниться до тех пор, пока в очереди не останется свободного места. После этого самый старый стек будет сожжен. Подключите электричество (RF/FE) для увеличения скорости обработки. Сохраняет инвентарь при перемещении.",
|
||||
"block.engineersdecor.straight_pipe_valve": "Одноканальный жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Фрагмент прямой трубы.§r Проводит жидкость только в одном направлении. Не соединяется по бокам. Уменьшает пропускную способность. SHIFT для размещения в противоположном направлении.",
|
||||
"block.engineersdecor.straight_pipe_valve.help": "§6Фрагмент прямой трубы.§r Проводит жидкость только в одном направлении. Не соединяется по бокам. Уменьшает пропускную способность. SHIFT для размещения в обратном направлении.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone": "Краснокаменно-контролируемый жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone.help": "§6Фрагмент прямой трубы.§r Проводит жидкости только в одном направлении. Не соединяется по бокам. SHIFT для размещения в обратном направлении. Блокирует поток, если присутствует сигнал красного камня.",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog": "Краснокаменно-аналоговый жидкостный клапан",
|
||||
"block.engineersdecor.straight_pipe_valve_redstone_analog.help": "§6Фрагмент прямой трубы.§r Проводит жидкости только в одном направлении. Не соединяется по бокам. SHIFT для размещения в обратном направлении. Не пропускает при отсутствии сигнала красного камня, уменьшает расход линейно с мощности 1 до 14, открывается максимально-возможно при уровне сигнала красного камня 15.",
|
||||
"block.engineersdecor.passive_fluid_accumulator": "Пассивный жидкостный накопитель",
|
||||
"block.engineersdecor.passive_fluid_accumulator.help": "§6Вакуумный всасывающий жидкостный коллектор.§r Имеет один выход, все остальные стороны входные. Сливает жидкости из соседних резервуаров при выкачивании жидкости из выходного порта.",
|
||||
"block.engineersdecor.small_fluid_funnel": "Small Fluid Collection Funnel",
|
||||
"block.engineersdecor.small_fluid_funnel": "Малая воронка для сбора жидкости",
|
||||
"block.engineersdecor.small_fluid_funnel.help": "§6Собирает жидкости над ним.§r Имеет внутренний бак на три ведра. Прослеживает текучие жидкости к соседним блокам источника. Жидкость может быть получена с помощью систем передачи жидкости или ведра. Заполняет только резервуары ниже (сила гравитации). Совместим с ванильным источником бесконечной воды.",
|
||||
"block.engineersdecor.factory_dropper": "Фабричный выбрасыватель",
|
||||
"block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.",
|
||||
"block.engineersdecor.factory_hopper": "Factory Hopper",
|
||||
"block.engineersdecor.factory_placer": "Factory Block Placer",
|
||||
"block.engineersdecor.small_block_breaker": "Factory Block Breaker",
|
||||
"block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace",
|
||||
"block.engineersdecor.small_solar_panel": "Small Solar Panel",
|
||||
"block.engineersdecor.small_tree_cutter": "Small Tree Cutter",
|
||||
"block.engineersdecor.small_milking_machine": "Small Milking Machine",
|
||||
"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_placer": "Фабричный разместитель блоков",
|
||||
"block.engineersdecor.factory_placer.help": "§6Позволяет размещать блоки и сажать урожай или деревья.§r\n GUI редстоун: Не инвертирован / инвертирован (по умолчанию), пульс режим / постоянный режим (по умолчанию).\n Also supports spike planing from underneath the soil. Выплевывает предметы, которые он не может поместить или посадить.",
|
||||
"block.engineersdecor.small_block_breaker": "Фабричный разбиватель блоков",
|
||||
"block.engineersdecor.small_block_breaker.help": "§6Разбивает блоки перед собой.§r\n Можно отключить, подав сигнал красного камня. Время, необходимое для разрушения блока, зависит от твердости этого блока. ${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_mineral_smelter": "Малая плавильная печь минералов",
|
||||
"block.engineersdecor.small_mineral_smelter.help": "§6Высокотемпературная электрическая каменная плавильная печь с высокой изоляцией.§r\n Нагревает минеральные блоки до магматических блоков и, наконец, до лавы. Нажмите с минеральным блоком (камень, булыжник, и т.п.) или используйте другие способы загрузки. Используйте ведро или жидкостные насосы для извлечения лавы. При охлаждении лавы, генерируется обсидиан. Отключите RF питание или подайте сигнал красного камня для отключения печи. Для автоматизации используйте редстоуновый компаратор, чтобы увидеть, в какой фазе плавления находится минерал.",
|
||||
"block.engineersdecor.small_solar_panel": "Малая солнечная панель",
|
||||
"block.engineersdecor.small_solar_panel.help": "§6Вырабатывает небольшое количество энергии при воздействии солнечного света.§r\n Полезно для зарядки низковольтных конденсаторов в удаленных системах с низким потреблением. Внутренний контур насоса накапливает и часто передает RF. Производство зависит от времени суток и погоды.",
|
||||
"block.engineersdecor.small_tree_cutter": "Малый лесоруб",
|
||||
"block.engineersdecor.small_tree_cutter.help": "§6Вырубает деревья перед ним.§r\n Не собирает срубленное. Выключается с помощью сигнала красного камня. ${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_milking_machine": "Малый доильный аппарат",
|
||||
"block.engineersdecor.small_milking_machine.help": "§6Изредка чистит и доит коров.§r\n Имеет внутренний бак для жидкости. Не кормит животных. Используйте ведра для извлечения молока. Извлекает/кладёт сосуды для молока из/в инвентарь сзади или снизу (предпочитает извлекать сзади и класть снизу, но может также класть заполненные сосуды обратно в тот же инвентарь). Поддерживает выход жидкости в резервуары или трубы снизу (только если молоко существует в виде жидкости). Позаботьтесь, чтобы в загоне не было тесно, добровольно прогуливаются только счастливые животные.",
|
||||
"block.engineersdecor.sign_decor": "Табличка с надписью (Логотип Engineer's decor)",
|
||||
"block.engineersdecor.sign_decor.help": "§Это не должно быть крафтовым или видимым в JEI. Используется для творческой вкладки и скриншотов.",
|
||||
"block.engineersdecor.sign_hotwire": "Знак «Осторожно, под напряжением»",
|
||||
|
@ -178,13 +194,15 @@
|
|||
"block.engineersdecor.sign_defense": "Знак «Осторожно, впереди система обороны»",
|
||||
"block.engineersdecor.sign_defense.help": "§6Предупреждающий знак для турелей, катушек Тесла и ловушек.",
|
||||
"block.engineersdecor.sign_factoryarea": "Знак «Заводская зона»",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Там дверь, пожалуйста...",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6Маркерный знак для зданий или областей, где расположены действительно большие машины.",
|
||||
"block.engineersdecor.sign_exit": "Знак «Выход»",
|
||||
"block.engineersdecor.sign_exit.help": "§6Там дверь, пожалуйста ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "Арматура для бетона",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_concrete": "Бетонный срез",
|
||||
"block.engineersdecor.halfslab_concrete.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Gas Concrete Slice",
|
||||
"block.engineersdecor.halfslab_gas_concrete": "Газобетонный срез",
|
||||
"block.engineersdecor.halfslab_gas_concrete.help": "§6Вертикально наращиваемая часть.§r Правый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_treated_wood": "Часть обработанного дерева",
|
||||
"block.engineersdecor.halfslab_treated_wood.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_iron": "Часть железного листового металла",
|
||||
|
@ -197,5 +215,6 @@
|
|||
"block.engineersdecor.halfslab_sheetmetal_gold.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum": "Часть алюминиевого листового металла",
|
||||
"block.engineersdecor.halfslab_sheetmetal_aluminum.help": "§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.",
|
||||
"block.engineersdecor.testblock": "ED Test Block (do NOT use)"
|
||||
}
|
||||
"block.engineersdecor.testblock": "ED тестовый блок (НЕ ИСПОЛЬЗОВАТЬ)",
|
||||
"block.engineersdecor.testblock.help": "§6Несоздаваемый тестовый блок с изменениемизменяющейся экспериментальной функциональностью. НЕ ИСПОЛЬЗОВАТЬ, может даже крашнуть игру в худшем случае!!"
|
||||
}
|
|
@ -196,6 +196,7 @@
|
|||
"block.engineersdecor.sign_factoryarea": "指示牌 \"工厂区域\"",
|
||||
"block.engineersdecor.sign_factoryarea.help": "§6用于指示真的很大的机器所在的建筑和区域。",
|
||||
"block.engineersdecor.sign_exit": "出口指示牌",
|
||||
"block.engineersdecor.sign_exit.help": "§6There's the door, please ...",
|
||||
"block.engineersdecor.halfslab_rebar_concrete": "强化混凝土切片",
|
||||
"block.engineersdecor.halfslab_rebar_concrete.help": "§6可垂直堆叠的切片。§r手持切片右/左击切片堆叠的顶端或底部来添加/移除切片。",
|
||||
"block.engineersdecor.halfslab_concrete": "混凝土切片",
|
||||
|
|
|
@ -48,4 +48,8 @@ tasks["create-half-slab-assets"] = function() {
|
|||
for(var i in block_data) halfslab_assets.create(block_data[i]);
|
||||
}
|
||||
|
||||
tasks["lang-json-fixes"] = function() {
|
||||
libtask114.stdtasks["lang-json-fixes"]();
|
||||
};
|
||||
|
||||
libtask.run(tasks, sys.args);
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
for(var i in lines) {
|
||||
if(!lines[i].length) continue;
|
||||
const kv = lines[i].split("=", 2);
|
||||
if(kv.length!=2) throw new Error("Invalid line in '"+file_path+"': '"+lines[i]+"'");
|
||||
if(kv.length!=2) throw new Error("Invalid line " + i + " in '"+file_path+"': '"+lines[i]+"'");
|
||||
const key = kv[0].trim();
|
||||
const text = kv[1].trim();
|
||||
text = text.replace("\\\\n", "\n").replace("\\n", "\n");
|
||||
|
|
|
@ -330,6 +330,28 @@
|
|||
}
|
||||
};
|
||||
|
||||
me.tasks.lang_json_text_replacements = function() {
|
||||
var file_list = (function() {
|
||||
var ls = [];
|
||||
const dir = "./" + constants.local_assets_root() + "/lang";
|
||||
if(fs.isdir(dir)) {
|
||||
ls = ls.concat(fs.find(dir, '*.json'));
|
||||
for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/");
|
||||
}
|
||||
ls.sort();
|
||||
return ls;
|
||||
})();
|
||||
|
||||
for(var file_i in file_list) {
|
||||
var file = file_list[file_i];
|
||||
var txt = fs.readfile(file);
|
||||
if(txt===undefined) throw new Error("Failed to read '" + file + "'");
|
||||
txt = txt.replace(/\\\\n/g,"\\n");
|
||||
fs.writefile(file, txt);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
me.stdtasks = {};
|
||||
me.stdtasks["assets"] = function() {
|
||||
me.tasks.map_regnames_blockstate_filenames();
|
||||
|
@ -367,6 +389,10 @@
|
|||
}
|
||||
};
|
||||
|
||||
me.stdtasks["lang-json-fixes"] = function() {
|
||||
me.tasks.lang_json_text_replacements();
|
||||
}
|
||||
|
||||
Object.freeze(me);
|
||||
Object.freeze(me.tasks);
|
||||
Object.freeze(me.parsing);
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"promos": {
|
||||
"1.12.2-recommended": "1.0.17",
|
||||
"1.12.2-latest": "1.0.17",
|
||||
"1.12.2-recommended": "1.0.18",
|
||||
"1.12.2-latest": "1.0.18",
|
||||
"1.14.4-recommended": "",
|
||||
"1.14.4-latest": "1.0.18-b1",
|
||||
"1.14.4-latest": "1.0.18-b4",
|
||||
"1.15.1-recommended": "",
|
||||
"1.15.1-latest": "1.0.18-b1"
|
||||
"1.15.1-latest": "1.0.18-b4"
|
||||
},
|
||||
"1.12.2": {
|
||||
"1.0.18": "[R] Release based on v1.0.18-b2. Release-to-release changes: * Tree cutter config fixes. * Treated Wood Crafting Table mouse tweaks. * Lang updates.\n[M] Lang update ru_ru (PR#77, thanks Smollet777).",
|
||||
"1.0.18-b2": "[A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).",
|
||||
"1.0.18-b1": "[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.17": "[R] Release based on v1.0.17-b3. Release-to-release changes: * Milking machine added. * Reverse recipes for slab slices added. * Texture and model improvements. * Lang file updates. * Minor bug fixes. * Config options added.\n[M] Updated zh_cn lang file (scikirbypoke).\n[A] Added opt-out config for the Small Tree Cutter.",
|
||||
"1.0.17-b3": "[F] Fixed Small Block Breaker facings to the horizontal range (issue #70, thx JimMiningWorm).",
|
||||
"1.0.17-b2": "[A] Reverse recipes for slabs and slab slices added.\n[M] Inset Floor Edge Light slightly thinner, looks better.",
|
||||
|
@ -81,6 +84,9 @@
|
|||
"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.0.18-b4": "[M] Lang update ru_ru (PR#77, thanks Smollet777).\n[F] Fixed Milking machine cow path issue, added milking delay cow tracking.\n[F] Slab / Slab Slice placement adapted to vanilla standard.",
|
||||
"1.0.18-b3": "[A] Added Treated Wood Crafting table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).\n[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).",
|
||||
"1.0.18-b2": "[F] Fixed JEI integration warning if nothing is opt'ed out (thx @SDUBZ for reporting).\n[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.18-b1": "[U] Updated to Forge 1.14.4-28.1.109/20190719-1.14.3.\n[A] Added opt-out config for the Small Tree Cutter.",
|
||||
"1.0.17-b3": "[F] Double newline escapes in lang files fixed (\"\\n\" in a tooltip).\n[M] Updated zh_cn lang file (scikirbypoke).",
|
||||
"1.0.17-b2": "[A] Reverse recipes for slabs and slab slices added.\n[M] Inset Floor Edge Light slightly thinner, looks better.",
|
||||
|
@ -120,6 +126,9 @@
|
|||
"1.0.7-b3": "[A] Initial 1.14.2 port of decorative blocks."
|
||||
},
|
||||
"1.15.1": {
|
||||
"1.0.18-b4": "[A] Ported Treated Wood Crafting Table item rendering.\n[F] Fixed Milking machine cow path issue, added milking delay cow tracking.\n[F] Slab / Slab Slice placement adapted to vanilla standard.\n[M] Lang update ru_ru (PR#77, thanks Smollet777).",
|
||||
"1.0.18-b3": "[A] Added Treated Wood Crafting Table tweaks (ctrl-shift moves all same stacks from the inventory, mouse wheel over crafting slot increases/decreases crafting grid stacks).\n[F] EN Lang file fixed (issue #76, thx Riverstar907).\n[F] Fixed Tree Cutter not respecting power-required config (thx federsavo, issue #77).\n[F] Fixed Small Solar Panel not exposing energy capability (thx MatthiasMann, issue #78).",
|
||||
"1.0.18-b2": "[M] Lang ru_ru updated (Smollet777).",
|
||||
"1.0.18-b1": "[U] Updated to Forge 1.15.1-30.0.16/20190719-1.14.3.\n[F] Client setup Dist annotation fixed (issue #73, thx hitsu420).\n[F] Double newline escapes in lang files fixed (\"\\n\" in a tooltip).\n[M] Updated zh_cn lang file (scikirbypoke).\n[A] Added opt-out config for the Small Tree Cutter",
|
||||
"1.0.17-b2": "[A] Initial port."
|
||||
}
|
||||
|
|
|
@ -28,7 +28,9 @@ looking manufacturing contraptions. Current feature set:
|
|||
refabrication of previous recipes. Providesa a recipe collision resolver (selection
|
||||
button for ambiguous recipes). Quick-move buttons (opt-in) to from/to storage or
|
||||
player inventory. Smart shift-click placement (balanced placing of items in the
|
||||
crafting grid). Shows the placed items on the top of the table.
|
||||
crafting grid). Ctrl-Shift-click places all same stacks. Scroll with the mouse over
|
||||
the crafting output slot to increase or decrease the stack sizes (shift and/or ctrl
|
||||
higher step size). Shows the placed items on the top of the table.
|
||||
|
||||
- *Small Laboratory Furnace*: Solid fuel consuming, updraught. Slightly hotter and
|
||||
better isolated than a cobblestone furnace, therefore more efficient. Has internal
|
||||
|
|
Loading…
Reference in a new issue