/*
* Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
* Copyright (C) 2021 cyoung06
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package kr.syeyoung.dungeonsguide.mod;
import com.google.common.collect.Sets;
import kr.syeyoung.dungeonsguide.IDungeonGuide;
import kr.syeyoung.dungeonsguide.Main;
import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessor;
import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter;
import kr.syeyoung.dungeonsguide.mod.commands.CommandDgDebug;
import kr.syeyoung.dungeonsguide.mod.commands.CommandDungeonsGuide;
import kr.syeyoung.dungeonsguide.mod.commands.CommandReparty;
import kr.syeyoung.dungeonsguide.mod.config.Config;
import kr.syeyoung.dungeonsguide.mod.cosmetics.CosmeticsManager;
import kr.syeyoung.dungeonsguide.mod.discord.rpc.RichPresenceManager;
import kr.syeyoung.dungeonsguide.mod.dungeon.DungeonFacade;
import kr.syeyoung.dungeonsguide.mod.events.listener.FeatureListener;
import kr.syeyoung.dungeonsguide.mod.events.listener.PacketListener;
import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry;
import kr.syeyoung.dungeonsguide.mod.party.PartyManager;
import kr.syeyoung.dungeonsguide.mod.resources.DGTexturePack;
import kr.syeyoung.dungeonsguide.mod.utils.AhUtils;
import kr.syeyoung.dungeonsguide.mod.utils.BlockCache;
import kr.syeyoung.dungeonsguide.mod.utils.TimeScoreUtil;
import kr.syeyoung.dungeonsguide.mod.utils.TitleRender;
import kr.syeyoung.dungeonsguide.mod.utils.cursor.GLCursors;
import kr.syeyoung.dungeonsguide.mod.wsresource.StaticResourceCache;
import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.*;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourcePack;
import net.minecraft.launchwrapper.LaunchClassLoader;
import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.ProgressManager;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
public class DungeonsGuide implements IDungeonGuide {
@Getter
private static boolean firstTimeUsingDG = false;
Logger logger = LogManager.getLogger("DungeonsGuide");
public boolean verbose = false;
private SkyblockStatus skyblockStatus;
@Getter
private CosmeticsManager cosmeticsManager;
@Getter
private DungeonFacade dungeonFacade;
@Getter
private BlockCache blockCache;
public DungeonsGuide(){
instance = this;
}
private static DungeonsGuide instance;
public static DungeonsGuide getDungeonsGuide() {
return instance;
}
@Getter
CommandReparty commandReparty;
public void init() {
ProgressManager.ProgressBar progressbar = ProgressManager.push("DungeonsGuide", 4);
MinecraftForge.EVENT_BUS.register(this);
progressbar.step("Registering Events & Commands");
skyblockStatus = new SkyblockStatus();
MinecraftForge.EVENT_BUS.register(skyblockStatus);
(new FeatureRegistry()).init();
new ChatTransmitter();
try {
Set invalid = ReflectionHelper.getPrivateValue(LaunchClassLoader.class, (LaunchClassLoader) Main.class.getClassLoader(), "invalidClasses");
((LaunchClassLoader) Main.class.getClassLoader()).clearNegativeEntries(Sets.newHashSet("org.slf4j.LoggerFactory"));
invalid.clear();
} catch (Exception e) {
e.printStackTrace();
}
this.blockCache = new BlockCache();
this.dungeonFacade = new DungeonFacade();
dungeonFacade.init();
TitleRender.getInstance();
CommandDungeonsGuide commandDungeonsGuide = new CommandDungeonsGuide();
CommandDgDebug command = new CommandDgDebug();
ClientCommandHandler.instance.registerCommand(commandDungeonsGuide);
ClientCommandHandler.instance.registerCommand(command);
MinecraftForge.EVENT_BUS.register(command);
MinecraftForge.EVENT_BUS.register(commandDungeonsGuide);
commandReparty = new CommandReparty();
MinecraftForge.EVENT_BUS.register(commandReparty);
MinecraftForge.EVENT_BUS.register(new FeatureListener());
MinecraftForge.EVENT_BUS.register(new PacketListener());
MinecraftForge.EVENT_BUS.register(new Keybinds());
MinecraftForge.EVENT_BUS.register(PartyManager.INSTANCE);
MinecraftForge.EVENT_BUS.register(ChatProcessor.INSTANCE);
MinecraftForge.EVENT_BUS.register(StaticResourceCache.INSTANCE);
MinecraftForge.EVENT_BUS.register(new AhUtils());
progressbar.step("Opening connection");
cosmeticsManager = new CosmeticsManager();
MinecraftForge.EVENT_BUS.register(cosmeticsManager);
progressbar.step("Loading Config");
try {
Config.loadConfig(null);
} catch (IOException e) {
e.printStackTrace();
}
if (FeatureRegistry.ETC_REPARTY.isEnabled()) {
ClientCommandHandler.instance.registerCommand(commandReparty);
}
if (FeatureRegistry.DISCORD_DONOTUSE.isEnabled()) {
System.setProperty("dg.safe", "true");
}
MinecraftForge.EVENT_BUS.register(RichPresenceManager.INSTANCE);
TimeScoreUtil.init();
Main.finishUpProgressBar(progressbar);
ProgressManager.pop(progressbar);
((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(resourceManager -> GLCursors.setupCursors());
}
private boolean showedStartUpGuide;
@SubscribeEvent
public void onGuiOpen(GuiOpenEvent guiOpenEvent){
if(!showedStartUpGuide){
showedStartUpGuide = true;
if(isFirstTimeUsingDG()){
GuiScreen originalGUI = guiOpenEvent.gui;
guiOpenEvent.gui = new GuiScreen() {
final String welcomeText = "Thank you for installing §eDungeonsGuide§f, the most intelligent skyblock dungeon mod!\nThe gui for relocating GUI Elements and enabling or disabling features can be opened by typing §e/dg\nType §e/dg help §fto view full list of commands offered by dungeons guide!";
@Override
public void initGui() {
ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
this.buttonList.add(new GuiButton(0, sr.getScaledWidth()/2-100,sr.getScaledHeight()-70 ,"Continue"));
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
super.actionPerformed(button);
if (button.id == 0) {
Minecraft.getMinecraft().displayGuiScreen(originalGUI);
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
super.drawBackground(1);
ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
fontRenderer.drawString("§eWelcome To DungeonsGuide", (sr.getScaledWidth()-fontRenderer.getStringWidth("Welcome To DungeonsGuide"))/2,40,0xFFFF0000);
int tenth = sr.getScaledWidth() / 10;
Gui.drawRect(tenth, 70,sr.getScaledWidth()-tenth, sr.getScaledHeight()-80, 0xFF5B5B5B);
String[] split = welcomeText.split("\n");
for (int i = 0; i < split.length; i++) {
fontRenderer.drawString(split[i].replace("\t", " "), tenth + 2,i*fontRenderer.FONT_HEIGHT + 72, 0xFFFFFFFF);
}
super.drawScreen(mouseX, mouseY, partialTicks);
}
};
}
}
}
public void preinit(){
File configFile = new File(Main.getConfigDir(), "config.json");
if (!configFile.exists()) {
Main.getConfigDir().mkdirs();
firstTimeUsingDG = true;
}
Config.f = configFile;
Minecraft.getMinecraft().getFramebuffer().enableStencil();
try {
List resourcePackList = ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), "defaultResourcePacks", "aA", "field_110449_ao");
resourcePackList.add(new DGTexturePack());
Minecraft.getMinecraft().refreshResources();
} catch (Exception e) {
e.printStackTrace();
}
}
public SkyblockStatus getSkyblockStatus() {
return skyblockStatus;
}
}