diff --git a/changelog b/changelog index 575a54ee4..c26beadfa 100644 --- a/changelog +++ b/changelog @@ -15,4 +15,5 @@ * Fixed hydroreactive items not exploding when submerged in water * Fixed fluid valves visually disconnecting when switching state * Fixed fluid valves no visually connecting when type is set -* Fixed falling blocks spawned by nukes or impulse grenades dropping blocks that don't have drops \ No newline at end of file +* Fixed falling blocks spawned by nukes or impulse grenades dropping blocks that don't have drops +* Added even more exception handling to CompStacks, hopefully fixing an incompatibility with Mana Metal \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/BossSpawnHandler.java b/src/main/java/com/hbm/handler/BossSpawnHandler.java index 485de324f..fa14f7d41 100644 --- a/src/main/java/com/hbm/handler/BossSpawnHandler.java +++ b/src/main/java/com/hbm/handler/BossSpawnHandler.java @@ -245,8 +245,9 @@ public class BossSpawnHandler { Vec3 vec; if(repell) { vec = Vec3.createVectorHelper(meteor.posX - player.posX, 0, meteor.posZ - player.posZ).normalize(); - vec.xCoord = vec.xCoord * meteorRand.nextDouble() - 0.5D; - vec.zCoord = vec.zCoord * meteorRand.nextDouble() - 0.5D; + double vel = meteorRand.nextDouble(); + vec.xCoord = vec.xCoord * vel; + vec.zCoord = vec.zCoord * vel; meteor.safe = true; } else { vec = Vec3.createVectorHelper(meteorRand.nextDouble() - 0.5D, 0, 0); diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 85a43f6bf..c2f5914db 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -116,10 +116,17 @@ public class RecipesCommon { this.stacksize = 1; return; } - this.item = stack.getItem(); - if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in - this.stacksize = stack.stackSize; - this.meta = stack.getItemDamage(); + try { + this.item = stack.getItem(); + if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in + this.stacksize = stack.stackSize; + this.meta = stack.getItemDamage(); + } catch(Exception ex) { + this.item = ModItems.nothing; + if(!GeneralConfig.enableSilentCompStackErrors) { + ex.printStackTrace(); + } + } } public ComparableStack makeSingular() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java index 27f659513..90d6a2337 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java @@ -7,12 +7,16 @@ public interface IMagazine { /** What ammo is loaded currently */ public Object getType(ItemStack stack); + /** Sets the mag's ammo type */ + public void setType(ItemStack stack, Object type); /** How much ammo this mag can carry */ public int getCapacity(ItemStack stack); /** How much ammo is currently loaded */ public int getAmount(ItemStack stack); /** Sets the mag's ammo level */ public void setAmount(ItemStack stack, int amount); + /** If a reload can even be initiated, i.e. the player even has bullets to load */ + public boolean canReload(ItemStack stack, EntityPlayer player); /** The action done at the end of one reload cycle, either loading one shell or replacing the whole mag */ public void reloadAction(ItemStack stack, EntityPlayer player); /** The stack that should be displayed for the ammo HUD */ diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java index fc9a7f6ae..628d1a73d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java @@ -12,9 +12,63 @@ public class MagazineRevolverDrum extends MagazineStandardBase { super(index, capacity); } + /** Returns true if the player has the same ammo if partially loaded, or any valid ammo if not */ + @Override + public boolean canReload(ItemStack stack, EntityPlayer player) { + + for(ItemStack slot : player.inventory.mainInventory) { + + if(slot != null) { + if(this.getAmount(stack) == 0) { + for(BulletConfig config : this.acceptedBullets) { + if(config.ammo.matchesRecipe(slot, true)) return true; + } + } else { + BulletConfig config = (BulletConfig) this.getType(stack); + if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); } + if(config.ammo.matchesRecipe(slot, true)) return true; + } + } + } + + return false; + } + + /** Reloads all rounds at once. If the mag is empty, the mag's type will change to the first valid ammo type */ @Override public void reloadAction(ItemStack stack, EntityPlayer player) { + for(int i = 0; i < player.inventory.mainInventory.length; i++) { + ItemStack slot = player.inventory.mainInventory[i]; + + if(slot != null) { + + //mag is empty, assume next best type + if(this.getAmount(stack) == 0) { + + for(BulletConfig config : this.acceptedBullets) { + if(config.ammo.matchesRecipe(slot, true)) { + this.setType(stack, config); + int toLoad = Math.min(this.getCapacity(stack), slot.stackSize); + this.setAmount(stack, toLoad); + player.inventory.decrStackSize(i, toLoad); + break; + } + } + //mag has a type set, only load that + } else { + BulletConfig config = (BulletConfig) this.getType(stack); + if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); } //fixing broken NBT + + if(config.ammo.matchesRecipe(slot, true)) { + int alreadyLoaded = this.getAmount(stack); + int toLoad = Math.min(this.getCapacity(stack) - alreadyLoaded, slot.stackSize); + this.setAmount(stack, toLoad + alreadyLoaded); + player.inventory.decrStackSize(i, toLoad); + } + } + } + } } @Override diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java index b066e2f91..4ce6a9eb9 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java @@ -9,7 +9,7 @@ import com.hbm.items.weapon.sedna.Receiver; import net.minecraft.item.ItemStack; -/** Base class for typical magazines, i.e. ones that hold bullets, shells, grenades, etc, any ammo item */ +/** Base class for typical magazines, i.e. ones that hold bullets, shells, grenades, etc, any ammo item. Type methods deal with BulletConfigs */ public abstract class MagazineStandardBase implements IMagazine { public static final String KEY_MAG_COUNT = "magcount"; @@ -33,12 +33,19 @@ public abstract class MagazineStandardBase implements IMagazine { @Override public Object getType(ItemStack stack) { int type = getMagType(stack, index); - if(type >= 0 && type < BulletConfig.configs.size()) { - return BulletConfig.configs.get(type); + if(type >= 0 && type < acceptedBullets.size()) { + return acceptedBullets.get(type); } return null; } + @Override + public void setType(ItemStack stack, Object type) { + if(!(type instanceof BulletConfig)) return; + int i = acceptedBullets.indexOf(type); + if(i >= 0) setMagType(stack, index, i); + } + @Override public int getCapacity(ItemStack stack) { return capacity; } @Override public int getAmount(ItemStack stack) { return getMagCount(stack, index); } @Override public void setAmount(ItemStack stack, int amount) { setMagCount(stack, index, amount); } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 375ec3d16..7bd969303 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -104,6 +104,7 @@ import com.hbm.render.item.*; import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; import com.hbm.render.item.block.*; import com.hbm.render.item.weapon.*; +import com.hbm.render.item.weapon.sedna.*; import com.hbm.render.loader.HmfModelLoader; import com.hbm.render.model.ModelPigeon; import com.hbm.render.tileentity.*; @@ -602,6 +603,8 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.gun_coilgun, new ItemRenderWeaponCoilgun()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_cryocannon, new ItemRenderWeaponCryoCannon()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderWeaponCongo()); + //SEDNA + MinecraftForgeClient.registerItemRenderer(ModItems.gun_debug, new ItemRenderDebug()); //multitool MinecraftForgeClient.registerItemRenderer(ModItems.multitool_dig, new ItemRenderMultitool()); MinecraftForgeClient.registerItemRenderer(ModItems.multitool_silk, new ItemRenderMultitool()); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 6c2efa833..9b2bddb31 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1071,8 +1071,8 @@ public class ModEventHandlerClient { @SideOnly(Side.CLIENT) @SubscribeEvent - public void onMouseClicked(InputEvent.KeyInputEvent event) { - + public void onMouseClicked(InputEvent.MouseInputEvent event) { + Minecraft mc = Minecraft.getMinecraft(); if(GeneralConfig.enableKeybindOverlap && (mc.currentScreen == null || mc.currentScreen.allowUserInput)) { boolean state = Mouse.getEventButtonState(); @@ -1083,7 +1083,7 @@ public class ModEventHandlerClient { KeyBinding key = (KeyBinding) o; if(key.getKeyCode() == keyCode && KeyBinding.hash.lookup(key.getKeyCode()) != key) { - + key.pressed = state; if(state) { key.pressTime++; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 7fb0fc35b..9cb14eac5 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -8,7 +8,9 @@ import com.hbm.config.RadiationConfig; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.armor.IArmorDisableModel; import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart; +import com.hbm.items.weapon.sedna.ItemGunBase; import com.hbm.packet.PermaSyncHandler; +import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase; import com.hbm.render.model.ModelMan; import com.hbm.world.biome.BiomeGenCraterBase; @@ -33,11 +35,15 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.common.ForgeModContainer; @@ -409,6 +415,24 @@ public class ModEventHandlerRenderer { } } + @SubscribeEvent + public void onRenderHand(RenderHandEvent event) { + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack held = player.getHeldItem(); + + if(held != null) { + IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(held, ItemRenderType.EQUIPPED_FIRST_PERSON); + + if(renderer instanceof ItemRenderWeaponBase) { + renderer.renderItem(ItemRenderType.FIRST_PERSON_MAP, held, null /*RenderBlocks*/, player); + //Minecraft.getMinecraft().entityRenderer.itemRenderer.renderItemInFirstPerson(event.partialTicks); + + event.setCanceled(true); + } + } + } + private static boolean fogInit = false; private static int fogX; private static int fogZ; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index aa3ff784d..07f22e0cb 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -951,6 +951,7 @@ public class ResourceManager { public static final ResourceLocation congolake_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/congolake.png"); public static final ResourceLocation lilmac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac.png"); public static final ResourceLocation lilmac_scope_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac_scope.png"); + public static final ResourceLocation debug_gun_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/debug_gun.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java new file mode 100644 index 000000000..4e52a079a --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java @@ -0,0 +1,44 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderDebug extends ItemRenderWeaponBase { + + @Override + public void renderFirstPerson(ItemStack stack) { + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex); + ResourceManager.lilmac.renderPart("Gun"); + ResourceManager.lilmac.renderPart("Cylinder"); + ResourceManager.lilmac.renderPart("Bullets"); + ResourceManager.lilmac.renderPart("Casings"); + ResourceManager.lilmac.renderPart("Pivot"); + ResourceManager.lilmac.renderPart("Hammer"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + GL11.glRotated(90, 0, 1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex); + ResourceManager.lilmac.renderPart("Gun"); + ResourceManager.lilmac.renderPart("Cylinder"); + ResourceManager.lilmac.renderPart("Bullets"); + ResourceManager.lilmac.renderPart("Casings"); + ResourceManager.lilmac.renderPart("Pivot"); + ResourceManager.lilmac.renderPart("Hammer"); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java new file mode 100644 index 000000000..20f044464 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -0,0 +1,82 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.Project; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public abstract class ItemRenderWeaponBase implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type != ItemRenderType.FIRST_PERSON_MAP; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION; + } + + @SuppressWarnings("incomplete-switch") //shut the fuck up + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + switch(type) { + case EQUIPPED_FIRST_PERSON: setupFirstPerson(item); renderFirstPerson(item); break; + case EQUIPPED: setupThirdPerson(item); renderOther(item, type); break; + case INVENTORY: setupInv(item); renderOther(item, type); break; + case ENTITY: setupEntity(item); renderOther(item, type); break; + } + GL11.glPopMatrix(); + } + + public void setupFirstPerson(ItemStack stack) { + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + float f1 = 0.07F; + Minecraft mc = Minecraft.getMinecraft(); + float farPlaneDistance = mc.gameSettings.renderDistanceChunks * 16; + float interp = 0; + + Project.gluPerspective(1, (float)mc.displayWidth / (float)mc.displayHeight, 0.05F, farPlaneDistance * 2.0F); + + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + + GL11.glPushMatrix(); + //this.hurtCameraEffect(interp); + + if (mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) + { + //this.enableLightmap((double)p_78476_1_); + this.renderItem(ItemRenderType.EQUIPPED_FIRST_PERSON, stack, null, mc.thePlayer); + //this.disableLightmap((double)p_78476_1_); + } + + GL11.glPopMatrix(); + + //GL11.glRotated(90, 0, 1, 0); + //GL11.glRotated(40, -1, 0, 0); + } + + public void setupThirdPerson(ItemStack stack) { + + } + + public void setupInv(ItemStack stack) { + GL11.glScaled(1, 1, -1); + GL11.glTranslated(8, 8, 0); + GL11.glRotated(225, 0, 0, 1); + GL11.glRotated(90, 0, 1, 0); + } + + public void setupEntity(ItemStack stack) { + + } + + public abstract void renderFirstPerson(ItemStack stack); + public abstract void renderOther(ItemStack stack, ItemRenderType type); +}