diff --git a/src/main/java/net/aspw/client/Launch.kt b/src/main/java/net/aspw/client/Launch.kt index 47410c26..2a9f50b9 100644 --- a/src/main/java/net/aspw/client/Launch.kt +++ b/src/main/java/net/aspw/client/Launch.kt @@ -23,7 +23,7 @@ object Launch { // Client information const val CLIENT_BEST = "NightX" const val CLIENT_FOLDER = "NightX-Client" - const val CLIENT_VERSION = "B125-Beta" + const val CLIENT_VERSION = "B125" const val CLIENT_CHAT = "§7[§5N§di§3g§bh§6t§aX§7] [§eInfo§7] §r" var isStarting = false diff --git a/src/main/java/net/aspw/client/features/module/impl/visual/Animations.kt b/src/main/java/net/aspw/client/features/module/impl/visual/Animations.kt index 50a0b2dd..06c4c1bc 100644 --- a/src/main/java/net/aspw/client/features/module/impl/visual/Animations.kt +++ b/src/main/java/net/aspw/client/features/module/impl/visual/Animations.kt @@ -60,8 +60,7 @@ class Animations : Module() { "Tap1", "Tap2", "Sigma3", - "Sigma4", - "Spin" + "Sigma4" ), "Swing" ) diff --git a/src/main/java/net/aspw/client/injection/forge/mixins/client/MixinMinecraft.java b/src/main/java/net/aspw/client/injection/forge/mixins/client/MixinMinecraft.java index 126ba983..ccd57e9c 100644 --- a/src/main/java/net/aspw/client/injection/forge/mixins/client/MixinMinecraft.java +++ b/src/main/java/net/aspw/client/injection/forge/mixins/client/MixinMinecraft.java @@ -26,9 +26,7 @@ import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; @@ -160,4 +158,9 @@ private void resolveScreenState(CallbackInfo ci) { private char resolveForeignKeyboards() { return (char) (Keyboard.getEventCharacter() + 256); } + + @ModifyConstant(method = "getLimitFramerate", constant = @Constant(intValue = 30)) + public int getLimitFramerate(int constant) { + return MinecraftInstance.mc.gameSettings.limitFramerate; + } } \ No newline at end of file diff --git a/src/main/java/net/aspw/client/injection/forge/mixins/item/MixinItemRenderer.java b/src/main/java/net/aspw/client/injection/forge/mixins/item/MixinItemRenderer.java index 99b97777..aadd59ff 100644 --- a/src/main/java/net/aspw/client/injection/forge/mixins/item/MixinItemRenderer.java +++ b/src/main/java/net/aspw/client/injection/forge/mixins/item/MixinItemRenderer.java @@ -42,7 +42,9 @@ public abstract class MixinItemRenderer { private Minecraft mc; @Shadow private ItemStack itemToRender; + private float delay = 0; + private long lastUpdateTime = System.currentTimeMillis(); @Shadow protected abstract void rotateArroundXAndY(float angle, float angleY); @@ -245,7 +247,7 @@ public void renderItemInFirstPerson(final float partialTicks) { transformFirstPersonItem(0.0F, 0.0f); else transformFirstPersonItem(f / 1.4F, 0.0f); doBlockTransformations(); - GlStateManager.rotate(-var * 42.5F, 1.1F, 0.8F, -0.3F); + GlStateManager.rotate(-var * 41F, 1.1F, 0.8F, -0.3F); GlStateManager.scale(Animations.scale.get() + 1, Animations.scale.get() + 1, Animations.scale.get() + 1); break; } @@ -272,16 +274,16 @@ public void renderItemInFirstPerson(final float partialTicks) { GlStateManager.rotate(this.delay, 0.0F, 0.0F, -0.1F); if (Animations.cancelEquip.get()) this.transformFirstPersonItem(0.0F, 0.0F); - else this.transformFirstPersonItem(f / 1.3F, 0.0F); + else this.transformFirstPersonItem(f / 1.2F, 0.0F); + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - lastUpdateTime; if (this.rotateTimer.hasReached(1L)) { - for (int i = 0; i < 1; i++) { - ++this.delay; - } + this.delay += elapsedTime * 360.0 / 1000.0; this.rotateTimer.reset(); } - if (this.delay > 360.0F) { + lastUpdateTime = currentTime; + if (this.delay > 360.0F) this.delay = 0.0F; - } doBlockTransformations(); GlStateManager.scale(Animations.scale.get() + 1, Animations.scale.get() + 1, Animations.scale.get() + 1); break; @@ -337,28 +339,14 @@ public void renderItemInFirstPerson(final float partialTicks) { GlStateManager.scale(Animations.scale.get() + 1, Animations.scale.get() + 1, Animations.scale.get() + 1); break; } - case "Spin": { - GL11.glTranslated(Animations.blockPosX.get().doubleValue(), Animations.blockPosY.get().doubleValue(), Animations.blockPosZ.get().doubleValue()); - if (Animations.cancelEquip.get()) - transformFirstPersonItem(0.0f, 0.0f); - else transformFirstPersonItem(f / 1.4F, 0.0F); - GlStateManager.translate(0, 0.2F, -1); - GlStateManager.rotate(-59, -1, 0, 3); - GlStateManager.rotate(-(System.currentTimeMillis() / 2 % 360), 1, 0, 0.0F); - GlStateManager.rotate(60.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.scale(Animations.scale.get() + 1, Animations.scale.get() + 1, Animations.scale.get() + 1); - } case "Slash": { - GL11.glTranslated(Animations.blockPosX.get().doubleValue(), Animations.blockPosY.get().doubleValue(), Animations.blockPosZ.get().doubleValue()); + GL11.glTranslated(Animations.blockPosX.get().doubleValue() + 0.08, Animations.blockPosY.get().doubleValue() + 0.08, Animations.blockPosZ.get().doubleValue()); final float var = MathHelper.sin((float) (MathHelper.sqrt_float(f1) * Math.PI)); if (Animations.cancelEquip.get()) - transformFirstPersonItem(0.0f, 0.0f); - else transformFirstPersonItem(f / 1.8f, 0.0f); + transformFirstPersonItem(0.0F, 0.0f); + else transformFirstPersonItem(f / 1.4F, 0.0f); doBlockTransformations(); - final float var16 = MathHelper.sin((float) (f1 * f1 * Math.PI)); - GlStateManager.rotate(-var16 * 0f, 0.0f, 1.0f, 0.0f); - GlStateManager.rotate(-var * 50f, 0.0f, 0.0f, 1.0f); - GlStateManager.rotate(-var * 0f, 1.5f, 0.0f, 0.0f); + GlStateManager.rotate(-var * 70F, 5F, 13F, 50F); GlStateManager.scale(Animations.scale.get() + 1, Animations.scale.get() + 1, Animations.scale.get() + 1); break; } diff --git a/src/main/java/net/aspw/client/utils/URLComponent.kt b/src/main/java/net/aspw/client/utils/URLComponent.kt index 8e2cf387..e1616d7b 100644 --- a/src/main/java/net/aspw/client/utils/URLComponent.kt +++ b/src/main/java/net/aspw/client/utils/URLComponent.kt @@ -1,6 +1,8 @@ package net.aspw.client.utils object URLComponent { + var gifLoaded = false + var interval = 1_000_000_000L / 150 const val WEBSITE = "https://aspw-w.github.io/NightX" const val STATUS = "$WEBSITE/database/data.txt" const val STAFFS = "$WEBSITE/database/staffs.txt" diff --git a/src/main/java/net/aspw/client/visual/client/GuiMainMenu.kt b/src/main/java/net/aspw/client/visual/client/GuiMainMenu.kt index 640ee366..0d5f328b 100644 --- a/src/main/java/net/aspw/client/visual/client/GuiMainMenu.kt +++ b/src/main/java/net/aspw/client/visual/client/GuiMainMenu.kt @@ -2,7 +2,9 @@ package net.aspw.client.visual.client import net.aspw.client.Launch import net.aspw.client.utils.APIConnecter +import net.aspw.client.utils.URLComponent import net.aspw.client.utils.misc.MiscUtils +import net.aspw.client.utils.render.BlurUtils import net.aspw.client.utils.render.RenderUtils import net.aspw.client.visual.client.altmanager.GuiAltManager import net.aspw.client.visual.font.smooth.FontLoaders @@ -15,13 +17,21 @@ class GuiMainMenu : GuiScreen(), GuiYesNoCallback { var alpha = 255 private var lastAnimTick: Long = 0L + private var previousTime = System.nanoTime() + private val moveMouseStrength = 200 private var alrUpdate = false private val buttonWidth = 112 private val buttonHeight = 20 - private var level = 0 private var ticks = 0 + private val particles = mutableListOf() + private var lastUpdateTime = System.currentTimeMillis() override fun initGui() { + if (particles.isNotEmpty()) + particles.clear() + for (i in 0 until 600) { + particles.add(Particle((Math.random() * width).toFloat(), (Math.random() * height).toFloat())) + } this.buttonList.add( GuiButton( 0, @@ -110,16 +120,44 @@ class GuiMainMenu : GuiScreen(), GuiYesNoCallback { lastAnimTick = System.currentTimeMillis() alrUpdate = true } + val currentTime = System.currentTimeMillis() + val deltaTime = (currentTime - lastUpdateTime) / 1000.0f + lastUpdateTime = currentTime GL11.glPushMatrix() GlStateManager.disableAlpha() drawBackground(0) + moveMouseEffect(mouseX, mouseY, moveMouseStrength - (moveMouseStrength / 2).toFloat()) loadGif() RenderUtils.drawImage( - ResourceLocation("client/background/mainmenu/$ticks.png"), 0, 0, - width, height + ResourceLocation("client/background/mainmenu/$ticks.png"), + -moveMouseStrength + (moveMouseStrength / 2), + -moveMouseStrength + (moveMouseStrength / 2), + width + moveMouseStrength, + height + moveMouseStrength + ) + moveMouseEffect(mouseX, mouseY, -moveMouseStrength + (moveMouseStrength / 2).toFloat()) + BlurUtils.blurArea( + 0f, + 0f, + width.toFloat(), + height.toFloat(), + 5f ) - RenderUtils.drawGradientRect(0, 0, width, height, -13158600, -804253680) + if (URLComponent.gifLoaded) + RenderUtils.drawImage2( + ResourceLocation("client/background/nightx.png"), + width / 2F - 50F, + height / 2F - 130F, + 100, + 100 + ) GlStateManager.enableAlpha() + if (URLComponent.gifLoaded) { + particles.forEach { it.update(deltaTime) } + particles.forEach { it.render() } + } + if (!URLComponent.gifLoaded) + FontLoaders.SF20.drawCenteredStringWithShadow("Loading...", width / 2f, height / 2f - 85f, -0x1111111) val apiMessage = if (APIConnecter.canConnect) "§eOK" else "§cNo" FontLoaders.SF20.drawStringWithShadow( "API Connection: $apiMessage", @@ -236,20 +274,37 @@ class GuiMainMenu : GuiScreen(), GuiYesNoCallback { } } + private fun moveMouseEffect(mouseX: Int, mouseY: Int, strength: Float) { + val mX = mouseX - width / 2 + val mY = mouseY - height / 2 + val xDelta = mX.toFloat() / (width / 2).toFloat() + val yDelta = mY.toFloat() / (height / 2).toFloat() + + GL11.glTranslatef(xDelta * strength, yDelta * strength, 0F) + } + private fun loadGif() { - level++ - if (level >= 2) { + val currentTime = System.nanoTime() + val deltaTime = currentTime - previousTime + + if (deltaTime >= URLComponent.interval) { ticks++ - level = 0 + if (ticks > 149) { + if (!URLComponent.gifLoaded) { + URLComponent.interval = 1_000_000_000L / 15 + URLComponent.gifLoaded = true + } + ticks = 0 + } + previousTime = currentTime } - if (ticks > 149) - ticks = 0 } override fun keyTyped(typedChar: Char, keyCode: Int) {} override fun onGuiClosed() { - level = 0 + if (particles.isNotEmpty()) + particles.clear() ticks = 0 } } \ No newline at end of file diff --git a/src/main/java/net/aspw/client/visual/client/Particle.kt b/src/main/java/net/aspw/client/visual/client/Particle.kt new file mode 100644 index 00000000..bb3373cf --- /dev/null +++ b/src/main/java/net/aspw/client/visual/client/Particle.kt @@ -0,0 +1,52 @@ +package net.aspw.client.visual.client + +import net.aspw.client.utils.MinecraftInstance +import net.aspw.client.utils.misc.RandomUtils +import net.minecraft.client.renderer.Tessellator +import net.minecraft.client.renderer.vertex.DefaultVertexFormats +import net.minecraft.util.ResourceLocation +import org.lwjgl.opengl.GL11 + +class Particle(var x: Float, var y: Float) { + private var velocityY = (Math.random() * 100).toFloat() + private val size = 1f + private val texture = ResourceLocation("client/background/particle.png") + private var delay = RandomUtils.nextInt(0, 800) + + fun update(deltaTime: Float) { + if (delay > 0) { + delay-- + return + } + + velocityY += 700f * deltaTime + y += velocityY * deltaTime + + if (y >= MinecraftInstance.mc.displayHeight) { + reset() + } + } + + fun render() { + if (delay > 0) return + + MinecraftInstance.mc.textureManager.bindTexture(texture) + GL11.glColor4f(1f, 1f, 1f, 1f) + val tessellator = Tessellator.getInstance() + val worldrenderer = tessellator.worldRenderer + + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX) + worldrenderer.pos((x - size).toDouble(), (y + size).toDouble(), 0.0).tex(0.0, 1.0).endVertex() + worldrenderer.pos((x + size).toDouble(), (y + size).toDouble(), 0.0).tex(1.0, 1.0).endVertex() + worldrenderer.pos((x + size).toDouble(), (y - size).toDouble(), 0.0).tex(1.0, 0.0).endVertex() + worldrenderer.pos((x - size).toDouble(), (y - size).toDouble(), 0.0).tex(0.0, 0.0).endVertex() + tessellator.draw() + } + + private fun reset() { + x = (Math.random() * MinecraftInstance.mc.displayWidth).toFloat() + y = (Math.random() * -20).toFloat() + velocityY = (Math.random() * 100).toFloat() + delay = RandomUtils.nextInt(0, 800) + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/client/background/nightx.png b/src/main/resources/assets/minecraft/client/background/nightx.png new file mode 100644 index 00000000..854eb59b Binary files /dev/null and b/src/main/resources/assets/minecraft/client/background/nightx.png differ diff --git a/src/main/resources/assets/minecraft/client/background/particle.png b/src/main/resources/assets/minecraft/client/background/particle.png new file mode 100644 index 00000000..2fcb49bd Binary files /dev/null and b/src/main/resources/assets/minecraft/client/background/particle.png differ