From 08812a700e304e1001234ad869a7617692fc5978 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 4 Mar 2024 21:08:31 +0100 Subject: [PATCH] the malicious gigglefish from the silly dimension --- changelog | 1 - src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../com/hbm/blocks/bomb/LaunchPadRusted.java | 9 ++ .../java/com/hbm/entity/EntityMappings.java | 1 + .../entity/missile/EntityMissileDoomsday.java | 54 ---------- .../entity/missile/EntityMissileTier4.java | 23 ++++ .../container/ContainerLaunchPadRusted.java | 48 ++++++++- .../hbm/inventory/gui/GUILaunchPadRusted.java | 71 +++++++++---- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/weapon/ItemMissile.java | 17 ++- src/main/java/com/hbm/main/ClientProxy.java | 3 + .../java/com/hbm/main/CraftingManager.java | 8 ++ .../java/com/hbm/main/ModEventHandler.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../entity/rocket/RenderMissileNuclear.java | 6 +- .../render/item/ItemRenderMissileGeneric.java | 1 + .../tileentity/RenderLaunchPadRusted.java | 72 +++++++++++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../bomb/TileEntityLaunchPadBase.java | 4 +- .../bomb/TileEntityLaunchPadRusted.java | 98 +++++++++++++++++- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../gui/weapon/gui_launch_pad_rusted.png | Bin 4844 -> 4836 bytes .../assets/hbm/textures/items/launch_code.png | Bin 290 -> 320 bytes 24 files changed, 344 insertions(+), 89 deletions(-) delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderLaunchPadRusted.java diff --git a/changelog b/changelog index f7108e12f..82df3d70f 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,6 @@ ##Added * CRTs and toasters * Decorative blocks that will spawn in upcoming dungeons -* Snow globes * Sentry turret "Edwin" * A broken down version of the sentry turret with infinite power and ammo * Will be found in the new silo structure diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 94c961f5e..43fa85e20 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1544,7 +1544,7 @@ public class ModBlocks { deco_loot = new BlockLoot().setBlockName("deco_loot").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); pedestal = new BlockPedestal().setBlockName("pedestal").setCreativeTab(null).setHardness(2.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":pedestal_top"); bobblehead = new BlockBobble().setBlockName("bobblehead").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); - snowglobe = new BlockSnowglobe().setBlockName("snowglobe").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":glass_boron"); + snowglobe = new BlockSnowglobe().setBlockName("snowglobe").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":glass_boron"); hazmat = new BlockGeneric(Material.cloth).setBlockName("hazmat").setStepSound(Block.soundTypeCloth).setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":hazmat"); gravel_obsidian = new BlockFalling(Material.iron).setBlockName("gravel_obsidian").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGravel).setHardness(5.0F).setResistance(240.0F).setBlockTextureName(RefStrings.MODID + ":gravel_obsidian"); diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPadRusted.java b/src/main/java/com/hbm/blocks/bomb/LaunchPadRusted.java index eec626d2c..2f2f29881 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPadRusted.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPadRusted.java @@ -1,12 +1,16 @@ package com.hbm.blocks.bomb; +import java.util.Random; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IBomb; import com.hbm.tileentity.bomb.TileEntityLaunchPadRusted; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -28,6 +32,11 @@ public class LaunchPadRusted extends BlockDummyable implements IBomb { if(meta >= 12) return new TileEntityLaunchPadRusted(); return null; } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 30d51c83c..35c6b1763 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -109,6 +109,7 @@ public class EntityMappings { addEntity(EntityMinecartTest.class, "entity_minecart_test", 1000); addEntity(EntitySparkBeam.class, "entity_spark_beam", 1000); addEntity(EntityMissileDoomsday.class, "entity_missile_doomsday", 1000); + addEntity(EntityMissileDoomsdayRusted.class, "entity_missile_doomsday_rusted", 1000); addEntity(EntityTSmokeFX.class, "entity_t_smoke_fx", 1000); addEntity(EntityNukeExplosionMK3.class, "entity_nuke_mk3", 1000); addEntity(EntityVortex.class, "entity_vortex", 250); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java deleted file mode 100644 index 06c55969f..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.List; - -import com.hbm.config.BombConfig; -import com.hbm.entity.effect.EntityNukeTorex; -import com.hbm.entity.logic.EntityNukeExplosionMK5; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntityMissileDoomsday extends EntityMissileBaseNT { - - public EntityMissileDoomsday(World world) { - super(world); - } - - public EntityMissileDoomsday(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); - EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); - } - - @Override - protected void spawnContrail() { - - byte rot = this.dataWatcher.getWatchableObjectByte(3); - - Vec3 thrust = Vec3.createVectorHelper(0, 0, 1); - switch(rot) { - case 2: thrust.rotateAroundY((float) -Math.PI / 2F); break; - case 4: thrust.rotateAroundY((float) -Math.PI); break; - case 3: thrust.rotateAroundY((float) -Math.PI / 2F * 3F); break; - } - thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F); - thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F); - thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F); - - this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord); - this.spawnContraolWithOffset(0, 0, 0); - this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord); - } - - @Override public List getDebris() { return null; } - @Override public ItemStack getDebrisRareDrop() { return null; } - @Override public String getUnlocalizedName() { return "radar.target.doomsday"; } - @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_doomsday); } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java index 5e9f8472e..ea440d024 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -103,4 +103,27 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_volcano); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_volcano); } } + + public static class EntityMissileDoomsday extends EntityMissileTier4 { + public EntityMissileDoomsday(World world) { super(world); } + public EntityMissileDoomsday(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); + EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); + } + @Override public List getDebris() { return null; } + @Override public ItemStack getDebrisRareDrop() { return null; } + @Override public String getUnlocalizedName() { return "radar.target.doomsday"; } + @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_doomsday); } + } + + public static class EntityMissileDoomsdayRusted extends EntityMissileDoomsday { + public EntityMissileDoomsdayRusted(World world) { super(world); } + public EntityMissileDoomsdayRusted(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ).moreFallout(100)); + EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius); + } + @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_doomsday_rusted); } + } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadRusted.java b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadRusted.java index a69c5f4c1..fb829f26e 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadRusted.java +++ b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadRusted.java @@ -1,7 +1,10 @@ package com.hbm.inventory.container; +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.items.ModItems; import com.hbm.tileentity.bomb.TileEntityLaunchPadRusted; +import api.hbm.item.IDesignatorItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -13,6 +16,12 @@ public class ContainerLaunchPadRusted extends Container { private TileEntityLaunchPadRusted launchpad; public ContainerLaunchPadRusted(InventoryPlayer invPlayer, TileEntityLaunchPadRusted tedf) { + this.launchpad = tedf; + + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, tedf, 0, 26, 72)); + this.addSlotToContainer(new Slot(tedf, 1, 116, 45)); + this.addSlotToContainer(new Slot(tedf, 2, 134, 45)); + this.addSlotToContainer(new Slot(tedf, 3, 26, 99)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { @@ -27,7 +36,44 @@ public class ContainerLaunchPadRusted extends Container { @Override public ItemStack transferStackInSlot(EntityPlayer player, int par2) { - return null; + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= 3) { + if(!this.mergeItemStack(var5, 4, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(var3.getItem() instanceof IDesignatorItem) { + if(!this.mergeItemStack(var5, 3, 4, false)) { + return null; + } + } else if(var3.getItem() == ModItems.launch_code) { + if(!this.mergeItemStack(var5, 1, 2, false)) { + return null; + } + } else if(var3.getItem() == ModItems.launch_key) { + if(!this.mergeItemStack(var5, 2, 3, false)) { + return null; + } + } else { + return null; + } + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + } + + return var3; } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java b/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java index 2a4d6d626..a90bd4799 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java +++ b/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java @@ -1,14 +1,28 @@ package com.hbm.inventory.gui; -import org.lwjgl.opengl.GL11; +import java.util.Random; +import java.util.function.Consumer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.container.ContainerLaunchPadRusted; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPadRusted; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUILaunchPadRusted extends GuiInfoContainer { @@ -27,6 +41,20 @@ public class GUILaunchPadRusted extends GuiInfoContainer { @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); + drawCustomInfoStat(mouseX, mouseY, guiLeft + 26, guiTop + 36, 16, 16, mouseX, mouseY, EnumChatFormatting.YELLOW + "Release Missile", "Missile is locked in lauch position,", "releasing may cause damage to the missile.", "Damaged missile can not be put back", "into launching position."); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 26 <= x && guiLeft + 26 + 16 > x && guiTop + 36 < y && guiTop + 36 + 16 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("release", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, launchpad.xCoord, launchpad.yCoord, launchpad.zCoord)); + } } @Override @@ -41,30 +69,33 @@ public class GUILaunchPadRusted extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + boolean hasCodes = launchpad.slots[1] != null && launchpad.slots[1].getItem() == ModItems.launch_code; + boolean hasKey = launchpad.slots[2] != null && launchpad.slots[2].getItem() == ModItems.launch_key; + + if(hasCodes) drawTexturedModalRect(guiLeft + 121, guiTop + 32, 192, 0, 6, 8); + if(hasKey) drawTexturedModalRect(guiLeft + 139, guiTop + 32, 192, 0, 6, 8); - /*if(launchpad.slots[0] != null) { - Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(launchpad.slots[0]).makeSingular()); + if(hasCodes && hasKey && launchpad.missileLoaded) { + + Random rand = new Random(launchpad.xCoord * 131_071 + launchpad.zCoord); + int launchCodes = rand.nextInt(100_000_000); + + for(int i = 0; i < 8; i++) { + int magnitude = (int) Math.pow(10, i); + int digit = (launchCodes % (magnitude * 10)) / magnitude; + drawTexturedModalRect(guiLeft + 109 + 6 * i, guiTop + 85, 192 + 6 * digit, 8, 6, 8); + } + } + + if(launchpad.missileLoaded) { + Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(ModItems.missile_doomsday_rusted).makeSingular()); if(renderer != null) { GL11.glPushMatrix(); GL11.glTranslatef(guiLeft + 70, guiTop + 120, 100); - double scale = 1D; - - if(launchpad.slots[0].getItem() instanceof ItemMissile) { - ItemMissile missile = (ItemMissile) launchpad.slots[0].getItem(); - switch(missile.formFactor) { - case ABM: scale = 1.45D; break; - case MICRO: scale = 2.5D; break; - case V2: scale = 1.75D; break; - case STRONG: scale = 1.375D; break; - case HUGE: scale = 0.925D; break; - case ATLAS: scale = 0.875D; break; - case OTHER: break; - } - if(missile == ModItems.missile_stealth) scale = 1.125D; - } - + double scale = 0.875D; GL11.glRotatef(90, 0, 1, 0); GL11.glScaled(scale, scale, scale); GL11.glScalef(-8, -8, -8); @@ -79,6 +110,6 @@ public class GUILaunchPadRusted extends GuiInfoContainer { GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glPopMatrix(); } - }*/ + } } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index badd7a22b..4814e8b11 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1327,6 +1327,7 @@ public class ModItems { public static Item missile_nuclear_cluster; public static Item missile_volcano; public static Item missile_doomsday; + public static Item missile_doomsday_rusted; public static Item missile_taint; public static Item missile_micro; public static Item missile_bhole; @@ -3956,6 +3957,7 @@ public class ModItems { missile_nuclear_cluster = new ItemMissile(MissileFormFactor.ATLAS, MissileTier.TIER4).setUnlocalizedName("missile_nuclear_cluster").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_nuclear_cluster"); missile_volcano = new ItemMissile(MissileFormFactor.ATLAS, MissileTier.TIER4).setUnlocalizedName("missile_volcano").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_volcano"); missile_doomsday = new ItemMissile(MissileFormFactor.ATLAS, MissileTier.TIER4).setUnlocalizedName("missile_doomsday").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_doomsday"); + missile_doomsday_rusted = new ItemMissile(MissileFormFactor.ATLAS, MissileTier.TIER4).notLaunchable().setUnlocalizedName("missile_doomsday_rusted").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_doomsday"); missile_taint = new ItemMissile(MissileFormFactor.MICRO, MissileTier.TIER0).setUnlocalizedName("missile_taint").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_taint"); missile_micro = new ItemMissile(MissileFormFactor.MICRO, MissileTier.TIER0).setUnlocalizedName("missile_micro").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_micro"); missile_bhole = new ItemMissile(MissileFormFactor.MICRO, MissileTier.TIER0).setUnlocalizedName("missile_bhole").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_bhole"); @@ -6919,6 +6921,7 @@ public class ModItems { GameRegistry.registerItem(missile_nuclear_cluster, missile_nuclear_cluster.getUnlocalizedName()); GameRegistry.registerItem(missile_volcano, missile_volcano.getUnlocalizedName()); GameRegistry.registerItem(missile_doomsday, missile_doomsday.getUnlocalizedName()); + GameRegistry.registerItem(missile_doomsday_rusted, missile_doomsday_rusted.getUnlocalizedName()); //Rockets GameRegistry.registerItem(missile_carrier, missile_carrier.getUnlocalizedName()); GameRegistry.registerItem(missile_soyuz, missile_soyuz.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index 74ac62c42..692750516 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -14,6 +14,7 @@ public class ItemMissile extends ItemCustomLore { public final MissileTier tier; public final MissileFuel fuel; public int fuelCap; + public boolean launchable = true; public ItemMissile(MissileFormFactor form, MissileTier tier) { this(form, tier, form.defaultFuel); @@ -26,6 +27,11 @@ public class ItemMissile extends ItemCustomLore { this.setFuelCap(this.fuel.defaultCap); } + public ItemMissile notLaunchable() { + this.launchable = false; + return this; + } + public ItemMissile setFuelCap(int fuelCap) { this.fuelCap = fuelCap; return this; @@ -34,9 +40,14 @@ public class ItemMissile extends ItemCustomLore { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(EnumChatFormatting.ITALIC + this.tier.display); - list.add("Fuel: " + this.fuel.display); - if(this.fuelCap > 0) list.add("Fuel capacity: " + this.fuelCap + "mB"); - super.addInformation(itemstack, player, list, bool); + + if(!this.launchable) { + list.add(EnumChatFormatting.RED + "Not launchable!"); + } else { + list.add("Fuel: " + this.fuel.display); + if(this.fuelCap > 0) list.add("Fuel capacity: " + this.fuelCap + "mB"); + super.addInformation(itemstack, player, list, bool); + } } public enum MissileFormFactor { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 0fac4f2f1..e04fcf3bf 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -326,6 +326,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCore.class, new RenderCore()); //missile blocks ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaunchPad.class, new RenderLaunchPad()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaunchPadRusted.class, new RenderLaunchPadRusted()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaunchPadLarge.class, new RenderLaunchPadLarge()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineMissileAssembly.class, new RenderMissileAssembly()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCompactLauncher.class, new RenderCompactLauncher()); @@ -447,6 +448,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_volcano, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday_rusted, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_carrier, new ItemRenderMissileGeneric(RenderMissileType.TYPE_CARRIER)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); @@ -712,6 +714,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityMissileVolcano.class, new RenderMissileNuclear()); RenderingRegistry.registerEntityRenderingHandler(EntityMIRV.class, new RenderMirv()); RenderingRegistry.registerEntityRenderingHandler(EntityMissileDoomsday.class, new RenderMissileNuclear()); + RenderingRegistry.registerEntityRenderingHandler(EntityMissileDoomsdayRusted.class, new RenderMissileNuclear()); RenderingRegistry.registerEntityRenderingHandler(EntityCarrier.class, new RenderCarrierMissile()); RenderingRegistry.registerEntityRenderingHandler(EntityBooster.class, new RenderBoosterMissile()); RenderingRegistry.registerEntityRenderingHandler(EntitySoyuz.class, new RenderSoyuz()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 8559cc901..c021fe722 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1126,6 +1126,14 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.rbmk_cooler, 1), new Object[] { "IGI", "GCG", "IGI", 'C', ModBlocks.rbmk_blank, 'I', ModItems.plate_polymer, 'G', ModBlocks.steel_grate }); } + addShapelessAuto(new ItemStack(ModItems.launch_code), new Object[] { + new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), + new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), + new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), + new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), + new ItemStack(ModItems.circuit_aluminium) + }); + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CHIPSET), new Object[] { ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_BIOS), ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_BUS), diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 4f472a6d3..ebbfc9671 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -325,6 +325,7 @@ public class ModEventHandler { if(event.entityLiving instanceof IMob) { if(event.entityLiving.getRNG().nextInt(1000) == 0) event.entityLiving.dropItem(ModItems.heart_piece, 1); if(event.entityLiving.getRNG().nextInt(250) == 0) event.entityLiving.dropItem(ModItems.key_red_cracked, 1); + if(event.entityLiving.getRNG().nextInt(250) == 0) event.entityLiving.dropItem(ModItems.launch_code_piece, 1); } if(event.entityLiving instanceof EntityCyberCrab && event.entityLiving.getRNG().nextInt(500) == 0) { diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 87085aba0..f02a8f479 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1230,6 +1230,7 @@ public class ResourceManager { public static final ResourceLocation missileMIRV_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_atlas_thermo.png"); public static final ResourceLocation missileVolcano_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_atlas_tectonic.png"); public static final ResourceLocation missileDoomsday_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_atlas_doomsday.png"); + public static final ResourceLocation missileDoomsdayRusted_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_atlas_doomsday_weathered.png"); public static final ResourceLocation missileTaint_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_micro_taint.png"); public static final ResourceLocation missileShuttle_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missileShuttle.png"); public static final ResourceLocation missileMicro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_micro.png"); @@ -1296,6 +1297,7 @@ public class ResourceManager { //Missile Parts public static final ResourceLocation missile_pad_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/silo.png"); + public static final ResourceLocation missile_pad_rusted_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/silo_rusted.png"); public static final ResourceLocation missile_erector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/pad.png"); public static final ResourceLocation missile_erector_micro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/erector_micro.png"); public static final ResourceLocation missile_erector_v2_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/erector_v2.png"); diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java index 8a8adc589..51abf8cd7 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java @@ -3,10 +3,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; import com.hbm.entity.missile.EntityMissileBaseNT; -import com.hbm.entity.missile.EntityMissileDoomsday; -import com.hbm.entity.missile.EntityMissileTier4.EntityMissileMirv; -import com.hbm.entity.missile.EntityMissileTier4.EntityMissileNuclear; -import com.hbm.entity.missile.EntityMissileTier4.EntityMissileVolcano; +import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; @@ -36,6 +33,7 @@ public class RenderMissileNuclear extends Render { if(entity instanceof EntityMissileNuclear) bindTexture(ResourceManager.missileNuclear_tex); if(entity instanceof EntityMissileMirv) bindTexture(ResourceManager.missileMIRV_tex); if(entity instanceof EntityMissileDoomsday) bindTexture(ResourceManager.missileDoomsday_tex); + if(entity instanceof EntityMissileDoomsdayRusted) bindTexture(ResourceManager.missileDoomsdayRusted_tex); if(entity instanceof EntityMissileVolcano) bindTexture(ResourceManager.missileVolcano_tex); GL11.glShadeModel(GL11.GL_SMOOTH); diff --git a/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java index d38d09a86..08bbe24d0 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java +++ b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java @@ -165,6 +165,7 @@ public class ItemRenderMissileGeneric implements IItemRenderer { renderers.put(new ComparableStack(ModItems.missile_nuclear_cluster), generateStandard(ResourceManager.missileMIRV_tex, ResourceManager.missileNuclear)); renderers.put(new ComparableStack(ModItems.missile_volcano), generateStandard(ResourceManager.missileVolcano_tex, ResourceManager.missileNuclear)); renderers.put(new ComparableStack(ModItems.missile_doomsday), generateStandard(ResourceManager.missileDoomsday_tex, ResourceManager.missileNuclear)); + renderers.put(new ComparableStack(ModItems.missile_doomsday_rusted), generateStandard(ResourceManager.missileDoomsdayRusted_tex, ResourceManager.missileNuclear)); renderers.put(new ComparableStack(ModItems.missile_carrier), x -> { GL11.glScalef(2F, 2F, 2F); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadRusted.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadRusted.java new file mode 100644 index 000000000..3b0dec424 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadRusted.java @@ -0,0 +1,72 @@ +package com.hbm.render.tileentity; + +import java.util.function.Consumer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.render.item.ItemRenderMissileGeneric; +import com.hbm.tileentity.bomb.TileEntityLaunchPadRusted; + +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderLaunchPadRusted extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + } + + bindTexture(ResourceManager.missile_pad_rusted_tex); + ResourceManager.missile_pad.renderAll(); + + if(tileEntity instanceof TileEntityLaunchPadRusted) { + TileEntityLaunchPadRusted launchpad = (TileEntityLaunchPadRusted) tileEntity; + if(launchpad.missileLoaded) { + GL11.glTranslated(0, 1, 0); + Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(ModItems.missile_doomsday_rusted).makeSingular()); + if(renderer != null) renderer.accept(this.field_147501_a.field_147553_e); + } + } + + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.launch_pad_rusted); + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + @Override public void renderInventory() { + GL11.glTranslated(0, -1, 0); + GL11.glScaled(3, 3, 3); + } + @Override public void renderCommon() { + bindTexture(ResourceManager.missile_pad_rusted_tex); ResourceManager.missile_pad.renderAll(); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ece9edd78..6ca6430d1 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -73,6 +73,7 @@ public class TileMappings { put(TileEntityRedBarrel.class, "tileentity_barrel"); put(TileEntityYellowBarrel.class, "tileentity_nukebarrel"); put(TileEntityLaunchPad.class, "tileentity_launch1"); + put(TileEntityLaunchPadRusted.class, "tileentity_launchpad_rusted"); put(TileEntityLaunchPadLarge.class, "tileentity_launchpad_large"); put(TileEntityDecoBlock.class, "tileentity_deco"); put(TileEntityDecoBlockAltW.class, "tileentity_deco_w"); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java index 81b2573c8..5fc986444 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java @@ -85,8 +85,8 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl missiles.put(new ComparableStack(ModItems.missile_nuclear), EntityMissileNuclear.class); missiles.put(new ComparableStack(ModItems.missile_nuclear_cluster), EntityMissileMirv.class); missiles.put(new ComparableStack(ModItems.missile_volcano), EntityMissileVolcano.class); - missiles.put(new ComparableStack(ModItems.missile_doomsday), EntityMissileDoomsday.class); + missiles.put(new ComparableStack(ModItems.missile_stealth), EntityMissileStealth.class); } @@ -307,7 +307,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl } public boolean isMissileValid(ItemStack stack) { - return stack.getItem() instanceof ItemMissile; + return stack.getItem() instanceof ItemMissile && ((ItemMissile) stack.getItem()).launchable; } public boolean hasFuel() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java index ae6320306..c5c5db0bd 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java @@ -1,25 +1,37 @@ package com.hbm.tileentity.bomb; import java.util.HashSet; +import java.util.List; import java.util.Set; +import com.hbm.entity.missile.EntityMissileBaseNT; +import com.hbm.entity.missile.EntityMissileTier4.EntityMissileDoomsdayRusted; import com.hbm.interfaces.IBomb.BombReturnCode; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerLaunchPadRusted; import com.hbm.inventory.gui.GUILaunchPadRusted; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.TrackerUtil; import com.hbm.util.fauxpointtwelve.BlockPos; +import api.hbm.item.IDesignatorItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { public int prevRedstonePower; public int redstonePower; @@ -28,7 +40,7 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements public boolean missileLoaded; public TileEntityLaunchPadRusted() { - super(3); + super(4); } @Override @@ -39,15 +51,77 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements @Override public void updateEntity() { + if(!worldObj.isRemote) { + + if(this.redstonePower > 0 && this.prevRedstonePower <= 0) { + this.launch(); + } + + this.prevRedstonePower = this.redstonePower; + this.networkPackNT(250); + } else { + + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); + + if(!entities.isEmpty()) { + for(int i = 0; i < 15; i++) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + if(worldObj.rand.nextBoolean()) dir = dir.getOpposite(); + if(worldObj.rand.nextBoolean()) dir = dir.getRotation(ForgeDirection.UP); + float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; + float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; + + MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + } + } + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.missileLoaded); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.missileLoaded = buf.readBoolean(); } public BombReturnCode launch() { - return BombReturnCode.UNDEFINED; + + if(slots[1] != null && slots[2] != null && slots[3] != null && this.missileLoaded) { + if(slots[1].getItem() == ModItems.launch_code && slots[2].getItem() == ModItems.launch_key) { + if(slots[3] != null && slots[3].getItem() instanceof IDesignatorItem) { + IDesignatorItem designator = (IDesignatorItem) slots[3].getItem(); + + if(!designator.isReady(worldObj, slots[3], xCoord, yCoord, zCoord)) return BombReturnCode.ERROR_MISSING_COMPONENT; + + Vec3 coords = designator.getCoords(worldObj, slots[3], xCoord, yCoord, zCoord); + int targetX = (int) Math.floor(coords.xCoord); + int targetZ = (int) Math.floor(coords.zCoord); + + EntityMissileDoomsdayRusted missile = new EntityMissileDoomsdayRusted(worldObj, xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, targetX, targetZ); + worldObj.spawnEntityInWorld(missile); + TrackerUtil.setTrackingRange(worldObj, missile, 500); + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:weapon.missileTakeOff", 2.0F, 1.0F); + this.missileLoaded = false; + this.decrStackSize(1, 1); + this.markDirty(); + } + } + } + + return BombReturnCode.ERROR_MISSING_COMPONENT; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + + this.missileLoaded = nbt.getBoolean("missileLoaded"); this.redstonePower = nbt.getInteger("redstonePower"); this.prevRedstonePower = nbt.getInteger("prevRedstonePower"); @@ -61,6 +135,8 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + + nbt.setBoolean("missileLoaded", missileLoaded); nbt.setInteger("redstonePower", redstonePower); nbt.setInteger("prevRedstonePower", prevRedstonePower); @@ -129,4 +205,20 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUILaunchPadRusted(player.inventory, this); } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("release")) { + if(this.missileLoaded && slots[0] == null) { + this.missileLoaded = false; + slots[0] = new ItemStack(ModItems.missile_doomsday_rusted); + this.markDirty(); + } + } + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 870e4e4bc..fafa793a2 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -347,6 +347,7 @@ container.hydrotreater=Hydrotreater container.iGenerator=Industrieller Generator container.keyForge=Schlossertisch container.launchPad=Startrampe +container.launchPadRusted=Startrampe container.launchTable=Große Startrampe container.leadBox=Sicherheitsbehälter container.machineArcWelder=Lichtbogenschweißer @@ -2245,6 +2246,9 @@ item.laser_crystal_co2.name=CO2-Desh-Laserkristall item.laser_crystal_digamma.name=Digamma-Laserkristall item.laser_crystal_dnt.desc=Dineutronium-Spark Fermion Superkristall item.laser_crystal_dnt.name=Spark-Laserkristall +item.launch_code.name=Silo-Startcode +item.launch_code_piece.name=Silo-Startcodestück +item.launch_key.name=Silo-Startschlüssel item.lead_gavel.name=Bleierner Richterhammer item.lemon.name="Zitrone" item.letter.name=Eilbrief diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8856440c5..52fe31da3 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -706,6 +706,7 @@ container.hydrotreater=Hydrotreater container.iGenerator=Industrial Generator container.keyForge=Locksmith Table container.launchPad=Launch Pad +container.launchPadRusted=Launch Pad container.launchTable=Large Launch Pad container.leadBox=Containment Box container.machineArcWelder=Arc Welder @@ -2996,6 +2997,9 @@ item.laser_crystal_co2.name=CO2-Desh Laser Crystal item.laser_crystal_digamma.name=Digamma Laser Crystal item.laser_crystal_dnt.desc=Dineutronium-Spark Fermion Supercrystal item.laser_crystal_dnt.name=Spark Laser Crystal +item.launch_code.name=Silo Launch Code +item.launch_code_piece.name=Silo Launch Code Piece +item.launch_key.name=Silo Launch Key item.lead_gavel.name=Leaden Gavel item.lemon.name="Lemon" item.letter.name=Express Mail diff --git a/src/main/resources/assets/hbm/textures/gui/weapon/gui_launch_pad_rusted.png b/src/main/resources/assets/hbm/textures/gui/weapon/gui_launch_pad_rusted.png index 97741eba5fb2e93c56ffa1936a2d1f8ba08df978..a08cd9b975228cc97dec34e56aeea3762f043546 100644 GIT binary patch literal 4836 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 M(Okd$f@|!*0nHTHoB#j- literal 4844 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 OB#iXUv1PjMzyAv&-0m&_ diff --git a/src/main/resources/assets/hbm/textures/items/launch_code.png b/src/main/resources/assets/hbm/textures/items/launch_code.png index ef5db0f4723427ecdb93cc27cf20dd45cbdbc857..a6dad0a9ef2dc904b80d80839a0de742bcebfcfc 100644 GIT binary patch delta 277 zcmV+w0qXvu0>A>0G=KL=L_t(IjqQ=KN&`UUTRQ-h&eDid zIt#%5>oWkyqbhN0IefQwM&S&lvn{w0r4a>S+#hg#*b9-{h<^_+fs@Buyabwc{c{4X z4M+DkXf}8XD4fAdKtBxA%^3jGS=+b8V<-^u%K;I#-N5PFJGQ&1RXo-e$who?acKt; z&Rxahe&M<^N3+gL0Z-qbjQax&@RfCr;|{Bd0eHE*pzh35KQMD b7Wx5;I)9Lbf)1#@00000NkvXXu0mjf(dvP? delta 246 zcmV@7QPAG%W4u;QfYQSJpj6$HkrujcG>_8 z&wBuV*NNpCF1#JjEa<|S$jL+wz;--iHHj+2h3*EU%@V?le)nRk