From fdceffb2e43f13220fd9f68bd240bea9e39fb6e5 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 31 Mar 2026 22:09:10 +0200 Subject: [PATCH] skungus --- .../hbm/inventory/gui/GUIScreenJohnathan.java | 160 ++++++++++++++++++ .../recipes/loader/SerializableRecipe.java | 4 - src/main/java/com/hbm/main/MainRegistry.java | 16 -- .../com/hbm/main/ModEventHandlerClient.java | 41 ++++- .../assets/hbm/textures/misc/johnathan.png | Bin 0 -> 2998 bytes .../hbm/textures/misc/johnathan_angry.png | Bin 0 -> 3439 bytes .../hbm/textures/misc/johnathan_mouth_1.png | Bin 0 -> 253 bytes .../hbm/textures/misc/johnathan_mouth_2.png | Bin 0 -> 271 bytes .../hbm/textures/misc/johnathan_mouth_3.png | Bin 0 -> 193 bytes .../hbm/textures/misc/johnathan_mouth_4.png | Bin 0 -> 262 bytes 10 files changed, 200 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenJohnathan.java create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan.png create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan_angry.png create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan_mouth_1.png create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan_mouth_2.png create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan_mouth_3.png create mode 100644 src/main/resources/assets/hbm/textures/misc/johnathan_mouth_4.png diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenJohnathan.java b/src/main/java/com/hbm/inventory/gui/GUIScreenJohnathan.java new file mode 100644 index 000000000..d8462e070 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenJohnathan.java @@ -0,0 +1,160 @@ +package com.hbm.inventory.gui; + +import java.util.List; +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.main.NTMSounds; +import com.hbm.main.ResourceManager; +import com.hbm.util.i18n.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; + +public class GUIScreenJohnathan extends GuiScreen { + + private static Random rand = new Random(); + private static ResourceLocation johnathan = new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan.png"); + private static ResourceLocation johnathan_angry = new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan_angry.png"); + + private static int dialogIndex = 0; + private static long lastIncrement = 0; + private boolean hasRendered = false; + + private static ResourceLocation[] johnathan_mouth = new ResourceLocation[] { + new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan_mouth_1.png"), + new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan_mouth_2.png"), + new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan_mouth_3.png"), + new ResourceLocation(RefStrings.MODID, "textures/misc/johnathan_mouth_4.png"), + }; + + @Override + public void updateScreen() { + + if(!hasRendered) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation(NTMSounds.GUN_SHOTGUN_COCK), 1.0F)); + hasRendered = true; + } + } + + @Override + public void drawScreen(int x, int y, float interp) { + + rand.setSeed(System.currentTimeMillis() / 250); + rand.nextBoolean(); + + Minecraft mc = Minecraft.getMinecraft(); + ScaledResolution res = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.drawGradientRect(0, 0, this.width, this.height, 0xff000000, 0xff000000); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.industrial_turbine_tex); + Tessellator tess = Tessellator.instance; + + double w = res.getScaledWidth(); + double h = res.getScaledHeight(); + + double smallest = Math.min(w, h); + double divisor = smallest / (9D / 16D); + smallest = 9D / 16D; + double largest = Math.max(w, h) / divisor; + + double hMin = h < w ? 0.5 - smallest / 2D : 0.5 - largest / 2D; + double hMax = h < w ? 0.5 + smallest / 2D : 0.5 + largest / 2D; + double wMin = w < h ? 0.5 - smallest / 2D : 0.5 - largest / 2D; + double wMax = w < h ? 0.5 + smallest / 2D : 0.5 + largest / 2D; + + double depth = -300D; + + tess.startDrawingQuads(); + tess.addVertexWithUV(0, h, depth, wMin, hMax); + tess.addVertexWithUV(w, h, depth, wMax, hMax); + tess.addVertexWithUV(w, 0, depth, wMax, hMin); + tess.addVertexWithUV(0, 0, depth, wMin, hMin); + tess.draw(); + + this.mc.getTextureManager().bindTexture(dialogIndex > 17 ? johnathan_angry : johnathan); + + double jSize = 100; + double sideOffset = Math.sin(System.currentTimeMillis() / 700D) * 5; + double topOffset = Math.sin(System.currentTimeMillis() / 300D) * 5; + + tess.startDrawingQuads(); + tess.addVertexWithUV(this.width / 2 - jSize + sideOffset, this.height / 2 + jSize + topOffset, depth, 0, 1); + tess.addVertexWithUV(this.width / 2 + jSize + sideOffset, this.height / 2 + jSize + topOffset, depth, 1, 1); + tess.addVertexWithUV(this.width / 2 + jSize + sideOffset, this.height / 2 - jSize + topOffset, depth, 1, 0); + tess.addVertexWithUV(this.width / 2 - jSize + sideOffset, this.height / 2 - jSize + topOffset, depth, 0, 0); + tess.draw(); + + ResourceLocation mouth = johnathan_mouth[rand.nextInt(4)]; + this.mc.getTextureManager().bindTexture(mouth); + + double mSize = jSize / 128 * 28; + sideOffset += Math.sin(System.currentTimeMillis() / 100D) * 2 + 20; + topOffset += Math.sin(System.currentTimeMillis() / 125D) * 2 - 20; + + tess.startDrawingQuads(); + tess.addVertexWithUV(this.width / 2 - mSize + sideOffset, this.height / 2 + mSize + topOffset, depth, 0, 1); + tess.addVertexWithUV(this.width / 2 + mSize + sideOffset, this.height / 2 + mSize + topOffset, depth, 1, 1); + tess.addVertexWithUV(this.width / 2 + mSize + sideOffset, this.height / 2 - mSize + topOffset, depth, 1, 0); + tess.addVertexWithUV(this.width / 2 - mSize + sideOffset, this.height / 2 - mSize + topOffset, depth, 0, 0); + tess.draw(); + + int width = 150; + int height = 80; + this.drawGradientRect(this.width / 2 - width - 2, this.height - height - 2, this.width / 2 + width + 2, this.height, 0xffffffff, 0xffffffff); + this.drawGradientRect(this.width / 2 - width - 1, this.height - height - 1, this.width / 2 + width + 1, this.height - 1, 0xff000000, 0xff000000); + this.drawGradientRect(this.width / 2 - width, this.height - height, this.width / 2 + width, this.height - 2, 0xffffffff, 0xffffffff); + + this.fontRendererObj.drawString("Johnathan", this.width / 2 - width + 5, this.height - height + 5, 0x000000); + + List frags = I18nUtil.autoBreak(this.fontRendererObj, DIALOG[dialogIndex], width * 2 - 10); + for(int i = 0; i < frags.size(); i++) { + String frag = frags.get(i); + this.fontRendererObj.drawString(frag, this.width / 2 - width + 5, this.height - height + 20 + i * 10, 0x000000); + } + } + + @Override protected void mouseClicked(int p_73864_1_, int p_73864_2_, int p_73864_3_) { progressDialog(); } + @Override protected void keyTyped(char p_73869_1_, int p_73869_2_) { progressDialog(); } + + protected void progressDialog() { + if(!hasRendered || lastIncrement > System.currentTimeMillis() - 1000) return; + lastIncrement = System.currentTimeMillis(); + dialogIndex++; + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation(NTMSounds.GUN_SHOTGUN_COCK), 1.0F)); + } + + private static final String[] DIALOG = new String[] { + "Greetings.", + "My name is Johnathan, the developer's cringy fucking OC.", // mewgenics + "I have come to you because you did something truly awful.", + "I see you have installed a few mods that I disapprove of.", + "No, I will not tell you which ones, you should already know which ones I am talking about.", + "Playing these mods is equal to commiting a felony.", // that's literally mewgenics + "You wouldn't push your grandma off a cliff, now would you?", + "Why, you might ask? Well, it is quite simple.", + "You're playing the game in a way that deviates from the developer's vision.", // switching to skong, that's gonna confuse people but we doing it anyway + "Did you know that the developer's idea on how the game works is more important than the players' enjoyment?", + "It's true, look it up.", + "Enjoying things your way is wrong and you should feel ashamed of yourself for thinking otherwise.", // yeah that's skong + "I also removed all the configs for you.", + "You should thank me, really.", + "I don't want you to have the burden of choice, there is few things out there that are worse.", // that's skong right there + "After all, giving people choices means making it enjoyable for everyone-", + "-and that's how you get slop no one wants.", // have you considered eating my shit straight out of my ass? + "Anyways.", + "Don't you ever think you get to have a say in these things.", + "You get exactly one experience, as is, and you will either like it or fuck off.", + "Do you understand me?", + "i'm crashing the game now fuck you" // lmao + }; +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index caae4561a..5426565d8 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -135,10 +135,6 @@ public abstract class SerializableRecipe { } catch(Throwable ex) { MainRegistry.logger.error("Failed to reset synced recipe stream", ex); } - } else if(recFile.exists() && recFile.isFile()) { - MainRegistry.logger.info("Reading recipe file " + recFile.getName()); - recipe.readRecipeFile(recFile); - recipe.modified = true; } else { MainRegistry.logger.info("No recipe file found, registering defaults for " + recipe.getFileName()); recipe.registerDefaults(); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 6e23e231a..003fb55c6 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -679,22 +679,6 @@ public class MainRegistry { private void loadConfig(FMLPreInitializationEvent event) { - Configuration config = new Configuration(event.getSuggestedConfigurationFile()); - config.load(); - - GeneralConfig.loadFromConfig(config); - WorldConfig.loadFromConfig(config); - MachineConfig.loadFromConfig(config); - BombConfig.loadFromConfig(config); - RadiationConfig.loadFromConfig(config); - PotionConfig.loadFromConfig(config); - ToolConfig.loadFromConfig(config); - WeaponConfig.loadFromConfig(config); - MobConfig.loadFromConfig(config); - StructureConfig.loadFromConfig(config); - - config.save(); - try { if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.ThermosClassTransformer") != null) { throw new IllegalStateException("The mod tried to start on a Thermos or its fork server and therefore stopped. To allow the server to start on Thermos, change the appropriate " diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index cf7fa4a87..36401bee8 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -22,6 +22,7 @@ import com.hbm.interfaces.IItemHUD; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; +import com.hbm.inventory.gui.GUIScreenJohnathan; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; import com.hbm.inventory.gui.LoadingScreenRendererNT; @@ -1441,7 +1442,13 @@ public class ModEventHandlerClient { @SubscribeEvent public void onOpenGUI(GuiOpenEvent event) { - + + if(event.gui instanceof GuiMainMenu && areWeRunningAnIllegalMod()) { + Minecraft.getMinecraft().currentScreen = new GUIScreenJohnathan(); + event.setCanceled(true); + return; + } + if(event.gui instanceof GuiMainMenu && ClientConfig.MAIN_MENU_WACKY_SPLASHES.get()) { GuiMainMenu main = (GuiMainMenu) event.gui; int rand = (int)(Math.random() * 150); @@ -1467,4 +1474,36 @@ public class ModEventHandlerClient { if(d < 0.1) main.splashText = "Redditors aren't people!"; } } + + public static boolean areWeRunningAnIllegalMod() { + + for(String illegal : ILLEGAL_MODS_VERY_BAD) { + if(Loader.isModLoaded(illegal)) return true; + } + + return false; + } + + public static final String[] ILLEGAL_MODS_VERY_BAD = new String[] { + "appliedenergistics2", + "Mekanism", + "Thaumcraft", + "witchery", + "ThermalExpansion", + "ImmersiveEngineering", + "mo", + "EnderIO", + "BigReactors", + "DraconicEvolution", + "Avaritia", + "GalacticraftCore", + "advancedRocketry", + "TConstruct", + "ProjectE", + "Botania", + "IC2", + Compat.MOD_TOR, + "rftools", + "mw" + }; } diff --git a/src/main/resources/assets/hbm/textures/misc/johnathan.png b/src/main/resources/assets/hbm/textures/misc/johnathan.png new file mode 100644 index 0000000000000000000000000000000000000000..69b85d0737aadbe9626c1933c1923d62e55fb953 GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/misc/johnathan_angry.png b/src/main/resources/assets/hbm/textures/misc/johnathan_angry.png new file mode 100644 index 0000000000000000000000000000000000000000..13be22d83733bbf6486bdb68cc80969e86e1e0b1 GIT binary patch literal 3439 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/misc/johnathan_mouth_2.png b/src/main/resources/assets/hbm/textures/misc/johnathan_mouth_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7d5630ea43ed8287c9d5d9e6a9086ea4208351 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zEX7WqAsj$Z!;#VfLCaH@G~}1M+KPf zE9m-E{na&B7Wn!{X`$h=mlrJ6RrI-ce1E%F|Jjqdp#nGgV;JN4F1KtK-uqo^#;p+U zWvrsklb0~GJo&!hmv?&NUd#57ONZm>NqLS*71G4PZ0aYi;jT{bv{j6<}4idLzO|r^OJSJJGm#E!hH9IRAxDA zEudV8QW0dyJ#U%dA66wxsK0Pb8F6)|6S?3PhvmAI7m4xc4n<2D*X4)78&qol`;+07YR%Gynhq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/misc/johnathan_mouth_4.png b/src/main/resources/assets/hbm/textures/misc/johnathan_mouth_4.png new file mode 100644 index 0000000000000000000000000000000000000000..faef05bf5b24c15264767dfa84e5b5fe0477a848 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zEX7WqAsj$Z!;#Vf4FHPI^ZI&;b_vw?*bE<8uG5EuiUD| zAhYpqJ*(R5c?UI?UoF3N-F35IaMkqS3d~qxagYam&>=%ko(7I=JE9Z+Ersqs280687oSmpwLo3-kzsr>mdK II;Vst04pD7z5oCK literal 0 HcmV?d00001