From 697991f7facd3113da499d7e7d66efc5f3f600a6 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 21 Jan 2019 02:09:22 +0100 Subject: [PATCH] Added rubber items and production --- .../collection/TileEntityLaserTreeFarm.java | 37 ++++++++++- .../java/cr0s/warpdrive/config/Recipes.java | 59 +++++++++++------- .../warpdrive/data/EnumComponentType.java | 4 ++ .../assets/warpdrive/lang/de_de.lang | 6 +- .../assets/warpdrive/lang/en_us.lang | 6 +- .../assets/warpdrive/lang/fr_fr.lang | 6 +- .../assets/warpdrive/lang/nl_nl.lang | 4 ++ .../assets/warpdrive/lang/ru_ru.lang | 6 +- .../assets/warpdrive/lang/zh_cn.lang | 4 ++ .../assets/warpdrive/lang/zh_tw.lang | 4 ++ .../models/item/component-raw_rubber.json | 6 ++ .../models/item/component-rubber.json | 6 ++ .../textures/items/component/raw_rubber.png | Bin 0 -> 3818 bytes .../textures/items/component/rubber.png | Bin 0 -> 3317 bytes 14 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 src/main/resources/assets/warpdrive/models/item/component-raw_rubber.json create mode 100644 src/main/resources/assets/warpdrive/models/item/component-rubber.json create mode 100644 src/main/resources/assets/warpdrive/textures/items/component/raw_rubber.png create mode 100644 src/main/resources/assets/warpdrive/textures/items/component/rubber.png diff --git a/src/main/java/cr0s/warpdrive/block/collection/TileEntityLaserTreeFarm.java b/src/main/java/cr0s/warpdrive/block/collection/TileEntityLaserTreeFarm.java index 8217b88c..46fb9075 100644 --- a/src/main/java/cr0s/warpdrive/block/collection/TileEntityLaserTreeFarm.java +++ b/src/main/java/cr0s/warpdrive/block/collection/TileEntityLaserTreeFarm.java @@ -25,8 +25,9 @@ import java.util.HashSet; import java.util.LinkedList; import net.minecraft.block.Block; +import net.minecraft.block.BlockOldLog; +import net.minecraft.block.BlockPlanks.EnumType; import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -328,6 +329,40 @@ public class TileEntityLaserTreeFarm extends TileEntityAbstractMiner { return; } } + + // Jungle wood to raw rubber + if ( blockStateValuable.getBlock() instanceof BlockOldLog + && blockStateValuable.getValue(BlockOldLog.VARIANT) == EnumType.JUNGLE ) { + if (WarpDriveConfig.LOGGING_COLLECTION) { + WarpDrive.logger.info(String.format("Tap found jungle wood at %s", + valuable)); + } + + // consume power + final int energyRequested = (int) Math.ceil(TREE_FARM_ENERGY_PER_LOG + TREE_FARM_ENERGY_PER_WET_SPOT); + isPowered = laserMedium_consumeExactly(energyRequested, false); + if (!isPowered) { + delayTargetTicks = TREE_FARM_LOW_POWER_DELAY_TICKS; + updateBlockState(blockState, BlockLaserTreeFarm.MODE, EnumLaserTreeFarmMode.FARMING_LOW_POWER); + return; + } else { + delayTargetTicks = TREE_FARM_TAP_TREE_WET_DELAY_TICKS; + updateBlockState(blockState, BlockLaserTreeFarm.MODE, EnumLaserTreeFarmMode.FARMING_POWERED); + } + + final ItemStack itemStackRawRubber = ItemComponent.getItemStack(EnumComponentType.RAW_RUBBER); + if (InventoryWrapper.addToConnectedInventories(world, pos, itemStackRawRubber)) { + stop(); + } + totalHarvested += itemStackRawRubber.getCount(); + final int age = Math.max(10, Math.round((4 + world.rand.nextFloat()) * TREE_FARM_HARVEST_LOG_DELAY_TICKS)); + PacketHandler.sendBeamPacket(world, laserOutput, new Vector3(valuable).translate(0.5D), + 0.8F, 0.8F, 0.2F, age, 0, 50); + + world.setBlockToAir(valuable); + // done with this block + return; + } } if (isLog || (breakLeaves && isLeaf)) {// actually break the block? diff --git a/src/main/java/cr0s/warpdrive/config/Recipes.java b/src/main/java/cr0s/warpdrive/config/Recipes.java index 066d66bc..f3de214b 100644 --- a/src/main/java/cr0s/warpdrive/config/Recipes.java +++ b/src/main/java/cr0s/warpdrive/config/Recipes.java @@ -72,12 +72,15 @@ public class Recipes { private static ItemStack[] itemStackMotors; private static Object barsIron; private static Object ingotIronOrSteel; - private static Object rubberOrLeather; + private static Object rubber; private static Object goldNuggetOrBasicCircuit; private static Object goldIngotOrAdvancedCircuit; private static Object emeraldOrSuperiorCircuit; public static void initOreDictionary() { + // components + registerOreDictionary("itemRubber", ItemComponent.getItemStack(EnumComponentType.RUBBER)); + // air shields for (final EnumDyeColor enumDyeColor : EnumDyeColor.values()) { registerOreDictionary("blockAirShield", new ItemStack(WarpDrive.blockAirShield, 1, enumDyeColor.getMetadata())); @@ -213,11 +216,9 @@ public class Recipes { "ore:ingotAluminum", 0, "ore:ingotIron", 0); - // integrate with rubber and sealant from all mods - rubberOrLeather = WarpDriveConfig.getOreOrItemStack("ore:plateRubber", 0, // comes with GregTech - "ore:itemRubber", 0, // comes with IndustrialCraft2 - "buildcrafttransport:waterproof", 0, - "ore:leather", 0); + // integrate with rubber from all mods + rubber = WarpDriveConfig.getOreOrItemStack("ore:plateRubber", 0, // comes with GregTech + "ore:itemRubber", 0 ); // comes with WarpDrive, IndustrialCraft2, IndustrialForegoing, TechReborn // integrate with circuits from all mods goldNuggetOrBasicCircuit = WarpDriveConfig.getOreOrItemStack("ore:circuitBasic", 0, // comes with IndustrialCraft2, Mekanism, VoltzEngine @@ -444,12 +445,12 @@ public class Recipes { 'w', itemStackWaterBottle, 'g', gunpowderOrSulfur)); - // Air canister is 4 iron bars, 2 leather/rubber, 2 yellow wool, 1 tank + // Air canister is 4 iron bars, 2 rubber, 2 yellow wool, 1 tank final Object woolPurple = WarpDriveConfig.getOreOrItemStack("ore:blockWoolPurple", 0, "minecraft:wool", 10); WarpDrive.register(new ShapedOreRecipe(groupComponents, ItemComponent.getItemStackNoCache(EnumComponentType.AIR_CANISTER, 4), false, "iyi", "rgr", "iyi", - 'r', rubberOrLeather, + 'r', rubber, 'g', ItemComponent.getItemStack(EnumComponentType.GLASS_TANK), 'y', woolPurple, 'i', barsIron)); @@ -489,13 +490,13 @@ public class Recipes { 'i', "ingotIron", 'n', "nuggetGold")); - // Pump is 2 Motor, 1 Iron ingot, 2 Tanks, 4 Rubber/leather, gives 2 + // Pump is 2 Motor, 1 Iron ingot, 2 Tanks, 4 Rubber, gives 2 WarpDrive.register(new ShapedOreRecipe(groupComponents, ItemComponent.getItemStackNoCache(EnumComponentType.PUMP, 2), false, "sst", "mim", "tss", - 's', rubberOrLeather, + 's', rubber, 'i', ingotIronOrSteel, 'm', itemStackMotors[0], - 't', ItemComponent.getItemStack(EnumComponentType.GLASS_TANK))); + 't', ItemComponent.getItemStack(EnumComponentType.GLASS_TANK) )); // *** optical components // Lens is 1 Diamond, 2 Gold ingots, 2 Glass panels @@ -545,11 +546,11 @@ public class Recipes { 'g', Blocks.GLOWSTONE)); // *** energy components - // Power interface is 4 Redstone, 2 Iron ingot, 3 Gold ingot + // Power interface is 4 Redstone, 2 Rubber, 3 Gold ingot WarpDrive.register(new ShapedOreRecipe(groupComponents, ItemComponent.getItemStackNoCache(EnumComponentType.POWER_INTERFACE, 3), false, "rgr", "RgR", "rgr", 'g', "ingotGold", - 'R', rubberOrLeather, + 'R', rubber, 'r', Items.REDSTONE )); // Superconductor is 1 Ender crystal, 4 Power interface, 4 Cryotheum dust/Lapis block/10k Coolant cell @@ -595,6 +596,16 @@ public class Recipes { 'c', ItemComponent.getItemStack(EnumComponentType.CAPACITIVE_CRYSTAL), 'e', ItemComponent.getItemStack(EnumComponentType.EMERALD_CRYSTAL))); } + + // Raw rubber lump is produced from Jungle wood in the laser tree farm + // (no direct recipe) + + // Rubber is the product of smelting (vulcanize) Raw rubber lump + // (in reality, vulcanization requires additives. This refining is optional, so low tiers could still use the Raw rubber lump) + GameRegistry.addSmelting( + ItemComponent.getItemStack(EnumComponentType.RAW_RUBBER), + ItemComponent.getItemStack(EnumComponentType.RUBBER), + 0); } private static void initToolsAndArmor() { @@ -629,7 +640,7 @@ public class Recipes { WarpDrive.itemWarpArmor[EntityEquipmentSlot.FEET.getIndex()], false, "wiw", "r r", " ", 'i', Items.IRON_BOOTS, 'w', Blocks.WOOL, - 'r', rubberOrLeather)); + 'r', rubber )); // Tuning fork variations for (final EnumDyeColor enumDyeColor : EnumDyeColor.values()) { @@ -885,29 +896,29 @@ public class Recipes { // Basic Air Tank is 2 Air canisters, 1 Pump, 1 Gold nugget, 1 Basic circuit, 4 Rubber WarpDrive.register(new ShapedOreRecipe(groupTools, WarpDrive.itemAirTanks[EnumAirTankTier.BASIC.getIndex()], false, "rnr", "tpt", "rcr", - 'r', rubberOrLeather, + 'r', rubber, 'p', ItemComponent.getItemStack(EnumComponentType.PUMP), 't', ItemComponent.getItemStack(EnumComponentType.AIR_CANISTER), 'c', goldNuggetOrBasicCircuit, - 'n', "nuggetGold")); + 'n', "nuggetGold" )); // Advanced Air Tank is 2 Basic air tank, 1 Pump, 1 Gold nugget, 1 Advanced circuit, 4 Rubber WarpDrive.register(new ShapedOreRecipe(groupTools, WarpDrive.itemAirTanks[EnumAirTankTier.ADVANCED.getIndex()], false, "rnr", "tpt", "rcr", - 'r', rubberOrLeather, + 'r', rubber, 'p', itemStackMotors[1], 't', WarpDrive.itemAirTanks[EnumAirTankTier.BASIC.getIndex()], 'c', goldIngotOrAdvancedCircuit, - 'n', "nuggetGold")); + 'n', "nuggetGold" )); // Superior Air Tank is 2 Advanced air tank, 1 Pump, 1 Gold nugget, 1 Elite circuit, 4 Rubber WarpDrive.register(new ShapedOreRecipe(groupTools, WarpDrive.itemAirTanks[EnumAirTankTier.SUPERIOR.getIndex()], false, "rnr", "tpt", "rcr", - 'r', rubberOrLeather, + 'r', rubber, 'p', itemStackMotors[2], 't', WarpDrive.itemAirTanks[EnumAirTankTier.ADVANCED.getIndex()], 'c', emeraldOrSuperiorCircuit, - 'n', "nuggetGold")); + 'n', "nuggetGold" )); // Uncrafting air tanks and canister WarpDrive.register(new ShapelessOreRecipe(groupComponents, @@ -1784,19 +1795,19 @@ public class Recipes { // Laser camera is just Laser + Camera WarpDrive.register(new ShapedOreRecipe(groupMachines, new ItemStack(WarpDrive.blockLaserCamera), false, "rlr", "rsr", "rcr", - 'r', rubberOrLeather, + 'r', rubber, 's', goldNuggetOrBasicCircuit, 'l', WarpDrive.blockLaser, - 'c', WarpDrive.blockCamera)); + 'c', WarpDrive.blockCamera )); // Weapon controller is diamond sword with Ship controller WarpDrive.register(new ShapedOreRecipe(groupMachines, new ItemStack(WarpDrive.blockWeaponController), false, "rwr", "msm", "rcr", - 'r', rubberOrLeather, + 'r', rubber, 's', ItemComponent.getItemStack(EnumComponentType.EMERALD_CRYSTAL), 'm', ItemComponent.getItemStack(EnumComponentType.MEMORY_CRYSTAL), 'w', Items.DIAMOND_SWORD, - 'c', WarpDrive.blockShipControllers[EnumTier.ADVANCED.getIndex()])); + 'c', WarpDrive.blockShipControllers[EnumTier.ADVANCED.getIndex()] )); } /* diff --git a/src/main/java/cr0s/warpdrive/data/EnumComponentType.java b/src/main/java/cr0s/warpdrive/data/EnumComponentType.java index 0795dc43..3fa853ff 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumComponentType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumComponentType.java @@ -45,6 +45,10 @@ public enum EnumComponentType implements IStringSerializable { LASER_MEDIUM_EMPTY ("laser_medium_empty"), ELECTROMAGNETIC_PROJECTOR ("electromagnetic_projector"), REACTOR_CORE ("reactor_core"), + + // materials + RAW_RUBBER ("raw_rubber"), + RUBBER ("rubber"), ; private final String name; diff --git a/src/main/resources/assets/warpdrive/lang/de_de.lang b/src/main/resources/assets/warpdrive/lang/de_de.lang index cb173c1b..d0403956 100644 --- a/src/main/resources/assets/warpdrive/lang/de_de.lang +++ b/src/main/resources/assets/warpdrive/lang/de_de.lang @@ -1,4 +1,4 @@ - + death.attack.warpdrive.asphyxia=%1$s ging die Luft aus death.attack.warpdrive.asphyxia.player=%1$s wurde von %2$s erstickt death.attack.warpdrive.cold=%1$s erfror @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=Medium Laser (leer) item.warpdrive.component.electromagnetic_projector.name=Elektromagnetischer Projektor item.warpdrive.component.reactor_core.name=Reaktorkern +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=Warp Helm item.warpdrive.armor.chestplate.name=Warp Brustpanzer item.warpdrive.armor.leggings.name=Warp Beinschutz diff --git a/src/main/resources/assets/warpdrive/lang/en_us.lang b/src/main/resources/assets/warpdrive/lang/en_us.lang index cefed42a..26d8a7a6 100644 --- a/src/main/resources/assets/warpdrive/lang/en_us.lang +++ b/src/main/resources/assets/warpdrive/lang/en_us.lang @@ -1,4 +1,4 @@ - + death.attack.warpdrive.asphyxia=%1$s died from asphyxia death.attack.warpdrive.asphyxia.player=%1$s was killed by %2$s using asphyxia death.attack.warpdrive.cold=%1$s died from cold @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=Laser Medium (empty) item.warpdrive.component.electromagnetic_projector.name=Electromagnetic Projector item.warpdrive.component.reactor_core.name=Reactor Core +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=Warp Helmet item.warpdrive.armor.chestplate.name=Warp Chestplate item.warpdrive.armor.leggings.name=Warp Leggings diff --git a/src/main/resources/assets/warpdrive/lang/fr_fr.lang b/src/main/resources/assets/warpdrive/lang/fr_fr.lang index 34811903..4a912939 100644 --- a/src/main/resources/assets/warpdrive/lang/fr_fr.lang +++ b/src/main/resources/assets/warpdrive/lang/fr_fr.lang @@ -1,4 +1,4 @@ - + death.attack.warpdrive.asphyxia=%1$s est mort asphyxié death.attack.warpdrive.asphyxia.player=%1$s est mort asphyxié grace à %2$s death.attack.warpdrive.cold=%1$s est mort de froid @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=Milieu amplificateur (vide) item.warpdrive.component.electromagnetic_projector.name=Projecteur électromagnétique item.warpdrive.component.reactor_core.name=Noyeau de réacteur +item.warpdrive.component.raw_rubber.name=Bloc de caoutchouc brut +item.warpdrive.component.raw_rubber.tooltip=Issue du bois d'acajou avec un laser forestier +item.warpdrive.component.rubber.name=Caoutchouc + item.warpdrive.armor.helmet.name=Casque warp item.warpdrive.armor.chestplate.name=Plastron warp item.warpdrive.armor.leggings.name=Jambières warp diff --git a/src/main/resources/assets/warpdrive/lang/nl_nl.lang b/src/main/resources/assets/warpdrive/lang/nl_nl.lang index 400e6a3d..30782ef1 100644 --- a/src/main/resources/assets/warpdrive/lang/nl_nl.lang +++ b/src/main/resources/assets/warpdrive/lang/nl_nl.lang @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=Lege Deeltjesversneller item.warpdrive.component.electromagnetic_projector.name=Electromagnetische Projector item.warpdrive.component.reactor_core.name=Reactor Kern +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=Warp Helm item.warpdrive.armor.chestplate.name=Warp Borstplaat item.warpdrive.armor.leggings.name=Warp Broek diff --git a/src/main/resources/assets/warpdrive/lang/ru_ru.lang b/src/main/resources/assets/warpdrive/lang/ru_ru.lang index d68fad0e..4d562b97 100644 --- a/src/main/resources/assets/warpdrive/lang/ru_ru.lang +++ b/src/main/resources/assets/warpdrive/lang/ru_ru.lang @@ -1,4 +1,4 @@ - + death.attack.warpdrive.asphyxia=%1$s умер от удушья death.attack.warpdrive.asphyxia.player=%2$s убил %1$s с помощью удушья death.attack.warpdrive.cold=%1$s died from cold @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=Лазерный излучат item.warpdrive.component.electromagnetic_projector.name=Electromagnetic Projector item.warpdrive.component.reactor_core.name=Ядро реактора +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=Космический шлем item.warpdrive.armor.chestplate.name=Warp Chestplate item.warpdrive.armor.leggings.name=Warp Leggings diff --git a/src/main/resources/assets/warpdrive/lang/zh_cn.lang b/src/main/resources/assets/warpdrive/lang/zh_cn.lang index 3807ecd7..4a1d16af 100644 --- a/src/main/resources/assets/warpdrive/lang/zh_cn.lang +++ b/src/main/resources/assets/warpdrive/lang/zh_cn.lang @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=激光媒质(空) item.warpdrive.component.electromagnetic_projector.name=电磁投影仪 item.warpdrive.component.reactor_core.name=反应堆芯 +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=曲率头盔 item.warpdrive.armor.chestplate.name=曲率胸甲 item.warpdrive.armor.leggings.name=曲率护腿 diff --git a/src/main/resources/assets/warpdrive/lang/zh_tw.lang b/src/main/resources/assets/warpdrive/lang/zh_tw.lang index 41bc3790..1bb65c21 100644 --- a/src/main/resources/assets/warpdrive/lang/zh_tw.lang +++ b/src/main/resources/assets/warpdrive/lang/zh_tw.lang @@ -50,6 +50,10 @@ item.warpdrive.component.laser_medium_empty.name=激光觸媒 (空) item.warpdrive.component.electromagnetic_projector.name=電磁投射器 item.warpdrive.component.reactor_core.name=反應核心 +item.warpdrive.component.raw_rubber.name=Raw rubber clump +item.warpdrive.component.raw_rubber.tooltip=Harvested from Jungle wood with Laser tree farm +item.warpdrive.component.rubber.name=Rubber + item.warpdrive.armor.helmet.name=躍遷保護盔 item.warpdrive.armor.chestplate.name=Warp Chestplate item.warpdrive.armor.leggings.name=Warp Leggings diff --git a/src/main/resources/assets/warpdrive/models/item/component-raw_rubber.json b/src/main/resources/assets/warpdrive/models/item/component-raw_rubber.json new file mode 100644 index 00000000..da21a0cb --- /dev/null +++ b/src/main/resources/assets/warpdrive/models/item/component-raw_rubber.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "warpdrive:items/component/raw_rubber" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/warpdrive/models/item/component-rubber.json b/src/main/resources/assets/warpdrive/models/item/component-rubber.json new file mode 100644 index 00000000..ea0a5b99 --- /dev/null +++ b/src/main/resources/assets/warpdrive/models/item/component-rubber.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "warpdrive:items/component/rubber" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/warpdrive/textures/items/component/raw_rubber.png b/src/main/resources/assets/warpdrive/textures/items/component/raw_rubber.png new file mode 100644 index 0000000000000000000000000000000000000000..25c46394c76957460cdcec245ce3aa570e8fb1d3 GIT binary patch literal 3818 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 guU~)m{eRfM0NpIRNM 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