From a204df448f5a8b6c4b1ef5b8b7d9f4d508a06ef5 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Thu, 5 Dec 2013 15:50:38 -0500 Subject: [PATCH] Work on jetpacks --- .../client/ClientPlayerTickHandler.java | 152 +++++++++++------- common/mekanism/client/ClientProxy.java | 1 + .../client/render/MekanismRenderer.java | 25 ++- .../client/render/RenderTickHandler.java | 19 +++ .../render/item/ItemRenderingHandler.java | 11 ++ .../common/CommonPlayerTickHandler.java | 42 +++++ common/mekanism/common/item/ItemJetpack.java | 77 ++++++++- .../common/network/PacketJetpackData.java | 70 +++++--- common/mekanism/common/util/StackUtils.java | 11 ++ .../TileEntityElectrolyticSeparator.java | 4 +- resources/assets/mekanism/lang/en_US.lang | 4 + .../assets/mekanism/sound/etc/Hydraulic.ogg | Bin 0 -> 28312 bytes 12 files changed, 329 insertions(+), 87 deletions(-) create mode 100644 resources/assets/mekanism/sound/etc/Hydraulic.ogg diff --git a/common/mekanism/client/ClientPlayerTickHandler.java b/common/mekanism/client/ClientPlayerTickHandler.java index b878465e3..e709d5316 100644 --- a/common/mekanism/client/ClientPlayerTickHandler.java +++ b/common/mekanism/client/ClientPlayerTickHandler.java @@ -9,11 +9,14 @@ import mekanism.common.PacketHandler.Transmission; import mekanism.common.item.ItemConfigurator; import mekanism.common.item.ItemElectricBow; import mekanism.common.item.ItemJetpack; +import mekanism.common.item.ItemJetpack.JetpackMode; import mekanism.common.item.ItemWalkieTalkie; import mekanism.common.network.PacketConfiguratorState; import mekanism.common.network.PacketElectricBowState; import mekanism.common.network.PacketJetpackData; +import mekanism.common.network.PacketJetpackData.PacketType; import mekanism.common.network.PacketWalkieTalkieState; +import mekanism.common.util.StackUtils; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -42,69 +45,84 @@ public class ClientPlayerTickHandler implements ITickHandler { EntityPlayer entityPlayer = (EntityPlayer)tickData[0]; - if(entityPlayer.getCurrentEquippedItem() != null) + ItemStack stack = entityPlayer.getCurrentEquippedItem(); + + if(StackUtils.getItem(entityPlayer.getCurrentEquippedItem()) instanceof ItemConfigurator) { - ItemStack stack = entityPlayer.getCurrentEquippedItem(); + ItemConfigurator item = (ItemConfigurator)entityPlayer.getCurrentEquippedItem().getItem(); - if(entityPlayer.getCurrentEquippedItem().getItem() instanceof ItemConfigurator) + if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed) + { + if(!lastTickUpdate) + { + item.setState(stack, (byte)(item.getState(stack) < 3 ? item.getState(stack)+1 : 0)); + PacketHandler.sendPacket(Transmission.SERVER, new PacketConfiguratorState().setParams(item.getState(stack))); + entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + "Configure State: " + item.getColor(item.getState(stack)) + item.getStateDisplay(item.getState(stack)))); + lastTickUpdate = true; + } + } + else { + lastTickUpdate = false; + } + } + else if(StackUtils.getItem(entityPlayer.getCurrentEquippedItem()) instanceof ItemElectricBow) + { + ItemElectricBow item = (ItemElectricBow)entityPlayer.getCurrentEquippedItem().getItem(); + + if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed) { - ItemConfigurator item = (ItemConfigurator)entityPlayer.getCurrentEquippedItem().getItem(); - - if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed) - { - if(!lastTickUpdate) - { - item.setState(stack, (byte)(item.getState(stack) < 3 ? item.getState(stack)+1 : 0)); - PacketHandler.sendPacket(Transmission.SERVER, new PacketConfiguratorState().setParams(item.getState(stack))); - entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + "Configure State: " + item.getColor(item.getState(stack)) + item.getStateDisplay(item.getState(stack)))); - lastTickUpdate = true; - } - } - else { - lastTickUpdate = false; - } - } - else if(entityPlayer.getCurrentEquippedItem().getItem() instanceof ItemElectricBow) - { - ItemElectricBow item = (ItemElectricBow)entityPlayer.getCurrentEquippedItem().getItem(); - - if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed) + if(!lastTickUpdate) { - if(!lastTickUpdate) - { - item.setFireState(stack, !item.getFireState(stack)); - PacketHandler.sendPacket(Transmission.SERVER, new PacketElectricBowState().setParams(item.getFireState(stack))); - entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + "Fire Mode: " + (item.getFireState(stack) ? (EnumColor.DARK_GREEN + "ON") : (EnumColor.DARK_RED + "OFF")))); - lastTickUpdate = true; - } - } - else { - lastTickUpdate = false; - } - } - else if(entityPlayer.getCurrentEquippedItem().getItem() instanceof ItemWalkieTalkie) - { - ItemWalkieTalkie item = (ItemWalkieTalkie)entityPlayer.getCurrentEquippedItem().getItem(); - - if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed && item.getOn(stack)) - { - if(!lastTickUpdate) - { - int newChan = item.getChannel(stack) < 9 ? item.getChannel(stack)+1 : 1; - item.setChannel(stack, newChan); - PacketHandler.sendPacket(Transmission.SERVER, new PacketWalkieTalkieState().setParams(newChan)); - Minecraft.getMinecraft().sndManager.playSoundFX("mekanism:etc.Ding", 1.0F, 1.0F); - lastTickUpdate = true; - } - } - else { - lastTickUpdate = false; + item.setFireState(stack, !item.getFireState(stack)); + PacketHandler.sendPacket(Transmission.SERVER, new PacketElectricBowState().setParams(item.getFireState(stack))); + entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + "Fire Mode: " + (item.getFireState(stack) ? (EnumColor.DARK_GREEN + "ON") : (EnumColor.DARK_RED + "OFF")))); + lastTickUpdate = true; } } else { lastTickUpdate = false; } } + else if(StackUtils.getItem(entityPlayer.getCurrentEquippedItem()) instanceof ItemWalkieTalkie) + { + ItemWalkieTalkie item = (ItemWalkieTalkie)entityPlayer.getCurrentEquippedItem().getItem(); + + if(entityPlayer.isSneaking() && MekanismKeyHandler.modeSwitchKey.pressed && item.getOn(stack)) + { + if(!lastTickUpdate) + { + int newChan = item.getChannel(stack) < 9 ? item.getChannel(stack)+1 : 1; + item.setChannel(stack, newChan); + PacketHandler.sendPacket(Transmission.SERVER, new PacketWalkieTalkieState().setParams(newChan)); + Minecraft.getMinecraft().sndManager.playSoundFX("mekanism:etc.Ding", 1.0F, 1.0F); + lastTickUpdate = true; + } + } + else { + lastTickUpdate = false; + } + } + else if(entityPlayer.getCurrentItemOrArmor(3) != null && entityPlayer.getCurrentItemOrArmor(3).getItem() instanceof ItemJetpack) + { + ItemStack jetpack = entityPlayer.getCurrentItemOrArmor(3); + + if(MekanismKeyHandler.modeSwitchKey.pressed) + { + if(!lastTickUpdate) + { + ((ItemJetpack)jetpack.getItem()).incrementMode(jetpack); + PacketHandler.sendPacket(Transmission.SERVER, new PacketJetpackData().setParams(PacketType.MODE)); + Minecraft.getMinecraft().sndManager.playSoundFX("mekanism:etc.Hydraulic", 1.0F, 1.0F); + lastTickUpdate = true; + } + } + else { + lastTickUpdate = false; + } + } + else { + lastTickUpdate = false; + } if(Mekanism.jetpackOn.contains(entityPlayer) != isJetpackOn(entityPlayer)) { @@ -116,7 +134,7 @@ public class ClientPlayerTickHandler implements ITickHandler Mekanism.jetpackOn.remove(entityPlayer); } - PacketHandler.sendPacket(Transmission.SERVER, new PacketJetpackData().setParams(entityPlayer, isJetpackOn(entityPlayer))); + PacketHandler.sendPacket(Transmission.SERVER, new PacketJetpackData().setParams(PacketType.UPDATE, entityPlayer, isJetpackOn(entityPlayer))); } for(EntityPlayer entry : Mekanism.jetpackOn) @@ -124,10 +142,20 @@ public class ClientPlayerTickHandler implements ITickHandler Mekanism.proxy.registerSound(entry); } - if(isJetpackOn(mc.thePlayer)) + if(isJetpackOn(entityPlayer)) { - mc.thePlayer.motionY = Math.min(mc.thePlayer.motionY + 0.15D, 0.5D); - mc.thePlayer.fallDistance = 0.0F; + ItemJetpack jetpack = (ItemJetpack)entityPlayer.getCurrentItemOrArmor(3).getItem(); + + if(jetpack.getMode(entityPlayer.getCurrentItemOrArmor(3)) == JetpackMode.NORMAL) + { + entityPlayer.motionY = Math.min(mc.thePlayer.motionY + 0.15D, 0.5D); + entityPlayer.fallDistance = 0.0F; + } + else if(jetpack.getMode(entityPlayer.getCurrentItemOrArmor(3)) == JetpackMode.HOVER) + { + entityPlayer.motionY = 0; + entityPlayer.fallDistance = 0.0F; + } } } } @@ -145,9 +173,15 @@ public class ClientPlayerTickHandler implements ITickHandler { if(stack.getItem() instanceof ItemJetpack) { - if(((ItemJetpack)stack.getItem()).getGas(stack) != null) + ItemJetpack jetpack = (ItemJetpack)stack.getItem(); + + if(jetpack.getGas(stack) != null) { - if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)) + if((Keyboard.isKeyDown(Keyboard.KEY_SPACE) && jetpack.getMode(stack) == JetpackMode.NORMAL)) + { + return true; + } + else if(jetpack.getMode(stack) == JetpackMode.HOVER) { return true; } diff --git a/common/mekanism/client/ClientProxy.java b/common/mekanism/client/ClientProxy.java index 68eab9d7b..c974ff98e 100644 --- a/common/mekanism/client/ClientProxy.java +++ b/common/mekanism/client/ClientProxy.java @@ -275,6 +275,7 @@ public class ClientProxy extends CommonProxy MinecraftForgeClient.registerItemRenderer(Mekanism.gasTankID, handler); MinecraftForgeClient.registerItemRenderer(Mekanism.obsidianTNTID, handler); MinecraftForgeClient.registerItemRenderer(Mekanism.basicBlockID, handler); + MinecraftForgeClient.registerItemRenderer(Mekanism.Jetpack.itemID, handler); //Register block handlers RenderingRegistry.registerBlockHandler(new MachineRenderingHandler()); diff --git a/common/mekanism/client/render/MekanismRenderer.java b/common/mekanism/client/render/MekanismRenderer.java index 77686db91..94997e9ed 100644 --- a/common/mekanism/client/render/MekanismRenderer.java +++ b/common/mekanism/client/render/MekanismRenderer.java @@ -31,7 +31,6 @@ import net.minecraftforge.fluids.Fluid; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -203,8 +202,8 @@ public class MekanismRenderer RenderHelper.disableStandardItemLighting(); - float glowRatioX = Math.min(((float)glow/15F)*240F + lightmapLastX, 240); - float glowRatioY = Math.min(((float)glow/15F)*240F + lightmapLastY, 240); + float glowRatioX = Math.min((glow/15F)*240F + lightmapLastX, 240); + float glowRatioY = Math.min((glow/15F)*240F + lightmapLastY, 240); if(!optifineBreak) { @@ -302,9 +301,9 @@ public class MekanismRenderer if(renderer.useInventoryTint) { int renderColor = block.getRenderColor(metadata); - float red = (float)(renderColor >> 16 & 255) / 255.0F; - float green = (float)(renderColor >> 8 & 255) / 255.0F; - float blue = (float)(renderColor & 255) / 255.0F; + float red = (renderColor >> 16 & 255) / 255.0F; + float green = (renderColor >> 8 & 255) / 255.0F; + float blue = (renderColor & 255) / 255.0F; GL11.glColor4f(red, green, blue, 1.0F); } @@ -449,6 +448,20 @@ public class MekanismRenderer return 0; } + public void drawTexturedModalRect(int par1, int par2, int par3, int par4, int par5, int par6) + { + int zLevel = 0; + float f = 0.00390625F; + float f1 = 0.00390625F; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV((par1 + 0), (par2 + par6), zLevel, ((par3 + 0) * f), ((par4 + par6) * f1)); + tessellator.addVertexWithUV((par1 + par5), (par2 + par6), zLevel, ((par3 + par5) * f), ((par4 + par6) * f1)); + tessellator.addVertexWithUV((par1 + par5), (par2 + 0), zLevel, ((par3 + par5) * f), ((par4 + 0) * f1)); + tessellator.addVertexWithUV((par1 + 0), (par2 + 0), zLevel, ((par3 + 0) * f), ((par4 + 0) * f1)); + tessellator.draw(); + } + public static ResourceLocation getBlocksTexture() { return TextureMap.locationBlocksTexture; diff --git a/common/mekanism/client/render/RenderTickHandler.java b/common/mekanism/client/render/RenderTickHandler.java index 24a864f68..f23d28d2e 100644 --- a/common/mekanism/client/render/RenderTickHandler.java +++ b/common/mekanism/client/render/RenderTickHandler.java @@ -5,9 +5,12 @@ import java.util.Random; import mekanism.api.Object3D; import mekanism.common.Mekanism; +import mekanism.common.item.ItemJetpack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.ScaledResolution; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -68,6 +71,22 @@ public class RenderTickHandler implements ITickHandler } } + if(player != null) + { + if(player.getCurrentItemOrArmor(3) != null && player.getCurrentItemOrArmor(3).getItem() instanceof ItemJetpack) + { + ItemStack stack = player.getCurrentItemOrArmor(3); + ItemJetpack jetpack = (ItemJetpack)stack.getItem(); + + ScaledResolution scaledresolution = new ScaledResolution(mc.gameSettings, mc.displayWidth, mc.displayHeight); + int x = scaledresolution.getScaledWidth(); + int y = scaledresolution.getScaledHeight(); + + font.drawStringWithShadow("Mode: " + jetpack.getMode(stack).getName(), 1, y - 20, 0x404040); + font.drawStringWithShadow("Hydrogen: " + jetpack.getStored(stack), 1, y - 11, 0x404040); + } + } + for(EntityPlayer p : Mekanism.jetpackOn) { if(p.getDistance(player.posX, player.posY, player.posZ) > 40) diff --git a/common/mekanism/client/render/item/ItemRenderingHandler.java b/common/mekanism/client/render/item/ItemRenderingHandler.java index 319e1f39e..13f250a99 100644 --- a/common/mekanism/client/render/item/ItemRenderingHandler.java +++ b/common/mekanism/client/render/item/ItemRenderingHandler.java @@ -7,6 +7,7 @@ import mekanism.client.MekanismClient; import mekanism.client.model.ModelEnergyCube; import mekanism.client.model.ModelEnergyCube.ModelEnergyCore; import mekanism.client.model.ModelGasTank; +import mekanism.client.model.ModelJetpack; import mekanism.client.model.ModelObsidianTNT; import mekanism.client.model.ModelRobit; import mekanism.client.render.MekanismRenderer; @@ -19,6 +20,7 @@ import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.inventory.InventoryBin; import mekanism.common.item.ItemBlockBasic; import mekanism.common.item.ItemBlockMachine; +import mekanism.common.item.ItemJetpack; import mekanism.common.item.ItemRobit; import mekanism.common.item.ItemWalkieTalkie; import mekanism.common.tileentity.TileEntityBin; @@ -55,6 +57,7 @@ public class ItemRenderingHandler implements IItemRenderer public ModelEnergyCore energyCore = new ModelEnergyCore(); public ModelGasTank gasTank = new ModelGasTank(); public ModelObsidianTNT obsidianTNT = new ModelObsidianTNT(); + public ModelJetpack jetpack = new ModelJetpack(); public RenderBin binRenderer = (RenderBin)TileEntityRenderer.instance.specialRendererMap.get(TileEntityBin.class); private final RenderItem renderItem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); @@ -303,6 +306,14 @@ public class ItemRenderingHandler implements IItemRenderer Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "Robit.png")); robit.render(0.08F); } + else if(item.getItem() instanceof ItemJetpack) + { + GL11.glRotatef(180, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90, 0.0F, -1.0F, 0.0F); + GL11.glTranslatef(0.2F, -0.35F, 0.0F); + Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png")); + jetpack.render(0.0625F); + } else { if(item.getItem() instanceof ItemBlockMachine) { diff --git a/common/mekanism/common/CommonPlayerTickHandler.java b/common/mekanism/common/CommonPlayerTickHandler.java index 404abf81e..3ac136c70 100644 --- a/common/mekanism/common/CommonPlayerTickHandler.java +++ b/common/mekanism/common/CommonPlayerTickHandler.java @@ -2,8 +2,12 @@ package mekanism.common; import java.util.EnumSet; +import org.lwjgl.input.Keyboard; + import mekanism.common.PacketHandler.Transmission; +import mekanism.common.item.ItemJetpack; import mekanism.common.item.ItemPortableTeleporter; +import mekanism.common.item.ItemJetpack.JetpackMode; import mekanism.common.network.PacketStatusUpdate; import mekanism.common.util.MekanismUtils; import net.minecraft.entity.player.EntityPlayer; @@ -22,6 +26,7 @@ public class CommonPlayerTickHandler implements ITickHandler if(tickData[0] instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)tickData[0]; + if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemPortableTeleporter) { ItemPortableTeleporter item = (ItemPortableTeleporter)player.getCurrentEquippedItem().getItem(); @@ -79,8 +84,45 @@ public class CommonPlayerTickHandler implements ITickHandler return; } } + + if(isJetpackOn(player)) + { + ItemJetpack jetpack = (ItemJetpack)player.getCurrentItemOrArmor(3).getItem(); + + if(jetpack.getMode(player.getCurrentItemOrArmor(3)) == JetpackMode.NORMAL) + { + player.motionY = Math.min(player.motionY + 0.15D, 0.5D); + player.fallDistance = 0.0F; + } + else if(jetpack.getMode(player.getCurrentItemOrArmor(3)) == JetpackMode.HOVER) + { + player.motionY = 0; + player.fallDistance = 0.0F; + } + } } } + + public boolean isJetpackOn(EntityPlayer player) + { + ItemStack stack = player.inventory.armorInventory[2]; + + if(stack != null) + { + if(stack.getItem() instanceof ItemJetpack) + { + if(((ItemJetpack)stack.getItem()).getGas(stack) != null) + { + if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)) + { + return true; + } + } + } + } + + return false; + } @Override public EnumSet ticks() diff --git a/common/mekanism/common/item/ItemJetpack.java b/common/mekanism/common/item/ItemJetpack.java index 3adc9764b..bae8e815b 100644 --- a/common/mekanism/common/item/ItemJetpack.java +++ b/common/mekanism/common/item/ItemJetpack.java @@ -1,14 +1,20 @@ package mekanism.common.item; +import java.util.List; + +import mekanism.api.EnumColor; import mekanism.api.gas.Gas; import mekanism.api.gas.GasRegistry; import mekanism.api.gas.GasStack; import mekanism.api.gas.IGasItem; import mekanism.client.render.ModelCustomArmor; import mekanism.client.render.ModelCustomArmor.ArmorModel; +import mekanism.common.Mekanism; +import mekanism.common.util.MekanismUtils; import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -24,7 +30,23 @@ public class ItemJetpack extends ItemArmor implements IGasItem public ItemJetpack(int id) { super(id, EnumHelper.addArmorMaterial("JETPACK", 0, new int[] {0, 0, 0, 0}, 0), 0, 1); - //setCreativeTab(Mekanism.tabMekanism); + setCreativeTab(Mekanism.tabMekanism); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) + { + GasStack gasStack = getGas(itemstack); + + if(gasStack == null) + { + list.add("No gas stored."); + } + else { + list.add("Stored " + gasStack.getGas().getLocalizedName() + ": " + gasStack.amount); + } + + list.add(EnumColor.GREY + "Mode: " + EnumColor.GREY + getMode(itemstack).getName()); } @Override @@ -48,6 +70,11 @@ public class ItemJetpack extends ItemArmor implements IGasItem return model; } + public void incrementMode(ItemStack stack) + { + setMode(stack, getMode(stack).increment()); + } + @Override public int getMaxGas(Object... data) { @@ -100,7 +127,7 @@ public class ItemJetpack extends ItemArmor implements IGasItem return new GasStack(type, gasToUse); } - private int getStored(ItemStack itemstack) + public int getStored(ItemStack itemstack) { return getGas(itemstack) != null ? getGas(itemstack).amount : 0; } @@ -145,6 +172,26 @@ public class ItemJetpack extends ItemArmor implements IGasItem return null; } + public JetpackMode getMode(ItemStack stack) + { + if(stack.stackTagCompound == null) + { + return JetpackMode.NORMAL; + } + + return JetpackMode.values()[stack.stackTagCompound.getInteger("mode")]; + } + + public void setMode(ItemStack stack, JetpackMode mode) + { + if(stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + stack.stackTagCompound.setInteger("mode", mode.ordinal()); + } + @Override public void setGas(GasStack stack, Object... data) { @@ -171,4 +218,30 @@ public class ItemJetpack extends ItemArmor implements IGasItem } } } + + public static enum JetpackMode + { + NORMAL("tooltip.jetpack.regular", EnumColor.DARK_GREEN), + HOVER("tooltip.jetpack.hover", EnumColor.DARK_AQUA), + DISABLED("tooltip.jetpack.disabled", EnumColor.DARK_RED); + + private String unlocalized; + private EnumColor color; + + private JetpackMode(String s, EnumColor c) + { + unlocalized = s; + color = c; + } + + public JetpackMode increment() + { + return ordinal() < values().length-1 ? values()[ordinal()+1] : values()[0]; + } + + public String getName() + { + return color + MekanismUtils.localize(unlocalized); + } + } } diff --git a/common/mekanism/common/network/PacketJetpackData.java b/common/mekanism/common/network/PacketJetpackData.java index b7d5d2c1d..6a65f6339 100644 --- a/common/mekanism/common/network/PacketJetpackData.java +++ b/common/mekanism/common/network/PacketJetpackData.java @@ -5,13 +5,17 @@ import java.io.DataOutputStream; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; +import mekanism.common.item.ItemJetpack; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.world.World; import com.google.common.io.ByteArrayDataInput; public class PacketJetpackData implements IMekanismPacket { + public PacketType packetType; + public EntityPlayer updatePlayer; public boolean value; @@ -24,8 +28,13 @@ public class PacketJetpackData implements IMekanismPacket @Override public IMekanismPacket setParams(Object... data) { - updatePlayer = (EntityPlayer)data[0]; - value = (Boolean)data[1]; + packetType = (PacketType)data[0]; + + if(packetType == PacketType.UPDATE) + { + updatePlayer = (EntityPlayer)data[1]; + value = (Boolean)data[2]; + } return this; } @@ -33,24 +42,38 @@ public class PacketJetpackData implements IMekanismPacket @Override public void read(ByteArrayDataInput dataStream, EntityPlayer player, World world) throws Exception { - String username = dataStream.readUTF(); - boolean value = dataStream.readBoolean(); + packetType = PacketType.values()[dataStream.readInt()]; - EntityPlayer p = world.getPlayerEntityByName(username); - - if(p != null) + if(packetType == PacketType.UPDATE) { - if(value) - { - Mekanism.jetpackOn.add(p); - } - else { - Mekanism.jetpackOn.remove(p); - } + String username = dataStream.readUTF(); + boolean value = dataStream.readBoolean(); - if(!world.isRemote) + EntityPlayer p = world.getPlayerEntityByName(username); + + if(p != null) { - PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketJetpackData().setParams(p, value), world.provider.dimensionId); + if(value) + { + Mekanism.jetpackOn.add(p); + } + else { + Mekanism.jetpackOn.remove(p); + } + + if(!world.isRemote) + { + PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketJetpackData().setParams(PacketType.UPDATE, p, value), world.provider.dimensionId); + } + } + } + else if(packetType == PacketType.MODE) + { + ItemStack stack = player.getCurrentItemOrArmor(3); + + if(stack != null && stack.getItem() instanceof ItemJetpack) + { + ((ItemJetpack)stack.getItem()).incrementMode(stack); } } } @@ -58,7 +81,18 @@ public class PacketJetpackData implements IMekanismPacket @Override public void write(DataOutputStream dataStream) throws Exception { - dataStream.writeUTF(updatePlayer.username); - dataStream.writeBoolean(value); + dataStream.writeInt(packetType.ordinal()); + + if(packetType == PacketType.UPDATE) + { + dataStream.writeUTF(updatePlayer.username); + dataStream.writeBoolean(value); + } + } + + public static enum PacketType + { + UPDATE, + MODE; } } diff --git a/common/mekanism/common/util/StackUtils.java b/common/mekanism/common/util/StackUtils.java index 9c1bcadcc..fa90c2d8b 100644 --- a/common/mekanism/common/util/StackUtils.java +++ b/common/mekanism/common/util/StackUtils.java @@ -3,6 +3,7 @@ package mekanism.common.util; import java.util.ArrayList; import java.util.List; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -32,6 +33,16 @@ public final class StackUtils return ret; } + public static Item getItem(ItemStack stack) + { + if(stack == null) + { + return null; + } + + return stack.getItem(); + } + public static boolean diffIgnoreNull(ItemStack stack1, ItemStack stack2) { if(stack1 == null || stack2 == null) diff --git a/common/mekanism/generators/common/tileentity/TileEntityElectrolyticSeparator.java b/common/mekanism/generators/common/tileentity/TileEntityElectrolyticSeparator.java index f89894dc1..ca7d37ea8 100644 --- a/common/mekanism/generators/common/tileentity/TileEntityElectrolyticSeparator.java +++ b/common/mekanism/generators/common/tileentity/TileEntityElectrolyticSeparator.java @@ -315,17 +315,17 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp if(type == 0) { outputType = GasRegistry.getGas(dataStream.readInt()); - return; } else if(type == 1) { dumpType = GasRegistry.getGas(dataStream.readInt()); - return; } else if(type == 2) { spawnParticle(); } + + return; } super.handlePacketData(dataStream); diff --git a/resources/assets/mekanism/lang/en_US.lang b/resources/assets/mekanism/lang/en_US.lang index 9a40418e0..236e64cdc 100644 --- a/resources/assets/mekanism/lang/en_US.lang +++ b/resources/assets/mekanism/lang/en_US.lang @@ -243,6 +243,10 @@ tooltip.configurator.noLink=No link tooltip.configurator.linkMsg=Bound to tooltip.configurator.dim=dimension +tooltip.jetpack.regular=Regular +tooltip.jetpack.hover=Hover +tooltip.jetpack.disabled=Disabled + //Redstone control control.disabled=Disabled control.high=High diff --git a/resources/assets/mekanism/sound/etc/Hydraulic.ogg b/resources/assets/mekanism/sound/etc/Hydraulic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0880a4c05e6106cba5e726fad74c8ec4c5c51083 GIT binary patch literal 28312 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 NS+DBctFK=J{trCAyI%kR literal 0 HcmV?d00001