From b2b0c79bb9bb546830abc37311c04c16796e5189 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 1 Mar 2024 15:06:39 +0100 Subject: [PATCH] missing star control pieces, snowglobes, broken turret --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../com/hbm/blocks/generic/BlockBobble.java | 6 +- .../hbm/blocks/generic/BlockSnowglobe.java | 37 +++--- .../blocks/turret/TurretHowardDamaged.java | 8 ++ .../blocks/turret/TurretSentryDamaged.java | 43 +++++++ .../hbm/inventory/gui/GUIScreenSnowglobe.java | 113 ++++++++++++++++++ .../special/ItemCircuitStarComponent.java | 3 +- .../hbm/items/special/ItemPlasticScrap.java | 7 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 7 ++ .../com/hbm/main/ModEventHandlerClient.java | 4 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../render/tileentity/RenderSnowglobe.java | 62 ++-------- .../render/tileentity/RenderTurretSentry.java | 17 ++- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../turret/TileEntityTurretSentry.java | 8 +- .../turret/TileEntityTurretSentryDamaged.java | 106 ++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 5 + src/main/resources/assets/hbm/lang/en_US.lang | 5 + .../items/circuit_star_component.card.png | Bin 0 -> 294 bytes .../circuit_star_piece.board_converter.png | Bin 0 -> 174 bytes .../items/circuit_star_piece.card_board.png | Bin 0 -> 230 bytes .../circuit_star_piece.card_processor.png | Bin 0 -> 175 bytes .../models/turrets/sentry_damaged.png | Bin 0 -> 3989 bytes 24 files changed, 360 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/turret/TurretSentryDamaged.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenSnowglobe.java create mode 100644 src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java create mode 100644 src/main/resources/assets/hbm/textures/items/circuit_star_component.card.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit_star_piece.board_converter.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit_star_piece.card_board.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit_star_piece.card_processor.png create mode 100644 src/main/resources/assets/hbm/textures/models/turrets/sentry_damaged.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 9cd303ffe..a24e5753e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1125,6 +1125,7 @@ public class ModBlocks { public static Block turret_arty; public static Block turret_himars; public static Block turret_sentry; + public static Block turret_sentry_damaged; public static Block rbmk_rod; public static Block rbmk_rod_mod; @@ -2199,6 +2200,7 @@ public class ModBlocks { turret_arty = new TurretArty(Material.iron).setBlockName("turret_arty").setHardness(5.0F).setResistance(600.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); turret_himars = new TurretHIMARS(Material.iron).setBlockName("turret_himars").setHardness(5.0F).setResistance(600.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); turret_sentry = new TurretSentry().setBlockName("turret_sentry").setHardness(5.0F).setResistance(5.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + turret_sentry_damaged = new TurretSentryDamaged().setBlockName("turret_sentry_damaged").setHardness(5.0F).setResistance(5.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_rust"); rbmk_rod = new RBMKRod(false).setBlockName("rbmk_rod").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_element"); rbmk_rod_mod = new RBMKRod(true).setBlockName("rbmk_rod_mod").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_element_mod"); @@ -3016,6 +3018,7 @@ public class ModBlocks { GameRegistry.registerBlock(turret_arty, turret_arty.getUnlocalizedName()); GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); GameRegistry.registerBlock(turret_sentry, turret_sentry.getUnlocalizedName()); + GameRegistry.registerBlock(turret_sentry_damaged, turret_sentry_damaged.getUnlocalizedName()); //Wall-mounted Explosives GameRegistry.registerBlock(charge_dynamite, ItemBlockBase.class, charge_dynamite.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index 2f40e0fd8..334ef97bf 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -191,9 +191,9 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { NOS( "Dr Nostalgia", "Dr Nostalgia", "SSG and Vortex models", "Take a picture, I'ma pose, paparazzi$I've been drinking, moving like a zombie", true, ScrapType.BOARD_TRANSISTOR), DRILLGON( "Drillgon200", "Drillgon200", "1.12 Port", null, false, ScrapType.CPU_LOGIC), CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK), - MICROWAVE( "Microwave", "Microwave", "OC Compatibility", "they call me the food heater", true, ScrapType.BRIDGE_BIOS), - PEEP( "Peep", "LePeeperSauvage", "Coilgun, Leadburster and Congo Lake models, BDCL QC", "Fluffy ears can't hide in ash, nor snow.", true, ScrapType.CPU_CLOCK), - MELLOW( "MELLOWARPEGGIATION", "Mellow", "Industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CPU_LOGIC); + MICROWAVE( "Microwave", "Microwave", "OC Compatibility", "they call me the food heater", true, ScrapType.BOARD_CONVERTER), + PEEP( "Peep", "LePeeperSauvage", "Coilgun, Leadburster and Congo Lake models, BDCL QC", "Fluffy ears can't hide in ash, nor snow.", true, ScrapType.CARD_BOARD), + MELLOW( "MELLOWARPEGGIATION", "Mellow", "Industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR); public String name; //the title of the tooltip public String label; //the name engraved in the socket diff --git a/src/main/java/com/hbm/blocks/generic/BlockSnowglobe.java b/src/main/java/com/hbm/blocks/generic/BlockSnowglobe.java index d0c8bdb22..d24000546 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockSnowglobe.java +++ b/src/main/java/com/hbm/blocks/generic/BlockSnowglobe.java @@ -3,8 +3,9 @@ package com.hbm.blocks.generic; import java.util.List; import java.util.Random; +import com.hbm.inventory.gui.GUIScreenSnowglobe; import com.hbm.main.MainRegistry; -import com.hbm.wiaj.WorldInAJar; +import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -12,11 +13,12 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; +import net.minecraft.inventory.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -28,7 +30,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class BlockSnowglobe extends BlockContainer { +public class BlockSnowglobe extends BlockContainer implements IGUIProvider { public BlockSnowglobe() { super(Material.glass); @@ -153,23 +155,28 @@ public class BlockSnowglobe extends BlockContainer { } public static enum SnowglobeType { - NONE("NONE", new WorldInAJar(1, 1, 1)), - TEST("Test", getTestJar()); + NONE( "NONE"), + RIVETCITY( "Rivet City"), + TENPENNYTOWER( "Tenpenny Tower"), + LUCKY38( "Lucky 38"), + SIERRAMADRE( "Sierra Madre"), + PRYDWEN( "Prydwen"); public String label; - public WorldInAJar scene; - private SnowglobeType(String label, WorldInAJar scene) { + private SnowglobeType(String label) { this.label = label; - this.scene = scene; } } - - private static WorldInAJar getTestJar() { - WorldInAJar world = new WorldInAJar(3, 3, 3); - for(int x = 0; x < 3; x++) for(int z = 0; z < 3; z++) world.setBlock(x, 0, z, Blocks.brick_block, 0); - world.setBlock(1, 1, 1, Blocks.gold_block, 0); - world.setBlock(1, 2, 1, Blocks.gold_block, 0); - return world; + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIScreenSnowglobe((TileEntitySnowglobe) world.getTileEntity(x, y, z)); } } diff --git a/src/main/java/com/hbm/blocks/turret/TurretHowardDamaged.java b/src/main/java/com/hbm/blocks/turret/TurretHowardDamaged.java index 6a58f5da6..1028e5972 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretHowardDamaged.java +++ b/src/main/java/com/hbm/blocks/turret/TurretHowardDamaged.java @@ -1,9 +1,12 @@ package com.hbm.blocks.turret; +import java.util.Random; + import com.hbm.tileentity.turret.TileEntityTurretHowardDamaged; 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.world.World; @@ -25,4 +28,9 @@ public class TurretHowardDamaged extends TurretBaseNT { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { return false; } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } } diff --git a/src/main/java/com/hbm/blocks/turret/TurretSentryDamaged.java b/src/main/java/com/hbm/blocks/turret/TurretSentryDamaged.java new file mode 100644 index 000000000..8a5463735 --- /dev/null +++ b/src/main/java/com/hbm/blocks/turret/TurretSentryDamaged.java @@ -0,0 +1,43 @@ +package com.hbm.blocks.turret; + +import java.util.Random; + +import com.hbm.tileentity.turret.TileEntityTurretSentryDamaged; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class TurretSentryDamaged extends BlockContainer { + + public TurretSentryDamaged() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTurretSentryDamaged(); + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSnowglobe.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSnowglobe.java new file mode 100644 index 000000000..7fb95e184 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSnowglobe.java @@ -0,0 +1,113 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; + +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; + +public class GUIScreenSnowglobe extends GuiScreen { + + TileEntitySnowglobe snowglobe; + + public GUIScreenSnowglobe(TileEntitySnowglobe bobble) { + this.snowglobe = bobble; + } + + @Override + public void initGui() { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:block.bobble"), 1.0F)); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + + this.drawDefaultBackground(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + double sizeX = 300; + double sizeY = 150; + double left = (this.width - sizeX) / 2; + double top = (this.height - sizeY) / 2; + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.setColorRGBA_F(0F, 0.2F, 0F, 0.8F); + tess.addVertex(left + sizeX, top, this.zLevel); + tess.addVertex(left, top, this.zLevel); + tess.addVertex(left, top + sizeY, this.zLevel); + tess.addVertex(left + sizeX, top + sizeY, this.zLevel); + tess.draw(); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + + int nextLevel = (int)top + 10; + + String bobbleTitle = "Nuclear Tech Commemorative Snowglobe"; + this.fontRendererObj.drawStringWithShadow(bobbleTitle, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(bobbleTitle) / 2), nextLevel, 0x00ff00); + + nextLevel += 10; + + String bobbleName = this.snowglobe.type.label; + this.fontRendererObj.drawStringWithShadow(bobbleName, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(bobbleName) / 2), nextLevel, 0x009900); + + nextLevel += 20; + + /*if(this.snowglobe.type.contribution != null) { + + String title = "Has contributed"; + this.fontRendererObj.drawStringWithShadow(title, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(title) / 2), nextLevel, 0x00ff00); + + nextLevel += 10; + + + String[] list = this.snowglobe.type.contribution.split("\\$"); + for(String text : list) { + this.fontRendererObj.drawStringWithShadow(text, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(text) / 2), nextLevel, 0x009900); + nextLevel += 10; + } + + nextLevel += 10; + } + + if(this.snowglobe.type.inscription != null) { + + String title = "On the bottom is the following inscription:"; + this.fontRendererObj.drawStringWithShadow(title, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(title) / 2), nextLevel, 0x00ff00); + + nextLevel += 10; + + String[] list = this.snowglobe.type.inscription.split("\\$"); + for(String text : list) { + this.fontRendererObj.drawStringWithShadow(text, (int)(left + sizeX / 2 - this.fontRendererObj.getStringWidth(text) / 2), nextLevel, 0x009900); + nextLevel += 10; + } + + nextLevel += 10; + }*/ + + GL11.glEnable(GL11.GL_LIGHTING); + } + + @Override + protected void keyTyped(char c, int key) { + if(key == 1 || key == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + } + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/com/hbm/items/special/ItemCircuitStarComponent.java b/src/main/java/com/hbm/items/special/ItemCircuitStarComponent.java index 840d79ea9..f31ae27ef 100644 --- a/src/main/java/com/hbm/items/special/ItemCircuitStarComponent.java +++ b/src/main/java/com/hbm/items/special/ItemCircuitStarComponent.java @@ -11,6 +11,7 @@ public class ItemCircuitStarComponent extends ItemEnumMulti { public static enum CircuitComponentType { CHIPSET, CPU, - RAM + RAM, + CARD } } diff --git a/src/main/java/com/hbm/items/special/ItemPlasticScrap.java b/src/main/java/com/hbm/items/special/ItemPlasticScrap.java index a262df155..e658f7981 100644 --- a/src/main/java/com/hbm/items/special/ItemPlasticScrap.java +++ b/src/main/java/com/hbm/items/special/ItemPlasticScrap.java @@ -13,6 +13,7 @@ public class ItemPlasticScrap extends ItemEnumMulti { //GENERAL BOARD BOARD_BLANK, BOARD_TRANSISTOR, + BOARD_CONVERTER, //CHIPSET BRIDGE_NORTH, @@ -36,6 +37,10 @@ public class ItemPlasticScrap extends ItemEnumMulti { MEM_16K_A, MEM_16K_B, MEM_16K_C, - MEM_16K_D + MEM_16K_D, + + //EXTENSION CARD + CARD_BOARD, + CARD_PROCESSOR } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 6ec66cd6a..0fac4f2f1 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -209,6 +209,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTurretArty.class, new RenderTurretArty()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTurretHIMARS.class, new RenderTurretHIMARS()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTurretSentry.class, new RenderTurretSentry()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTurretSentryDamaged.class, new RenderTurretSentry()); //mines ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLandmine.class, new RenderLandmine()); //machines diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 4531f4a4b..8559cc901 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1153,11 +1153,18 @@ public class CraftingManager { ModItems.circuit_star_piece.stackFromEnum(ScrapType.MEM_16K_D) }); + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CARD), new Object[] { + ModItems.circuit_star_piece.stackFromEnum(ScrapType.CARD_BOARD), + ModItems.circuit_star_piece.stackFromEnum(ScrapType.CARD_PROCESSOR) + }); + addShapelessAuto(new ItemStack(ModItems.circuit_star), new Object[] { ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CHIPSET), ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CPU), ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.RAM), + ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CARD), ModItems.circuit_star_piece.stackFromEnum(ScrapType.BOARD_TRANSISTOR), + ModItems.circuit_star_piece.stackFromEnum(ScrapType.BOARD_CONVERTER), ModItems.circuit_star_piece.stackFromEnum(ScrapType.BOARD_BLANK) }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index cbe28fedb..c43e7e0e7 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -216,9 +216,9 @@ public class ModEventHandlerClient { ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); } - List text = new ArrayList(); + /*List text = new ArrayList(); text.add("Meta: " + world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ)); - ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text); + ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text);*/ } else if(mop.typeOfHit == mop.typeOfHit.ENTITY) { Entity entity = mop.entityHit; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 9b53c0e47..87085aba0 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -424,6 +424,7 @@ public class ResourceManager { public static final ResourceLocation turret_arty_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/arty.png"); public static final ResourceLocation turret_himars_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/himars.png"); public static final ResourceLocation turret_sentry_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/sentry.png"); + public static final ResourceLocation turret_sentry_damaged_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/sentry_damaged.png"); public static final ResourceLocation himars_standard_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/himars_standard.png"); public static final ResourceLocation himars_single_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/himars_single.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java b/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java index 44dcab19f..2292b028f 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java @@ -5,24 +5,19 @@ import org.lwjgl.opengl.GL12; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.lib.RefStrings; -import com.hbm.wiaj.WorldInAJar; +import com.hbm.render.loader.HFRWavefrontObject; -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; public class RenderSnowglobe extends TileEntitySpecialRenderer { - public static final IModelCustom snowglobe = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/snowglobe.obj")); + public static final IModelCustom snowglobe = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/snowglobe.obj"), false).asDisplayList(); public static final ResourceLocation socket = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/snowglobe.png"); + public static final ResourceLocation features = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/snowglobe_features.png"); public static RenderBlocks renderer = new RenderBlocks(); @Override @@ -42,49 +37,18 @@ public class RenderSnowglobe extends TileEntitySpecialRenderer { snowglobe.renderPart("Socket"); TileEntitySnowglobe te = (TileEntitySnowglobe) tile; + this.bindTexture(features); - if(te.type.scene != null) { - - WorldInAJar world = te.type.scene; - renderer.blockAccess = world; - - double size = Math.max(world.sizeX, world.sizeZ); - scale = 4D / size; - GL11.glScaled(scale, scale, scale); - GL11.glTranslated(0, 1, 0); - GL11.glScaled(scale, scale, scale); - - GL11.glTranslated(world.sizeX * -0.5, 0, world.sizeZ * -0.5); - - RenderHelper.disableStandardItemLighting(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_SMOOTH); - - bindTexture(TextureMap.locationBlocksTexture); - Minecraft.getMinecraft().entityRenderer.disableLightmap(interp); - - Tessellator tess = Tessellator.instance; - tess.startDrawingQuads(); - tess.setColorOpaque_F(1F, 1F, 1F); - - for(int a = 0; a < world.sizeX; a++) { - for(int b = 0; b < world.sizeY; b++) { - for(int c = 0; c < world.sizeZ; c++) { - Block block = world.getBlock(a, b, c); - renderer.renderBlockByRenderType(block, a, b, c); - } - } - } - - tess.draw(); - GL11.glShadeModel(GL11.GL_FLAT); - + switch(te.type) { + case NONE: break; + case RIVETCITY: snowglobe.renderPart("RivetCity"); break; + case TENPENNYTOWER: snowglobe.renderPart("TenpennyTower"); break; + case LUCKY38: snowglobe.renderPart("Lucky38_Plane"); break; + case SIERRAMADRE: snowglobe.renderPart("SierraMadre"); break; + case PRYDWEN: snowglobe.renderPart("Prydwen"); break; + default: break; } + GL11.glPopMatrix(); - Minecraft.getMinecraft().entityRenderer.enableLightmap(interp); - RenderHelper.enableStandardItemLighting(); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretSentry.java b/src/main/java/com/hbm/render/tileentity/RenderTurretSentry.java index 480de1536..107e37973 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretSentry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretSentry.java @@ -6,6 +6,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.turret.TileEntityTurretSentry; +import com.hbm.tileentity.turret.TileEntityTurretSentryDamaged; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; @@ -26,8 +27,14 @@ public class RenderTurretSentry extends TileEntitySpecialRenderer implements IIt GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glShadeModel(GL11.GL_SMOOTH); + + boolean damaged = te instanceof TileEntityTurretSentryDamaged; - bindTexture(ResourceManager.turret_sentry_tex); + if(damaged) + bindTexture(ResourceManager.turret_sentry_damaged_tex); + else + bindTexture(ResourceManager.turret_sentry_tex); + ResourceManager.turret_sentry.renderPart("Base"); double yaw = -Math.toDegrees(turret.lastRotationYaw + (turret.rotationYaw - turret.lastRotationYaw) * interp); @@ -48,7 +55,13 @@ public class RenderTurretSentry extends TileEntitySpecialRenderer implements IIt GL11.glPopMatrix(); GL11.glPushMatrix(); - GL11.glTranslated(0, 0, (turret.lastBarrelRightPos + (turret.barrelRightPos - turret.lastBarrelRightPos) * interp) * -0.5); + if(damaged) { + GL11.glTranslated(0, 1.5, 0.5); + GL11.glRotated(25, 1, 0, 0); + GL11.glTranslated(0, -1.5, -0.5); + } else { + GL11.glTranslated(0, 0, (turret.lastBarrelRightPos + (turret.barrelRightPos - turret.lastBarrelRightPos) * interp) * -0.5); + } ResourceManager.turret_sentry.renderPart("BarrelR"); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 1f99e3dd9..ece9edd78 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -267,6 +267,7 @@ public class TileMappings { put(TileEntityTurretArty.class, "tileentity_turret_arty"); put(TileEntityTurretHIMARS.class, "tileentity_turret_himars"); put(TileEntityTurretSentry.class, "tileentity_turret_sentry"); + put(TileEntityTurretSentryDamaged.class, "tileentity_turret_sentry_damaged"); } private static void putMachines() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 5a1a1326b..09b8d22ee 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -26,12 +26,12 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IGUIProvider { - private boolean didJustShootLeft = false; - private boolean retractingLeft = false; + protected boolean didJustShootLeft = false; + protected boolean retractingLeft = false; public double barrelLeftPos = 0; public double lastBarrelLeftPos = 0; - private boolean didJustShootRight = false; - private boolean retractingRight = false; + protected boolean didJustShootRight = false; + protected boolean retractingRight = false; public double barrelRightPos = 0; public double lastBarrelRightPos = 0; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java new file mode 100644 index 000000000..acb7898cb --- /dev/null +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java @@ -0,0 +1,106 @@ +package com.hbm.tileentity.turret; + +import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.handler.BulletConfiguration; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; + +public class TileEntityTurretSentryDamaged extends TileEntityTurretSentry { + + @Override + public boolean hasPower() { //does not need power + return true; + } + + @Override + public boolean isOn() { //is always on + return true; + } + + @Override + public double getTurretYawSpeed() { + return 3D; + } + + @Override + public double getTurretPitchSpeed() { + return 2D; + } + + @Override + public boolean hasThermalVision() { + return false; + } + + @Override + public boolean entityAcceptableTarget(Entity e) { //will fire at any living entity + + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) + return false; + + return e instanceof EntityLivingBase; + } + + @Override + public void updateFiringTick() { + + timer++; + + if(timer % 10 == 0) { + + BulletConfiguration conf = BulletConfigSyncingUtil.pullConfig(BulletConfigSyncingUtil.R5_NORMAL); + + if(conf != null) { + + Vec3 pos = this.getTurretPos(); + Vec3 vec = Vec3.createVectorHelper(0, 0, 0); + Vec3 side = Vec3.createVectorHelper(0, 0, 0); + + this.cachedCasingConfig = conf.spentCasing; + + if(shotSide) { + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.sentry_fire", 2.0F, 1.0F); + this.spawnBullet(conf); + + vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + + side = Vec3.createVectorHelper(0.125 * (shotSide ? 1 : -1), 0, 0); + side.rotateAroundY((float) -(this.rotationYaw)); + + } else { + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.sentry_fire", 2.0F, 0.75F); + if(usesCasings()) { + if(this.casingDelay() == 0) { + spawnCasing(); + } else { + casingDelay = this.casingDelay(); + } + } + } + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "largeexplode"); + data.setFloat("size", 1F); + data.setByte("count", (byte) 1); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + + if(shotSide) { + this.didJustShootLeft = true; + } else { + this.didJustShootRight = true; + } + shotSide = !shotSide; + } + } + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index ab40acd89..870e4e4bc 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1499,10 +1499,12 @@ item.circuit_raw.name=Schaltkreisrohling item.circuit_red_copper.name=Fortgeschrittener Schaltkreis item.circuit_schrabidium.name=Leistungsstarker Schaltkreis item.circuit_star.name=StarControl Schalttafel +item.circuit_star_component.card.name=StarControl Erweiterungskarte item.circuit_star_component.chipset.name=StarControl Chipset item.circuit_star_component.cpu.name=StarControl CPU item.circuit_star_component.ram.name=StarControl RAM item.circuit_star_piece.board_blank.name=SC - Leiterplatte +item.circuit_star_piece.board_converter.name=SC - Spammungswandler item.circuit_star_piece.board_transistor.name=SC - Transistoren item.circuit_star_piece.bridge_bios.name=SC- BIOS-Chip item.circuit_star_piece.bridge_bus.name=SC - BUS @@ -1511,6 +1513,8 @@ item.circuit_star_piece.bridge_cmos.name=SC - CMOS-RAM item.circuit_star_piece.bridge_io.name=SC - IO-Chip item.circuit_star_piece.bridge_north.name=SC - Northbridge item.circuit_star_piece.bridge_south.name=SC - Southbridge +item.circuit_star_piece.card_board.name=SC - Erweiterungskarten-Board +item.circuit_star_piece.card_processor.name=SC - Erweiterungskarten-Prozessor item.circuit_star_piece.cpu_cache.name=SC - CPU-Cache item.circuit_star_piece.cpu_clock.name=SC - CPU-Clock item.circuit_star_piece.cpu_ext.name=SC - Arsenhalbleiter-Erweiterung @@ -4582,6 +4586,7 @@ tile.turret_rocket.name=Raketengeschütz tile.turret_richard.name=Raketenwerfergeschütz "Richard" tile.turret_spitfire.name=Geschütz für das ich noch keinen Namen habe [WIP] tile.turret_sentry.name=Selbstschussanlage "Brown" +tile.turret_sentry_damaged.name=Selbstschussanlage "Edwin" tile.turret_tau.name=Tauonengeschütz tile.turret_tauon.name=XVL1456-Prototypengeschütz "Tauon" tile.vacuum.name=Vakuum diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index a05ca79fe..8856440c5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2198,10 +2198,12 @@ item.circuit_red_copper.name=Advanced Circuit item.circuit_schrabidium.name=High Performance Circuit item.circuit_star.name=StarControl Circuit Board item.circuit_star.desc=Currently unused, for it lacks an operating system. +item.circuit_star_component.card.name=StarControl Extension Card item.circuit_star_component.chipset.name=StarControl Chipset item.circuit_star_component.cpu.name=StarControl CPU item.circuit_star_component.ram.name=StarControl RAM item.circuit_star_piece.board_blank.name=SC - Printed Circuit Board +item.circuit_star_piece.board_converter.name=SC - Voltage Converter item.circuit_star_piece.board_transistor.name=SC - Transistors item.circuit_star_piece.bridge_bios.name=SC- BIOS Chip item.circuit_star_piece.bridge_bus.name=SC - BUS @@ -2210,6 +2212,8 @@ item.circuit_star_piece.bridge_cmos.name=SC - CMOS RAM item.circuit_star_piece.bridge_io.name=SC - IO Chip item.circuit_star_piece.bridge_north.name=SC - North Bridge item.circuit_star_piece.bridge_south.name=SC - South Bridge +item.circuit_star_piece.card_board.name=SC - Extension Card Board +item.circuit_star_piece.card_processor.name=SC - Extension Card Processor item.circuit_star_piece.cpu_cache.name=SC - CPU Cache item.circuit_star_piece.cpu_clock.name=SC - CPU Clock item.circuit_star_piece.cpu_ext.name=SC - Arsenic Semi Conductor Extension @@ -5594,6 +5598,7 @@ tile.turret_rocket.name=Rocket Turret tile.turret_richard.name=Rocket Launcher Turret "Richard" tile.turret_spitfire.name=Turret I have no name for right now [WIP] tile.turret_sentry.name=Sentry Turret "Brown" +tile.turret_sentry_damaged.name=Sentry Turret "Edwin" tile.turret_tau.name=Tauon Turret tile.turret_tauon.name=XVL1456 Prototype Turret "Tauon" tile.vacuum.name=Vacuum diff --git a/src/main/resources/assets/hbm/textures/items/circuit_star_component.card.png b/src/main/resources/assets/hbm/textures/items/circuit_star_component.card.png new file mode 100644 index 0000000000000000000000000000000000000000..ed191db209363f958b86cd7eacf4bb03f794fb1d GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfS4-O$Ltz&7w5aPP6eJV$~^WD|{oOe}K`3snO|HlHsHiXL1xJ4OZyv zZd&XaU-jGWpM3tq>kk<{G}c$_!sD0{M2<}~+3-HGf`1{9wy&`Pn;X&fjy;Zq<%6v-j0?N@W*ba=ICIO)<8#aTVj|UVW|@>EwlM qN5mSg&3X`1zsF|P0ofn_cQC$L>}&j6#$N^KQ3g*}KbLh*2~7Z!Aazy% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/circuit_star_piece.board_converter.png b/src/main/resources/assets/hbm/textures/items/circuit_star_piece.board_converter.png new file mode 100644 index 0000000000000000000000000000000000000000..4324d84669fcdef7cbc7aae2c93235ae87dab453 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VflIxo7hTv9?pQer`iCiCI?yi~U~{`>!o zH`t{oD75h!H*^NAH#RhI@cCW!-QKxrsuD8@80LsDuV9uaana+XJOlO|7o#N%*af&G`X!bF-q#jwVqN(#rcUhnO zkT1a?*!lCIWqO^U1Ve}@L$+>u$JtJn`De`Yl!WrLZ#=d6#mb+iAwB)|N-G2Zhd0lg zE)mT-67*$uf%!q3)>Rp9pV`)y?lOO2X)gR_&cm<0@|;E+S^uZ)5ex`D_Ip$Hj#&#- bWaRm8**V;KZ0+?0=uievS3j3^P66`TM6L{8GzekLJChLsCtMD*e} RuK?P};OXk;vd$@?2>`QEHe&z) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/turrets/sentry_damaged.png b/src/main/resources/assets/hbm/textures/models/turrets/sentry_damaged.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6a61a55940a7713765a800feaaa00a29b6bc87 GIT binary patch literal 3989 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 v(P)57)6d7H)>hEV)6418)6