diff --git a/changelog b/changelog index 5f91dbddb..6f3ede9f5 100644 --- a/changelog +++ b/changelog @@ -44,4 +44,5 @@ * Rapidly spinning dyx should no longer have a state leak that would rotate lighting of unrelated TESRs with it * Fixed issue where mining strange stone with silk touch ability would cause a desync. It also now drops cobblestone, as if silk touch wasn't active at all * Fixed issue where applying a filter to a mask that doesn't support certain protection types would permanently remove those types from the filter until the game is restarted -* Fixed InventoryBogoSorter being able to move held crates \ No newline at end of file +* Fixed InventoryBogoSorter being able to move held crates +* Fixed tier 2 pickaxes mining depth rock causing a desync with the depth rock not actually being broken \ No newline at end of file diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index abe7a137f..e91283917 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -274,7 +274,7 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro EntityPlayerMP player = (EntityPlayerMP) playerEntity; ItemStack stack = player.getHeldItem(); - if (stack == null) { + if(stack == null) { return; } @@ -288,7 +288,7 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ); float strength = ForgeHooks.blockStrength(block, player, world, x, y, z); - if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getBlockHardness(world, refX, refY, refZ) < 0) + if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getPlayerRelativeBlockHardness(player, world, refX, refY, refZ) < 0) return; BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 378ffcad8..24df3eeff 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -323,7 +323,7 @@ public class XFactory12ga { ModItems.gun_maresleg_broken = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() .dura(0).draw(5).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(32F).spreadAmmo(1.15F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) + .dmg(48F).spreadAmmo(1.15F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 6).addConfigs(g12_equestrian_tkr, g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus)) .offset(0.75, -0.0625, -0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_MARESLEG)) @@ -654,12 +654,18 @@ public class XFactory12ga { @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_SEXY_ANIMS = (stack, type) -> { switch(type) { case CYCLE: return new BusAnimation() - .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, -1, 50, IType.SIN_DOWN).addPos(0, 0, 0, 150, IType.SIN_FULL)) - .addBus("CYCLE", new BusAnimationSequence().addPos(0, 0, 18, 50)); + .addBus("RECOIL", new BusAnimationSequence().hold(50).addPos(0, 0, -0.25, 50, IType.SIN_DOWN).addPos(0, 0, 0, 100, IType.SIN_FULL)) + .addBus("BARREL", new BusAnimationSequence().addPos(0, 0, -1, 50, IType.SIN_DOWN).addPos(0, 0, 0, 150)) + .addBus("CYCLE", new BusAnimationSequence().addPos(1, 0, 0, 150)) + .addBus("HOOD", new BusAnimationSequence().hold(50).addPos(3, 0, 0, 50, IType.SIN_DOWN).addPos(0, 0, 0, 50, IType.SIN_UP)); case CYCLE_DRY: return new BusAnimation() .addBus("CYCLE", new BusAnimationSequence().addPos(0, 0, 18, 50)); + case RELOAD: return new BusAnimation() + .addBus("LEVER", new BusAnimationSequence().addPos(0, 0, 1, 150).hold(2750).addPos(0, 0, 0, 150)) + .addBus("HOOD", new BusAnimationSequence().hold(250).addPos(60, 0, 0, 500, IType.SIN_FULL).hold(1500).addPos(0, 0, 0, 500, IType.SIN_FULL)) + .addBus("BELT", new BusAnimationSequence().setPos(1, 0, 0).hold(750).addPos(0, 0, 0, 500, IType.SIN_FULL).hold(500).addPos(1, 0, 0, 500, IType.SIN_FULL)); } - return LAMBDA_SHREDDER_ANIMS.apply(stack, type); + return null; }; } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 2df3bbfd0..ce23a4e69 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -922,16 +922,18 @@ public class ModEventHandlerClient { ItemFluidDuct.class ); - String prefix = "Gun "; - int scale = 8; + String prefix = "Slot "; + int gunScale = 8; + int slotScale = 1; boolean ignoreNonNTM = true; + boolean onlyGuns = true; List stacks = new ArrayList(); for (Object reg : Item.itemRegistry) { Item item = (Item) reg; if(ignoreNonNTM && !Item.itemRegistry.getNameForObject(item).startsWith("hbm:")) continue; if(ignoredItems.contains(item)) continue; - if(!(item instanceof ItemGunBaseNT) && prefix.toLowerCase(Locale.US).startsWith("gun")) continue; + if(onlyGuns && !(item instanceof ItemGunBaseNT)) continue; if(collapsedClasses.contains(item.getClass())) { stacks.add(new ItemStack(item)); } else { @@ -940,7 +942,7 @@ public class ModEventHandlerClient { } Minecraft.getMinecraft().thePlayer.closeScreen(); - FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", scale)); + FMLCommonHandler.instance().showGuiScreen(new GUIScreenWikiRender(stacks.toArray(new ItemStack[0]), prefix, "wiki-block-renders-256", slotScale)); } } else { isRenderingItems = false; diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java index 797910362..901d129fd 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java @@ -2,14 +2,17 @@ package com.hbm.render.item.weapon.sedna; import org.lwjgl.opengl.GL11; +import com.hbm.interfaces.NotableComments; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; import com.hbm.util.BobMathUtil; +import com.hbm.util.Vec3NT; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +@NotableComments public class ItemRenderSexy extends ItemRenderWeaponBase { @Override @@ -43,8 +46,15 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { double scale = 0.375D; GL11.glScaled(scale, scale, scale); + boolean doesCycle = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("CYCLE") != null; + boolean reloading = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("BELT") != null; double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] cycle = HbmAnimations.getRelevantTransformation("CYCLE"); + double[] barrel = HbmAnimations.getRelevantTransformation("BARREL"); + double[] hood = HbmAnimations.getRelevantTransformation("HOOD"); + double[] lever = HbmAnimations.getRelevantTransformation("LEVER"); + double[] belt = HbmAnimations.getRelevantTransformation("BELT"); GL11.glTranslated(0, -1, -8); GL11.glRotated(equip[0], 1, 0, 0); @@ -57,7 +67,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { ResourceManager.sexy.renderPart("Gun"); GL11.glPushMatrix(); - //GL11.glTranslated(0, 0, -1); + GL11.glTranslated(0, 0, barrel[2]); ResourceManager.sexy.renderPart("Barrel"); GL11.glPopMatrix(); @@ -70,42 +80,64 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glPushMatrix(); GL11.glTranslated(0, 0.4375, -2.875); - //GL11.glRotated(60, 1, 0, 0); + GL11.glRotated(hood[0], 1, 0, 0); GL11.glTranslated(0, -0.4375, 2.875); ResourceManager.sexy.renderPart("Hood"); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glTranslated(0, 0.46875, -6.875); - //GL11.glRotated(60, 1, 0, 0); + GL11.glRotated(lever[2] * 60, 1, 0, 0); GL11.glTranslated(0, -0.46875, 6.875); ResourceManager.sexy.renderPart("Lever"); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glTranslated(0, 0, -6.75); - //GL11.glScaled(1, 1, 0.75); + GL11.glScaled(1, 1, 1 - lever[2] * 0.25); GL11.glTranslated(0, 0, 6.75); ResourceManager.sexy.renderPart("LockSpring"); GL11.glPopMatrix(); ResourceManager.sexy.renderPart("Magazine"); - - /*renderShell(0, -0.375, 90, false); - renderShell(0.3125, -0.0625, 30, false); - renderShell(0.75, -0.125, -30, false); - renderShell(1.0625, -0.4375, -60, false); - renderShell(1.0625, -0.875, -90, false); - renderShell(1.0625, -1.3125, -90, false);*/ double p = 0.0625D; + double x = p * 17; + double y = p * -26; + double angle = 0; + Vec3NT vec = new Vec3NT(0, 0.4375, 0); // reusable, just like how toilet paper was reusable during corona + + // basically what all this does is take an array of angles and just strings together shells with the appropriate + // position and angle calculated out of the next angle, taking all previous transformations into account. + // has a second array which is the "open" position that the animation can smoothly interpolate through + double[] anglesLoaded = new double[] {0, 0, 20, 20, 50, 60, 70}; + double[] anglesUnloaded = new double[] {0, -10, -50, -60, -60, 0, 0}; + double reloadProgress = !reloading ? 1D : belt[0]; + double cycleProgress = !doesCycle ? 1 : cycle[0]; - renderShell(p * 0, p * -6, 90, true); - renderShell(p * 5, p * 1, 30, true); - renderShell(p * 12, p * -1, -30, true); - renderShell(p * 17, p * -6, -60, true); - renderShell(p * 17, p * -13, -90, true); - renderShell(p * 17, p * -20, -90, true); + double[][] shells = new double[anglesLoaded.length][3]; + + // generate belt, interp used for the reload animation + for(int i = 0; i < anglesLoaded.length; i++) { + shells[i][0] = x; + shells[i][1] = y; + shells[i][2] = angle - 90; + double delta = BobMathUtil.interp(anglesUnloaded[i], anglesLoaded[i], reloadProgress); + angle += delta; + vec.rotateAroundZDeg(-delta); + x += vec.xCoord; + y += vec.yCoord; + } + + // draw belt, interp used for cycling (shells will transform towards the position/rotation of the next shell) + for(int i = 0; i < shells.length - 1; i++) { + double[] prevShell = shells[i]; + double[] nextShell = shells[i + 1]; + renderShell( + BobMathUtil.interp(prevShell[0], nextShell[0], cycleProgress), + BobMathUtil.interp(prevShell[1], nextShell[1], cycleProgress), + BobMathUtil.interp(prevShell[2], nextShell[2], cycleProgress), true); + } GL11.glShadeModel(GL11.GL_FLAT); } @@ -113,10 +145,9 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { @Override public void setupThirdPerson(ItemStack stack) { super.setupThirdPerson(stack); - double scale = 1.25D; + double scale = 1.75D; GL11.glScaled(scale, scale, scale); - GL11.glTranslated(0, 0, 4); - + GL11.glTranslated(1, 1, 6); } @Override