diff --git a/src/main/java/api/hbm/item/IGasMask.java b/src/main/java/api/hbm/item/IGasMask.java new file mode 100644 index 000000000..d9be1c421 --- /dev/null +++ b/src/main/java/api/hbm/item/IGasMask.java @@ -0,0 +1,15 @@ +package api.hbm.item; + +import java.util.List; + +import com.hbm.util.ArmorRegistry.HazardClass; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IGasMask { + + public List getBlacklist(ItemStack stack, EntityPlayer player); + public ItemStack getFilter(ItemStack stack, EntityPlayer player); + public void damageFilter(ItemStack stack, EntityPlayer player); +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java index ba7c68a28..9a1d73749 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java @@ -10,6 +10,7 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -64,7 +65,7 @@ public class MachineFractionTower extends BlockDummyable { player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "=== FRACTIONING TOWER Y:" + pos[1] + " ===")); for(int i = 0; i < frac.tanks.length; i++) - player.addChatComponentMessage(new ChatComponentText(frac.tanks[i].getTankType() + ": " + frac.tanks[i].getFill() + "/" + frac.tanks[i].getMaxFill() + "mB")); + player.addChatComponentMessage(new ChatComponentTranslation("hbmfluid." + frac.tanks[i].getTankType().getName().toLowerCase()).appendSibling(new ChatComponentText(": " + frac.tanks[i].getFill() + "/" + frac.tanks[i].getMaxFill() + "mB"))); } else { if(world.getTileEntity(pos[0], pos[1] - 3, pos[2]) instanceof TileEntityMachineFractionTower) { diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 6b51a76a5..4a628acee 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -49,7 +49,7 @@ public class ToolRecipes { addHoe( ModItems.ingot_combine_steel, ModItems.cmb_hoe); addSword( "ingotDesh", ModItems.desh_sword); addPickaxe( "ingotDesh", ModItems.desh_pickaxe); - addAxe( "ingotDesh", ModItems.desh_pickaxe); + addAxe( "ingotDesh", ModItems.desh_axe); addShovel( "ingotDesh", ModItems.desh_shovel); addHoe( "ingotDesh", ModItems.desh_hoe); diff --git a/src/main/java/com/hbm/entity/mob/EntityDuck.java b/src/main/java/com/hbm/entity/mob/EntityDuck.java index c263eeb93..018409d8d 100644 --- a/src/main/java/com/hbm/entity/mob/EntityDuck.java +++ b/src/main/java/com/hbm/entity/mob/EntityDuck.java @@ -2,6 +2,8 @@ package com.hbm.entity.mob; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.passive.EntityChicken; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; import net.minecraft.world.World; public class EntityDuck extends EntityChicken { @@ -9,21 +11,29 @@ public class EntityDuck extends EntityChicken { public EntityDuck(World world) { super(world); } + + protected String getLivingSound() { + return "hbm:entity.ducc"; + } + + protected String getHurtSound() { + return "hbm:entity.ducc"; + } + + protected String getDeathSound() { + return "hbm:entity.ducc"; + } + + public EntityDuck createChild(EntityAgeable entity) { + return new EntityDuck(this.worldObj); + } - protected String getLivingSound() { - return "hbm:entity.ducc"; - } + protected void damageEntity(DamageSource p_70665_1_, float p_70665_2_) { + super.damageEntity(p_70665_1_, p_70665_2_); + } - protected String getHurtSound() { - return "hbm:entity.ducc"; - } - - protected String getDeathSound() { - return "hbm:entity.ducc"; - } - - public EntityDuck createChild(EntityAgeable entity) - { - return new EntityDuck(this.worldObj); - } + public void onDeath(DamageSource p_70645_1_) { + if(!worldObj.isRemote) MinecraftServer.getServer().getConfigurationManager().sendChatMsg(this.func_110142_aN().func_151521_b()); + super.onDeath(p_70645_1_); + } } diff --git a/src/main/java/com/hbm/handler/BulletConfiguration.java b/src/main/java/com/hbm/handler/BulletConfiguration.java index 61fa9b04a..4a4d7a919 100644 --- a/src/main/java/com/hbm/handler/BulletConfiguration.java +++ b/src/main/java/com/hbm/handler/BulletConfiguration.java @@ -12,7 +12,6 @@ import com.hbm.interfaces.IBulletUpdateBehavior; import com.hbm.interfaces.Untested; import com.hbm.lib.ModDamageSource; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun357MagnumFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun357MagnumFactory.java index 16f89d24c..a8415ca7e 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun357MagnumFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun357MagnumFactory.java @@ -6,6 +6,7 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; import com.hbm.potion.HbmPotion; import com.hbm.render.util.RenderScreenOverlay.Crosshair; @@ -292,10 +293,13 @@ public class Gun357MagnumFactory { bullet.bulletsMax = 6; bullet.dmgMin = 50; bullet.dmgMax = 150; + bullet.doesRicochet = false; bullet.destroysBlocks = true; bullet.style = bullet.STYLE_BOLT; bullet.trail = bullet.BOLT_NIGHTMARE; + bullet.damageType = ModDamageSource.s_laser; + return bullet; } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index eac9c385c..c719ae7e1 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4553,9 +4553,9 @@ public class ModItems { goggles = new ArmorModel(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("goggles").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":goggles"); ashglasses = new ArmorAshGlasses(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("ashglasses").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":ashglasses"); - gas_mask = new ArmorModel(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("gas_mask").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask"); - gas_mask_m65 = new ArmorModel(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("gas_mask_m65").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask_m65"); - gas_mask_mono = new ArmorModel(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("gas_mask_mono").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask_mono"); + gas_mask = new ArmorGasMask().setUnlocalizedName("gas_mask").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask"); + gas_mask_m65 = new ArmorGasMask().setUnlocalizedName("gas_mask_m65").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask_m65"); + gas_mask_mono = new ArmorGasMask().setUnlocalizedName("gas_mask_mono").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":gas_mask_mono"); hat = new ArmorHat(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("nossy_hat").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":hat"); beta = new ItemDrop().setUnlocalizedName("beta").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":beta"); //oxy_mask = new ArmorModel(ArmorMaterial.IRON, 7, 0).setUnlocalizedName("oxy_mask").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":oxy_mask"); diff --git a/src/main/java/com/hbm/items/armor/ArmorGasMask.java b/src/main/java/com/hbm/items/armor/ArmorGasMask.java new file mode 100644 index 000000000..f5c0cd417 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ArmorGasMask.java @@ -0,0 +1,162 @@ +package com.hbm.items.armor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.render.model.ModelGasMask; +import com.hbm.render.model.ModelM65; +import com.hbm.util.ArmorRegistry.HazardClass; + +import api.hbm.item.IGasMask; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +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.util.ResourceLocation; + +public class ArmorGasMask extends ItemArmor implements IGasMask { + + @SideOnly(Side.CLIENT) + private ModelGasMask modelGas; + @SideOnly(Side.CLIENT) + private ModelM65 modelM65; + + private ResourceLocation[] googleBlur = new ResourceLocation[] { + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_0.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_1.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_2.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_3.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_4.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_5.png") + }; + + private ResourceLocation[] maskBlur = new ResourceLocation[] { + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_0.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_1.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_2.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_3.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_4.png"), + new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_5.png") + }; + + public ArmorGasMask() { + super(ArmorMaterial.IRON, 7, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { + + if(this == ModItems.gas_mask) { + if(armorSlot == 0) { + if(this.modelGas == null) { + this.modelGas = new ModelGasMask(); + } + return this.modelGas; + } + } + + if(this == ModItems.gas_mask_m65 || this == ModItems.gas_mask_mono) { + if(armorSlot == 0) { + if(this.modelM65 == null) { + this.modelM65 = new ModelM65(); + } + return this.modelM65; + } + } + + return null; + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + + if(stack.getItem() == ModItems.gas_mask) { + return "hbm:textures/models/GasMask.png"; + } + if(stack.getItem() == ModItems.gas_mask_m65) { + return "hbm:textures/models/ModelM65.png"; + } + if(stack.getItem() == ModItems.gas_mask_mono) { + return "hbm:textures/models/ModelM65Mono.png"; + } + + return null; + } + + @SideOnly(Side.CLIENT) + public void renderHelmetOverlay(ItemStack stack, EntityPlayer player, ScaledResolution resolution, float partialTicks, boolean hasScreen, int mouseX, int mouseY) { + + ResourceLocation tex = null; + + if(this == ModItems.goggles || this == ModItems.gas_mask_m65) { + int index = (int) ((double) stack.getItemDamage() / (double) stack.getMaxDamage() * 6D); + tex = this.googleBlur[index]; + } + + if(this == ModItems.gas_mask) { + int index = (int) ((double) stack.getItemDamage() / (double) stack.getMaxDamage() * 6D); + tex = this.maskBlur[index]; + } + + if(tex == null) + return; + + Minecraft.getMinecraft().getTextureManager().bindTexture(tex); + + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_ALPHA_TEST); + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(0.0D, (double) resolution.getScaledHeight(), -90.0D, 0.0D, 1.0D); + tessellator.addVertexWithUV((double) resolution.getScaledWidth(), (double) resolution.getScaledHeight(), -90.0D, 1.0D, 1.0D); + tessellator.addVertexWithUV((double) resolution.getScaledWidth(), 0.0D, -90.0D, 1.0D, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + @Override + public List getBlacklist(ItemStack stack, EntityPlayer player) { + + if(this == ModItems.gas_mask_mono) { + return Arrays.asList(new HazardClass[] {HazardClass.GAS_CHLORINE, HazardClass.BACTERIA}); + } + + return new ArrayList(); + } + + @Override + public ItemStack getFilter(ItemStack stack, EntityPlayer player) { + + if(stack == null || !(stack.getItem() instanceof IGasMask) || !stack.hasTagCompound()) + return null; + + return null; + } + + @Override + public void damageFilter(ItemStack stack, EntityPlayer player) { + + } +} diff --git a/src/main/java/com/hbm/items/armor/ArmorModel.java b/src/main/java/com/hbm/items/armor/ArmorModel.java index 0531aa3d6..b5ba32358 100644 --- a/src/main/java/com/hbm/items/armor/ArmorModel.java +++ b/src/main/java/com/hbm/items/armor/ArmorModel.java @@ -8,7 +8,6 @@ import com.hbm.interfaces.Spaghetti; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.render.model.ModelCloak; -import com.hbm.render.model.ModelGasMask; import com.hbm.render.model.ModelGoggles; import com.hbm.render.model.ModelHat; import com.hbm.render.model.ModelM65; @@ -35,8 +34,6 @@ public class ArmorModel extends ItemArmor { @SideOnly(Side.CLIENT) private ModelGoggles modelGoggles; @SideOnly(Side.CLIENT) - private ModelGasMask modelGas; - @SideOnly(Side.CLIENT) private ModelCloak modelCloak; @SideOnly(Side.CLIENT) private ModelOxygenMask modelOxy; @@ -51,59 +48,11 @@ public class ArmorModel extends ItemArmor { private ResourceLocation goggleBlur3 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_3.png"); private ResourceLocation goggleBlur4 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_4.png"); private ResourceLocation goggleBlur5 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_goggles_5.png"); - private ResourceLocation gasmaskBlur0 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_0.png"); - private ResourceLocation gasmaskBlur1 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_1.png"); - private ResourceLocation gasmaskBlur2 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_2.png"); - private ResourceLocation gasmaskBlur3 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_3.png"); - private ResourceLocation gasmaskBlur4 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_4.png"); - private ResourceLocation gasmaskBlur5 = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_gasmask_5.png"); public ArmorModel(ArmorMaterial armorMaterial, int renderIndex, int armorType) { super(armorMaterial, renderIndex, armorType); } - //there was no reason to override this - /*@Override - public boolean isValidArmor(ItemStack stack, int armorType, Entity entity) { - if (this == ModItems.goggles) { - return armorType == 0; - } - if (this == ModItems.gas_mask) { - return armorType == 0; - } - if (this == ModItems.gas_mask_m65) { - return armorType == 0; - } - if (this == ModItems.gas_mask_mono) { - return armorType == 0; - } - if (this == ModItems.hat) { - return armorType == 0; - } - if (this == ModItems.hazmat_helmet_red) { - return armorType == 0; - } - if (this == ModItems.hazmat_helmet_grey) { - return armorType == 0; - } - if (this == ModItems.oxy_mask) { - return armorType == 0; - } - if (this == ModItems.cape_test) { - return armorType == 1; - } - if (this == ModItems.cape_radiation) { - return armorType == 1; - } - if (this == ModItems.cape_gasmask) { - return armorType == 1; - } - if (this == ModItems.cape_schrabidium) { - return armorType == 1; - } - return armorType == 0; - }*/ - @Override @SideOnly(Side.CLIENT) public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { @@ -115,15 +64,7 @@ public class ArmorModel extends ItemArmor { return this.modelGoggles; } } - if (this == ModItems.gas_mask) { - if (armorSlot == 0) { - if (this.modelGas == null) { - this.modelGas = new ModelGasMask(); - } - return this.modelGas; - } - } - if (this == ModItems.gas_mask_m65 || this == ModItems.hazmat_helmet_red || this == ModItems.hazmat_helmet_grey || this == ModItems.gas_mask_mono) { + if (this == ModItems.hazmat_helmet_red || this == ModItems.hazmat_helmet_grey) { if (armorSlot == 0) { if (this.modelM65 == null) { this.modelM65 = new ModelM65(); @@ -163,15 +104,6 @@ public class ArmorModel extends ItemArmor { if (stack.getItem() == ModItems.goggles) { return "hbm:textures/models/Goggles.png"; } - if (stack.getItem() == ModItems.gas_mask) { - return "hbm:textures/models/GasMask.png"; - } - if (stack.getItem() == ModItems.gas_mask_m65) { - return "hbm:textures/models/ModelM65.png"; - } - if (stack.getItem() == ModItems.gas_mask_mono) { - return "hbm:textures/models/ModelM65Mono.png"; - } if (stack.getItem() == ModItems.hazmat_helmet_red) { return "hbm:textures/models/ModelHazRed.png"; } @@ -209,7 +141,7 @@ public class ArmorModel extends ItemArmor { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_ALPHA_TEST); - if(this == ModItems.goggles || this == ModItems.gas_mask_m65 || this == ModItems.hazmat_helmet_red || this == ModItems.hazmat_helmet_grey) { + if(this == ModItems.hazmat_helmet_red || this == ModItems.hazmat_helmet_grey) { switch((int)((double)stack.getItemDamage() / (double)stack.getMaxDamage() * 6D)) { case 0: Minecraft.getMinecraft().getTextureManager().bindTexture(goggleBlur0); break; @@ -227,24 +159,6 @@ public class ArmorModel extends ItemArmor { Minecraft.getMinecraft().getTextureManager().bindTexture(goggleBlur5); break; } } - if(this == ModItems.gas_mask) { - switch((int)((double)stack.getItemDamage() / (double)stack.getMaxDamage() * 6D)) { - case 0: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur0); break; - case 1: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur1); break; - case 2: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur2); break; - case 3: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur3); break; - case 4: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur4); break; - case 5: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur5); break; - default: - Minecraft.getMinecraft().getTextureManager().bindTexture(gasmaskBlur5); break; - } - } Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); @@ -271,12 +185,5 @@ public class ArmorModel extends ItemArmor { if(this == ModItems.cape_schrabidium) { list.add("Avalible for everyone"); } - - if(this == ModItems.gas_mask || this == ModItems.gas_mask_m65) { - list.add("Protects against most harmful gasses"); - } - if(this == ModItems.gas_mask_mono) { - list.add("Protects against carbon monoxide"); - } } } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 69e9dcc43..544946cdf 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -466,7 +466,7 @@ public class ModEventHandlerClient { List list = event.toolTip; /// HAZMAT INFO /// - List hazInfo = ArmorRegistry.armor.get(stack.getItem()); + List hazInfo = ArmorRegistry.hazardClasses.get(stack.getItem()); if(hazInfo != null) { list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("hazard.prot")); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 2131dfdf2..9557b1d30 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -2,12 +2,16 @@ package com.hbm.main; import com.hbm.lib.RefStrings; import com.hbm.render.loader.HFRWavefrontObject; +import com.hbm.render.shader.Shader; +import com.hbm.render.shader.ShaderManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; public class ResourceManager { + + public static final Shader test_shader = ShaderManager.loadShader(new ResourceLocation(RefStrings.MODID, "shaders/test_shader")); //God public static final IModelCustom error = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/error.obj")); diff --git a/src/main/java/com/hbm/render/shader/Shader.java b/src/main/java/com/hbm/render/shader/Shader.java new file mode 100644 index 000000000..f7bf4f321 --- /dev/null +++ b/src/main/java/com/hbm/render/shader/Shader.java @@ -0,0 +1,42 @@ +package com.hbm.render.shader; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL20; + +public class Shader { + + private int shader; + private List uniforms = new ArrayList<>(2); + + public Shader(int shader) { + this.shader = shader; + } + + public Shader withUniforms(Uniform... uniforms) { + for(Uniform u : uniforms) { + this.uniforms.add(u); + } + return this; + } + + public void use() { + + if(!ShaderManager.enableShaders) + return; + + GL20.glUseProgram(shader); + for(Uniform u : uniforms) { + u.apply(shader); + } + } + + public void release() { + GL20.glUseProgram(0); + } + + public int getShaderId() { + return shader; + } +} diff --git a/src/main/java/com/hbm/render/shader/ShaderManager.java b/src/main/java/com/hbm/render/shader/ShaderManager.java new file mode 100644 index 000000000..a00e3d6c1 --- /dev/null +++ b/src/main/java/com/hbm/render/shader/ShaderManager.java @@ -0,0 +1,81 @@ +package com.hbm.render.shader; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +import org.apache.commons.io.IOUtils; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + +import com.hbm.main.MainRegistry; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; + +public class ShaderManager { + + public static boolean enableShaders = true; + + public static final Uniform LIGHTMAP = shader -> { + GL20.glUniform1i(GL20.glGetUniformLocation(shader, "lightmap"), 1); + }; + + public static Shader loadShader(ResourceLocation file) { + + if(!enableShaders) + return new Shader(0); + + int vertexShader = 0; + int fragmentShader = 0; + + try { + int program = GL20.glCreateProgram(); + + vertexShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER); + GL20.glShaderSource(vertexShader, readFileToBuf(new ResourceLocation(file.getResourceDomain(), file.getResourcePath() + ".vert"))); + GL20.glCompileShader(vertexShader); + if(GL20.glGetShaderi(vertexShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + MainRegistry.logger.error(GL20.glGetShaderInfoLog(vertexShader, GL20.GL_INFO_LOG_LENGTH)); + throw new RuntimeException("Error creating vertex shader: " + file); + } + + fragmentShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER); + GL20.glShaderSource(fragmentShader, readFileToBuf(new ResourceLocation(file.getResourceDomain(), file.getResourcePath() + ".frag"))); + GL20.glCompileShader(fragmentShader); + if(GL20.glGetShaderi(fragmentShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + MainRegistry.logger.error(GL20.glGetShaderInfoLog(fragmentShader, GL20.GL_INFO_LOG_LENGTH)); + throw new RuntimeException("Error creating fragment shader: " + file); + } + + GL20.glAttachShader(program, vertexShader); + GL20.glAttachShader(program, fragmentShader); + GL20.glLinkProgram(program); + if(GL20.glGetProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) { + MainRegistry.logger.error(GL20.glGetProgramInfoLog(program, GL20.GL_INFO_LOG_LENGTH)); + throw new RuntimeException("Error creating fragment shader: " + file); + } + + GL20.glDeleteShader(vertexShader); + GL20.glDeleteShader(fragmentShader); + + return new Shader(program); + } catch(Exception x) { + GL20.glDeleteShader(vertexShader); + GL20.glDeleteShader(fragmentShader); + x.printStackTrace(); + } + return new Shader(0); + } + + private static ByteBuffer readFileToBuf(ResourceLocation file) throws IOException { + InputStream in = Minecraft.getMinecraft().getResourceManager().getResource(file).getInputStream(); + byte[] bytes = IOUtils.toByteArray(in); + IOUtils.closeQuietly(in); + ByteBuffer buf = BufferUtils.createByteBuffer(bytes.length); + buf.put(bytes); + buf.rewind(); + return buf; + } +} diff --git a/src/main/java/com/hbm/render/shader/Uniform.java b/src/main/java/com/hbm/render/shader/Uniform.java new file mode 100644 index 000000000..0a32c8893 --- /dev/null +++ b/src/main/java/com/hbm/render/shader/Uniform.java @@ -0,0 +1,6 @@ +package com.hbm.render.shader; + +public interface Uniform { + + public void apply(int shader); +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretChekhov.java b/src/main/java/com/hbm/render/tileentity/RenderTurretChekhov.java index 46ba75490..f58e73b40 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretChekhov.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretChekhov.java @@ -16,6 +16,8 @@ public class RenderTurretChekhov extends RenderTurretBase { TileEntityTurretChekhov turret = (TileEntityTurretChekhov)te; Vec3 pos = turret.getHorizontalOffset(); + + ResourceManager.test_shader.use(); GL11.glPushMatrix(); GL11.glTranslated(x + pos.xCoord, y, z + pos.zCoord); @@ -50,5 +52,7 @@ public class RenderTurretChekhov extends RenderTurretBase { GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); + + ResourceManager.test_shader.release(); } } diff --git a/src/main/java/com/hbm/util/ArmorRegistry.java b/src/main/java/com/hbm/util/ArmorRegistry.java index b1ecefd9f..b3c486fc5 100644 --- a/src/main/java/com/hbm/util/ArmorRegistry.java +++ b/src/main/java/com/hbm/util/ArmorRegistry.java @@ -8,11 +8,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; public class ArmorRegistry { + + public static HashMap> hazardClasses = new HashMap(); - public static HashMap> armor = new HashMap(); - - public static void registerArmor(Item item, HazardClass... hazards) { - armor.put(item, Arrays.asList(hazards)); + public static void registerHazard(Item item, HazardClass... hazards) { + hazardClasses.put(item, Arrays.asList(hazards)); } public static boolean hasProtection(EntityPlayer player, int slot, HazardClass clazz) { @@ -20,7 +20,7 @@ public class ArmorRegistry { if(ArmorUtil.checkArmorNull(player, slot)) return false; - List list = armor.get(player.inventory.armorInventory[slot].getItem()); + List list = hazardClasses.get(player.inventory.armorInventory[slot].getItem()); if(list == null) return false; @@ -43,12 +43,12 @@ public class ArmorRegistry { } } - public static enum ArmorClass { + /*public static enum ArmorClass { MASK_FILTERED, MASK_OXY, GOGGLES, HAZMAT_HEAT, HAZMAT_RADIATION, HAZMAT_BIO; - } + }*/ } diff --git a/src/main/java/com/hbm/util/ArmorUtil.java b/src/main/java/com/hbm/util/ArmorUtil.java index 7af6793a0..903aaf804 100644 --- a/src/main/java/com/hbm/util/ArmorUtil.java +++ b/src/main/java/com/hbm/util/ArmorUtil.java @@ -17,9 +17,8 @@ import net.minecraft.network.NetHandlerPlayServer; public class ArmorUtil { public static void register() { - ArmorRegistry.registerArmor(ModItems.gas_mask, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_CHLORINE); - ArmorRegistry.registerArmor(ModItems.gas_mask_m65, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_CHLORINE); - ArmorRegistry.registerArmor(ModItems.gas_mask_mono, HazardClass.PARTICLE_COARSE, HazardClass.GAS_MONOXIDE); + ArmorRegistry.registerHazard(ModItems.gas_mask_filter_mono, HazardClass.PARTICLE_COARSE, HazardClass.GAS_MONOXIDE); + ArmorRegistry.registerHazard(ModItems.gas_mask_filter, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_CHLORINE, HazardClass.BACTERIA); } public static boolean checkArmor(EntityPlayer player, Item... armor) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 137414d45..937201eb5 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -312,6 +312,7 @@ death.attack.euthanizedSelf2=%1$s gewinnt den Darwin Award. death.attack.euthanizedSelf=%1$s hat sich selbst eingeschläfert, was für ein Vollpfosten. death.attack.exhaust=%1$s wurde von einer startenden Rakete verbrutzelt. death.attack.flamethrower=%1$s wurde von %2$s gegrillt. +death.attack.flamethrower.item=%1$s wurde von %2$s mit %3$s gegrillt. death.attack.ice=%1$s wurde von %2$s in ein Eis am Stiel verwandelt. death.attack.laser=%1$s wurde von %2$s zerbröselt. death.attack.laser.item=%1$s wurde von %2$s mit %3$s zerbröselt. @@ -326,7 +327,7 @@ death.attack.pc=%1$s wurde zu einer Pfütze in der pinken Wolke. death.attack.plasma=%1$s wurde von %2$s eingeäschert. death.attack.radiation=%1$s starb an Strahlenvergiftung. death.attack.revolverBullet=%1$s wurde von %2$s in den Kopf geschossen. -death.attack.revolverBullet.item=%1$s wurde von %2$s mit %3$s in den Kopf geschossen. +death.attack.revolverBullet.item.item=%1$s wurde von %2$s mit %3$s in den Kopf geschossen. death.attack.rubble=%1$s wurde von Schutt zerquetscht. death.attack.shrapnel=%1$s wurde von einem Schrapnell zerfetzt. death.attack.spikes=%1$s wurde aufgespießt. diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index df6f71956..56056927d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -380,6 +380,7 @@ death.attack.euthanizedSelf2=%1$s wins the Darwin Award. death.attack.euthanizedSelf=%1$s euthanized himself, what a dork. death.attack.exhaust=%1$s was turned into shish kebab by a starting rocket. death.attack.flamethrower=%1$s was cremated by %2$s. +death.attack.flamethrower.item=%1$s was cremated by %2$s using %3$s. death.attack.ice=%1$s was turned into a popsicle by %2$s. death.attack.laser=%1$s was turned into ash by %2$s. death.attack.laser.item=%1$s was turned into ash by %2$s using %3$s. @@ -394,7 +395,7 @@ death.attack.pc=%1$s was reduced to a puddle in the pink cloud. death.attack.plasma=%1$s was immolated by %2$s. death.attack.radiation=%1$s died from radiation poisoning. death.attack.revolverBullet=%1$s was shot in the head by %2$s. -death.attack.revolverBullet=%1$s was shot in the head by %2$s using %3$s. +death.attack.revolverBullet.item=%1$s was shot in the head by %2$s using %3$s. death.attack.rubble=%1$s was squashed by debris. death.attack.shrapnel=%1$s was ragged by a shrapnel. death.attack.spikes=%1$s got impaled. diff --git a/src/main/resources/assets/hbm/shaders/test_shader.frag b/src/main/resources/assets/hbm/shaders/test_shader.frag new file mode 100644 index 000000000..2e6f3ab0b --- /dev/null +++ b/src/main/resources/assets/hbm/shaders/test_shader.frag @@ -0,0 +1,25 @@ +#version 330 compatibility + +in vec2 texCoord; +in vec2 lightCoord; +in vec4 color; +in vec3 lighting; +out vec4 FragColor; + +uniform sampler2D texture; +uniform sampler2D lightmap; + +void main(){ + vec4 center = texture2D(DiffuseSampler, texCoord); + vec4 up = texture2D(DiffuseSampler, texCoord + vec2( 0.0, -oneTexel.y)); + vec4 down = texture2D(DiffuseSampler, texCoord + vec2( oneTexel.x, 0.0)); + vec4 left = texture2D(DiffuseSampler, texCoord + vec2(-oneTexel.x, 0.0)); + vec4 right = texture2D(DiffuseSampler, texCoord + vec2( 0.0, oneTexel.y)); + vec4 uDiff = center - up; + vec4 dDiff = center - down; + vec4 lDiff = center - left; + vec4 rDiff = center - right; + vec4 sum = uDiff + dDiff + lDiff + rDiff; + vec3 clamped = clamp(center.rgb - sum.rgb, 0.0, 1.0); + gl_FragColor = vec4(clamped, center.a); +} diff --git a/src/main/resources/assets/hbm/shaders/test_shader.vert b/src/main/resources/assets/hbm/shaders/test_shader.vert new file mode 100644 index 000000000..29c5d6a14 --- /dev/null +++ b/src/main/resources/assets/hbm/shaders/test_shader.vert @@ -0,0 +1,26 @@ +#version 330 compatibility + +out vec2 texCoord; +out vec2 lightCoord; +out vec4 color; +out vec3 lighting; + +void main(){ + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).st; + lightCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).st; + color = gl_Color; + + vec3 totalLighting = vec3(gl_LightModel.ambient) * vec3(gl_FrontMaterial.emission); + vec3 normal = (gl_NormalMatrix * gl_Normal).xyz; + vec4 difftot = vec4(0.0F); + + for (int i = 0; i < gl_MaxLights; i ++){ + + vec4 diff = gl_FrontLightProduct[i].diffuse * max(dot(normal,gl_LightSource[i].position.xyz), 0.0f); + diff = clamp(diff, 0.0F, 1.0F); + + difftot += diff; + } + lighting = clamp((difftot + gl_LightModel.ambient).rgb, 0.0F, 1.0F); +} diff --git a/src/main/resources/assets/hbm/textures/models/machines/crane_console.png b/src/main/resources/assets/hbm/textures/models/machines/crane_console.png new file mode 100644 index 000000000..d0dcad029 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/crane_console.png differ