diff --git a/buildNumber.properties b/buildNumber.properties index da501854..9f389c75 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Fri Aug 16 18:09:29 EDT 2024 -buildNumber=257 +#Fri Aug 16 19:38:51 EDT 2024 +buildNumber=258 diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 90e35d54..6f36688f 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -601,6 +601,7 @@ Fix ui alignment for item panels in inventory menus (ie dont have to place in co Netconfig file support Fix rotation not sending correctly on initialization of creatures on client Fix F2 menu not regaining controls when Xing menu instead of hitting F2 to close +Logger toggle debug window # TODO diff --git a/src/main/java/electrosphere/logger/Logger.java b/src/main/java/electrosphere/logger/Logger.java index 60f5f89f..431f0db4 100644 --- a/src/main/java/electrosphere/logger/Logger.java +++ b/src/main/java/electrosphere/logger/Logger.java @@ -20,12 +20,17 @@ public class Logger { //the level of this log LogLevel level; + + //The name of the logger + String name; /** * Creates a logger channel + * @param name The name of the logger * @param level The level of message to report on this channel */ - public Logger(LogLevel level){ + public Logger(String name, LogLevel level){ + this.name = name; this.level = level; } @@ -118,7 +123,39 @@ public class Logger { * @param message The message */ public void PRINT(LogLevel level, String message){ + switch(level){ + case ERROR:{ + this.ERROR(new Exception(message)); + } break; + case WARNING:{ + this.WARNING(message); + } break; + case INFO:{ + this.INFO(message); + } break; + case DEBUG:{ + this.DEBUG(message); + } break; + case LOOP_DEBUG:{ + this.DEBUG_LOOP(message); + } break; + } + } + /** + * Gets the level of the logger + * @return The level + */ + public LogLevel getLevel(){ + return this.level; + } + + /** + * Gets the name of the logger + * @return the name + */ + public String getName(){ + return this.name; } } diff --git a/src/main/java/electrosphere/logger/LoggerInterface.java b/src/main/java/electrosphere/logger/LoggerInterface.java index 58fa0882..bf0abfa5 100644 --- a/src/main/java/electrosphere/logger/LoggerInterface.java +++ b/src/main/java/electrosphere/logger/LoggerInterface.java @@ -1,5 +1,8 @@ package electrosphere.logger; +import java.util.Arrays; +import java.util.List; + import electrosphere.logger.Logger.LogLevel; /** @@ -26,18 +29,41 @@ public class LoggerInterface { * Initializes all logic objects */ public static void initLoggers(){ - loggerStartup = new Logger(LogLevel.WARNING); - loggerNetworking = new Logger(LogLevel.WARNING); - loggerFileIO = new Logger(LogLevel.WARNING); - loggerGameLogic = new Logger(LogLevel.WARNING); - loggerRenderer = new Logger(LogLevel.WARNING); - loggerEngine = new Logger(LogLevel.WARNING); - loggerAuth = new Logger(LogLevel.WARNING); - loggerDB = new Logger(LogLevel.WARNING); - loggerAudio = new Logger(LogLevel.WARNING); - loggerUI = new Logger(LogLevel.WARNING); - loggerScripts = new Logger(LogLevel.WARNING); - loggerAI = new Logger(LogLevel.LOOP_DEBUG); + loggerStartup = new Logger("Startup", LogLevel.WARNING); + loggerNetworking = new Logger("Networking", LogLevel.WARNING); + loggerFileIO = new Logger("File IO", LogLevel.WARNING); + loggerGameLogic = new Logger("Game Logic", LogLevel.WARNING); + loggerRenderer = new Logger("Renderer", LogLevel.WARNING); + loggerEngine = new Logger("Engine", LogLevel.WARNING); + loggerAuth = new Logger("Auth", LogLevel.WARNING); + loggerDB = new Logger("DB", LogLevel.WARNING); + loggerAudio = new Logger("Audio", LogLevel.WARNING); + loggerUI = new Logger("UI", LogLevel.WARNING); + loggerScripts = new Logger("Scripts", LogLevel.WARNING); + loggerAI = new Logger("AI", LogLevel.WARNING); loggerStartup.INFO("Initialized loggers"); } + + /** + * Gets the list of all loggers + * @return The list of all loggers + */ + public static List getLoggers(){ + Logger[] loggerList = new Logger[]{ + loggerAI, + loggerAudio, + loggerAuth, + loggerNetworking, + loggerFileIO, + loggerGameLogic, + loggerRenderer, + loggerEngine, + loggerStartup, + loggerDB, + loggerUI, + loggerScripts, + }; + return Arrays.asList(loggerList); + } + } diff --git a/src/main/java/electrosphere/menu/debug/ImGuiLogger.java b/src/main/java/electrosphere/menu/debug/ImGuiLogger.java new file mode 100644 index 00000000..d03b4e6f --- /dev/null +++ b/src/main/java/electrosphere/menu/debug/ImGuiLogger.java @@ -0,0 +1,111 @@ +package electrosphere.menu.debug; + +import electrosphere.engine.Globals; +import electrosphere.logger.Logger; +import electrosphere.logger.LoggerInterface; +import electrosphere.logger.Logger.LogLevel; +import electrosphere.renderer.ui.imgui.ImGuiWindow; +import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; +import imgui.ImGui; + +/** + * Windows for dealing with loggers + */ +public class ImGuiLogger { + + //window for viewing information about loggers + protected static ImGuiWindow loggersWindow; + + + /** + * Creates the windows in this file + */ + protected static void createLoggersWindows(){ + createLoggersWindow(); + } + + /** + * loggers view + */ + protected static void createLoggersWindow(){ + loggersWindow = new ImGuiWindow("Loggers"); + loggersWindow.setCallback(new ImGuiWindowCallback() { + @Override + public void exec() { + //ui framework text + ImGui.text("Loggers"); + + + ImGui.beginTable("Loggers", 6); + for(Logger logger : LoggerInterface.getLoggers()){ + ImGui.tableNextRow(); + + ImGui.tableNextColumn(); + ImGui.text(logger.getName() + ": "); + + ImGui.tableNextColumn(); + if(logger.getLevel() == LogLevel.ERROR){ + ImGui.text("Error"); + } else { + ImGui.pushID(logger.getName() + "error"); + if(ImGui.button("Error")){ + logger.setLevel(LogLevel.ERROR); + } + ImGui.popID(); + } + + ImGui.tableNextColumn(); + if(logger.getLevel() == LogLevel.WARNING){ + ImGui.text("Warning"); + } else { + ImGui.pushID(logger.getName() + "warning"); + if(ImGui.button("Warning")){ + logger.setLevel(LogLevel.WARNING); + } + ImGui.popID(); + } + + ImGui.tableNextColumn(); + if(logger.getLevel() == LogLevel.INFO){ + ImGui.text("Info"); + } else { + ImGui.pushID(logger.getName() + "info"); + if(ImGui.button("Info")){ + logger.setLevel(LogLevel.INFO); + } + ImGui.popID(); + } + + ImGui.tableNextColumn(); + if(logger.getLevel() == LogLevel.DEBUG){ + ImGui.text("Debug"); + } else { + ImGui.pushID(logger.getName() + "debug"); + if(ImGui.button("Debug")){ + logger.setLevel(LogLevel.DEBUG); + } + ImGui.popID(); + } + + ImGui.tableNextColumn(); + if(logger.getLevel() == LogLevel.LOOP_DEBUG){ + ImGui.text("Debug_Loop"); + } else { + ImGui.pushID(logger.getName() + "debug_loop"); + if(ImGui.button("Debug_Loop")){ + logger.setLevel(LogLevel.LOOP_DEBUG); + } + ImGui.popID(); + } + + } + + ImGui.endTable(); + + } + }); + loggersWindow.setOpen(false); + Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(loggersWindow); + } + +} diff --git a/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java b/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java index c3aa0994..f93daf78 100644 --- a/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java +++ b/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java @@ -46,6 +46,7 @@ public class ImGuiWindowMacros { ImGuiControls.createControlsWindows(); ImGuiAI.createAIDebugWindow(); ImGuiAudio.createAudioDebugMenu(); + ImGuiLogger.createLoggersWindows(); } /** @@ -156,6 +157,10 @@ public class ImGuiWindowMacros { if(ImGui.button("AI State Debug")){ ImGuiAI.aiWindow.setOpen(true); } + //logger state control + if(ImGui.button("Loggers")){ + ImGuiLogger.loggersWindow.setOpen(true); + } //close button if(ImGui.button("Close")){ mainDebugWindow.setOpen(false); diff --git a/src/main/java/electrosphere/server/ai/nodes/actions/combat/MeleeTargetingNode.java b/src/main/java/electrosphere/server/ai/nodes/actions/combat/MeleeTargetingNode.java index ef3b415b..4f05c843 100644 --- a/src/main/java/electrosphere/server/ai/nodes/actions/combat/MeleeTargetingNode.java +++ b/src/main/java/electrosphere/server/ai/nodes/actions/combat/MeleeTargetingNode.java @@ -34,7 +34,7 @@ public class MeleeTargetingNode implements AITreeNode { @Override public AITreeNodeResult evaluate(Entity entity, Blackboard blackboard){ - if(MeleeTargetingNode.hasTarget(blackboard)){ + if(MeleeTargetingNode.hasTarget(blackboard) && this.targetIsValid(entity)){ return AITreeNodeResult.SUCCESS; } @@ -65,6 +65,15 @@ public class MeleeTargetingNode implements AITreeNode { return null; } + /** + * Makes sure the target is valid + * @param entity The target entity + * @return true if valid, false otherwise + */ + private boolean targetIsValid(Entity entity){ + return Globals.realmManager.getEntityRealm(entity) != null; + } + /** * checks if the blackboard contains a melee target * @param blackboard The blackboard