From 70f96a4b028cf636013265f2d54073d90e4572be Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 2 Aug 2018 20:22:53 +0200 Subject: [PATCH] Re-added a single mode Wrench that can rotate blocks and break Refined Storage covers. --- CHANGELOG.md | 1 + .../raoulvdberge/refinedstorage/RSItems.java | 1 + .../network/node/cover/CoverManager.java | 18 +++- .../refinedstorage/block/BlockBase.java | 10 +- .../refinedstorage/block/BlockCable.java | 12 +-- .../refinedstorage/item/ItemCover.java | 2 + .../refinedstorage/item/ItemWrench.java | 98 ++++++++++++++++++ .../refinedstorage/proxy/ProxyCommon.java | 1 + .../render/collision/AdvancedRayTracer.java | 2 + .../render/collision/CollisionGroup.java | 15 +++ .../refinedstorage/util/WorldUtils.java | 9 ++ .../assets/refinedstorage/lang/de_de.lang | 1 + .../assets/refinedstorage/lang/en_us.lang | 1 + .../assets/refinedstorage/lang/es_es.lang | 1 + .../assets/refinedstorage/lang/fr_fr.lang | 1 + .../assets/refinedstorage/lang/ko_kr.lang | 1 + .../assets/refinedstorage/lang/pt_br.lang | 1 + .../assets/refinedstorage/lang/ru_ru.lang | 1 + .../assets/refinedstorage/lang/zh_cn.lang | 1 + .../refinedstorage/models/item/wrench.json | 6 ++ .../assets/refinedstorage/recipes/wrench.json | 19 ++++ .../refinedstorage/textures/items/wrench.png | Bin 0 -> 1314 bytes 22 files changed, 182 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/item/ItemWrench.java create mode 100644 src/main/resources/assets/refinedstorage/models/item/wrench.json create mode 100644 src/main/resources/assets/refinedstorage/recipes/wrench.json create mode 100644 src/main/resources/assets/refinedstorage/textures/items/wrench.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 9166136a5..bcbd0dbeb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### 1.6.3 - Fixed crash with Wireless Fluid Grid (raoulvdberge) +- Re-added a single mode Wrench that can rotate blocks and break Refined Storage covers (raoulvdberge) ### 1.6.2 - Fixed Grid searching not working (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSItems.java b/src/main/java/com/raoulvdberge/refinedstorage/RSItems.java index cb5becdde..20d9d2e1c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSItems.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSItems.java @@ -23,4 +23,5 @@ public final class RSItems { public static final ItemCuttingTool CUTTING_TOOL = new ItemCuttingTool(); public static final ItemCover COVER = new ItemCover(); public static final ItemHollowCover HOLLOW_COVER = new ItemHollowCover(); + public static final ItemWrench WRENCH = new ItemWrench(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java index 28da6744b..4cf567352 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/cover/CoverManager.java @@ -63,13 +63,19 @@ public class CoverManager { return covers.containsKey(facing); } - public boolean setCover(EnumFacing facing, Cover cover) { - if (isValidCover(cover.getStack()) && !hasCover(facing)) { - if (facing == node.getDirection() && !(node instanceof NetworkNodeCable) && cover.getType() != CoverType.HOLLOW) { - return false; + public boolean setCover(EnumFacing facing, @Nullable Cover cover) { + if (cover == null || (isValidCover(cover.getStack()) && !hasCover(facing))) { + if (cover != null) { + if (facing == node.getDirection() && !(node instanceof NetworkNodeCable) && cover.getType() != CoverType.HOLLOW) { + return false; + } } - covers.put(facing, cover); + if (cover == null) { + covers.remove(facing); + } else { + covers.put(facing, cover); + } node.markDirty(); @@ -84,6 +90,8 @@ public class CoverManager { } public void readFromNbt(NBTTagList list) { + covers.clear(); + for (int i = 0; i < list.tagCount(); ++i) { NBTTagCompound tag = list.getCompoundTagAt(i); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java index b56befe97..2240e5c7e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java @@ -11,7 +11,6 @@ import net.minecraft.block.Block; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -21,7 +20,6 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; @@ -130,13 +128,7 @@ public abstract class BlockBase extends Block { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBase && ((TileBase) tile).getDrops() != null) { - IItemHandler handler = ((TileBase) tile).getDrops(); - - for (int i = 0; i < handler.getSlots(); ++i) { - if (!handler.getStackInSlot(i).isEmpty()) { - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); - } - } + WorldUtils.dropInventory(world, pos, ((TileBase) tile).getDrops()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java index 922428490..73eba90cf 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java @@ -250,7 +250,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( coverWest != null ? 2 : 0, coverDown != null ? 2 : 0, 0, coverEast != null ? 14 : 16, coverUp != null ? 14 : 16, 2 - ))); + )).setDirection(EnumFacing.NORTH)); if (coverNorth.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_NORTH); @@ -261,7 +261,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( 14, coverDown != null ? 2 : 0, 0, 16, coverUp != null ? 14 : 16, 16 - ))); + )).setDirection(EnumFacing.EAST)); if (coverEast.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_EAST); @@ -272,7 +272,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( coverEast != null ? 14 : 16, coverDown != null ? 2 : 0, 16, coverWest != null ? 2 : 0, coverUp != null ? 14 : 16, 14 - ))); + )).setDirection(EnumFacing.SOUTH)); if (coverSouth.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_SOUTH); @@ -283,7 +283,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( 0, coverDown != null ? 2 : 0, 0, 2, coverUp != null ? 14 : 16, 16 - ))); + )).setDirection(EnumFacing.WEST)); if (coverWest.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_WEST); @@ -294,7 +294,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( 0, 14, 0, 16, 16, 16 - ))); + )).setDirection(EnumFacing.UP)); if (coverUp.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_UP); @@ -305,7 +305,7 @@ public class BlockCable extends BlockNode { groups.add(new CollisionGroup().addItem(CollisionUtils.getBounds( 0, 0, 0, 16, 2, 16 - ))); + )).setDirection(EnumFacing.DOWN)); if (coverDown.getType() != CoverType.HOLLOW) { groups.add(ConstantsCable.HOLDER_DOWN); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemCover.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemCover.java index 7c4ed8014..a353b81e1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemCover.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemCover.java @@ -150,6 +150,8 @@ public class ItemCover extends ItemBase { INetworkNode node = ((TileNode) tile).getNode(); if (node.getNetwork() != null && !node.getNetwork().getSecurityManager().hasPermission(Permission.BUILD, player)) { + WorldUtils.sendNoPermissionMessage(player); + return EnumActionResult.FAIL; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemWrench.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemWrench.java new file mode 100644 index 000000000..c39cfeaed --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemWrench.java @@ -0,0 +1,98 @@ +package com.raoulvdberge.refinedstorage.item; + +import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager; +import com.raoulvdberge.refinedstorage.block.BlockCable; +import com.raoulvdberge.refinedstorage.item.info.ItemInfo; +import com.raoulvdberge.refinedstorage.render.IModelRegistration; +import com.raoulvdberge.refinedstorage.render.collision.AdvancedRayTraceResult; +import com.raoulvdberge.refinedstorage.render.collision.AdvancedRayTracer; +import com.raoulvdberge.refinedstorage.tile.TileNode; +import com.raoulvdberge.refinedstorage.util.WorldUtils; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ItemWrench extends ItemBase { + public ItemWrench() { + super(new ItemInfo(RS.ID, "wrench")); + + setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerModels(IModelRegistration modelRegistration) { + modelRegistration.setModel(this, 0, new ModelResourceLocation(info.getId(), "inventory")); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if (!player.isSneaking()) { + return EnumActionResult.FAIL; + } + + if (world.isRemote) { + return EnumActionResult.SUCCESS; + } + + TileEntity tile = world.getTileEntity(pos); + + if (tile instanceof TileNode && ((TileNode) tile).getNode().getNetwork() != null && !((TileNode) tile).getNode().getNetwork().getSecurityManager().hasPermission(Permission.BUILD, player)) { + WorldUtils.sendNoPermissionMessage(player); + + return EnumActionResult.FAIL; + } + + IBlockState state = world.getBlockState(pos); + + Block block = state.getBlock(); + + if (block instanceof BlockCable && tile instanceof TileNode && ((TileNode) tile).getNode() instanceof ICoverable) { + CoverManager manager = ((ICoverable) ((TileNode) tile).getNode()).getCoverManager(); + + @SuppressWarnings("deprecation") + AdvancedRayTraceResult result = AdvancedRayTracer.rayTrace( + pos, + AdvancedRayTracer.getStart(player), + AdvancedRayTracer.getEnd(player), + ((BlockCable) block).getCollisions(tile, block.getActualState(state, world, pos)) + ); + + if (result != null && result.getGroup().getDirection() != null) { + EnumFacing facingSelected = result.getGroup().getDirection(); + + if (manager.hasCover(facingSelected)) { + ItemStack cover = manager.getCover(facingSelected).getType().createStack(); + + ItemCover.setItem(cover, manager.getCover(facingSelected).getStack()); + + manager.setCover(facingSelected, null); + + WorldUtils.updateBlock(world, pos); + + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), cover); + + return EnumActionResult.SUCCESS; + } + } + } + + block.rotateBlock(world, pos, player.getHorizontalFacing().getOpposite()); + + return EnumActionResult.SUCCESS; + } +} \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index aa63daaf6..ecece8959 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -242,6 +242,7 @@ public class ProxyCommon { registerItem(RSItems.SECURITY_CARD); registerItem(RSItems.COVER); registerItem(RSItems.HOLLOW_COVER); + registerItem(RSItems.WRENCH); IntegrationInventorySorter.register(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/collision/AdvancedRayTracer.java b/src/main/java/com/raoulvdberge/refinedstorage/render/collision/AdvancedRayTracer.java index 5533065d5..21f799b91 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/collision/AdvancedRayTracer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/collision/AdvancedRayTracer.java @@ -7,6 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import javax.annotation.Nullable; import java.util.Collection; public final class AdvancedRayTracer { @@ -23,6 +24,7 @@ public final class AdvancedRayTracer { return start.add(lookVec.x * reachDistance, lookVec.y * reachDistance, lookVec.z * reachDistance); } + @Nullable public static AdvancedRayTraceResult rayTrace(BlockPos pos, Vec3d start, Vec3d end, Collection groups) { double minDistance = Double.POSITIVE_INFINITY; AdvancedRayTraceResult hit = null; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/collision/CollisionGroup.java b/src/main/java/com/raoulvdberge/refinedstorage/render/collision/CollisionGroup.java index e88df429c..6f7bb6032 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/collision/CollisionGroup.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/collision/CollisionGroup.java @@ -1,13 +1,17 @@ package com.raoulvdberge.refinedstorage.render.collision; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; public class CollisionGroup { private List items = new ArrayList<>(); private boolean canAccessGui; + @Nullable + private EnumFacing direction; public CollisionGroup addItem(AxisAlignedBB item) { items.add(item); @@ -28,4 +32,15 @@ public class CollisionGroup { return this; } + + public CollisionGroup setDirection(EnumFacing direction) { + this.direction = direction; + + return this; + } + + @Nullable + public EnumFacing getDirection() { + return direction; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java index f39b09373..a0435624d 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java @@ -4,6 +4,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -53,4 +54,12 @@ public final class WorldUtils { public static void sendNoPermissionMessage(EntityPlayer player) { player.sendMessage(new TextComponentTranslation("misc.refinedstorage:security.no_permission").setStyle(new Style().setColor(TextFormatting.RED))); } + + public static void dropInventory(World world, BlockPos pos, IItemHandler handler) { + for (int i = 0; i < handler.getSlots(); ++i) { + if (!handler.getStackInSlot(i).isEmpty()) { + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); + } + } + } } diff --git a/src/main/resources/assets/refinedstorage/lang/de_de.lang b/src/main/resources/assets/refinedstorage/lang/de_de.lang index 5d32628df..d5f5a9b57 100755 --- a/src/main/resources/assets/refinedstorage/lang/de_de.lang +++ b/src/main/resources/assets/refinedstorage/lang/de_de.lang @@ -289,6 +289,7 @@ item.refinedstorage:upgrade.9.name=Glücksupgrade item.refinedstorage:storage_housing.name=Speichergehäuse item.refinedstorage:filter.name=Filter item.refinedstorage:network_card.name=Netzwerkkarte +item.refinedstorage:wrench.name=Schraubenschlüssel item.refinedstorage:security_card.name=Sicherheitskarte item.refinedstorage:security_card.owner=Besitzer: %s item.refinedstorage:cutting_tool.name=Schnittwerkzeug diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.lang b/src/main/resources/assets/refinedstorage/lang/en_us.lang index d3c01b651..f9a69b4ce 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_us.lang @@ -289,6 +289,7 @@ item.refinedstorage:upgrade.9.name=Fortune Upgrade item.refinedstorage:storage_housing.name=Storage Housing item.refinedstorage:filter.name=Filter item.refinedstorage:network_card.name=Network Card +item.refinedstorage:wrench.name=Wrench item.refinedstorage:security_card.name=Security Card item.refinedstorage:security_card.owner=Bound to: %s item.refinedstorage:cutting_tool.name=Cutting Tool diff --git a/src/main/resources/assets/refinedstorage/lang/es_es.lang b/src/main/resources/assets/refinedstorage/lang/es_es.lang index ca592ec79..054c73655 100644 --- a/src/main/resources/assets/refinedstorage/lang/es_es.lang +++ b/src/main/resources/assets/refinedstorage/lang/es_es.lang @@ -271,6 +271,7 @@ item.refinedstorage:upgrade.9.name=Mejora de Fortuna item.refinedstorage:storage_housing.name=Carcasa item.refinedstorage:filter.name=Filtro item.refinedstorage:network_card.name=Tarjeta de Red +item.refinedstorage:wrench.name=Llave inglesa item.refinedstorage:security_card.name=Tarjeta de Seguridad item.refinedstorage:security_card.owner=Designado a: %s diff --git a/src/main/resources/assets/refinedstorage/lang/fr_fr.lang b/src/main/resources/assets/refinedstorage/lang/fr_fr.lang index 5843dd751..6babe9c04 100755 --- a/src/main/resources/assets/refinedstorage/lang/fr_fr.lang +++ b/src/main/resources/assets/refinedstorage/lang/fr_fr.lang @@ -246,6 +246,7 @@ item.refinedstorage:upgrade.7.name=Amélioration Fortune item.refinedstorage:storage_housing.name=Boitier de stockage item.refinedstorage:filter.name=Filtre item.refinedstorage:network_card.name=Carte réseau +item.refinedstorage:wrench.name=Clé item.refinedstorage:security_card.name=Carte de sécurité item.refinedstorage:security_card.owner=Bound to: %s diff --git a/src/main/resources/assets/refinedstorage/lang/ko_kr.lang b/src/main/resources/assets/refinedstorage/lang/ko_kr.lang index b0da3c3db..f95fd5a11 100644 --- a/src/main/resources/assets/refinedstorage/lang/ko_kr.lang +++ b/src/main/resources/assets/refinedstorage/lang/ko_kr.lang @@ -244,5 +244,6 @@ item.refinedstorage:upgrade.7.name=행운 업그레이드 item.refinedstorage:storage_housing.name=빈 저장 디스크 item.refinedstorage:filter.name=필터 item.refinedstorage:network_card.name=네트워크 카드 +item.refinedstorage:wrench.name=렌치 item.refinedstorage:security_card.name=보안 카드 item.refinedstorage:security_card.owner=플레이어: %s diff --git a/src/main/resources/assets/refinedstorage/lang/pt_br.lang b/src/main/resources/assets/refinedstorage/lang/pt_br.lang index 72c631feb..2d4ee4657 100755 --- a/src/main/resources/assets/refinedstorage/lang/pt_br.lang +++ b/src/main/resources/assets/refinedstorage/lang/pt_br.lang @@ -248,6 +248,7 @@ item.refinedstorage:upgrade.8.name=Aprimoramento de Fortuna item.refinedstorage:upgrade.9.name=Aprimoramento de Fortuna item.refinedstorage:storage_housing.name=Alojamento de Armazenação item.refinedstorage:filter.name=Filtro +item.refinedstorage:wrench.name=Chave Inglesa item.refinedstorage:network_card.name=Cartão de Rede item.refinedstorage:security_card.name=Cartão de Segurança item.refinedstorage:security_card.owner=Ligado a: %s diff --git a/src/main/resources/assets/refinedstorage/lang/ru_ru.lang b/src/main/resources/assets/refinedstorage/lang/ru_ru.lang index 6759abe6e..498b224be 100755 --- a/src/main/resources/assets/refinedstorage/lang/ru_ru.lang +++ b/src/main/resources/assets/refinedstorage/lang/ru_ru.lang @@ -282,6 +282,7 @@ item.refinedstorage:upgrade.9.name=Улучшение: "Удача" item.refinedstorage:storage_housing.name=Хранилище корпуса item.refinedstorage:filter.name=Фильтр item.refinedstorage:network_card.name=Сетевая карта +item.refinedstorage:wrench.name=Ключ item.refinedstorage:security_card.name=Карточка безопасности item.refinedstorage:security_card.owner=Связано с: %s item.refinedstorage:cutting_tool.name=Режущий инструмент diff --git a/src/main/resources/assets/refinedstorage/lang/zh_cn.lang b/src/main/resources/assets/refinedstorage/lang/zh_cn.lang index 0e74caa67..3f5db7c16 100755 --- a/src/main/resources/assets/refinedstorage/lang/zh_cn.lang +++ b/src/main/resources/assets/refinedstorage/lang/zh_cn.lang @@ -250,5 +250,6 @@ item.refinedstorage:upgrade.9.name=时运升级 item.refinedstorage:storage_housing.name=磁盘外壳 item.refinedstorage:filter.name=过滤升级 item.refinedstorage:network_card.name=网卡 +item.refinedstorage:wrench.name=扳手 item.refinedstorage:security_card.name=权限卡 item.refinedstorage:security_card.owner=绑定至:%s diff --git a/src/main/resources/assets/refinedstorage/models/item/wrench.json b/src/main/resources/assets/refinedstorage/models/item/wrench.json new file mode 100644 index 000000000..191dd9189 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/wrench.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/wrench" + } +} diff --git a/src/main/resources/assets/refinedstorage/recipes/wrench.json b/src/main/resources/assets/refinedstorage/recipes/wrench.json new file mode 100644 index 000000000..cb0722742 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/recipes/wrench.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "EPE", + "EEE", + " E " + ], + "key": { + "E": { + "item": "refinedstorage:quartz_enriched_iron" + }, + "P": { + "item": "#basic_processor" + } + }, + "result": { + "item": "refinedstorage:wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/textures/items/wrench.png b/src/main/resources/assets/refinedstorage/textures/items/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..f26a8ce17dcdb3dbebaeba527e135da12f454918 GIT binary patch literal 1314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk&``nLQqR!T z!q~`EN5ROz&{W^RQs2-(*TB%q(7?*bKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$IMft0!ZY(y z^2>`g!FqgstvvIJOA_;vQ$1a5m4K$`WoD*Wxw^PHyP6ofIU2e-8ydQrSr|AwJGnZU z8=Ja1n_E~I!t}c2Czs}?=9R$oroi-YPQCg-$LND17b&t~LckORV#1RykONQrsd>N@Uj$6rS>`ev3=E8u zJY5_^DsC+aw)Jod6!~}0nWfo7YF>hZh@u8pTc8HZBLQ9|J;8^Mo?Q~lTfcUr=PjvK zx=~BEHr2IoY?f=x+|d%?(j*kQFD_wuxxAK;{!yEP9s8f}zW?*wP8q>OfydV3b^GUs z{I_p7{WQrrehSap>9Y^U>}Swri_x3j{7OoI`AxUuWV`BEW=^)|4;3~kX0sEw-wxCe z*->J(w*SDY54UCc*mqtx%hXi9?7Y`&VL->1cZSdZFZ%ZNPsgE5uGQvhQ@m7L4kx~f zWKHv1J~?Tl#00;Evn&r^ImveCcDTp8_exT|LH-PBV%@AZ=aYZDlZoE$zu{eH#J!yj zDxMrHOjkmgP3wJ`&BR?Nc6w|(YN0B`8D%ly#lA4L`RA`+Yk7U`l#cA;iyW?j3jXJl zkC=5{ylHtQ&c5*p*QT2~=@&S&CMTzgurMA?5_G=qUa>MPpn7`XPr1V`ix;kUw42|q zbEbjST}e>aLasmCc2Uihk7bn{uRmH{cD{YtH_=9*dF7m!HV-5=Tz{=Pt?yP&%X5=BMQr@|>Vj%hT1*Wt~$(69AP<&VB#@ literal 0 HcmV?d00001