diff --git a/libs/src/de/jcm/discordgamesdk/ActivityManager.class b/libs/src/de/jcm/discordgamesdk/ActivityManager.class
new file mode 100644
index 00000000..d22265f8
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/ActivityManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/Core.class b/libs/src/de/jcm/discordgamesdk/Core.class
new file mode 100644
index 00000000..aac24573
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/Core.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/CoreClosedException.class b/libs/src/de/jcm/discordgamesdk/CoreClosedException.class
new file mode 100644
index 00000000..3e3705cf
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/CoreClosedException.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/CreateParams$Flags.class b/libs/src/de/jcm/discordgamesdk/CreateParams$Flags.class
new file mode 100644
index 00000000..f82a598a
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/CreateParams$Flags.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/CreateParams.class b/libs/src/de/jcm/discordgamesdk/CreateParams.class
new file mode 100644
index 00000000..76963e38
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/CreateParams.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/DiscordEventAdapter.class b/libs/src/de/jcm/discordgamesdk/DiscordEventAdapter.class
new file mode 100644
index 00000000..cb9dd4ac
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/DiscordEventAdapter.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/DiscordEventHandler.class b/libs/src/de/jcm/discordgamesdk/DiscordEventHandler.class
new file mode 100644
index 00000000..2b4aa923
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/DiscordEventHandler.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/DiscordUtils.class b/libs/src/de/jcm/discordgamesdk/DiscordUtils.class
new file mode 100644
index 00000000..032a1aaf
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/DiscordUtils.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/GameSDKException.class b/libs/src/de/jcm/discordgamesdk/GameSDKException.class
new file mode 100644
index 00000000..ea645531
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/GameSDKException.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/ImageManager.class b/libs/src/de/jcm/discordgamesdk/ImageManager.class
new file mode 100644
index 00000000..ad1f2cb0
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/ImageManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/LobbyManager.class b/libs/src/de/jcm/discordgamesdk/LobbyManager.class
new file mode 100644
index 00000000..a83bed27
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/LobbyManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/LogLevel.class b/libs/src/de/jcm/discordgamesdk/LogLevel.class
new file mode 100644
index 00000000..0b0fa4be
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/LogLevel.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/NetworkManager.class b/libs/src/de/jcm/discordgamesdk/NetworkManager.class
new file mode 100644
index 00000000..a6180fda
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/NetworkManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/OverlayManager.class b/libs/src/de/jcm/discordgamesdk/OverlayManager.class
new file mode 100644
index 00000000..efcb7d5c
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/OverlayManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/RelationshipManager.class b/libs/src/de/jcm/discordgamesdk/RelationshipManager.class
new file mode 100644
index 00000000..4d3c28e6
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/RelationshipManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/Result.class b/libs/src/de/jcm/discordgamesdk/Result.class
new file mode 100644
index 00000000..7104d97c
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/Result.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/UserManager.class b/libs/src/de/jcm/discordgamesdk/UserManager.class
new file mode 100644
index 00000000..1d8ad0e8
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/UserManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/VoiceManager.class b/libs/src/de/jcm/discordgamesdk/VoiceManager.class
new file mode 100644
index 00000000..10c63c96
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/VoiceManager.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/Activity$ActivityReference.class b/libs/src/de/jcm/discordgamesdk/activity/Activity$ActivityReference.class
new file mode 100644
index 00000000..2d1feb80
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/Activity$ActivityReference.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/Activity.class b/libs/src/de/jcm/discordgamesdk/activity/Activity.class
new file mode 100644
index 00000000..5a0a60e0
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/Activity.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityActionType.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityActionType.class
new file mode 100644
index 00000000..fb07974c
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityActionType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityAssets.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityAssets.class
new file mode 100644
index 00000000..0c589a6f
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityAssets.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityJoinRequestReply.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityJoinRequestReply.class
new file mode 100644
index 00000000..ca854fc3
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityJoinRequestReply.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityParty.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityParty.class
new file mode 100644
index 00000000..70d50b5a
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityParty.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityPartySize.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityPartySize.class
new file mode 100644
index 00000000..5cc30ac1
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityPartySize.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivitySecrets.class b/libs/src/de/jcm/discordgamesdk/activity/ActivitySecrets.class
new file mode 100644
index 00000000..f9846856
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivitySecrets.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityTimestamps.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityTimestamps.class
new file mode 100644
index 00000000..692f001a
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityTimestamps.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/activity/ActivityType.class b/libs/src/de/jcm/discordgamesdk/activity/ActivityType.class
new file mode 100644
index 00000000..8a6fbf7a
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/activity/ActivityType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/image/ImageDimensions.class b/libs/src/de/jcm/discordgamesdk/image/ImageDimensions.class
new file mode 100644
index 00000000..b022f15d
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/image/ImageDimensions.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/image/ImageHandle.class b/libs/src/de/jcm/discordgamesdk/image/ImageHandle.class
new file mode 100644
index 00000000..c7ac5499
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/image/ImageHandle.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/image/ImageType.class b/libs/src/de/jcm/discordgamesdk/image/ImageType.class
new file mode 100644
index 00000000..a349f18e
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/image/ImageType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/Lobby.class b/libs/src/de/jcm/discordgamesdk/lobby/Lobby.class
new file mode 100644
index 00000000..999eb745
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/Lobby.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbyMemberTransaction.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbyMemberTransaction.class
new file mode 100644
index 00000000..4c111d77
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbyMemberTransaction.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Cast.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Cast.class
new file mode 100644
index 00000000..75f1be61
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Cast.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Comparison.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Comparison.class
new file mode 100644
index 00000000..b5b0753b
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Comparison.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Distance.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Distance.class
new file mode 100644
index 00000000..a1e95022
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery$Distance.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery.class
new file mode 100644
index 00000000..39675f55
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbySearchQuery.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbyTransaction.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbyTransaction.class
new file mode 100644
index 00000000..4035b78b
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbyTransaction.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/lobby/LobbyType.class b/libs/src/de/jcm/discordgamesdk/lobby/LobbyType.class
new file mode 100644
index 00000000..20e0201e
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/lobby/LobbyType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/DiscordUser.class b/libs/src/de/jcm/discordgamesdk/user/DiscordUser.class
new file mode 100644
index 00000000..0d3d04c0
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/DiscordUser.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/OnlineStatus.class b/libs/src/de/jcm/discordgamesdk/user/OnlineStatus.class
new file mode 100644
index 00000000..f35bf5fe
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/OnlineStatus.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/PremiumType.class b/libs/src/de/jcm/discordgamesdk/user/PremiumType.class
new file mode 100644
index 00000000..47d64ca3
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/PremiumType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/Presence.class b/libs/src/de/jcm/discordgamesdk/user/Presence.class
new file mode 100644
index 00000000..4cf8eb6f
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/Presence.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/Relationship.class b/libs/src/de/jcm/discordgamesdk/user/Relationship.class
new file mode 100644
index 00000000..ff3802f2
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/Relationship.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/user/RelationshipType.class b/libs/src/de/jcm/discordgamesdk/user/RelationshipType.class
new file mode 100644
index 00000000..3e40bfcf
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/user/RelationshipType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode$InputModeType.class b/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode$InputModeType.class
new file mode 100644
index 00000000..77e3a888
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode$InputModeType.class differ
diff --git a/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode.class b/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode.class
new file mode 100644
index 00000000..80846922
Binary files /dev/null and b/libs/src/de/jcm/discordgamesdk/voice/VoiceInputMode.class differ
diff --git a/libs/src/native/linux/amd64/libdiscord_game_sdk_jni.so b/libs/src/native/linux/amd64/libdiscord_game_sdk_jni.so
new file mode 100644
index 00000000..8e36260c
Binary files /dev/null and b/libs/src/native/linux/amd64/libdiscord_game_sdk_jni.so differ
diff --git a/libs/src/native/macos/amd64/libdiscord_game_sdk_jni.dylib b/libs/src/native/macos/amd64/libdiscord_game_sdk_jni.dylib
new file mode 100644
index 00000000..82a22f4d
Binary files /dev/null and b/libs/src/native/macos/amd64/libdiscord_game_sdk_jni.dylib differ
diff --git a/libs/src/native/windows/amd64/discord_game_sdk_jni.dll b/libs/src/native/windows/amd64/discord_game_sdk_jni.dll
new file mode 100644
index 00000000..9125a736
Binary files /dev/null and b/libs/src/native/windows/amd64/discord_game_sdk_jni.dll differ
diff --git a/libs/src/native/windows/x86/discord_game_sdk_jni.dll b/libs/src/native/windows/x86/discord_game_sdk_jni.dll
new file mode 100644
index 00000000..dfb803a6
Binary files /dev/null and b/libs/src/native/windows/x86/discord_game_sdk_jni.dll differ
diff --git a/src/main/java/fr/litarvan/openauth/AuthPoints.java b/src/main/java/fr/litarvan/openauth/AuthPoints.java
new file mode 100644
index 00000000..6ceb46a6
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/AuthPoints.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth;
+
+/**
+ * The server Auth Points
+ *
+ *
+ * Contains the pages url of a server
+ *
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthPoints {
+
+ /**
+ * The Mojang auth server auth points
+ */
+ public static final AuthPoints NORMAL_AUTH_POINTS = new AuthPoints("authenticate", "refresh", "validate", "signout", "invalidate");
+
+ /**
+ * The server authenticate point
+ */
+ private String authenticatePoint;
+
+ /**
+ * The server refresh point
+ */
+ private String refreshPoint;
+
+ /**
+ * The server validate point
+ */
+ private String validatePoint;
+
+ /**
+ * The server signout point
+ */
+ private String signoutPoint;
+
+ /**
+ * The server invalidate point
+ */
+ private String invalidatePoint;
+
+ /**
+ * AuthPoints constructor
+ *
+ * @param authenticatePoint
+ * Authenticate point
+ * @param refreshPoint
+ * Refresh point
+ * @param validatePoint
+ * Validate point
+ * @param signoutPoint
+ * Signout point
+ * @param invalidatePoint
+ * Invalidate point
+ */
+ public AuthPoints(String authenticatePoint, String refreshPoint, String validatePoint, String signoutPoint, String invalidatePoint) {
+ this.authenticatePoint = authenticatePoint;
+ this.refreshPoint = refreshPoint;
+ this.validatePoint = validatePoint;
+ this.signoutPoint = signoutPoint;
+ this.invalidatePoint = invalidatePoint;
+ }
+
+ /**
+ * Returns the server authenticate point
+ *
+ * @return The authenticate point
+ */
+ public String getAuthenticatePoint() {
+ return this.authenticatePoint;
+ }
+
+ /**
+ * Returns the server refresh point
+ *
+ * @return The refresh point
+ */
+ public String getRefreshPoint() {
+ return this.refreshPoint;
+ }
+
+ /**
+ * Returns the server validate point
+ *
+ * @return The validate point
+ */
+ public String getValidatePoint() {
+ return this.validatePoint;
+ }
+
+ /**
+ * Returns the server signout point
+ *
+ * @return The signout point
+ */
+ public String getSignoutPoint() {
+ return this.signoutPoint;
+ }
+
+ /**
+ * Returns the server invalidate point
+ *
+ * @return The invalidate point
+ */
+ public String getInvalidatePoint() {
+ return this.invalidatePoint;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/AuthenticationException.java b/src/main/java/fr/litarvan/openauth/AuthenticationException.java
new file mode 100644
index 00000000..f3884bbf
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/AuthenticationException.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth;
+
+import fr.litarvan.openauth.model.AuthError;
+
+/**
+ * Authentication exceptions
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthenticationException extends Exception {
+
+ /**
+ * The given JSON model instance of the error
+ */
+ private AuthError model;
+
+ /**
+ * Create a new Authentication Exception
+ *
+ * @param model
+ * The given JSON model instance of the error
+ */
+ public AuthenticationException(AuthError model) {
+ super(model.getErrorMessage());
+ this.model = model;
+ }
+
+ /**
+ * Returns the given JSON model instance of the error
+ *
+ * @return The error model
+ */
+ public AuthError getErrorModel() {
+ return model;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/fr/litarvan/openauth/Authenticator.java b/src/main/java/fr/litarvan/openauth/Authenticator.java
new file mode 100644
index 00000000..5d1c8e36
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/Authenticator.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth;
+
+import com.google.gson.Gson;
+import fr.litarvan.openauth.model.AuthAgent;
+import fr.litarvan.openauth.model.request.*;
+import fr.litarvan.openauth.model.response.*;
+import fr.litarvan.openauth.model.AuthError;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * The Authenticator
+ *
+ *
+ * The main class of the lib, use it to authenticate a user !
+ *
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class Authenticator {
+
+ /**
+ * The Mojang official auth server
+ */
+ public static final String MOJANG_AUTH_URL = "https://authserver.mojang.com/";
+
+ /**
+ * The auth server URL
+ */
+ private String authURL;
+
+ /**
+ * The server auth points
+ */
+ private AuthPoints authPoints;
+
+ /**
+ * Create an authenticator
+ *
+ * @param authURL
+ * The auth server URL
+ *
+ * @param authPoints
+ * The URIs of the multiple requests
+ */
+ public Authenticator(String authURL, AuthPoints authPoints) {
+ this.authURL = authURL;
+ this.authPoints = authPoints;
+ }
+
+ /**
+ * Authenticates an user using his password.
+ *
+ * @param agent
+ * The auth agent (optional)
+ * @param username
+ * User mojang account name
+ * @param password
+ * User mojang account password
+ * @param clientToken
+ * The client token (optional, like a key for the access token)
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ *
+ * @return The response sent by the server (parsed from a JSON)
+ */
+ public AuthResponse authenticate(AuthAgent agent, String username, String password, String clientToken) throws AuthenticationException {
+ AuthRequest request = new AuthRequest(agent, username, password, clientToken);
+ return (AuthResponse) sendRequest(request, AuthResponse.class, authPoints.getAuthenticatePoint());
+ }
+
+ /**
+ * Refresh a valid access token. It can be uses to keep a user logged in between gaming sessions
+ * and is preferred over storing the user's password in a file.
+ *
+ * @param accessToken
+ * The saved access token
+ * @param clientToken
+ * The saved client token (need to be the same used when authenticated to get the acces token)
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ *
+ * @return The response sent by the server (parsed from a JSON)
+ */
+ public RefreshResponse refresh(String accessToken, String clientToken) throws AuthenticationException {
+ RefreshRequest request = new RefreshRequest(accessToken, clientToken);
+ return (RefreshResponse) sendRequest(request, RefreshResponse.class, authPoints.getRefreshPoint());
+ }
+
+ /**
+ * Check if an access token is a valid session token with a currently-active session.
+ * Note: this method will not respond successfully to all currently-logged-in sessions,
+ * just the most recently-logged-in for each user. It is intended to be used by servers to validate
+ * that a user should be connecting (and reject users who have logged in elsewhere since starting Minecraft),
+ * NOT to auth that a particular session token is valid for authentication purposes.
+ * To authenticate a user by session token, use the refresh verb and catch resulting errors.
+ *
+ * @param accessToken
+ * The access token to check
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ */
+ public void validate(String accessToken) throws AuthenticationException {
+ ValidateRequest request = new ValidateRequest(accessToken);
+ sendRequest(request, null, authPoints.getValidatePoint());
+ }
+
+ /**
+ * Invalidates accessTokens using an account's username and password
+ *
+ * @param username
+ * User mojang account name
+ * @param password
+ * User mojang account password
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ */
+ public void signout(String username, String password) throws AuthenticationException {
+ SignoutRequest request = new SignoutRequest(username, password);
+ sendRequest(request, null, authPoints.getSignoutPoint());
+ }
+
+ /**
+ * Invalidates accessTokens using a client/access token pair
+ *
+ * @param accessToken
+ * Valid access token to invalidate
+ * @param clientToken
+ * Client token used when authenticated to get the access token
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ */
+ public void invalidate(String accessToken, String clientToken) throws AuthenticationException {
+ InvalidateRequest request = new InvalidateRequest(accessToken, clientToken);
+ sendRequest(request, null, authPoints.getInvalidatePoint());
+ }
+
+ /**
+ * Send a request to the auth server
+ *
+ * @param request
+ * The auth request to send
+ * @param model
+ * The model of the reponse
+ * @param authPoint
+ * The auth point of the request
+ * @throws AuthenticationException
+ * If it returned an error or the request failed
+ *
+ * @throws AuthenticationException If the server returned an error as a JSON
+ *
+ * @return Instance of the given reponse model if it not null
+ */
+ private Object sendRequest(Object request, Class> model, String authPoint) throws AuthenticationException {
+ Gson gson = new Gson();
+ String response;
+
+ try {
+ response = sendPostRequest(this.authURL + authPoint, gson.toJson(request));
+ } catch (IOException e) {
+ throw new AuthenticationException(new AuthError("Can't send the request : " + e.getClass().getName(), e.getMessage(), "Unknown"));
+ }
+
+ if(model != null)
+ return gson.fromJson(response, model);
+ else
+ return null;
+ }
+
+ /**
+ * Sends a post request of a json
+ *
+ * @param url
+ * The url to send the request
+ * @param json
+ * The json to send
+ * @throws IOException
+ * If it failed
+ *
+ * @throws AuthenticationException If the request returned an error JSON or not a JSON
+ *
+ * @return The request response
+ */
+ private String sendPostRequest(String url, String json) throws AuthenticationException, IOException {
+ byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8);
+ URL serverURL = new URL(url);
+ HttpURLConnection connection = (HttpURLConnection) serverURL.openConnection();
+ connection.setRequestMethod("POST");
+
+ // Sending post request
+ connection.setDoOutput(true);
+ connection.setRequestProperty("Accept-Charset", "UTF-8");
+ connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
+ connection.setRequestProperty("Content-Length", String.valueOf(jsonBytes.length));
+ DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
+ wr.write(jsonBytes, 0, jsonBytes.length);
+ wr.flush();
+ wr.close();
+
+ connection.connect();
+
+ int responseCode = connection.getResponseCode();
+
+ if(responseCode == 204) {
+ connection.disconnect();
+ return null;
+ }
+
+ InputStream is;
+ if(responseCode == 200)
+ is = connection.getInputStream();
+ else
+ is = connection.getErrorStream();
+
+ String response;
+
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ response = br.readLine();
+ try {
+ br.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ connection.disconnect();
+
+ while (response != null && response.startsWith("\uFEFF"))
+ response = response.substring(1);
+
+ if (responseCode != 200) {
+ Gson gson = new Gson();
+
+ if (response != null && !response.startsWith("{"))
+ throw new AuthenticationException(new AuthError("Internal server error", response, "Remote"));
+
+ throw new AuthenticationException(gson.fromJson(response, AuthError.class));
+ }
+
+ return response;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/AuthTokens.java b/src/main/java/fr/litarvan/openauth/microsoft/AuthTokens.java
new file mode 100644
index 00000000..d2a9db86
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/AuthTokens.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+public class AuthTokens
+{
+ private final String accessToken;
+ private final String refreshToken;
+
+ public AuthTokens(String accessToken, String refreshToken)
+ {
+ this.accessToken = accessToken;
+ this.refreshToken = refreshToken;
+ }
+
+ public String getAccessToken()
+ {
+ return accessToken;
+ }
+
+ public String getRefreshToken()
+ {
+ return refreshToken;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/HttpClient.java b/src/main/java/fr/litarvan/openauth/microsoft/HttpClient.java
new file mode 100644
index 00000000..e92aceec
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/HttpClient.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+import com.google.gson.Gson;
+
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.*;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+
+public class HttpClient
+{
+ public static final String MIME_TYPE_JSON = "application/json";
+ public static final String MIME_TYPE_URLENCODED_FORM = "application/x-www-form-urlencoded";
+
+
+ private final Gson gson;
+
+ public HttpClient()
+ {
+ this.gson = new Gson();
+ }
+
+
+ public String getText(String url, Map params) throws MicrosoftAuthenticationException
+ {
+ return readResponse(createConnection(url + '?' + buildParams(params)));
+ }
+
+ public T getJson(String url, String token, Class responseClass) throws MicrosoftAuthenticationException
+ {
+ HttpsURLConnection connection = createConnection(url);
+ connection.addRequestProperty("Authorization", "Bearer " + token);
+ connection.addRequestProperty("Accept", MIME_TYPE_JSON);
+
+ return readJson(connection, responseClass);
+ }
+
+ public HttpsURLConnection postForm(String url, Map params) throws MicrosoftAuthenticationException
+ {
+ return post(url, MIME_TYPE_URLENCODED_FORM, "*/*", buildParams(params));
+ }
+
+ public T postJson(String url, Object request, Class responseClass) throws MicrosoftAuthenticationException
+ {
+ HttpsURLConnection connection = post(url, MIME_TYPE_JSON, MIME_TYPE_JSON, gson.toJson(request));
+ return readJson(connection, responseClass);
+ }
+
+ public T postFormGetJson(String url, Map params, Class responseClass) throws MicrosoftAuthenticationException
+ {
+ return readJson(postForm(url, params), responseClass);
+ }
+
+
+ protected HttpsURLConnection post(String url, String contentType, String accept, String data) throws MicrosoftAuthenticationException
+ {
+ HttpsURLConnection connection = createConnection(url);
+ connection.setDoOutput(true);
+ connection.addRequestProperty("Content-Type", contentType);
+ connection.addRequestProperty("Accept", accept);
+
+ try {
+ connection.setRequestMethod("POST");
+ connection.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8));
+ } catch (IOException e) {
+ throw new MicrosoftAuthenticationException(e);
+ }
+
+ return connection;
+ }
+
+ protected T readJson(HttpsURLConnection connection, Class responseType) throws MicrosoftAuthenticationException
+ {
+ return gson.fromJson(readResponse(connection), responseType);
+ }
+
+ protected String readResponse(HttpsURLConnection connection) throws MicrosoftAuthenticationException
+ {
+ String redirection = connection.getHeaderField("Location");
+ if (redirection != null) {
+ return readResponse(createConnection(redirection));
+ }
+
+ StringBuilder response = new StringBuilder();
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ response.append(line).append('\n');
+ }
+ } catch (IOException e) {
+ throw new MicrosoftAuthenticationException(e);
+ }
+
+ return response.toString();
+ }
+
+ protected HttpsURLConnection followRedirects(HttpsURLConnection connection) throws MicrosoftAuthenticationException
+ {
+ String redirection = connection.getHeaderField("Location");
+ if (redirection != null) {
+ connection = followRedirects(createConnection(redirection));
+ }
+
+ return connection;
+ }
+
+ protected String buildParams(Map params)
+ {
+ StringBuilder query = new StringBuilder();
+ params.forEach((key, value) -> {
+ if (query.length() > 0) {
+ query.append('&');
+ }
+
+ try {
+ query.append(key).append('=').append(URLEncoder.encode(value, "UTF-8"));
+ } catch (UnsupportedEncodingException ignored) {
+ // Can't happen
+ }
+ });
+
+ return query.toString();
+ }
+
+ protected HttpsURLConnection createConnection(String url) throws MicrosoftAuthenticationException
+ {
+ HttpsURLConnection connection;
+ try {
+ connection = (HttpsURLConnection) new URL(url).openConnection();
+ } catch (IOException e) {
+ throw new MicrosoftAuthenticationException(e);
+ }
+
+ String userAgent = "Mozilla/5.0 (XboxReplay; XboxLiveAuth/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36";
+
+ connection.setRequestProperty("Accept-Language", "en-US");
+ connection.setRequestProperty("Accept-Charset", "UTF-8");
+ connection.setRequestProperty("User-Agent", userAgent);
+
+ return connection;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthResult.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthResult.java
new file mode 100644
index 00000000..2ae5b70e
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthResult.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+import fr.litarvan.openauth.microsoft.model.response.MinecraftProfile;
+
+/**
+ * Microsoft authentication result
+ *
+ *
+ * This class contains the result of a successful Microsoft authentication: a player profile and its tokens (both
+ * access and refresh token).
+ *
+ *
+ * @author Litarvan
+ * @version 1.1.0
+ */
+public class MicrosoftAuthResult
+{
+ private final MinecraftProfile profile;
+ private final String accessToken;
+ private final String refreshToken;
+
+ public MicrosoftAuthResult(MinecraftProfile profile, String accessToken, String refreshToken)
+ {
+ this.profile = profile;
+ this.accessToken = accessToken;
+ this.refreshToken = refreshToken;
+ }
+
+ /**
+ * @return The player Minecraft profile (contains its UUID and username)
+ */
+ public MinecraftProfile getProfile()
+ {
+ return profile;
+ }
+
+ /**
+ * @return The Minecraft access token
+ */
+ public String getAccessToken()
+ {
+ return accessToken;
+ }
+
+ /**
+ * @return The Microsoft refresh token that can be used to log the user back silently using
+ * {@link MicrosoftAuthenticator#loginWithRefreshToken(String)}
+ */
+ public String getRefreshToken()
+ {
+ return refreshToken;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticationException.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticationException.java
new file mode 100644
index 00000000..f91c7ab8
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticationException.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+import java.io.IOException;
+
+public class MicrosoftAuthenticationException extends Exception
+{
+ public MicrosoftAuthenticationException(String message)
+ {
+ super(message);
+ }
+
+ public MicrosoftAuthenticationException(IOException cause)
+ {
+ super("I/O exception thrown during Microsoft HTTP requests", cause);
+ }
+
+ public MicrosoftAuthenticationException(Throwable cause)
+ {
+ super(cause);
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java
new file mode 100644
index 00000000..78f70d72
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+/*
+ * Ported from the amazing work of Alexis Bize on @xboxreplay/xboxlive-auth
+ *
+ * https://github.com/Alexis-Bize
+ * https://github.com/XboxReplay/xboxlive-auth
+ */
+
+import fr.litarvan.openauth.microsoft.model.request.MinecraftLoginRequest;
+import fr.litarvan.openauth.microsoft.model.request.XSTSAuthorizationProperties;
+import fr.litarvan.openauth.microsoft.model.request.XboxLiveLoginProperties;
+import fr.litarvan.openauth.microsoft.model.request.XboxLoginRequest;
+import fr.litarvan.openauth.microsoft.model.response.*;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.UnsupportedEncodingException;
+import java.net.*;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Microsoft authenticator
+ *
+ *
+ * This class can be used to authenticate a player using its Microsoft account.
+ * Use {@link #loginWithCredentials} to retrieve a player profile from his Microsoft credentials,
+ * or loginWithWebview to use a webview with Microsoft login form.
+ *
+ *
+ * @version 1.1.0
+ * @author Litarvan
+ */
+public class MicrosoftAuthenticator
+{
+ public static final String MICROSOFT_AUTHORIZATION_ENDPOINT = "https://login.live.com/oauth20_authorize.srf";
+ public static final String MICROSOFT_TOKEN_ENDPOINT = "https://login.live.com/oauth20_token.srf";
+ public static final String MICROSOFT_REDIRECTION_ENDPOINT = "https://login.live.com/oauth20_desktop.srf";
+
+ public static final String XBOX_LIVE_AUTH_HOST = "user.auth.xboxlive.com";
+ public static final String XBOX_LIVE_CLIENT_ID = "000000004C12AE6F";
+ public static final String XBOX_LIVE_SERVICE_SCOPE = "service::user.auth.xboxlive.com::MBI_SSL";
+
+ public static final String XBOX_LIVE_AUTHORIZATION_ENDPOINT = "https://user.auth.xboxlive.com/user/authenticate";
+ public static final String XSTS_AUTHORIZATION_ENDPOINT = "https://xsts.auth.xboxlive.com/xsts/authorize";
+ public static final String MINECRAFT_AUTH_ENDPOINT = "https://api.minecraftservices.com/authentication/login_with_xbox";
+
+ public static final String XBOX_LIVE_AUTH_RELAY = "http://auth.xboxlive.com";
+ public static final String MINECRAFT_AUTH_RELAY = "rp://api.minecraftservices.com/";
+
+ public static final String MINECRAFT_STORE_ENDPOINT = "https://api.minecraftservices.com/entitlements/mcstore";
+ public static final String MINECRAFT_PROFILE_ENDPOINT = "https://api.minecraftservices.com/minecraft/profile";
+
+ public static final String MINECRAFT_STORE_IDENTIFIER = "game_minecraft";
+
+
+ private final HttpClient http;
+
+ public MicrosoftAuthenticator()
+ {
+ this.http = new HttpClient();
+ }
+
+
+ /**
+ * Logs in a player using its Microsoft account credentials, and retrieve its Minecraft profile
+ *
+ * @param email Player Microsoft account e-mail
+ * @param password Player Microsoft account password
+ *
+ * @return The player Minecraft profile
+ *
+ * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point
+ */
+ public MicrosoftAuthResult loginWithCredentials(String email, String password) throws MicrosoftAuthenticationException
+ {
+ CookieHandler currentHandler = CookieHandler.getDefault();
+ CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
+
+ Map params = new HashMap<>();
+ params.put("login", email);
+ params.put("loginfmt", email);
+ params.put("passwd", password);
+
+ HttpsURLConnection result;
+
+ try {
+ PreAuthData authData = preAuthRequest();
+ params.put("PPFT", authData.getPPFT());
+
+ result = http.followRedirects(http.postForm(authData.getUrlPost(), params));
+ } finally {
+ CookieHandler.setDefault(currentHandler);
+ }
+
+ try {
+ return loginWithTokens(extractTokens(result.getURL().toString()));
+ } catch (MicrosoftAuthenticationException e) {
+ if (match("identity/confirm", http.readResponse(result)) != null) {
+ throw new MicrosoftAuthenticationException(
+ "User has enabled double-authentication or must allow sign-in on https://account.live.com/activity"
+ );
+ }
+
+ throw e;
+ }
+ }
+
+// /**
+// * Logs in a player using a webview to display Microsoft login page.
+// * This function blocks the current thread until the process is finished; this can cause your application to
+// * freeze. When calling from the JavaFX thread or any thread which must not be blocked, use
+// * {@link #loginWithAsyncWebview()}
+// *
+// * @return The player Minecraft profile
+// *
+// * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point
+// */
+// public MicrosoftAuthResult loginWithWebview() throws MicrosoftAuthenticationException
+// {
+// try {
+// return loginWithAsyncWebview().get();
+// } catch (InterruptedException | ExecutionException e) {
+// throw new MicrosoftAuthenticationException(e);
+// }
+// }
+
+// /**
+// * Logs in a player using a webview to display Microsoft login page. This function does not block the current thread.
+// *
+// * @return A future resolved by the player Minecraft profile
+// */
+// public CompletableFuture loginWithAsyncWebview()
+// {
+// String url = String.format("%s?%s", MICROSOFT_AUTHORIZATION_ENDPOINT, http.buildParams(getLoginParams()));
+// LoginFrame frame = new LoginFrame();
+//
+// return frame.start(url).thenApplyAsync(result -> {
+// try {
+// return loginWithTokens(extractTokens(result));
+// } catch (MicrosoftAuthenticationException e) {
+// throw new CompletionException(e);
+// }
+// });
+// }
+
+ /*public MicrosoftAuthResult loginWithWebview() throws MicrosoftAuthenticationException
+ {
+ try {
+ return loginWithAsyncWebview().get();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new MicrosoftAuthenticationException(e);
+ }
+ }*/
+
+ /*public CompletableFuture loginWithAsyncWebview()
+ {
+ String url = String.format("%s?%s", MICROSOFT_AUTHORIZATION_ENDPOINT, http.buildParams(getLoginParams()));
+ LoginFrame frame = new LoginFrame();
+ return frame.start(url).thenApplyAsync(result -> {
+ try {
+ return loginWithTokens(extractTokens(result));
+ } catch (MicrosoftAuthenticationException e) {
+ throw new CompletionException(e);
+ }
+ });
+ }*/
+
+ /**
+ * Logs in a player using a Microsoft account refresh token retrieved earlier.
+ *
+ * @param refreshToken Player Microsoft account refresh token
+ *
+ * @return The player Minecraft profile
+ *
+ * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point
+ */
+ public MicrosoftAuthResult loginWithRefreshToken(String refreshToken) throws MicrosoftAuthenticationException
+ {
+ Map params = getLoginParams();
+ params.put("refresh_token", refreshToken);
+ params.put("grant_type", "refresh_token");
+
+ MicrosoftRefreshResponse response = http.postFormGetJson(
+ MICROSOFT_TOKEN_ENDPOINT,
+ params, MicrosoftRefreshResponse.class
+ );
+
+ return loginWithTokens(new AuthTokens(response.getAccessToken() , response.getRefreshToken()));
+ }
+
+ /**
+ * Logs in a player using a Microsoft account tokens retrieved earlier.
+ * If the token was retrieved using Azure AAD/MSAL, it should be prefixed with d=
+ *
+ * @param tokens Player Microsoft account tokens pair
+ *
+ * @return The player Minecraft profile
+ *
+ * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point
+ */
+ public MicrosoftAuthResult loginWithTokens(AuthTokens tokens) throws MicrosoftAuthenticationException
+ {
+ XboxLoginResponse xboxLiveResponse = xboxLiveLogin(tokens.getAccessToken());
+ XboxLoginResponse xstsResponse = xstsLogin(xboxLiveResponse.getToken());
+
+ String userHash = xstsResponse.getDisplayClaims().getUsers()[0].getUserHash();
+ MinecraftLoginResponse minecraftResponse = minecraftLogin(userHash, xstsResponse.getToken());
+ MinecraftStoreResponse storeResponse = http.getJson(
+ MINECRAFT_STORE_ENDPOINT,
+ minecraftResponse.getAccessToken(),
+ MinecraftStoreResponse.class
+ );
+
+ if (Arrays.stream(storeResponse.getItems()).noneMatch(item -> item.getName().equals(MINECRAFT_STORE_IDENTIFIER))) {
+ throw new MicrosoftAuthenticationException("Player didn't buy Minecraft Java Edition or did not migrate its account");
+ }
+
+ MinecraftProfile profile = http.getJson(
+ MINECRAFT_PROFILE_ENDPOINT,
+ minecraftResponse.getAccessToken(),
+ MinecraftProfile.class
+ );
+
+ return new MicrosoftAuthResult(profile, minecraftResponse.getAccessToken(), tokens.getRefreshToken());
+ }
+
+
+ protected PreAuthData preAuthRequest() throws MicrosoftAuthenticationException
+ {
+ Map params = getLoginParams();
+ params.put("display", "touch");
+ params.put("locale", "en");
+
+ String result = http.getText(MICROSOFT_AUTHORIZATION_ENDPOINT, params);
+
+ String ppft = match("sFTTag:'.*value=\"([^\"]*)\"", result);
+ String urlPost = match("urlPost: ?'(.+?(?='))", result);
+
+ return new PreAuthData(ppft, urlPost);
+ }
+
+ protected XboxLoginResponse xboxLiveLogin(String accessToken) throws MicrosoftAuthenticationException
+ {
+ XboxLiveLoginProperties properties = new XboxLiveLoginProperties("RPS", XBOX_LIVE_AUTH_HOST, accessToken);
+ XboxLoginRequest request = new XboxLoginRequest<>(
+ properties, XBOX_LIVE_AUTH_RELAY, "JWT"
+ );
+
+ return http.postJson(XBOX_LIVE_AUTHORIZATION_ENDPOINT, request, XboxLoginResponse.class);
+ }
+
+ protected XboxLoginResponse xstsLogin(String xboxLiveToken) throws MicrosoftAuthenticationException
+ {
+ XSTSAuthorizationProperties properties = new XSTSAuthorizationProperties("RETAIL", new String[] { xboxLiveToken });
+ XboxLoginRequest request = new XboxLoginRequest<>(
+ properties, MINECRAFT_AUTH_RELAY, "JWT"
+ );
+
+ return http.postJson(XSTS_AUTHORIZATION_ENDPOINT, request, XboxLoginResponse.class);
+ }
+
+ protected MinecraftLoginResponse minecraftLogin(String userHash, String xstsToken) throws MicrosoftAuthenticationException
+ {
+ MinecraftLoginRequest request = new MinecraftLoginRequest(String.format("XBL3.0 x=%s;%s", userHash, xstsToken));
+ return http.postJson(MINECRAFT_AUTH_ENDPOINT, request, MinecraftLoginResponse.class);
+ }
+
+
+ protected Map getLoginParams()
+ {
+ Map params = new HashMap<>();
+ params.put("client_id", XBOX_LIVE_CLIENT_ID);
+ params.put("redirect_uri", MICROSOFT_REDIRECTION_ENDPOINT);
+ params.put("scope", XBOX_LIVE_SERVICE_SCOPE);
+ params.put("response_type", "token");
+
+ return params;
+ }
+
+ protected AuthTokens extractTokens(String url) throws MicrosoftAuthenticationException
+ {
+ return new AuthTokens(extractValue(url, "access_token"), extractValue(url, "refresh_token"));
+ }
+
+ protected String extractValue(String url, String key) throws MicrosoftAuthenticationException
+ {
+ String matched = match(key + "=([^&]*)", url);
+ if (matched == null) {
+ throw new MicrosoftAuthenticationException("Invalid credentials or tokens");
+ }
+
+ try {
+ return URLDecoder.decode(matched, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new MicrosoftAuthenticationException(e);
+ }
+ }
+
+ protected String match(String regex, String content)
+ {
+ Matcher matcher = Pattern.compile(regex).matcher(content);
+ if (!matcher.find()) {
+ return null;
+ }
+
+ return matcher.group(1);
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftPatchedHttpURLConnection.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftPatchedHttpURLConnection.java
new file mode 100644
index 00000000..42d07e97
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftPatchedHttpURLConnection.java
@@ -0,0 +1,150 @@
+package fr.litarvan.openauth.microsoft;
+
+/*
+ * Thanks a lot to Mickaƫl Guessant for this trick
+ *
+ * https://github.com/mguessan
+ * https://github.com/mguessan/davmail/blob/master/src/java/davmail/exchange/auth/O365InteractiveAuthenticatorFrame.java
+ */
+
+import java.io.*;
+import java.net.*;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * HttpURLConnection Microsoft-patched wrapped
+ *
+ *
+ * This class serves as HttpURLConnection, but actually wraps a real one and
+ * patch its input to disable Microsoft meta integrity check, which can fail
+ * on Java >=11 on non-macOS platforms.
+ *
+ *
+ * @version 1.1.1
+ * @author Litarvan
+ */
+public class MicrosoftPatchedHttpURLConnection extends HttpURLConnection
+{
+ private final HttpURLConnection inner;
+
+ public MicrosoftPatchedHttpURLConnection(URL url, HttpURLConnection inner)
+ {
+ super(url);
+
+ this.inner = inner;
+ }
+
+ @Override
+ public void setRequestMethod(String method) throws ProtocolException
+ {
+ this.inner.setRequestMethod(method);
+ }
+
+ @Override
+ public void setInstanceFollowRedirects(boolean followRedirects)
+ {
+ this.inner.setInstanceFollowRedirects(followRedirects);
+ }
+
+ @Override
+ public boolean getInstanceFollowRedirects()
+ {
+ return this.inner.getInstanceFollowRedirects();
+ }
+
+ @Override
+ public String getRequestMethod()
+ {
+ return this.inner.getRequestMethod();
+ }
+
+ @Override
+ public int getResponseCode() throws IOException
+ {
+ return this.inner.getResponseCode();
+ }
+
+ @Override
+ public String getResponseMessage() throws IOException
+ {
+ return this.inner.getResponseMessage();
+ }
+
+ @Override
+ public Map> getHeaderFields()
+ {
+ return this.inner.getHeaderFields();
+ }
+
+ @Override
+ public String getHeaderField(String name)
+ {
+ return this.inner.getHeaderField(name);
+ }
+
+ @Override
+ public String getHeaderField(int n)
+ {
+ return this.inner.getHeaderField(n);
+ }
+
+ @Override
+ public void disconnect()
+ {
+ this.inner.disconnect();
+ }
+
+ @Override
+ public void setDoOutput(boolean dooutput)
+ {
+ this.inner.setDoOutput(dooutput);
+ }
+
+ @Override
+ public boolean usingProxy()
+ {
+ return this.inner.usingProxy();
+ }
+
+ @Override
+ public void connect() throws IOException
+ {
+ this.inner.connect();
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException
+ {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ try (InputStream in = this.inner.getInputStream()) {
+ int n;
+ byte[] data = new byte[8192];
+
+ while ((n = in.read(data, 0, data.length)) != -1) {
+ buffer.write(data, 0, n);
+ }
+ }
+
+ byte[] patched = buffer
+ .toString("UTF-8")
+ .replaceAll("integrity ?=", "integrity.disabled=")
+ .replaceAll("setAttribute\\(\"integrity\"", "setAttribute(\"integrity.disabled\"")
+ .getBytes(StandardCharsets.UTF_8);
+
+ return new ByteArrayInputStream(patched);
+ }
+
+ @Override
+ public OutputStream getOutputStream() throws IOException
+ {
+ return this.inner.getOutputStream();
+ }
+
+ @Override
+ public InputStream getErrorStream()
+ {
+ return this.inner.getErrorStream();
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/PreAuthData.java b/src/main/java/fr/litarvan/openauth/microsoft/PreAuthData.java
new file mode 100644
index 00000000..ffcf2e45
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/PreAuthData.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft;
+
+public class PreAuthData
+{
+ private final String ppft;
+ private final String urlPost;
+
+ public PreAuthData(String ppft, String urlPost)
+ {
+ this.ppft = ppft;
+ this.urlPost = urlPost;
+ }
+
+ public String getPPFT()
+ {
+ return ppft;
+ }
+
+ public String getUrlPost()
+ {
+ return urlPost;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/request/MinecraftLoginRequest.java b/src/main/java/fr/litarvan/openauth/microsoft/model/request/MinecraftLoginRequest.java
new file mode 100644
index 00000000..fa708fff
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/request/MinecraftLoginRequest.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.request;
+
+public class MinecraftLoginRequest
+{
+ private final String identityToken;
+
+ public MinecraftLoginRequest(String identityToken)
+ {
+ this.identityToken = identityToken;
+ }
+
+ public String getIdentityToken()
+ {
+ return identityToken;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/request/XSTSAuthorizationProperties.java b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XSTSAuthorizationProperties.java
new file mode 100644
index 00000000..7e439494
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XSTSAuthorizationProperties.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.request;
+
+public class XSTSAuthorizationProperties
+{
+ private final String SandboxId;
+ private final String[] UserTokens;
+
+ public XSTSAuthorizationProperties(String SandboxId, String[] UserTokens)
+ {
+ this.SandboxId = SandboxId;
+ this.UserTokens = UserTokens;
+ }
+
+ public String getSandboxId()
+ {
+ return SandboxId;
+ }
+
+ public String[] getUserTokens()
+ {
+ return UserTokens;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLiveLoginProperties.java b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLiveLoginProperties.java
new file mode 100644
index 00000000..b8f8dc61
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLiveLoginProperties.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.request;
+
+public class XboxLiveLoginProperties
+{
+ private final String AuthMethod;
+ private final String SiteName;
+ private final String RpsTicket;
+
+ public XboxLiveLoginProperties(String AuthMethod, String SiteName, String RpsTicket)
+ {
+ this.AuthMethod = AuthMethod;
+ this.SiteName = SiteName;
+ this.RpsTicket = RpsTicket;
+ }
+
+ public String getAuthMethod()
+ {
+ return AuthMethod;
+ }
+
+ public String getSiteName()
+ {
+ return SiteName;
+ }
+
+ public String getRpsTicket()
+ {
+ return RpsTicket;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLoginRequest.java b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLoginRequest.java
new file mode 100644
index 00000000..7948f38d
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/request/XboxLoginRequest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.request;
+
+public class XboxLoginRequest
+{
+ private final T Properties;
+ private final String RelyingParty;
+ private final String TokenType;
+
+ public XboxLoginRequest(T Properties, String RelyingParty, String TokenType)
+ {
+ this.Properties = Properties;
+ this.RelyingParty = RelyingParty;
+ this.TokenType = TokenType;
+ }
+
+ public T getProperties()
+ {
+ return Properties;
+ }
+
+ public String getSiteName()
+ {
+ return RelyingParty;
+ }
+
+ public String getTokenType()
+ {
+ return TokenType;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/response/MicrosoftRefreshResponse.java b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MicrosoftRefreshResponse.java
new file mode 100644
index 00000000..c1a126a0
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MicrosoftRefreshResponse.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.response;
+
+public class MicrosoftRefreshResponse
+{
+ private final String token_type;
+ private final long expires_in;
+ private final String scope;
+ private final String access_token;
+ private final String refresh_token;
+ private final String user_id;
+
+ public MicrosoftRefreshResponse(String token_type, long expires_in, String scope, String access_token, String refresh_token, String user_id)
+ {
+ this.token_type = token_type;
+ this.expires_in = expires_in;
+ this.scope = scope;
+ this.access_token = access_token;
+ this.refresh_token = refresh_token;
+ this.user_id = user_id;
+ }
+
+ public String getTokenType()
+ {
+ return token_type;
+ }
+
+ public long getExpiresIn()
+ {
+ return expires_in;
+ }
+
+ public String getScope()
+ {
+ return scope;
+ }
+
+ public String getAccessToken()
+ {
+ return access_token;
+ }
+
+ public String getRefreshToken()
+ {
+ return refresh_token;
+ }
+
+ public String getUserId()
+ {
+ return user_id;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftLoginResponse.java b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftLoginResponse.java
new file mode 100644
index 00000000..dee3cb93
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftLoginResponse.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.response;
+
+public class MinecraftLoginResponse
+{
+ private final String username;
+ private final String access_token;
+ private final String token_type;
+ private final long expires_in;
+
+ public MinecraftLoginResponse(String username, String access_token, String token_type, long expires_in)
+ {
+ this.username = username;
+ this.access_token = access_token;
+ this.token_type = token_type;
+ this.expires_in = expires_in;
+ }
+
+ public String getUsername()
+ {
+ return username;
+ }
+
+ public String getAccessToken()
+ {
+ return access_token;
+ }
+
+ public String getTokenType()
+ {
+ return token_type;
+ }
+
+ public long getExpiresIn()
+ {
+ return expires_in;
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftProfile.java b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftProfile.java
new file mode 100644
index 00000000..38d6e2c7
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftProfile.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.response;
+
+/**
+ * Minecraft player profile
+ *
+ *
+ * Represents a Minecraft player profile data. UUID is {@link #id} and username is {@link #name}.
+ *
+ *
+ * @version 1.1.0
+ * @author Litarvan
+ */
+public class MinecraftProfile
+{
+ private final String id;
+ private final String name;
+ private final MinecraftSkin[] skins;
+
+ public MinecraftProfile(String id, String name, MinecraftSkin[] skins)
+ {
+ this.id = id;
+ this.name = name;
+ this.skins = skins;
+ }
+
+ /**
+ * @return The player Minecraft UUID
+ */
+ public String getId()
+ {
+ return id;
+ }
+
+ /**
+ * @return The player Minecraft username
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public MinecraftSkin[] getSkins()
+ {
+ return skins;
+ }
+
+ public static class MinecraftSkin
+ {
+ private final String id;
+ private final String state;
+ private final String url;
+ private final String variant;
+ private final String alias;
+
+ public MinecraftSkin(String id, String state, String url, String variant, String alias)
+ {
+ this.id = id;
+ this.state = state;
+ this.url = url;
+ this.variant = variant;
+ this.alias = alias;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public String getState()
+ {
+ return state;
+ }
+
+ public String getUrl()
+ {
+ return url;
+ }
+
+ public String getVariant()
+ {
+ return variant;
+ }
+
+ public String getAlias()
+ {
+ return alias;
+ }
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftStoreResponse.java b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftStoreResponse.java
new file mode 100644
index 00000000..00f7bf2d
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/response/MinecraftStoreResponse.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.response;
+
+public class MinecraftStoreResponse
+{
+ private final StoreProduct[] items;
+ private final String signature;
+ private final String keyId;
+
+ public MinecraftStoreResponse(StoreProduct[] items, String signature, String keyId)
+ {
+ this.items = items;
+ this.signature = signature;
+ this.keyId = keyId;
+ }
+
+ public StoreProduct[] getItems()
+ {
+ return items;
+ }
+
+ public String getSignature()
+ {
+ return signature;
+ }
+
+ public String getKeyId()
+ {
+ return keyId;
+ }
+
+ public static class StoreProduct
+ {
+ private final String name;
+ private final String signature;
+
+ public StoreProduct(String name, String signature)
+ {
+ this.name = name;
+ this.signature = signature;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public String getSignature()
+ {
+ return signature;
+ }
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/microsoft/model/response/XboxLoginResponse.java b/src/main/java/fr/litarvan/openauth/microsoft/model/response/XboxLoginResponse.java
new file mode 100644
index 00000000..f9c35c4a
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/microsoft/model/response/XboxLoginResponse.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2015-2021 Adrien 'Litarvan' Navratil
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.microsoft.model.response;
+
+public class XboxLoginResponse
+{
+ private final String IssueInstant;
+ private final String NotAfter;
+ private final String Token;
+ private final XboxLiveLoginResponseClaims DisplayClaims;
+
+ public XboxLoginResponse(String IssueInstant, String NotAfter, String Token, XboxLiveLoginResponseClaims DisplayClaims)
+ {
+ this.IssueInstant = IssueInstant;
+ this.NotAfter = NotAfter;
+ this.Token = Token;
+ this.DisplayClaims = DisplayClaims;
+ }
+
+ public String getIssueInstant()
+ {
+ return IssueInstant;
+ }
+
+ public String getNotAfter()
+ {
+ return NotAfter;
+ }
+
+ public String getToken()
+ {
+ return Token;
+ }
+
+ public XboxLiveLoginResponseClaims getDisplayClaims()
+ {
+ return DisplayClaims;
+ }
+
+ public static class XboxLiveLoginResponseClaims
+ {
+ private final XboxLiveUserInfo[] xui;
+
+ public XboxLiveLoginResponseClaims(XboxLiveUserInfo[] xui)
+ {
+ this.xui = xui;
+ }
+
+ public XboxLiveUserInfo[] getUsers()
+ {
+ return xui;
+ }
+ }
+
+ public static class XboxLiveUserInfo
+ {
+ private final String uhs;
+
+ public XboxLiveUserInfo(String uhs)
+ {
+ this.uhs = uhs;
+ }
+
+ public String getUserHash()
+ {
+ return uhs;
+ }
+ }
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/AuthAgent.java b/src/main/java/fr/litarvan/openauth/model/AuthAgent.java
new file mode 100644
index 00000000..2e0b1db5
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/AuthAgent.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model;
+
+/**
+ * JSON model of an auth agent
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthAgent {
+
+ /**
+ * The Minecraft auth agent
+ */
+ public static final AuthAgent MINECRAFT = new AuthAgent("Minecraft", 1);
+
+ /**
+ * The Scroll auth agent
+ */
+ public static final AuthAgent SCROLLS = new AuthAgent("Scrolls", 1);
+
+ /**
+ * The agent name
+ */
+ private String name;
+
+ /**
+ * The agent version
+ */
+ private int version;
+
+ /**
+ * Agent constructor
+ *
+ * @param name
+ * The name of the agent
+ * @param version
+ * The version of the agent (1 by default)
+ */
+ public AuthAgent(String name, int version) {
+ this.name = name;
+ this.version = version;
+ }
+
+ /**
+ * Sets a new name
+ *
+ * @param name
+ * The new name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Returns the name of the agent
+ *
+ * @return The agent name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * Sets a new version
+ *
+ * @param version
+ * The new version
+ */
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+ /**
+ * Returns the version of the agent
+ *
+ * @return The agent version
+ */
+ public int getVersion() {
+ return this.version;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/AuthError.java b/src/main/java/fr/litarvan/openauth/model/AuthError.java
new file mode 100644
index 00000000..9c597aaa
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/AuthError.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model;
+
+/**
+ * JSON model of an error
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthError {
+
+ /**
+ * Short description of the error
+ */
+ private String error;
+
+ /**
+ * Longer description wich can be shown to the user
+ */
+ private String errorMessage;
+
+ /**
+ * Cause of the error (optional)
+ */
+ private String cause;
+
+ /**
+ * Auth Error constructor
+ *
+ * @param error
+ * Short description of the error
+ * @param errorMessage
+ * Longer description wich can be shown to the user
+ * @param cause
+ * Cause of the error
+ */
+ public AuthError(String error, String errorMessage, String cause) {
+ this.error = error;
+ this.errorMessage = errorMessage;
+ this.cause = cause;
+ }
+
+ /**
+ * Returns the error (Short description of the error)
+ *
+ * @return The error
+ */
+ public String getError() {
+ return error;
+ }
+
+ /**
+ * Returns the error message (Longer description of the error)
+ *
+ * @return The error message
+ */
+ public String getErrorMessage() {
+ return this.errorMessage;
+ }
+
+ /**
+ * Returns the cause of the error
+ *
+ * @return The cause
+ */
+ public String getCause() {
+ return cause;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/AuthProfile.java b/src/main/java/fr/litarvan/openauth/model/AuthProfile.java
new file mode 100644
index 00000000..d70c0616
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/AuthProfile.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model;
+
+/**
+ * JSON model of a profile
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthProfile {
+
+ /**
+ * The profile name
+ */
+ private String name;
+
+ /**
+ * The profile UUID
+ */
+ private String id;
+
+ /**
+ * Blank auth profile
+ */
+ public AuthProfile() {
+ this.name = "";
+ this.id = "";
+ }
+
+ /**
+ * Normal auth profile
+ *
+ * @param name
+ * The profile name
+ * @param id
+ * The profile UUID
+ */
+ public AuthProfile(String name, String id) {
+ this.name = name;
+ this.id = id;
+ }
+
+ /**
+ * Returns the name of the profile
+ *
+ * @return The profile name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * Returns the profile UUID
+ *
+ * @return The profile UUID
+ */
+ public String getId() {
+ return this.id;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/request/AuthRequest.java b/src/main/java/fr/litarvan/openauth/model/request/AuthRequest.java
new file mode 100644
index 00000000..bda92ed6
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/request/AuthRequest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.request;
+
+import fr.litarvan.openauth.model.AuthAgent;
+
+/**
+ * JSON Model of an authentication request
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthRequest {
+
+ /**
+ * The authentication agent (Optional, the game profile you want to use, Minecraft, Scrolls, etc...)
+ */
+ private AuthAgent agent;
+
+ /**
+ * The username (The username of the player you want to authenticate)
+ */
+ private String username;
+
+ /**
+ * The password (The password of the player you want to authenticate)
+ */
+ private String password;
+
+ /**
+ * The client token (Optional, it's like a password for the access token)
+ */
+ private String clientToken;
+
+ /**
+ * Authentication Request
+ *
+ * @param agent
+ * The authentication agent (Optional, the game you want to use, Minecraft, Scrolls, etc...)
+ * @param username
+ * The username (The username of the player you want to authenticate)
+ * @param password
+ * The password (The password of the player you want to authenticate)
+ * @param clientToken
+ * The client token (Optional, It's like a password for the access token)
+ */
+ public AuthRequest(AuthAgent agent, String username, String password, String clientToken) {
+ this.agent = agent;
+ this.username = username;
+ this.password = password;
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Sets a new authentication agent (Optional, the game you want to use, Minecraft, Scrolls, etc...)
+ *
+ * @param agent
+ * The new agent
+ */
+ public void setAgent(AuthAgent agent) {
+ this.agent = agent;
+ }
+
+ /**
+ * Returns the authentication agent (Given with the constructor or the setter)
+ *
+ * @return The given auth agent
+ */
+ public AuthAgent getAgent() {
+ return this.agent;
+ }
+
+ /**
+ * Sets a new username (The username of the player you want to authenticate)
+ *
+ * @param username
+ * The new username
+ */
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ /**
+ * Returns the username (Given with the constructor or the setter)
+ *
+ * @return The given username
+ */
+ public String getUsername() {
+ return this.username;
+ }
+
+ /**
+ * Sets a new password (The password of the player you want to authenticate)
+ *
+ * @param password
+ * The new password
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * Returns the password (Given with the constructor or the setter)
+ *
+ * @return The given password
+ */
+ public String getPassword() {
+ return this.password;
+ }
+
+ /**
+ * Sets a new client token (It's like a password for the access token)
+ *
+ * @param clientToken
+ * The new client token
+ */
+ public void setClientToken(String clientToken) {
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Returns the client token (Given with the constructor or the setter)
+ *
+ * @return The given client token
+ */
+ public String getClientToken() {
+ return clientToken;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/request/InvalidateRequest.java b/src/main/java/fr/litarvan/openauth/model/request/InvalidateRequest.java
new file mode 100644
index 00000000..5689627d
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/request/InvalidateRequest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.request;
+
+/**
+ * JSON Model of an invalidate request
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class InvalidateRequest {
+
+ /**
+ * The access token you want to invalidate
+ */
+ private String accessToken;
+
+ /**
+ * The client token associated with the access token
+ */
+ private String clientToken;
+
+ /**
+ * Invalidate Request constructor
+ *
+ * @param accessToken
+ * The access token you want to invalidate
+ * @param clientToken
+ * The client token associated with the access token
+ */
+ public InvalidateRequest(String accessToken, String clientToken) {
+ this.accessToken = accessToken;
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Sets a new access token (That you want to invalidate)
+ *
+ * @param accessToken
+ * The new access token
+ */
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ /**
+ * Returns the access token (Given by the constructor or the setter)
+ *
+ * @return The given access token
+ */
+ public String getAccessToken() {
+ return this.accessToken;
+ }
+
+ /**
+ * Sets a new client token (Need to be associated with the access token)
+ *
+ * @param clientToken
+ * The new client token
+ */
+ public void setClientToken(String clientToken) {
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Returns the client token (Given by the constructor or the setter)
+ *
+ * @return The given client token
+ */
+ public String getClientToken() {
+ return clientToken;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/request/RefreshRequest.java b/src/main/java/fr/litarvan/openauth/model/request/RefreshRequest.java
new file mode 100644
index 00000000..a6833790
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/request/RefreshRequest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.request;
+
+/**
+ * JSON model of a refresh request
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class RefreshRequest {
+
+ /**
+ * The saved access token that you want to refresh
+ */
+ private String accessToken;
+
+ /**
+ * The saved client token associated with the access token
+ */
+ private String clientToken;
+
+ /**
+ * Refresh Request constructor
+ *
+ * @param accessToken
+ * The saved access token that you want to refresh
+ * @param clientToken
+ * The saved client token associated with the access token
+ */
+ public RefreshRequest(String accessToken, String clientToken) {
+ this.accessToken = accessToken;
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Sets a new access token (That you want to refresh)
+ *
+ * @param accessToken
+ * The new access token
+ */
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ /**
+ * Returns the access token (Given by the constructor or the setter)
+ *
+ * @return The given access token
+ */
+ public String getAccessToken() {
+ return this.accessToken;
+ }
+
+ /**
+ * Sets a new client token (Need to be associated with the access token)
+ *
+ * @param clientToken
+ * The new client token
+ */
+ public void setClientToken(String clientToken) {
+ this.clientToken = clientToken;
+ }
+
+ /**
+ * Returns the client token (Given by the constructor or the setter)
+ *
+ * @return The given client token
+ */
+ public String getClientToken() {
+ return this.clientToken;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/request/SignoutRequest.java b/src/main/java/fr/litarvan/openauth/model/request/SignoutRequest.java
new file mode 100644
index 00000000..917fedb5
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/request/SignoutRequest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.request;
+
+/**
+ * JSON Model of an signout request
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class SignoutRequest {
+
+ /**
+ * The username of the player that you want to signout
+ */
+ private String username;
+
+ /**
+ * The password of the player that you want to signout
+ */
+ private String password;
+
+ /**
+ * Signout Request constructor
+ *
+ * @param username
+ * The username of the player that you want to signout
+ * @param password
+ * The password of the player that you want to signout
+ */
+ public SignoutRequest(String username, String password) {
+ this.username = username;
+ this.password = password;
+ }
+
+ /**
+ * Sets a new username (Of the player that you want to signout)
+ *
+ * @param username
+ * The new username
+ */
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ /**
+ * Returns the username (Given by the constructor or the setter)
+ *
+ * @return The given username
+ */
+ public String getUsername() {
+ return this.username;
+ }
+
+ /**
+ * Sets a new password (Of the player that you want to signout)
+ *
+ * @param password
+ * The new password
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * Returns the password (Given by the constructor or the setter)
+ *
+ * @return The given password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/request/ValidateRequest.java b/src/main/java/fr/litarvan/openauth/model/request/ValidateRequest.java
new file mode 100644
index 00000000..d85b090c
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/request/ValidateRequest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.request;
+
+/**
+ * JSON Model of an validate request
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class ValidateRequest {
+
+ /**
+ * The access token that you want to validate
+ */
+ private String accessToken;
+
+ /**
+ * Validate Request constructor
+ *
+ * @param accessToken
+ * The access token that you want to validate
+ */
+ public ValidateRequest(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ /**
+ * Sets a new access token
+ *
+ * @param accessToken
+ * The new access token
+ */
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ /**
+ * Returns the access token (Given by the constructor or the setter)
+ *
+ * @return The given access token
+ */
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/response/AuthResponse.java b/src/main/java/fr/litarvan/openauth/model/response/AuthResponse.java
new file mode 100644
index 00000000..e29d449f
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/response/AuthResponse.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.response;
+
+import fr.litarvan.openauth.model.AuthProfile;
+
+/**
+ * JSON Model of an authentication response
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class AuthResponse {
+
+ /**
+ * The access token
+ */
+ private String accessToken;
+
+ /**
+ * The client token (same as the one given by the request)
+ */
+ private String clientToken;
+
+ /**
+ * All available profiles
+ */
+ private AuthProfile[] availableProfiles;
+
+ /**
+ * The current selected profile from the agent
+ */
+ private AuthProfile selectedProfile;
+
+ /**
+ * Auth Response constructor
+ *
+ * @param accessToken
+ * The access token
+ * @param clientToken
+ * The client token (same as the one given by the request)
+ * @param availableProfiles
+ * All available profiles
+ * @param selectedProfile
+ * The current selected profile from the agent
+ */
+ public AuthResponse(String accessToken, String clientToken, AuthProfile[] availableProfiles, AuthProfile selectedProfile) {
+ this.accessToken = accessToken;
+ this.clientToken = clientToken;
+ this.availableProfiles = availableProfiles;
+ this.selectedProfile = selectedProfile;
+ }
+
+ /**
+ * Returns the access token
+ *
+ * @return The access token
+ */
+ public String getAccessToken() {
+ return this.accessToken;
+ }
+
+ /**
+ * Returns the client token (same as the one given by the request)
+ *
+ * @return The client token
+ */
+ public String getClientToken() {
+ return this.clientToken;
+ }
+
+ /**
+ * Returns the available profiles
+ *
+ * @return The available profiles
+ */
+ public AuthProfile[] getAvailableProfiles() {
+ return this.availableProfiles;
+ }
+
+ /**
+ * Returns the selected profile from the agent
+ *
+ * @return The selected profile
+ */
+ public AuthProfile getSelectedProfile() {
+ return this.selectedProfile;
+ }
+
+}
diff --git a/src/main/java/fr/litarvan/openauth/model/response/RefreshResponse.java b/src/main/java/fr/litarvan/openauth/model/response/RefreshResponse.java
new file mode 100644
index 00000000..2381d9de
--- /dev/null
+++ b/src/main/java/fr/litarvan/openauth/model/response/RefreshResponse.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015 TheShark34
+ *
+ * This file is part of OpenAuth.
+
+ * OpenAuth is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenAuth 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenAuth. If not, see .
+ */
+package fr.litarvan.openauth.model.response;
+
+import fr.litarvan.openauth.model.AuthProfile;
+
+/**
+ * JSON Model of an refresh response
+ *
+ * @version 1.0.4
+ * @author Litarvan
+ */
+public class RefreshResponse {
+
+ /**
+ * The access token (not the same as the one given by the request)
+ */
+ private String accessToken;
+
+ /**
+ * The client token (same as the one given by the request)
+ */
+ private String clientToken;
+
+ /**
+ * The selected profile
+ */
+ private AuthProfile selectedProfile;
+
+ /**
+ * Refresh Response constructor
+ *
+ * @param accessToken
+ * The access token (not the same as the one given by the request)
+ * @param clientToken
+ * The client token (same as the one given by the request)
+ * @param selectedProfile
+ * The profile selected (depending of the sent AuthAgent) containing
+ * more information about the agent (the game) selected, like the
+ * username for Minecraft
+ */
+ public RefreshResponse(String accessToken, String clientToken, AuthProfile selectedProfile) {
+ this.accessToken = accessToken;
+ this.clientToken = clientToken;
+ this.selectedProfile = selectedProfile;
+ }
+
+ /**
+ * Returns the access token (not the same as the one given by the request)
+ *
+ * @return The access token
+ */
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ /**
+ * Returns the client token (same as the one given by the request)
+ *
+ * @return The client token
+ */
+ public String getClientToken() {
+ return clientToken;
+ }
+
+ /**
+ * Returns the selected profile
+ *
+ * @return The selected profile
+ */
+ public AuthProfile getSelectedProfile() {
+ return selectedProfile;
+ }
+
+}
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index cb28f35f..75730886 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -196,6 +196,7 @@ import rip.athena.client.events.types.render.RenderEvent;
import rip.athena.client.events.types.render.RenderType;
import rip.athena.client.gui.menu.AthenaMenu;
import rip.athena.client.modules.impl.fpssettings.OptimizerMod;
+import rip.athena.client.modules.impl.mods.HitDelayFix;
public class Minecraft implements IThreadListener, IPlayerUsage
{
@@ -1536,7 +1537,11 @@ public class Minecraft implements IThreadListener, IPlayerUsage
if (this.playerController.isNotCreative())
{
- this.leftClickCounter = 10;
+ if(Athena.INSTANCE.getModuleManager().get(HitDelayFix.class).isToggled()) {
+ this.leftClickCounter = 0;
+ } else {
+ this.leftClickCounter = 10;
+ }
}
}
else
@@ -3182,7 +3187,7 @@ public class Minecraft implements IThreadListener, IPlayerUsage
}
else
{
- GuiStreamUnavailable.func_152321_a(this.currentScreen);
+ //GuiStreamUnavailable.func_152321_a(this.currentScreen);
}
}
else if (i == this.gameSettings.keyBindStreamPauseUnpause.getKeyCode())
diff --git a/src/main/java/net/minecraft/client/entity/EntityPlayerSP.java b/src/main/java/net/minecraft/client/entity/EntityPlayerSP.java
index ef53142b..17bf3d7b 100644
--- a/src/main/java/net/minecraft/client/entity/EntityPlayerSP.java
+++ b/src/main/java/net/minecraft/client/entity/EntityPlayerSP.java
@@ -42,15 +42,11 @@ import net.minecraft.potion.Potion;
import net.minecraft.stats.StatBase;
import net.minecraft.stats.StatFileWriter;
import net.minecraft.tileentity.TileEntitySign;
-import net.minecraft.util.BlockPos;
-import net.minecraft.util.DamageSource;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.EnumParticleTypes;
-import net.minecraft.util.IChatComponent;
-import net.minecraft.util.MovementInput;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.*;
import net.minecraft.world.IInteractionObject;
import net.minecraft.world.World;
+import rip.athena.client.Athena;
+import rip.athena.client.modules.impl.mods.ToggleSprint;
public class EntityPlayerSP extends AbstractClientPlayer
{
@@ -783,7 +779,12 @@ public class EntityPlayerSP extends AbstractClientPlayer
boolean flag1 = this.movementInput.sneak;
float f = 0.8F;
boolean flag2 = this.movementInput.moveForward >= f;
- this.movementInput.updatePlayerMoveState();
+
+ if(Athena.INSTANCE.getModuleManager().get(ToggleSprint.class).isToggled()) {
+ ToggleSprint.update(mc, (MovementInputFromOptions) this.movementInput, this);
+ } else {
+ this.movementInput.updatePlayerMoveState();
+ }
if (this.isUsingItem() && !this.isRiding())
{
@@ -820,19 +821,27 @@ public class EntityPlayerSP extends AbstractClientPlayer
this.setSprinting(false);
}
- if (this.capabilities.allowFlying)
- {
- if (this.mc.playerController.isSpectatorMode())
+ if(Athena.INSTANCE.getModuleManager().get(ToggleSprint.class).isToggled()) {
+
+ if(ToggleSprint.optionEnableFlyBoost && this.capabilities.isFlying && ToggleSprint.sprint)
{
- if (!this.capabilities.isFlying)
- {
- this.capabilities.isFlying = true;
- this.sendPlayerAbilities();
+ if(ToggleSprint.sprint && ToggleSprint.optionEnableFlyBoost) {
+ this.capabilities.setFlySpeed(0.05F * (float) ToggleSprint.flyboostspeedHorizontal);
+ if(this.movementInput.sneak) this.motionY -= 0.15D * (double) ToggleSprint.flyboostspeedVertical;
+ if(this.movementInput.jump) this.motionY += 0.15D * (double) ToggleSprint.flyboostspeedVertical;
+ } else if(!ToggleSprint.optionEnableFlyBoost && this.mc.gameSettings.keyBindSprint.isKeyDown()) {
+ this.capabilities.setFlySpeed(0.05F * (float) ToggleSprint.flyboostspeedHorizontal);
+ if(this.movementInput.sneak) this.motionY -= 0.15D * (double) ToggleSprint.flyboostspeedVertical;
+ if(this.movementInput.jump) this.motionY += 0.15D * (double) ToggleSprint.flyboostspeedVertical;
}
}
- else if (!flag && this.movementInput.jump)
+ else if(this.capabilities.getFlySpeed() != 0.05F)
{
- if (this.flyToggleTimer == 0)
+ this.capabilities.setFlySpeed(0.05F);
+ }
+ if(this.capabilities.allowFlying && !isJumping && this.movementInput.jump)
+ {
+ if(this.flyToggleTimer == 0)
{
this.flyToggleTimer = 7;
}
@@ -843,18 +852,44 @@ public class EntityPlayerSP extends AbstractClientPlayer
this.flyToggleTimer = 0;
}
}
- }
- if (this.capabilities.isFlying && this.isCurrentViewEntity())
- {
- if (this.movementInput.sneak)
+ if(this.capabilities.isFlying)
{
- this.motionY -= (double)(this.capabilities.getFlySpeed() * 3.0F);
+ if(this.movementInput.sneak)
+ {
+ this.motionY -= 0.15D;
+ }
+ if(this.movementInput.jump)
+ {
+ this.motionY += 0.15D;
+ }
+ }
+ } else {
+ if (this.capabilities.allowFlying) {
+ if (this.mc.playerController.isSpectatorMode()) {
+ if (!this.capabilities.isFlying) {
+ this.capabilities.isFlying = true;
+ this.sendPlayerAbilities();
+ }
+ } else if (!flag && this.movementInput.jump) {
+ if (this.flyToggleTimer == 0) {
+ this.flyToggleTimer = 7;
+ } else {
+ this.capabilities.isFlying = !this.capabilities.isFlying;
+ this.sendPlayerAbilities();
+ this.flyToggleTimer = 0;
+ }
+ }
}
- if (this.movementInput.jump)
- {
- this.motionY += (double)(this.capabilities.getFlySpeed() * 3.0F);
+ if (this.capabilities.isFlying && this.isCurrentViewEntity()) {
+ if (this.movementInput.sneak) {
+ this.motionY -= (double) (this.capabilities.getFlySpeed() * 3.0F);
+ }
+
+ if (this.movementInput.jump) {
+ this.motionY += (double) (this.capabilities.getFlySpeed() * 3.0F);
+ }
}
}
diff --git a/src/main/java/net/minecraft/client/gui/FontRenderer.java b/src/main/java/net/minecraft/client/gui/FontRenderer.java
index 04021bfd..7db75664 100644
--- a/src/main/java/net/minecraft/client/gui/FontRenderer.java
+++ b/src/main/java/net/minecraft/client/gui/FontRenderer.java
@@ -27,6 +27,8 @@ import optifine.FontUtils;
import org.apache.commons.io.IOUtils;
import org.lwjgl.opengl.GL11;
+import rip.athena.client.Athena;
+import rip.athena.client.modules.impl.other.NickHider;
public class FontRenderer implements IResourceManagerReloadListener
{
@@ -433,6 +435,16 @@ public class FontRenderer implements IResourceManagerReloadListener
*/
private void renderStringAtPos(String p_78255_1_, boolean p_78255_2_)
{
+ NickHider mod = (NickHider) Athena.INSTANCE.getModuleManager().get(NickHider.class);
+
+ if(Athena.INSTANCE.getModuleManager().get(NickHider.class).isToggled()) {
+ if(Minecraft.getMinecraft().thePlayer != null) {
+ if (p_78255_1_.contains(Minecraft.getMinecraft().thePlayer.getName())) {
+ p_78255_1_ = p_78255_1_.replace(Minecraft.getMinecraft().thePlayer.getName(), mod.nick);
+ }
+ }
+ }
+
for (int i = 0; i < p_78255_1_.length(); ++i)
{
char c0 = p_78255_1_.charAt(i);
@@ -654,6 +666,16 @@ public class FontRenderer implements IResourceManagerReloadListener
*/
public int getStringWidth(String text)
{
+ NickHider mod = (NickHider) Athena.INSTANCE.getModuleManager().get(NickHider.class);
+
+ if (Athena.INSTANCE.getModuleManager().get(NickHider.class).isToggled()) {
+ if (Minecraft.getMinecraft().thePlayer != null) {
+ if (text.contains(Minecraft.getMinecraft().thePlayer.getName())) {
+ text = text.replace(Minecraft.getMinecraft().thePlayer.getName(), mod.nick);
+ }
+ }
+ }
+
if (text == null)
{
return 0;
diff --git a/src/main/java/net/minecraft/client/gui/Gui.java b/src/main/java/net/minecraft/client/gui/Gui.java
index 7bf18b6c..77fc0066 100644
--- a/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/src/main/java/net/minecraft/client/gui/Gui.java
@@ -7,6 +7,8 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation;
+import static org.lwjgl.opengl.GL11.*;
+
public class Gui
{
public static final ResourceLocation optionsBackground = new ResourceLocation("textures/gui/options_background.png");
@@ -44,6 +46,28 @@ public class Gui
drawRect(x, startY + 1, x + 1, endY, color);
}
+ public static void drawRect2(double x, double y, double width, double height, int color) {
+ GlStateManager.color(1,1,1,1);
+ GlStateManager.enableAlpha();
+ GlStateManager.alphaFunc(GL_GREATER, (float) (0 * .01));
+ GlStateManager.enableBlend();
+ GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.disableTexture2D();
+
+ Tessellator tessellator = Tessellator.getInstance();
+ WorldRenderer worldrenderer = tessellator.getWorldRenderer();
+
+ worldrenderer.begin(GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
+ worldrenderer.pos(x, y, 0.0D).color(color).endVertex();
+ worldrenderer.pos(x, y + height, 0.0D).color(color).endVertex();
+ worldrenderer.pos(x + width, y + height, 0.0D).color(color).endVertex();
+ worldrenderer.pos(x + width, y, 0.0D).color(color).endVertex();
+ tessellator.draw();
+
+ GlStateManager.enableTexture2D();
+ GlStateManager.disableBlend();
+ }
+
/**
* Draws a solid color rectangle with the specified coordinates and color (ARGB format). Args: x1, y1, x2, y2, color
*/
diff --git a/src/main/java/net/minecraft/client/gui/GuiButton.java b/src/main/java/net/minecraft/client/gui/GuiButton.java
index d69dee2e..86f94ea2 100644
--- a/src/main/java/net/minecraft/client/gui/GuiButton.java
+++ b/src/main/java/net/minecraft/client/gui/GuiButton.java
@@ -5,7 +5,9 @@ import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ResourceLocation;
+import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -98,7 +100,8 @@ public class GuiButton extends Gui
int j = 14737632;
RoundedUtils.drawRoundedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 12, hovered ? new Color(200,200,200,100).getRGB() : new Color(100,100,100,100).getRGB());
- RoundedUtils.drawRoundedRect(this.xPosition + 1, this.yPosition + 1, (this.xPosition + this.width) - 1, (this.yPosition + this.height) - 1, 12, new Color(22, 24, 27,100).getRGB());
+ RoundedUtils.drawGradientRound(this.xPosition + 1, this.yPosition + 1, (this.width) - 1, (this.height) - 1, 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
+ //RoundedUtils.drawRoundedRect(this.xPosition + 1, this.yPosition + 1, (this.xPosition + this.width) - 1, (this.yPosition + this.height) - 1, 12, new Color(22, 24, 27,100).getRGB());
if (!this.enabled)
diff --git a/src/main/java/net/minecraft/client/gui/GuiNewChat.java b/src/main/java/net/minecraft/client/gui/GuiNewChat.java
index 7fa01469..8f855295 100644
--- a/src/main/java/net/minecraft/client/gui/GuiNewChat.java
+++ b/src/main/java/net/minecraft/client/gui/GuiNewChat.java
@@ -11,6 +11,7 @@ import net.minecraft.util.IChatComponent;
import net.minecraft.util.MathHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
import rip.athena.client.modules.impl.render.Chat;
@@ -85,11 +86,7 @@ public class GuiNewChat extends Gui
String s = chatline.getChatComponent().getFormattedText();
GlStateManager.color(1,1,1);
GlStateManager.enableBlend();
- if(Chat.customFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawStringWithShadow(s, (float) i2, (float) (j2 - 10), 16777215 + (l1 << 24));
- } else {
- this.mc.fontRendererObj.drawStringWithShadow(s, (float) i2, (float) (j2 - 8), 16777215 + (l1 << 24));
- }
+ this.mc.fontRendererObj.drawStringWithShadow(s, (float) i2, (float) (j2 - 8), 16777215 + (l1 << 24));
GlStateManager.disableAlpha();
GlStateManager.disableBlend();
}
@@ -175,9 +172,12 @@ public class GuiNewChat extends Gui
{
this.chatLines.add(0, new ChatLine(p_146237_3_, p_146237_1_, p_146237_2_));
- while (this.chatLines.size() > 100)
- {
- this.chatLines.remove(this.chatLines.size() - 1);
+ Chat mod = (Chat) Athena.INSTANCE.getModuleManager().get(Chat.class);
+
+ if(!mod.isToggled() && !mod.infiniteChat) {
+ while (this.chatLines.size() > 100) {
+ this.chatLines.remove(this.chatLines.size() - 1);
+ }
}
}
}
diff --git a/src/main/java/net/minecraft/client/gui/GuiOptions.java b/src/main/java/net/minecraft/client/gui/GuiOptions.java
index cefdfbf4..d5d24405 100644
--- a/src/main/java/net/minecraft/client/gui/GuiOptions.java
+++ b/src/main/java/net/minecraft/client/gui/GuiOptions.java
@@ -214,11 +214,11 @@ public class GuiOptions extends GuiScreen implements GuiYesNoCallback
if (istream.func_152936_l() && istream.func_152928_D())
{
- this.mc.displayGuiScreen(new GuiStreamOptions(this, this.game_settings_1));
+ //this.mc.displayGuiScreen(new GuiStreamOptions(this, this.game_settings_1));
}
else
{
- GuiStreamUnavailable.func_152321_a(this);
+ //GuiStreamUnavailable.func_152321_a(this);
}
}
}
diff --git a/src/main/java/net/minecraft/client/gui/stream/GuiStreamOptions.java b/src/main/java/net/minecraft/client/gui/stream/GuiStreamOptions.java
index 490bba29..3ea10e7f 100644
--- a/src/main/java/net/minecraft/client/gui/stream/GuiStreamOptions.java
+++ b/src/main/java/net/minecraft/client/gui/stream/GuiStreamOptions.java
@@ -33,8 +33,8 @@ public class GuiStreamOptions extends GuiScreen
public void initGui()
{
int i = 0;
- this.field_152319_i = I18n.format("options.stream.title", new Object[0]);
- this.field_152313_r = I18n.format("options.stream.chat.title", new Object[0]);
+ //this.field_152319_i = I18n.format("options.stream.title", new Object[0]);
+ //this.field_152313_r = I18n.format("options.stream.chat.title", new Object[0]);
for (GameSettings.Options gamesettings$options : field_152312_a)
{
diff --git a/src/main/java/net/minecraft/client/multiplayer/PlayerControllerMP.java b/src/main/java/net/minecraft/client/multiplayer/PlayerControllerMP.java
index 495b3061..9fdbdbf7 100644
--- a/src/main/java/net/minecraft/client/multiplayer/PlayerControllerMP.java
+++ b/src/main/java/net/minecraft/client/multiplayer/PlayerControllerMP.java
@@ -28,6 +28,8 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraft.world.WorldSettings;
+import rip.athena.client.Athena;
+import rip.athena.client.events.types.entity.AttackEntityEvent;
public class PlayerControllerMP
{
@@ -490,6 +492,8 @@ public class PlayerControllerMP
*/
public void attackEntity(EntityPlayer playerIn, Entity targetEntity)
{
+ if(!Athena.INSTANCE.getEventBus().post(new AttackEntityEvent(playerIn, targetEntity))) return;
+
this.syncCurrentPlayItem();
this.netClientHandler.addToSendQueue(new C02PacketUseEntity(targetEntity, C02PacketUseEntity.Action.ATTACK));
diff --git a/src/main/java/net/minecraft/client/renderer/EntityRenderer.java b/src/main/java/net/minecraft/client/renderer/EntityRenderer.java
index bf21e9a9..7461b57e 100644
--- a/src/main/java/net/minecraft/client/renderer/EntityRenderer.java
+++ b/src/main/java/net/minecraft/client/renderer/EntityRenderer.java
@@ -87,10 +87,7 @@ import org.lwjgl.util.glu.Project;
import rip.athena.client.Athena;
import rip.athena.client.events.types.render.RenderEvent;
import rip.athena.client.events.types.render.RenderType;
-import rip.athena.client.modules.impl.mods.NoHurtCam;
-import rip.athena.client.modules.impl.mods.Zoom;
-import rip.athena.client.modules.impl.mods.Freelook;
-import rip.athena.client.modules.impl.mods.OldAnimations;
+import rip.athena.client.modules.impl.mods.*;
import shadersmod.client.Shaders;
import shadersmod.client.ShadersRender;
@@ -941,7 +938,12 @@ public class EntityRenderer implements IResourceManagerReloadListener
if (this.mc.gameSettings.viewBobbing)
{
- this.setupViewBobbing(partialTicks);
+ MinimalBobbing module = (MinimalBobbing) Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class);
+ if(Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class).isToggled() && module.screenBobbing) {
+ } else {
+ this.setupViewBobbing(partialTicks);
+ }
+ //this.setupViewBobbing(partialTicks);
}
float f1 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * partialTicks;
@@ -1040,7 +1042,11 @@ public class EntityRenderer implements IResourceManagerReloadListener
if (this.mc.gameSettings.viewBobbing)
{
- this.setupViewBobbing(p_renderHand_1_);
+ MinimalBobbing module = (MinimalBobbing) Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class);
+ if(Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class).isToggled() && module.handBobbing) {
+ } else {
+ this.setupViewBobbing(p_renderHand_1_);
+ }
}
flag = this.mc.getRenderViewEntity() instanceof EntityLivingBase && ((EntityLivingBase)this.mc.getRenderViewEntity()).isPlayerSleeping();
@@ -1080,7 +1086,12 @@ public class EntityRenderer implements IResourceManagerReloadListener
if (this.mc.gameSettings.viewBobbing)
{
- this.setupViewBobbing(p_renderHand_1_);
+ MinimalBobbing module = (MinimalBobbing) Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class);
+ if(Athena.INSTANCE.getModuleManager().get(MinimalBobbing.class).isToggled() && module.handBobbing) {
+ } else {
+ this.setupViewBobbing(p_renderHand_1_);
+ }
+ //this.setupViewBobbing(p_renderHand_1_);
}
}
}
diff --git a/src/main/java/net/minecraft/client/renderer/WorldRenderer.java b/src/main/java/net/minecraft/client/renderer/WorldRenderer.java
index c276928e..d99f12ec 100644
--- a/src/main/java/net/minecraft/client/renderer/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/renderer/WorldRenderer.java
@@ -484,6 +484,10 @@ public class WorldRenderer
return this.color((int)(p_181666_1_ * 255.0F), (int)(p_181666_2_ * 255.0F), (int)(p_181666_3_ * 255.0F), (int)(p_181666_4_ * 255.0F));
}
+ public WorldRenderer color(int colorHex) {
+ return this.color(colorHex >> 16 & 255, colorHex >> 8 & 255, colorHex & 255, colorHex >> 24 & 255);
+ }
+
public WorldRenderer color(int p_181669_1_, int p_181669_2_, int p_181669_3_, int p_181669_4_)
{
if (this.needsUpdate)
diff --git a/src/main/java/net/minecraft/client/renderer/entity/Render.java b/src/main/java/net/minecraft/client/renderer/entity/Render.java
index 242b24d4..6aabe190 100644
--- a/src/main/java/net/minecraft/client/renderer/entity/Render.java
+++ b/src/main/java/net/minecraft/client/renderer/entity/Render.java
@@ -23,6 +23,8 @@ import net.minecraft.world.World;
import optifine.Config;
import org.lwjgl.opengl.GL11;
+import rip.athena.client.Athena;
+import rip.athena.client.modules.impl.other.NickHider;
import rip.athena.client.socket.SocketClient;
import shadersmod.client.Shaders;
@@ -348,6 +350,7 @@ public abstract class Render
*/
protected void renderLivingLabel(T entityIn, String str, double x, double y, double z, int maxDistance)
{
+
double d0 = entityIn.getDistanceSqToEntity(this.renderManager.livingPlayer);
if (d0 <= (double)(maxDistance * maxDistance))
diff --git a/src/main/java/net/minecraft/client/renderer/entity/RendererLivingEntity.java b/src/main/java/net/minecraft/client/renderer/entity/RendererLivingEntity.java
index c136c4ea..89417a3c 100644
--- a/src/main/java/net/minecraft/client/renderer/entity/RendererLivingEntity.java
+++ b/src/main/java/net/minecraft/client/renderer/entity/RendererLivingEntity.java
@@ -31,6 +31,7 @@ import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import rip.athena.client.Athena;
import rip.athena.client.events.types.render.RenderEntityEvent;
+import rip.athena.client.modules.impl.other.NickHider;
import rip.athena.client.modules.impl.other.Settings;
import rip.athena.client.modules.impl.render.CustomHitColor;
import shadersmod.client.Shaders;
@@ -553,8 +554,8 @@ public abstract class RendererLivingEntity extends R
{
Settings settings = (Settings) Athena.INSTANCE.getModuleManager().get(Settings.class);
- if (this.canRenderName(entity) || settings.F5Nametags && entity instanceof EntityPlayer && entity == Minecraft.getMinecraft().thePlayer)
- {
+ if (this.canRenderName(entity) || settings.F5Nametags && entity instanceof EntityPlayer && entity == Minecraft.getMinecraft().thePlayer) {
+
double d0 = entity.getDistanceSqToEntity(this.renderManager.livingPlayer);
float f = entity.isSneaking() ? NAME_TAG_RANGE_SNEAK : NAME_TAG_RANGE;
diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayer.java b/src/main/java/net/minecraft/entity/player/EntityPlayer.java
index 72344557..3f626d9e 100644
--- a/src/main/java/net/minecraft/entity/player/EntityPlayer.java
+++ b/src/main/java/net/minecraft/entity/player/EntityPlayer.java
@@ -75,6 +75,7 @@ import net.minecraft.world.LockCode;
import net.minecraft.world.World;
import net.minecraft.world.WorldSettings;
import rip.athena.client.Athena;
+import rip.athena.client.events.types.entity.AttackEntityEvent;
import rip.athena.client.events.types.entity.PlayerInteractEvent;
import rip.athena.client.events.types.entity.PlayerTickEvent;
diff --git a/src/main/java/rip/athena/client/Athena.java b/src/main/java/rip/athena/client/Athena.java
index ec12cec5..2dd8fdd6 100644
--- a/src/main/java/rip/athena/client/Athena.java
+++ b/src/main/java/rip/athena/client/Athena.java
@@ -5,6 +5,7 @@ import net.minecraft.client.Minecraft;
import org.json.JSONException;
import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
+import rip.athena.client.account.AccountManager;
import rip.athena.client.config.save.ConfigManager;
import rip.athena.client.events.EventBus;
import rip.athena.client.events.SubscribeEvent;
@@ -13,6 +14,7 @@ import rip.athena.client.gui.hud.HUDManager;
import rip.athena.client.gui.notifications.NotificationManager;
import rip.athena.client.macros.MacroManager;
import rip.athena.client.modules.ModuleManager;
+import rip.athena.client.modules.impl.other.AimTrainer;
import rip.athena.client.requests.ContentType;
import rip.athena.client.requests.WebRequest;
import rip.athena.client.requests.WebRequestResult;
@@ -49,6 +51,7 @@ public class Athena {
public static final File MAIN_DIR = Paths.get(Minecraft.getMinecraft().mcDataDir.getAbsolutePath(), "settings").toFile();
public static final File CONFIGS_DIR = Paths.get(MAIN_DIR.getAbsolutePath(), "configs").toFile();
+ public static final File ACCOUNTS_DIR = new File(MAIN_DIR.getAbsolutePath(), "accounts.json");
private final PrefixedLogger log = new PrefixedLogger("Athena");
@@ -57,6 +60,7 @@ public class Athena {
private final String clientBuild = "230601";
private NotificationManager notificationManager;
+ private AccountManager accountManager;
private ConfigManager configManager;
private ModuleManager moduleManager;
private ThemeManager themeManager;
@@ -80,12 +84,21 @@ public class Athena {
MAIN_DIR.mkdir();
}
+ if(!ACCOUNTS_DIR.exists()) {
+ try {
+ ACCOUNTS_DIR.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
if(SocketClient.isClientRunning()) {
JOptionPane.showMessageDialog(null, "Port 1337 already in use.");
System.exit(0);
}
this.configManager = new ConfigManager(CONFIGS_DIR);
+ this.accountManager = new AccountManager();
this.moduleManager = new ModuleManager();
this.themeManager = new ThemeManager();
this.macroManager = new MacroManager();
diff --git a/src/main/java/rip/athena/client/account/Account.java b/src/main/java/rip/athena/client/account/Account.java
new file mode 100644
index 00000000..310ec333
--- /dev/null
+++ b/src/main/java/rip/athena/client/account/Account.java
@@ -0,0 +1,77 @@
+package rip.athena.client.account;
+
+import rip.athena.client.utils.animations.simple.SimpleAnimation;
+import rip.athena.client.utils.time.TimerUtil;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class Account {
+
+ private AccountType accountType;
+
+ private String username, uuid, token;
+
+ private String info;
+
+ private TimerUtil timer;
+
+ public SimpleAnimation opacityAnimation = new SimpleAnimation(0.0F);
+ public boolean isDone;
+
+ public Account(AccountType accountType, String username, String uuid, String token) {
+ this.accountType = accountType;
+ this.username = username;
+ this.uuid = uuid;
+ this.token = token;
+ this.info = "";
+ this.timer = new TimerUtil();
+ this.isDone = true;
+ }
+
+ public AccountType getAccountType() {
+ return accountType;
+ }
+
+ public void setAccountType(AccountType accountType) {
+ this.accountType = accountType;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public String getInfo() {
+ return info;
+ }
+
+ public void setInfo(String info) {
+ this.info = info;
+ }
+
+ public TimerUtil getTimer() {
+ return timer;
+ }
+}
diff --git a/src/main/java/rip/athena/client/account/AccountManager.java b/src/main/java/rip/athena/client/account/AccountManager.java
new file mode 100644
index 00000000..9baaa88f
--- /dev/null
+++ b/src/main/java/rip/athena/client/account/AccountManager.java
@@ -0,0 +1,157 @@
+package rip.athena.client.account;
+
+import fr.litarvan.openauth.microsoft.MicrosoftAuthResult;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticationException;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticator;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.Session;
+import rip.athena.client.Athena;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * @project Athena-Client
+ * @author Athena Development
+ * @date 6/10/2023
+ */
+public class AccountManager {
+
+ private Minecraft mc = Minecraft.getMinecraft();
+
+ private ArrayList accounts = new ArrayList<>();
+
+ public boolean isFirstLogin = false;
+
+ private Account currentAccount;
+
+ public AccountManager() {
+
+ if(Athena.ACCOUNTS_DIR.length() == 0) {
+ isFirstLogin = true;
+ }
+
+ this.load();
+ this.login(currentAccount);
+ }
+
+ public void save() {
+ ArrayList toSave = new ArrayList<>();
+
+ for (Account a : Athena.INSTANCE.getAccountManager().getAccounts()) {
+ toSave.add("Account:" + a.getAccountType().toString() + ":" + a.getUsername() + ":" + a.getUuid() + ":" + a.getToken());
+ }
+
+ toSave.add("Current:" + getCurrentAccount().getUsername());
+
+ try {
+ PrintWriter pw = new PrintWriter(Athena.ACCOUNTS_DIR);
+ for (String str : toSave) {
+ pw.println(str);
+ }
+ pw.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void load() {
+ ArrayList lines = new ArrayList();
+
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader(Athena.ACCOUNTS_DIR));
+ String line = reader.readLine();
+ while (line != null) {
+ lines.add(line);
+ line = reader.readLine();
+ }
+ reader.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ for (String s : lines) {
+
+ String[] args = s.split(":");
+
+ if (s.toLowerCase().startsWith("account:")) {
+
+ AccountType accountType = AccountType.MICROSOFT;
+
+ if(args[1].equals("MICROSOFT")) {
+ accountType = AccountType.MICROSOFT;
+ }
+
+ if(args[1].equals("SESSION")) {
+ accountType = AccountType.SESSION;
+ }
+
+ if(args[1].equals("CRACKED")) {
+ accountType = AccountType.CRACKED;
+ }
+
+ accounts.add(new Account(accountType, args[2], args[3], args[4]));
+ }
+
+ if (s.toLowerCase().startsWith("current:")) {
+ setCurrentAccount(getAccountByUsername(args[1]));
+ }
+ }
+ }
+
+ private void login(Account a) {
+
+ if(a == null) {
+ return;
+ }
+
+ if(a.getAccountType().equals(AccountType.MICROSOFT)) {
+ MicrosoftAuthenticator authenticator = new MicrosoftAuthenticator();
+ a.setInfo("Loading...");
+ try {
+ MicrosoftAuthResult acc = authenticator.loginWithRefreshToken(a.getToken());
+ mc.session = new Session(acc.getProfile().getName(), acc.getProfile().getId(), acc.getAccessToken(), "legacy");
+ a.setInfo("Success");
+ } catch (MicrosoftAuthenticationException e) {
+ e.printStackTrace();
+ a.setInfo("Error");
+ }
+ }
+
+ if(a.getAccountType().equals(AccountType.SESSION)) {
+ a.setInfo("Loading...");
+ try {
+ mc.session = new Session(a.getUsername(), a.getUuid(), a.getToken(), "mojang");
+ a.setInfo("Success!");
+ } catch (Exception e) {
+ e.printStackTrace();
+ a.setInfo("Error");
+ }
+ }
+
+ if(a.getAccountType().equals(AccountType.CRACKED)) {
+ a.setInfo("Success");
+ mc.session = new Session(a.getUsername(), "0", "0", "legacy");
+ }
+ }
+
+ public Account getAccountByUsername(String name) {
+ return accounts.stream().filter(account -> account.getUsername().equalsIgnoreCase(name)).findFirst().orElse(null);
+ }
+
+ public ArrayList getAccounts() {
+ return accounts;
+ }
+
+ public Account getCurrentAccount() {
+ return currentAccount;
+ }
+
+ public void setCurrentAccount(Account currentAccount) {
+ this.currentAccount = currentAccount;
+ }
+}
diff --git a/src/main/java/rip/athena/client/account/AccountType.java b/src/main/java/rip/athena/client/account/AccountType.java
new file mode 100644
index 00000000..bb97ae97
--- /dev/null
+++ b/src/main/java/rip/athena/client/account/AccountType.java
@@ -0,0 +1,10 @@
+package rip.athena.client.account;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public enum AccountType {
+ MICROSOFT, CRACKED, SESSION;
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/config/save/Config.java b/src/main/java/rip/athena/client/config/save/Config.java
index ffef14ea..4391b20e 100644
--- a/src/main/java/rip/athena/client/config/save/Config.java
+++ b/src/main/java/rip/athena/client/config/save/Config.java
@@ -15,7 +15,7 @@ import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.macros.Macro;
import rip.athena.client.modules.Module;
import rip.athena.client.modules.impl.render.Crosshair;
-import rip.athena.client.theme.Theme;
+import rip.athena.client.theme.impl.AccentTheme;
import rip.athena.client.utils.StringUtils;
import rip.athena.client.utils.file.FileHandler;
import rip.athena.client.utils.input.BindType;
@@ -147,7 +147,7 @@ public class Config {
String themeIdentifier = obj.getString("theme");
- for (Theme theme : Theme.values()) {
+ for (AccentTheme theme : AccentTheme.values()) {
if (theme.name().equalsIgnoreCase(themeIdentifier)) {
Athena.INSTANCE.getThemeManager().setTheme(theme);
break;
diff --git a/src/main/java/rip/athena/client/gui/clickgui/IngameMenu.java b/src/main/java/rip/athena/client/gui/clickgui/IngameMenu.java
index 386f77d6..183975f1 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/IngameMenu.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/IngameMenu.java
@@ -45,13 +45,13 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
private static boolean initd;
private static int savedWidth = -1;
private static int savedHeight = -1;
-
+
public IngameMenu(Module feature, Menu menu) {
super(feature, menu);
-
+
pageManager = new PageManager(this, menu);
}
-
+
@Override
public void initGui() {
@@ -59,14 +59,14 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
menu.getComponents().clear();
initd = false;
}
-
+
if(!initd) {
for(IPage page : pageManager.getPages().values()) {
page.onInit();
}
-
+
menu.addComponent(new MenuDraggable(0, 0, menu.getWidth(), 58));
-
+
int x = 175;
//int y = 58 / 2 + 2;
@@ -80,24 +80,24 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
if(IngameMenu.category != null) {
pageManager.getPage(IngameMenu.category).onUnload();
}
-
+
IngameMenu.category = category;
-
+
for(MenuComponent component : menu.getComponents()) {
if(component instanceof CategoryButton) {
CategoryButton button = (CategoryButton) component;
button.setActive(component == this);
}
}
-
+
initPage();
}
};
-
+
if(category == IngameMenu.category) {
comp.setActive(true);
}
-
+
menu.addComponent(comp);
if(Settings.customGuiFont) {
x += rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(category.getName()) + 20;
@@ -110,14 +110,14 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
initPage();
initd = true;
}
-
+
if(category != null) {
pageManager.getPage(category).onOpen();
}
-
+
super.initGui();
}
-
+
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
if(savedWidth != mc.displayWidth || savedHeight != mc.displayHeight) {
@@ -136,10 +136,10 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
drawShadowDown(menu.getX(), menu.getY() + 58, menu.getWidth());
- RoundedUtils.drawRoundedOutline(menu.getX(), menu.getY(), menu.getX() + menu.getWidth(), menu.getY() + menu.getHeight(), 32, 5, new Color(50, 50, 50, 255).getRGB());
- RoundedUtils.drawRoundedRect(menu.getX(), menu.getY(), menu.getX() + menu.getWidth(), menu.getY() + menu.getHeight(), 32, new Color(30, 30, 30, 255).getRGB());
+ RoundedUtils.drawRoundedOutline(menu.getX(), menu.getY(), menu.getX() + menu.getWidth(), menu.getY() + menu.getHeight(), 32, 5, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ RoundedUtils.drawRoundedRect(menu.getX(), menu.getY(), menu.getX() + menu.getWidth(), menu.getY() + menu.getHeight(), 32, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
- rip.athena.client.utils.font.FontManager.getNunitoBold(50).drawString(Athena.INSTANCE.getClientName().toUpperCase(), menu.getX() + 60, menu.getY() + 17, MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(50).drawString(Athena.INSTANCE.getClientName().toUpperCase(), menu.getX() + 60, menu.getY() + 17, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
//DrawUtils.drawImage(new ResourceLocation("Athena/logo/pride.png"), (int) (menu.getX() + FontManager.font1.getStringWidth(Athena.INSTANCE.getClientName().toUpperCase()) + 70), (int) (menu.getY() - 10 + FontManager.font1.getHeight(Athena.INSTANCE.getClientName().toUpperCase())), 30, 30);
@@ -149,38 +149,38 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
if(category != null) {
pageManager.getPage(category).onRender();
}
-
+
GlStateManager.popMatrix();
-
+
super.drawScreen(mouseX, mouseY, partialTicks);
GlStateManager.pushMatrix();
GlStateManager.scale(value, value, value);
-
+
for(MenuComponent component : menu.getComponents()) {
if(component instanceof MenuScrollPane) {
MenuScrollPane scrollpane = (MenuScrollPane) component;
-
+
scrollpane.drawExtras();
}
}
-
+
GlStateManager.popMatrix();
}
-
+
public void initPage() {
List remove = new ArrayList<>();
-
+
for(MenuComponent component : menu.getComponents()) {
if(component instanceof CategoryButton || component instanceof MenuDraggable) {
continue;
}
-
+
remove.add(component);
}
-
+
menu.getComponents().removeAll(remove);
-
+
pageManager.getPage(category).onLoad();
}
@@ -188,25 +188,25 @@ public class IngameMenu extends MinecraftMenuImpl implements DrawImpl {
if(category != null) {
pageManager.getPage(category).onUnload();
}
-
+
category = Category.MODS;
-
+
pageManager.getPage(ModsPage.class, Category.MODS).activeModule = parent;
-
+
initPage();
}
-
+
@Override
public void onGuiClosed() {
if(category != null) {
pageManager.getPage(category).onClose();
}
-
+
super.onGuiClosed();
-
+
new Thread(() -> {
Config config = Athena.INSTANCE.getConfigManager().getLoadedConfig();
-
+
if(config != null) {
config.save();
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/macros/MacroBase.java b/src/main/java/rip/athena/client/gui/clickgui/components/macros/MacroBase.java
index 4c527432..142017dd 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/macros/MacroBase.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/macros/MacroBase.java
@@ -2,6 +2,7 @@ package rip.athena.client.gui.clickgui.components.macros;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
+import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
import rip.athena.client.gui.framework.MenuComponent;
import rip.athena.client.gui.framework.MenuPriority;
@@ -69,7 +70,7 @@ public class MacroBase extends MenuComponent {
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x, y, width, height, backgroundColor);
GlStateManager.color(1,1,1);
- RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, backgroundColor);
+ RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getThirdColor());
/*drawHorizontalLine(x, y, width + 1, 1, lineColor);
drawVerticalLine(x, y + 1, height - 1, 1, lineColor);
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/CategoryButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/CategoryButton.java
index 636681b0..aae043af 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/CategoryButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/CategoryButton.java
@@ -64,9 +64,9 @@ public class CategoryButton extends MenuButton {
//RoundedUtils.drawRoundedRect(x + 30, y, x + width - 20, y + height, 12, new Color(25,25,25,255).getRGB());
}
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(20).drawString(text, x + 70, y + height / 2 - (getStringHeight(text) / 2) + 2, textColor);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(20).drawString(text, x + 70, y + height / 2 - (getStringHeight(text) / 2) + 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
DrawUtils.drawImage(image, x + 35, y + 3, 25, 25);
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/FeatureText.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/FeatureText.java
index ddca572c..f02fe87c 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/FeatureText.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/FeatureText.java
@@ -1,6 +1,7 @@
package rip.athena.client.gui.clickgui.components.mods;
import net.minecraft.client.Minecraft;
+import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
import rip.athena.client.gui.framework.components.MenuLabel;
import rip.athena.client.gui.framework.draw.ButtonState;
@@ -37,9 +38,9 @@ public class FeatureText extends MenuLabel {
@Override
public void drawText(String text, int x, int y, int color) {
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString(text, x, y, color);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString(text, x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, x, y, color);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/GoBackButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/GoBackButton.java
index 5a985331..650a0b7b 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/GoBackButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/GoBackButton.java
@@ -2,6 +2,7 @@ package rip.athena.client.gui.clickgui.components.mods;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
+import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
import rip.athena.client.gui.framework.components.MenuButton;
import rip.athena.client.gui.framework.draw.ButtonState;
@@ -121,7 +122,7 @@ public class GoBackButton extends MenuButton {
GlStateManager.color(1, 1,1);
- DrawUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, rounding, 83886080);
+ DrawUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
DrawUtils.drawRoundedRect(x - 3, y - 3, x + width + 4, y + height + 4, rounding, 335544320);
DrawUtils.drawRoundedRect(x - 2, y - 2, x + width + 3, y + height + 3, rounding, 436207616);
@@ -135,9 +136,9 @@ public class GoBackButton extends MenuButton {
DrawUtils.drawRoundedRect(x + 1, y + 1, x + width, y + height, rounding, backgroundColor);*/
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), textColor);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
x -= 20;
width = 30;
@@ -147,9 +148,9 @@ public class GoBackButton extends MenuButton {
x -= 2;
y -= 2;
- DrawUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, rounding, 83886080);
- DrawUtils.drawRoundedRect(x - 3, y - 3, x + width + 4, y + height + 4, rounding, 335544320);
- DrawUtils.drawRoundedRect(x - 2, y - 2, x + width + 3, y + height + 3, rounding, 436207616);
+ DrawUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
+ DrawUtils.drawRoundedRect(x - 3, y - 3, x + width + 4, y + height + 4, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ DrawUtils.drawRoundedRect(x - 2, y - 2, x + width + 3, y + height + 3, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
height -= 4;
width -= 4;
@@ -157,8 +158,8 @@ public class GoBackButton extends MenuButton {
y += 2;
DrawUtils.drawRoundedRect(x - 1, y - 1, x + width + 2, y + height + 2, rounding, lineColor);
- DrawUtils.drawRoundedRect(x, y, x + width + 1, y + height + 1, rounding, lineColor);
- DrawUtils.drawRoundedRect(x + 1, y + 1, x + width, y + height, rounding, backgroundColor);
+ DrawUtils.drawRoundedRect(x, y, x + width + 1, y + height + 1, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ DrawUtils.drawRoundedRect(x + 1, y + 1, x + width, y + height, rounding, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
mouseDown = false;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModKeybind.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModKeybind.java
index 5a3be8cf..34297f61 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModKeybind.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModKeybind.java
@@ -163,7 +163,7 @@ public class MenuModKeybind extends MenuComponent {
GlStateManager.color(1,1,1);
- DrawUtils.drawRoundedRect(x, y, x + width, y + height, 4.0f, new Color(50, 50, 50, 255).getRGB());
+ DrawUtils.drawRoundedRect(x, y, x + width, y + height, 4.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
RoundedUtils.drawRoundedGradientOutlineCorner(x, y, x + width, y + height, 1, 12, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB());
//DrawUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 4.0f, new Color(35, 35, 35, 255).getRGB());
@@ -202,7 +202,7 @@ public class MenuModKeybind extends MenuComponent {
text = "BOUND: " + Keyboard.getKeyName(getBind()).toUpperCase();
}
- drawText(text, x + width / 2 - getStringWidth(text) / 2, y + height / 2 - getStringHeight(text) / 2, textColor);
+ drawText(text, x + width / 2 - getStringWidth(text) / 2, y + height / 2 - getStringHeight(text) / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
mouseDown = false;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModList.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModList.java
index 38d15bb0..2db40c13 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModList.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModList.java
@@ -114,7 +114,7 @@ public class MenuModList extends MenuDropdown {
GlStateManager.color(1,1,1);
- RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, new Color(50, 50, 50, 255).getRGB());
+ RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
//RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 12.0f, new Color(35, 35, 35, 255).getRGB());
RoundedUtils.drawRoundedGradientOutlineCorner(x, y, x + width, y + height, 1, 12, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB());
@@ -135,7 +135,7 @@ public class MenuModList extends MenuDropdown {
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x, y, cursorWidth, height + 1, popupColor);
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + 1, y + 1, cursorWidth - 2, height - 1, backgroundColor);
- drawText("<", x + (cursorWidth / 2) - getStringWidth("<") / 2, y + height / 2 - getStringHeight("<") / 2, textColor);
+ drawText("<", x + (cursorWidth / 2) - getStringWidth("<") / 2, y + height / 2 - getStringHeight("<") / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
if(mouseX < x + width - cursorWidth - 1) {
backgroundColor = defBg;
@@ -145,10 +145,10 @@ public class MenuModList extends MenuDropdown {
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + width - cursorWidth, y, cursorWidth, height + 1, popupColor);
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + width - cursorWidth + 1, y + 1, cursorWidth - 2, height - 1, backgroundColor);
- drawText(">", x + width - cursorWidth + 3 + (cursorWidth / 2) - getStringWidth(">") / 2, y + height / 2 - getStringHeight(">") / 2, textColor);
+ drawText(">", x + width - cursorWidth + 3 + (cursorWidth / 2) - getStringWidth(">") / 2, y + height / 2 - getStringHeight(">") / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
String text = values[index].toUpperCase();
- drawText(text, x + width / 2 - getStringWidth(text) / 2, y + height / 2 - getStringHeight(text) / 2, textColor);
+ drawText(text, x + width / 2 - getStringWidth(text) / 2, y + height / 2 - getStringHeight(text) / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
mouseDown = false;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModSlider.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModSlider.java
index c1626260..2dec564d 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModSlider.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/MenuModSlider.java
@@ -75,8 +75,8 @@ public class MenuModSlider extends MenuSlider {
GlStateManager.color(1,1,1);
- RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, new Color(50, 50, 50, 255).getRGB());
- RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 12.0f, new Color(35, 35, 35, 255).getRGB());
+ RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 12.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
/*drawHorizontalLine(x, y, width + 1, 1, lineColor);
drawVerticalLine(x, y + 1, height - 1, 1, lineColor);
@@ -112,7 +112,7 @@ public class MenuModSlider extends MenuSlider {
}
rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + cursorPos - cursorWidth, y, cursorWidth + 2, height + 1, linePopupColor);
- rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + 1 + cursorPos - cursorWidth, y + 1, cursorWidth, height - 1, backgroundPopupColor);
+ rip.athena.client.gui.framework.draw.DrawImpl.drawRect(x + 1 + cursorPos - cursorWidth, y + 1, cursorWidth, height - 1, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
drawText(">", x + 3 + cursorPos - (cursorWidth / 2) - getStringWidth(">") / 2, y + height / 2 - getStringHeight(">") / 2, textColor);
if(wantToDrag || (mouseDown && lastState == ButtonState.HOVER)) {
if(mouseDown) {
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModCategoryButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModCategoryButton.java
index 7d2dab44..ffdf9d1a 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModCategoryButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModCategoryButton.java
@@ -73,9 +73,13 @@ public class ModCategoryButton extends MenuButton {
}
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(25).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2) - 3, textColor);
+ if(text.equalsIgnoreCase("EDIT HUD")) {
+ rip.athena.client.utils.font.FontManager.getNunitoBold(25).drawString(text, x + (width / 2 - getStringWidth(text) / 2) - 7, y + height / 2 - (getStringHeight(text) / 2) - 3, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+ } else {
+ rip.athena.client.utils.font.FontManager.getNunitoBold(25).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2) - 3, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+ }
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2) - 3, textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2) - 3, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
if(text.equalsIgnoreCase("EDIT HUD")) {
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModScrollPane.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModScrollPane.java
index f2572883..e8ae58d5 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModScrollPane.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModScrollPane.java
@@ -237,7 +237,7 @@ public class ModScrollPane extends MenuScrollPane {
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(scrollerX, y + 1, scrollerWidth, scrollerHeight + 2, getColor(DrawType.LINE, ButtonState.NORMAL));
//rip.athena.client.gui.framework.draw.DrawImpl.drawRect(scrollerX + 1, y + 2, scrollerWidth - 2, scrollerHeight, getColor(DrawType.BACKGROUND, ButtonState.NORMAL));
- RoundedUtils.drawRoundedRect(scrollerX + 2, y + 2, scrollerX + scrollerWidth - 2, y + scrollerHeight, 6, getColor(DrawType.BACKGROUND, ButtonState.NORMAL));
+ RoundedUtils.drawRoundedRect(scrollerX + 2, y + 2, scrollerX + scrollerWidth - 2, y + scrollerHeight, 6, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
//RoundedUtils.drawRoundedRect(scrollerX - 3, newY - 3, scrollerWidth + 6, newSize + 6, 12, -1);
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModTextbox.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModTextbox.java
index dbde667f..aeefaed8 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModTextbox.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModTextbox.java
@@ -11,6 +11,7 @@ import org.lwjgl.input.Keyboard;
import rip.athena.client.gui.clickgui.IngameMenu;
import rip.athena.client.modules.impl.other.Settings;
import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.utils.render.RoundedUtils;
import java.awt.*;
@@ -63,9 +64,9 @@ public class ModTextbox extends MenuTextField {
GlStateManager.color(1, 1,1);
- DrawUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, 4, 83886080);
- DrawUtils.drawRoundedRect(x - 3, y - 3, x + width + 4, y + height + 4, 4, 369098752);
- DrawUtils.drawRoundedRect(x - 2, y - 2, x + width + 3, y + height + 3, 4, 587202560);
+ RoundedUtils.drawRoundedRect(x - 4, y - 4, x + width + 5, y + height + 5, 12, 83886080);
+ RoundedUtils.drawRoundedRect(x - 3, y - 3, x + width + 4, y + height + 4, 12, 369098752);
+ RoundedUtils.drawRoundedRect(x - 2, y - 2, x + width + 3, y + height + 3, 12, 587202560);
//DrawUtils.drawRoundedRect(x - 1, y - 1, x + width + 2, y + height + 2, 10, lineColor);
//DrawUtils.drawRoundedRect(x, y, x + width + 1, y + height + 1, 10, lineColor);
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModsButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModsButton.java
index 4cea4552..ddb86994 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModsButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModsButton.java
@@ -117,7 +117,7 @@ public class ModsButton extends MenuButton {
GlStateManager.color(1,1,1);
- RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, new Color(50, 50, 50, 255).getRGB());
+ RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
RoundedUtils.drawRoundedGradientOutlineCorner(x, y, x + width, y + height, 1, 12, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor().getRGB());
//RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 12.0f, new Color(35, 35, 35, 255).getRGB());
@@ -128,9 +128,9 @@ public class ModsButton extends MenuButton {
drawVerticalLine(x + width, y + 1, height - 1, 1, lineColor);*/
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), textColor);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, x + (width / 2 - getStringWidth(text) / 2), y + height / 2 - (getStringHeight(text) / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
mouseDown = false;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModuleBox.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModuleBox.java
index 7a19413a..2de1f91c 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModuleBox.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/ModuleBox.java
@@ -182,18 +182,18 @@ public class ModuleBox extends MenuComponent {
GlStateManager.color(1,1,1);
- RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 26.0f, new Color(50,50,50,255).getRGB());
- RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 26.0f, new Color(35,35,35,255).getRGB());
+ RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 26.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ RoundedUtils.drawRoundedRect(x + 1, y + 1, x + width - 1, y + height - 1, 26.0f, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
int yPos = y + (height / 2) - tHeight / 2 + 10;
for (String line : lines) {
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString(line, x + (float) width / 2 - (double) rip.athena.client.utils.font.FontManager.getNunitoBold(30).width(line) / 2, yPos, textColor);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString(line, x + (float) width / 2 - (double) rip.athena.client.utils.font.FontManager.getNunitoBold(30).width(line) / 2, yPos, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
//FontManager.baloo30.drawString(line, x + (float) width / 2 - FontManager.baloo30.getStringWidth(line) / 2, yPos, textColor);
yPos += FontManager.baloo30.getHeight(line);
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(line, (int) (x + (float) width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth(line) / 2), yPos, textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(line, (int) (x + (float) width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth(line) / 2), yPos, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
yPos += Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT;
}
}
@@ -215,10 +215,10 @@ public class ModuleBox extends MenuComponent {
String text = module.isToggled() ? "ENABLED" : "DISABLED";
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(25).drawString(text, x + (float) width / 2 - (double) rip.athena.client.utils.font.FontManager.getNunitoBold(25).width(text) / 2, y + height - 10 - 15, -1);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(25).drawString(text, x + (float) width / 2 - (double) rip.athena.client.utils.font.FontManager.getNunitoBold(25).width(text) / 2, y + height - 10 - 15, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
//rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x + (float) width / 2 - rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(text) / 2, y + height - 10 - 15, -1);
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(text, (int) (x + (float) width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth(text) / 2), y + height - 10 - 15, -1);
+ Minecraft.getMinecraft().fontRendererObj.drawString(text, (int) (x + (float) width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth(text) / 2), y + height - 10 - 15, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
if (!module.getEntries().isEmpty()) {
drawColor = defaultColor;
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/mods/SearchTextfield.java b/src/main/java/rip/athena/client/gui/clickgui/components/mods/SearchTextfield.java
index 7a0c8c41..ec228c72 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/mods/SearchTextfield.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/mods/SearchTextfield.java
@@ -162,9 +162,9 @@ public class SearchTextfield extends MenuTextField {
}
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunito(20).drawString(textToDraw, x + 10 + minOffset + xAdd, y + 2 + (float) height / 2 - (float) (int) rip.athena.client.utils.font.FontManager.getNunito(20).height() / 2, textColor);
+ rip.athena.client.utils.font.FontManager.getNunito(20).drawString(textToDraw, x + 10 + minOffset + xAdd, y + 2 + (float) height / 2 - (float) (int) rip.athena.client.utils.font.FontManager.getNunito(20).height() / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString(textToDraw, x + 10 + minOffset + xAdd, (int) (y + (float) height / 2 - (float) (int) Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2), textColor);
+ Minecraft.getMinecraft().fontRendererObj.drawString(textToDraw, x + 10 + minOffset + xAdd, (int) (y + (float) height / 2 - (float) (int) Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
if(lastState == ButtonState.HOVER && mouseDown) {
focused = true;
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/themes/SimpleGradientButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/SimpleGradientButton.java
similarity index 93%
rename from src/main/java/rip/athena/client/gui/clickgui/components/themes/SimpleGradientButton.java
rename to src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/SimpleGradientButton.java
index 5745ec35..fe6067e9 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/themes/SimpleGradientButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/SimpleGradientButton.java
@@ -1,16 +1,14 @@
-package rip.athena.client.gui.clickgui.components.themes;
+package rip.athena.client.gui.clickgui.components.themes.accent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
-import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
import rip.athena.client.gui.clickgui.IngameMenu;
import rip.athena.client.gui.framework.components.MenuButton;
import rip.athena.client.gui.framework.draw.ButtonState;
import rip.athena.client.gui.framework.draw.DrawType;
import rip.athena.client.modules.impl.other.Settings;
-import rip.athena.client.theme.Theme;
-import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.theme.impl.AccentTheme;
import rip.athena.client.utils.render.RoundedUtils;
import java.awt.*;
@@ -24,7 +22,7 @@ import java.awt.*;
public class SimpleGradientButton extends MenuButton {
protected boolean leftColorChange;
- public SimpleGradientButton(Theme theme, int x, int y, int width, int height, boolean leftColorChange) {
+ public SimpleGradientButton(AccentTheme theme, int x, int y, int width, int height, boolean leftColorChange) {
super(theme, x, y, width, height);
this.leftColorChange = leftColorChange;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/themes/TriColorGradientButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/TriColorGradientButton.java
similarity index 94%
rename from src/main/java/rip/athena/client/gui/clickgui/components/themes/TriColorGradientButton.java
rename to src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/TriColorGradientButton.java
index e55503e4..5a5eeaed 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/components/themes/TriColorGradientButton.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/themes/accent/TriColorGradientButton.java
@@ -1,4 +1,4 @@
-package rip.athena.client.gui.clickgui.components.themes;
+package rip.athena.client.gui.clickgui.components.themes.accent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
@@ -8,7 +8,7 @@ import rip.athena.client.gui.framework.components.MenuButton;
import rip.athena.client.gui.framework.draw.ButtonState;
import rip.athena.client.gui.framework.draw.DrawType;
import rip.athena.client.modules.impl.other.Settings;
-import rip.athena.client.theme.Theme;
+import rip.athena.client.theme.impl.AccentTheme;
import rip.athena.client.utils.render.RoundedUtils;
import java.awt.*;
@@ -22,7 +22,7 @@ import java.awt.*;
public class TriColorGradientButton extends MenuButton {
protected boolean leftColorChange;
- public TriColorGradientButton(Theme theme, int x, int y, int width, int height, boolean leftColorChange) {
+ public TriColorGradientButton(AccentTheme theme, int x, int y, int width, int height, boolean leftColorChange) {
super(theme, x, y, width, height);
this.leftColorChange = leftColorChange;
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/components/themes/primary/PrimaryGradientButton.java b/src/main/java/rip/athena/client/gui/clickgui/components/themes/primary/PrimaryGradientButton.java
new file mode 100644
index 00000000..01420a9e
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/clickgui/components/themes/primary/PrimaryGradientButton.java
@@ -0,0 +1,100 @@
+package rip.athena.client.gui.clickgui.components.themes.primary;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.GlStateManager;
+import rip.athena.client.font.FontManager;
+import rip.athena.client.gui.clickgui.IngameMenu;
+import rip.athena.client.gui.framework.components.MenuButton;
+import rip.athena.client.gui.framework.draw.ButtonState;
+import rip.athena.client.gui.framework.draw.DrawType;
+import rip.athena.client.modules.impl.other.Settings;
+import rip.athena.client.theme.impl.AccentTheme;
+import rip.athena.client.theme.impl.PrimaryTheme;
+import rip.athena.client.utils.render.RoundedUtils;
+
+import java.awt.*;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/2/2023
+ */
+
+public class PrimaryGradientButton extends MenuButton {
+ protected boolean leftColorChange;
+
+ public PrimaryGradientButton(PrimaryTheme theme, int x, int y, int width, int height, boolean leftColorChange) {
+ super(theme, x, y, width, height);
+ this.leftColorChange = leftColorChange;
+ }
+
+ @Override
+ public void onInitColors() {
+ setColor(DrawType.BACKGROUND, ButtonState.NORMAL, new Color(35, 35, 35, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.BACKGROUND, ButtonState.ACTIVE, new Color(35, 35, 35, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.BACKGROUND, ButtonState.HOVER, new Color(35, 35, 35, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.BACKGROUND, ButtonState.HOVERACTIVE, new Color(35, 35, 35, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.BACKGROUND, ButtonState.DISABLED, new Color(255, 255, 255, IngameMenu.MENU_ALPHA));
+
+ setColor(DrawType.LINE, ButtonState.NORMAL, new Color(52, 52, 53, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.LINE, ButtonState.ACTIVE, new Color(52, 52, 53, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.LINE, ButtonState.HOVER, new Color(52, 52, 53, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.LINE, ButtonState.HOVERACTIVE, new Color(52, 52, 53, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.LINE, ButtonState.DISABLED, new Color(255, 255, 255, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.LINE, ButtonState.POPUP, new Color(28, 28, 30, IngameMenu.MENU_ALPHA));
+
+ setColor(DrawType.TEXT, ButtonState.NORMAL, new Color(56, 56, 58, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.TEXT, ButtonState.ACTIVE, new Color(90, 90, 94, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.TEXT, ButtonState.HOVER, new Color(75, 75, 78, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.TEXT, ButtonState.HOVERACTIVE, new Color(100, 100, 104, IngameMenu.MENU_ALPHA));
+ setColor(DrawType.TEXT, ButtonState.DISABLED, new Color(255, 255, 255, IngameMenu.MENU_ALPHA));
+ }
+
+ @Override
+ public void onRender() {
+ int x = this.getRenderX();
+ int y = this.getRenderY();
+ int mouseX = parent.getMouseX();
+ int width = this.width;
+
+ int backgroundColor = getColor(DrawType.BACKGROUND, lastState);
+ int lineColor = getColor(DrawType.LINE, lastState);
+ int textColor = getColor(DrawType.TEXT, lastState);
+ int linePopupColor = getColor(DrawType.LINE, ButtonState.POPUP);
+
+ GlStateManager.color(1,1,1);
+ //RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 12.0f, new Color(50,50,50,255).getRGB());
+
+ RoundedUtils.drawGradientRound(x, y, width, height, 6, new Color(primaryTheme.getFirstColor()), new Color(primaryTheme.getFirstColor()), new Color(primaryTheme.getSecondColor()), new Color(primaryTheme.getSecondColor()));
+ GlStateManager.color(1,1,1);
+
+ mouseDown = false;
+ }
+
+ @Override
+ public void drawText(String string, int x, int y, int color) {
+ if(Settings.customGuiFont) {
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(string, x - 3, y, color);
+ } else {
+ Minecraft.getMinecraft().fontRendererObj.drawString(string, x, y, color);
+ }
+ }
+
+ @Override
+ public int getStringWidth(String string) {
+ if(Settings.customGuiFont) {
+ return (int) rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string) - 1;
+ } else {
+ return Minecraft.getMinecraft().fontRendererObj.getStringWidth(string);
+ }
+ }
+
+ @Override
+ public int getStringHeight(String string) {
+ if(Settings.customGuiFont) {
+ return (int) FontManager.baloo17.getHeight(string) + 1;
+ } else {
+ return Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT;
+ }
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/pages/MacrosPage.java b/src/main/java/rip/athena/client/gui/clickgui/pages/MacrosPage.java
index 4ec231c1..90acbfcd 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/pages/MacrosPage.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/pages/MacrosPage.java
@@ -165,42 +165,42 @@ public class MacrosPage extends Page {
drawVerticalLine(menu.getX() + 215, y + height - 30, height + 432, 3, new Color(32, 32, 32, 225).getRGB());
if(Settings.customGuiFont) {
- FontManager.getNunitoBold(30).drawString("MACROS", menu.getX() + 235, menu.getY() + 80, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ FontManager.getNunitoBold(30).drawString("MACROS", menu.getX() + 235, menu.getY() + 80, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("MACROS", menu.getX() + 235, menu.getY() + 80, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("MACROS", menu.getX() + 235, menu.getY() + 80, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
//drawHorizontalLine(menu.getX() + 31, menu.getY() + 110, menu.getWidth() - width - 31 * 2, 3, IngameMenu.MENU_LINE_COLOR);
- rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + menu.getWidth() - width, menu.getY() + 58, width, menu.getHeight() - 58, MENU_SIDE_BG_COLOR);
+ rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + menu.getWidth() - width, menu.getY() + 58, width, menu.getHeight() - 58, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
- rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + menu.getWidth() - width, menu.getY() + 58, width, height + 1, ModCategoryButton.MAIN_COLOR);
+ rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + menu.getWidth() - width, menu.getY() + 58, width, height + 1, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
drawShadowDown(menu.getX() + menu.getWidth() - width, y + height, width);
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ADD NEW MACRO", menu.getX() + menu.getWidth() - width / 2 - (double) FontManager.getProductSansRegular(30).width("ADD NEW MACRO") / 2, y + height / 2 - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ADD NEW MACRO", menu.getX() + menu.getWidth() - width / 2 - (double) FontManager.getProductSansRegular(30).width("ADD NEW MACRO") / 2, y + height / 2 - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("ADD NEW MACRO", menu.getX() + menu.getWidth() - width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth("ADD NEW MACRO") / 2, y + height / 2 - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("ADD NEW MACRO", menu.getX() + menu.getWidth() - width / 2 - Minecraft.getMinecraft().fontRendererObj.getStringWidth("ADD NEW MACRO") / 2, y + height / 2 - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
drawShadowDown(menu.getX() + menu.getWidth() - width, y - 1, width);
y += 60;
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ENTER NAME", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ENTER NAME", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("ENTER NAME", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("ENTER NAME", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
y += 70;
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ENTER COMMAND LINE", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ENTER COMMAND LINE", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("ENTER COMMAND LINE", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("ENTER COMMAND LINE", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
y += 70;
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ADD KEYBIND", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString("ADD KEYBIND", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("ADD KEYBIND", x, y, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("ADD KEYBIND", x, y, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
}
diff --git a/src/main/java/rip/athena/client/gui/clickgui/pages/ModsPage.java b/src/main/java/rip/athena/client/gui/clickgui/pages/ModsPage.java
index c6bd4414..702a2a8a 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/pages/ModsPage.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/pages/ModsPage.java
@@ -86,10 +86,10 @@ public class ModsPage extends Page {
if (modCategory != null) {
if (Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(activeModule != null ? activeModule.getName().toUpperCase() : modCategory.getText(), menu.getX() + 255, menu.getY() + 20, IngameMenu.MENU_HEADER_TEXT_COLOR);
- rip.athena.client.utils.font.FontManager.getProductSansRegular(20).drawString("Configure build-in client mods", menu.getX() + 255, menu.getY() + 35, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(activeModule != null ? activeModule.getName().toUpperCase() : modCategory.getText(), menu.getX() + 255, menu.getY() + 20, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(20).drawString("Configure build-in client mods", menu.getX() + 255, menu.getY() + 35, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- mc.fontRendererObj.drawString(activeModule != null ? "SETTINGS | " : modCategory.getText(), menu.getX() + 255, menu.getY() + 25, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ mc.fontRendererObj.drawString(activeModule != null ? "SETTINGS | " : modCategory.getText(), menu.getX() + 255, menu.getY() + 25, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
if (activeModule != null) {
int offset = (int) rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width("SETTINGS | ");
@@ -105,8 +105,8 @@ public class ModsPage extends Page {
drawShadowDown(menu.getX() + 255, menu.getY() + menu.getHeight() - 27 - 5, menu.getWidth() - 286);
drawShadowRight(menu.getX() + menu.getWidth() - 33, menu.getY() + 110 + 25, menu.getHeight() - 110 - 50 - 5);
- rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + 255, menu.getY() + 110 + 25, menu.getWidth() - 255 - 31, menu.getHeight() - 110 - 50 - 5, MENU_BG_COLOR_MOD_BORDER);
- rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + 255 + 1, menu.getY() + 110 + 25 + 1, menu.getWidth() - 255 - 33, menu.getHeight() - 110 - 52 - 5, MENU_BG_COLOR_MOD);
+ rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + 255, menu.getY() + 110 + 25, menu.getWidth() - 255 - 31, menu.getHeight() - 110 - 50 - 5, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor());
+ rip.athena.client.gui.framework.draw.DrawImpl.drawRect(menu.getX() + 255 + 1, menu.getY() + 110 + 25 + 1, menu.getWidth() - 255 - 33, menu.getHeight() - 110 - 52 - 5, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor());
if (activeModule instanceof Crosshair) {
Crosshair crosshair = (Crosshair) activeModule;
diff --git a/src/main/java/rip/athena/client/gui/clickgui/pages/ThemesPage.java b/src/main/java/rip/athena/client/gui/clickgui/pages/ThemesPage.java
index c4b3ac0f..084b4263 100644
--- a/src/main/java/rip/athena/client/gui/clickgui/pages/ThemesPage.java
+++ b/src/main/java/rip/athena/client/gui/clickgui/pages/ThemesPage.java
@@ -1,38 +1,20 @@
package rip.athena.client.gui.clickgui.pages;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiScreen;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.json.JSONException;
import rip.athena.client.Athena;
-import rip.athena.client.config.save.Config;
import rip.athena.client.gui.clickgui.IngameMenu;
import rip.athena.client.gui.clickgui.Page;
-import rip.athena.client.gui.clickgui.components.macros.MacroButton;
-import rip.athena.client.gui.clickgui.components.macros.MacroTextfield;
-import rip.athena.client.gui.clickgui.components.macros.SimpleTextButton;
-import rip.athena.client.gui.clickgui.components.mods.ModCategoryButton;
import rip.athena.client.gui.clickgui.components.mods.ModScrollPane;
-import rip.athena.client.gui.clickgui.components.profiles.ProfilesBase;
-import rip.athena.client.gui.clickgui.components.profiles.ProfilesBlueButton;
-import rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton;
-import rip.athena.client.gui.clickgui.components.themes.TriColorGradientButton;
+import rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton;
+import rip.athena.client.gui.clickgui.components.themes.accent.TriColorGradientButton;
+import rip.athena.client.gui.clickgui.components.themes.primary.PrimaryGradientButton;
import rip.athena.client.gui.framework.Menu;
-import rip.athena.client.gui.framework.TextPattern;
-import rip.athena.client.gui.framework.draw.DrawImpl;
import rip.athena.client.modules.impl.other.Settings;
-import rip.athena.client.requests.ContentType;
-import rip.athena.client.requests.WebRequest;
-import rip.athena.client.requests.WebRequestResult;
-import rip.athena.client.theme.Theme;
-import rip.athena.client.utils.font.FontManager;
-import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.theme.impl.AccentTheme;
+import rip.athena.client.theme.impl.PrimaryTheme;
import rip.athena.client.utils.render.RoundedUtils;
import java.awt.*;
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.util.NoSuchElementException;
/**
* @author Athena Development
@@ -42,8 +24,9 @@ import java.util.NoSuchElementException;
public class ThemesPage extends Page {
+ private ModScrollPane scrollPane2;
private ModScrollPane scrollPane;
- private Theme activeTheme;
+ private AccentTheme activeTheme;
public ThemesPage(Minecraft mc, Menu menu, IngameMenu parent) {
super(mc, menu, parent);
@@ -53,7 +36,8 @@ public class ThemesPage extends Page {
public void onInit() {
int width = 300;
- scrollPane = new ModScrollPane(260, 140, menu.getWidth() - width - 10 * 2, menu.getHeight() - 141, false);
+ scrollPane2 = new ModScrollPane(260, 130, menu.getWidth() - width - 10, menu.getHeight() - 341, false);
+ scrollPane = new ModScrollPane(260, 225, menu.getWidth() - width - 10 * 2, menu.getHeight() - 241, false);
populateScrollPane();
}
@@ -64,18 +48,20 @@ public class ThemesPage extends Page {
int height = 32;
if(Settings.customGuiFont) {
- rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString("THEMES | " + Athena.INSTANCE.getThemeManager().getTheme().getTheme(), menu.getX() + 235, menu.getY() + 80, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ rip.athena.client.utils.font.FontManager.getNunitoBold(30).drawString("THEMES | " + Athena.INSTANCE.getThemeManager().getTheme() + ", " + Athena.INSTANCE.getThemeManager().getPrimaryTheme(), menu.getX() + 235, menu.getY() + 80, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
} else {
- Minecraft.getMinecraft().fontRendererObj.drawString("THEMES", menu.getX() + 235, menu.getY() + 80, IngameMenu.MENU_HEADER_TEXT_COLOR);
+ Minecraft.getMinecraft().fontRendererObj.drawString("THEMES", menu.getX() + 235, menu.getY() + 80, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
- RoundedUtils.drawGradientRound(menu.getX() + 275, menu.getY() + 110, 85 + menu.getWidth() / 2, 20, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawGradientRound(menu.getX() + 295, menu.getY() + 110, menu.getWidth() / 4, 20, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawGradientRound(menu.getX() + 595, menu.getY() + 110, menu.getWidth() / 4, 20, 6, new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor()), new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor()), new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor()), new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor()));
drawVerticalLine(menu.getX() + 215, y + height - 30, height + 432, 3, new Color(32, 32, 32, 225).getRGB());
}
private void populateScrollPane() {
+ scrollPane2.getComponents().clear();
scrollPane.getComponents().clear();
int spacing = 15;
@@ -84,12 +70,35 @@ public class ThemesPage extends Page {
int y = spacing;
int x = spacing;
+ int y2 = spacing;
+ int x2 = spacing;
+
int defaultX = spacing;
+ int defaultX2 = spacing;
int width = 190;
+ int width2 = 190;
int maxWidth = scrollPane.getWidth() - spacing * 2;
+ int maxWidth2 = scrollPane.getWidth() - spacing * 2;
- for(Theme theme : Theme.values()) {
+ for(PrimaryTheme primaryTheme : PrimaryTheme.values()) {
+ scrollPane2.addComponent(new PrimaryGradientButton(primaryTheme, x2, y2, width2, height, false) {
+ @Override
+ public void onAction() {
+ setActive(false);
+ Athena.INSTANCE.getThemeManager().setPrimaryTheme(primaryTheme);
+ populateScrollPane();
+ }
+ });
+
+ x2 += spacing + width2;
+
+ if(x2 + spacing + width2 > maxWidth2) {
+ x2 = defaultX2;
+ }
+ }
+
+ for(AccentTheme theme : AccentTheme.values()) {
if (theme.isTriColor()) {
scrollPane.addComponent(new TriColorGradientButton(theme, x, y, width, height, false) {
@Override
@@ -122,6 +131,7 @@ public class ThemesPage extends Page {
@Override
public void onLoad() {
+ menu.addComponent(scrollPane2);
menu.addComponent(scrollPane);
}
diff --git a/src/main/java/rip/athena/client/gui/framework/components/MenuButton.java b/src/main/java/rip/athena/client/gui/framework/components/MenuButton.java
index 3b4e4219..9e9ed551 100644
--- a/src/main/java/rip/athena/client/gui/framework/components/MenuButton.java
+++ b/src/main/java/rip/athena/client/gui/framework/components/MenuButton.java
@@ -4,7 +4,8 @@ import net.minecraft.client.renderer.GlStateManager;
import rip.athena.client.gui.framework.MenuComponent;
import rip.athena.client.gui.framework.draw.ButtonState;
import rip.athena.client.gui.framework.draw.DrawType;
-import rip.athena.client.theme.Theme;
+import rip.athena.client.theme.impl.AccentTheme;
+import rip.athena.client.theme.impl.PrimaryTheme;
import java.awt.*;
@@ -19,7 +20,8 @@ public class MenuButton extends MenuComponent {
protected int minOffset = 2;
protected boolean mouseDown = false;
protected boolean active = false;
- protected Theme theme;
+ protected AccentTheme theme;
+ protected PrimaryTheme primaryTheme;
protected ButtonState lastState = ButtonState.NORMAL;
public MenuButton(String text, int x, int y){
@@ -32,10 +34,15 @@ public class MenuButton extends MenuComponent {
this.text = text;
}
- public MenuButton(Theme theme, int x, int y, int width, int height) {
+ public MenuButton(AccentTheme theme, int x, int y, int width, int height) {
super(x, y, width, height);
this.theme = theme;
}
+
+ public MenuButton(PrimaryTheme theme, int x, int y, int width, int height) {
+ super(x, y, width, height);
+ this.primaryTheme = theme;
+ }
@Override
public void onInitColors() {
diff --git a/src/main/java/rip/athena/client/gui/framework/components/MenuCheckbox.java b/src/main/java/rip/athena/client/gui/framework/components/MenuCheckbox.java
index c100abc7..9b0737f2 100644
--- a/src/main/java/rip/athena/client/gui/framework/components/MenuCheckbox.java
+++ b/src/main/java/rip/athena/client/gui/framework/components/MenuCheckbox.java
@@ -1,5 +1,6 @@
package rip.athena.client.gui.framework.components;
+import rip.athena.client.Athena;
import rip.athena.client.gui.framework.MenuPriority;
import rip.athena.client.gui.framework.draw.ButtonState;
import rip.athena.client.gui.framework.draw.DrawType;
@@ -194,7 +195,7 @@ public class MenuCheckbox extends MenuComponent {
drawVerticalLine(mouseX, mouseY + 1, tipHeight - 1, 1, lineColor);
drawHorizontalLine(mouseX, mouseY + tipHeight, tipWidth + 1, 1, lineColor);
drawVerticalLine(mouseX + tipWidth, mouseY + 1, tipHeight - 1, 1, lineColor);
- drawText(tooltip, mouseX + minOffset, mouseY + minOffset, getColor(DrawType.TEXT, ButtonState.POPUP));
+ drawText(tooltip, mouseX + minOffset, mouseY + minOffset, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
}
}
diff --git a/src/main/java/rip/athena/client/gui/hud/HUDEditor.java b/src/main/java/rip/athena/client/gui/hud/HUDEditor.java
index f440b1d9..40a9e19a 100644
--- a/src/main/java/rip/athena/client/gui/hud/HUDEditor.java
+++ b/src/main/java/rip/athena/client/gui/hud/HUDEditor.java
@@ -121,13 +121,12 @@ public class HUDEditor extends MinecraftMenuImpl implements DrawImpl {
int mouseX = Math.round((float)mX / value);
int mouseY = Math.round((float)mY / value);
-
if(selected != null || !mouseDownCache) {
for(HUDElement element : Athena.INSTANCE.getHudManager().getElements()) {
if(!element.getParent().isToggled()) {
continue;
}
-
+
int x = Math.round(element.getX() * SCALE);
int y = Math.round(element.getY() * SCALE);
int width = Math.round(element.getWidth() * SCALE * (float)(element.getScale()));
@@ -260,10 +259,14 @@ public class HUDEditor extends MinecraftMenuImpl implements DrawImpl {
if(mouseDown) {
if(selected != null) {
+
+ int maxPosX = (int) Math.round((menu.getWidth() - selected.getWidth() * selected.getScale()) / SCALE);
+ int maxPosY = (int) Math.round((menu.getHeight() - selected.getHeight() * selected.getScale()) / SCALE);
+
if(resizing) {
int xDelta = mouseX / SCALE - cachedX;
int yDelta = mouseY / SCALE - cachedY;
-
+
double maxDelta = 1 + Math.max(xDelta, yDelta) / 30D;
double delta = maxDelta * originalScale;
@@ -277,7 +280,7 @@ public class HUDEditor extends MinecraftMenuImpl implements DrawImpl {
} else if(moving) {
int xDelta = mouseX / SCALE + cachedX;
int yDelta = mouseY / SCALE + cachedY;
-
+
int x = xDelta;
int y = yDelta;
int width = Math.round(selected.getWidth() * (float)(selected.getScale()));
@@ -343,12 +346,12 @@ public class HUDEditor extends MinecraftMenuImpl implements DrawImpl {
@Override
public void drawText(String text, int x, int y, int color) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(text, x, y, color);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(text, x, y, color);
}
@Override
public int getStringWidth(String string) {
- return (int) rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string);
+ return (int) rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string);
}
@Override
diff --git a/src/main/java/rip/athena/client/gui/hud/HUDElement.java b/src/main/java/rip/athena/client/gui/hud/HUDElement.java
index fbea23f2..c11e1e8d 100644
--- a/src/main/java/rip/athena/client/gui/hud/HUDElement.java
+++ b/src/main/java/rip/athena/client/gui/hud/HUDElement.java
@@ -1,6 +1,9 @@
package rip.athena.client.gui.hud;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.ScaledResolution;
import rip.athena.client.modules.Module;
+import sun.net.www.MimeEntry;
/**
* @author Athena Development
@@ -41,7 +44,7 @@ public abstract class HUDElement implements IHUD {
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
-
+
public int getX() {
return x;
}
diff --git a/src/main/java/rip/athena/client/gui/menu/AthenaMenu.java b/src/main/java/rip/athena/client/gui/menu/AthenaMenu.java
index 804f49f7..cd4d4365 100644
--- a/src/main/java/rip/athena/client/gui/menu/AthenaMenu.java
+++ b/src/main/java/rip/athena/client/gui/menu/AthenaMenu.java
@@ -1,6 +1,6 @@
package rip.athena.client.gui.menu;
-import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.*;
import java.awt.Color;
import java.awt.Desktop;
@@ -24,16 +24,7 @@ import org.lwjgl.util.glu.Project;
import com.google.common.collect.Lists;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiButtonLanguage;
-import net.minecraft.client.gui.GuiConfirmOpenLink;
-import net.minecraft.client.gui.GuiLanguage;
-import net.minecraft.client.gui.GuiMultiplayer;
-import net.minecraft.client.gui.GuiOptions;
import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.client.gui.GuiSelectWorld;
-import net.minecraft.client.gui.GuiYesNo;
-import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
@@ -51,6 +42,12 @@ import net.minecraft.world.storage.ISaveFormat;
import net.minecraft.world.storage.WorldInfo;
import rip.athena.client.Athena;
import rip.athena.client.font.FontManager;
+import rip.athena.client.gui.menu.altmanager.GuiAccountManager;
+import rip.athena.client.gui.menu.altmanager.GuiAltManager;
+import rip.athena.client.utils.MouseUtils;
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+import rip.athena.client.utils.animations.impl.EaseBackIn;
import rip.athena.client.utils.input.InputUtils;
import rip.athena.client.utils.render.DrawUtils;
@@ -89,6 +86,11 @@ public class AthenaMenu extends GuiScreen implements GuiYesNoCallback
private boolean field_183502_L;
private GuiScreen field_183503_M;
+ public Animation introAnimation;
+ public boolean closeIntro;
+
+ private CloseType closeType;
+
public AthenaMenu()
{
this.openGLWarning2 = field_96138_a;
@@ -174,25 +176,14 @@ public class AthenaMenu extends GuiScreen implements GuiYesNoCallback
public void initGui()
{
+ if(Athena.INSTANCE.getAccountManager().isFirstLogin) {
+ mc.displayGuiScreen(new GuiAltManager());
+ }
+ introAnimation = new EaseBackIn(450, 1, 1.5F);
+
this.viewportTexture = new DynamicTexture(256, 256);
this.backgroundTexture = this.mc.getTextureManager().getDynamicTextureLocation("background", this.viewportTexture);
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(new Date());
- if (calendar.get(2) + 1 == 12 && calendar.get(5) == 24)
- {
- this.splashText = "Merry X-mas!";
- }
- else if (calendar.get(2) + 1 == 1 && calendar.get(5) == 1)
- {
- this.splashText = "Happy new year!";
- }
- else if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31)
- {
- this.splashText = "OOoooOOOoooo! Spooky!";
- }
-
- int i = 24;
int j = this.height / 4 + 48;
if (this.mc.isDemo())
@@ -335,7 +326,7 @@ public class AthenaMenu extends GuiScreen implements GuiYesNoCallback
GlStateManager.pushMatrix();
DrawUtils.drawImage(new ResourceLocation("Athena/menu/exit.png"),startX + startX - 20, 10, 10, 10);
- DrawUtils.drawImage(new ResourceLocation("Athena/menu/usericon.png"), startX + startX - 45, 10, 10, 10);
+ DrawUtils.drawImage(new ResourceLocation("Athena/menu/usericon.png"), startX + startX - 49, 6, 18, 18);
GlStateManager.popMatrix();
GlStateManager.pushMatrix();
@@ -355,6 +346,9 @@ public class AthenaMenu extends GuiScreen implements GuiYesNoCallback
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException
{
super.mouseClicked(mouseX, mouseY, mouseButton);
+
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
int[] size = InputUtils.getWindowsSize();
int startX = size[0] / 2;
int startY = size[1] / 2;
@@ -367,7 +361,7 @@ public class AthenaMenu extends GuiScreen implements GuiYesNoCallback
}
if(isOverAccountManager) {
- this.mc.displayGuiScreen(new SessionGui(this));
+ this.mc.displayGuiScreen(new GuiAccountManager(this));
}
diff --git a/src/main/java/rip/athena/client/gui/menu/CloseType.java b/src/main/java/rip/athena/client/gui/menu/CloseType.java
new file mode 100644
index 00000000..7a1aeeba
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/CloseType.java
@@ -0,0 +1,10 @@
+package rip.athena.client.gui.menu;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public enum CloseType {
+ ACCOUNT, CREDIT;
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAccountManager.java b/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAccountManager.java
new file mode 100644
index 00000000..6c192044
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAccountManager.java
@@ -0,0 +1,407 @@
+package rip.athena.client.gui.menu.altmanager;
+
+import fr.litarvan.openauth.microsoft.MicrosoftAuthResult;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticationException;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticator;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.texture.DynamicTexture;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.Session;
+import org.apache.commons.lang3.RandomStringUtils;
+import rip.athena.client.Athena;
+import rip.athena.client.account.Account;
+import rip.athena.client.account.AccountType;
+import rip.athena.client.gui.menu.altmanager.button.AltTextField;
+import rip.athena.client.utils.GLUtils;
+import rip.athena.client.utils.MouseUtils;
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+import rip.athena.client.utils.animations.impl.EaseBackIn;
+import rip.athena.client.utils.animations.simple.SimpleAnimation;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.ClickEffect;
+import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.utils.render.RoundedUtils;
+import rip.athena.client.utils.render.StencilUtils;
+import rip.athena.client.utils.time.TimerUtil;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.*;
+import java.util.List;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class GuiAccountManager extends GuiScreen {
+
+ private GuiScreen prevGuiScreen;
+
+ private Animation showAccountAnimation;
+ private boolean closeAccountManager;
+ private boolean showAddAccount;
+
+ private SimpleAnimation clickAnimation = new SimpleAnimation(0.0F);
+ private boolean click;
+ private TimerUtil clickTimer = new TimerUtil();
+
+ public ResourceLocation faceTexture;
+
+ private SimpleAnimation showAddAccountAnimation = new SimpleAnimation(0.0F);
+
+ private boolean delete;
+ private Account deleteAccount;
+
+ private double scrollY;
+ private SimpleAnimation scrollAnimation = new SimpleAnimation(0.0F);
+
+ private SimpleAnimation addOpacityAnimation = new SimpleAnimation(0.0F);
+
+ private AltTextField usernameField;
+ private SimpleAnimation selectAnimation = new SimpleAnimation(0.0F);
+
+ private List clickEffects = new ArrayList<>();
+
+ public GuiAccountManager(GuiScreen prevGuiScreen) {
+ this.prevGuiScreen = prevGuiScreen;
+ }
+
+ @Override
+ public void initGui() {
+
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
+ int addX = 340;
+ int addY = 85;
+ int x = sr.getScaledWidth() / 2 - addY;
+ int y = sr.getScaledHeight() / 2 - addY;
+
+ showAddAccount = false;
+ closeAccountManager = false;
+ showAccountAnimation = new EaseBackIn(450, 1, 1.5F);
+ usernameField = new AltTextField(1, mc.fontRendererObj, x + 38, y + 65, 220, 22, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+ click = false;
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
+ int addX = 140;
+ int addY = 85;
+ int x = sr.getScaledWidth() / 2 - addX;
+ int y = sr.getScaledHeight() / 2 - addY;
+
+ int width = addX * 2;
+ int height = addY * 2;
+ int offsetY = 36;
+ int index = 1;
+
+ if(closeAccountManager) {
+ showAccountAnimation.setDirection(Direction.BACKWARDS);
+ if(showAccountAnimation.isDone(Direction.BACKWARDS)) {
+ closeAccountManager = false;
+ mc.displayGuiScreen(prevGuiScreen);
+ }
+ }
+
+ if(click) {
+ if(clickTimer.hasTimeElapsed(150)) {
+ click = false;
+ }
+ }else {
+ clickTimer.reset();
+ }
+
+ DrawUtils.drawImage(new ResourceLocation("Athena/menu/test.png"), 0, 0, sr.getScaledWidth(), sr.getScaledHeight());
+
+ GlStateManager.pushMatrix();
+
+ RoundedUtils.drawGradientRound(x, y, width, height, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawRound(x + 1, y + 1, width - 2, height - 2, 6, new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor()));
+ FontManager.getProductSansRegular(22).drawString("Account Manager " + Athena.INSTANCE.getAccountManager().getCurrentAccount() != null ? "Account Manager | " + Athena.INSTANCE.getAccountManager().getCurrentAccount().getUsername() : "Account Manager | No Account", x + 10, y + 10, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+
+ RoundedUtils.drawGradientRound(x , y + 179, width, height - 148, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawRound(x + 1, y + 180, width - 2, height - 150, 6, new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor()));
+ FontManager.getProductSansRegular(22).drawString("Add Account", x + 5, y + 186, Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+
+
+ StencilUtils.initStencilToWrite();
+ RoundedUtils.drawRound(x, y + 28, width, height - 28.5F, 6, Color.WHITE);
+ StencilUtils.readStencilBuffer(1);
+
+ showAddAccountAnimation.setAnimation(showAddAccount ? 0 : 140, 16);
+
+ GLUtils.startTranslate(0, (140 - showAddAccountAnimation.getValue()));
+
+ if(Athena.INSTANCE.getAccountManager().getAccounts().isEmpty()) {
+ FontManager.getProductSansRegular(22).drawString("Empty...", sr.getScaledWidth() / 2 - (FontManager.getProductSansRegular(22).height() / 2), (sr.getScaledHeight() / 2) - (FontManager.getProductSansRegular(22).height() / 2), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+ }
+
+ for(Account a : Athena.INSTANCE.getAccountManager().getAccounts()) {
+
+ RoundedUtils.drawRound(x + 9, y + offsetY + scrollAnimation.getValue() - 1, width - 18, 37, 4, new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getSecondColor()));
+
+ RoundedUtils.drawRound(x + 10, y + offsetY + scrollAnimation.getValue(), width - 20, 35, 4, new Color(Athena.INSTANCE.getThemeManager().getPrimaryTheme().getFirstColor()));
+
+ if(a.getAccountType().equals(AccountType.MICROSOFT) || a.getAccountType().equals(AccountType.SESSION)) {
+ //mc.getTextureManager().bindTexture(face(a.getUsername(), UUID.fromString(a.getUuid())));
+ } else {
+ mc.getTextureManager().bindTexture(new ResourceLocation("head.png"));
+ }
+
+ GlStateManager.enableBlend();
+ RoundedUtils.drawRoundTextured(x + 17, y + offsetY + 6 + scrollAnimation.getValue(), 24, 24, 4, 1.0F);
+ GlStateManager.disableBlend();
+
+ FontManager.getProductSansRegular(22).drawString(a.getUsername(), x + 50, y + offsetY + 15 + scrollAnimation.getValue(), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+
+ a.opacityAnimation.setAnimation(a.isDone ? 0 : 255, 16);
+
+ FontManager.getProductSansRegular(22).drawCenteredString(a.getInfo(), x + width - 54, y + 14.5F + offsetY + scrollAnimation.getValue(), Athena.INSTANCE.getThemeManager().getPrimaryTheme().getTextColor());
+
+ if(a.getInfo().equals("Success") || a.getInfo().equals("Error")) {
+ if(a.getTimer().hasTimeElapsed(3500)) {
+ a.isDone = true;
+ a.getTimer().reset();
+ }
+ }else {
+ a.getTimer().reset();
+ }
+
+ offsetY+=45;
+ index++;
+ }
+
+ GLUtils.stopTranslate();
+
+
+ StencilUtils.uninitStencilBuffer();
+
+ GLUtils.stopScale();
+
+ final MouseUtils.Scroll scroll = MouseUtils.scroll();
+
+ if(scroll != null) {
+ switch (scroll) {
+ case DOWN:
+ if(index > 4){
+ if(scrollY > -((index - 3.5) * 45)) {
+ scrollY -=20;
+ }
+
+ if(index > 4) {
+ if(scrollY < -((index - 3.8) * 45)) {
+ scrollY = -((index - 3.9) * 45);
+ }
+ }
+ }else {
+ scrollY = 0;
+ }
+ break;
+ case UP:
+ if(scrollY > 0) {
+ scrollY = -18;
+ }
+
+ if(scrollY < -0) {
+ scrollY +=20;
+ }else {
+ if(index > 5) {
+ scrollY = 10;
+ }
+ }
+ break;
+ }
+ }
+
+ scrollAnimation.setAnimation((float) scrollY, 16);
+
+ if(delete) {
+ Athena.INSTANCE.getAccountManager().getAccounts().remove(deleteAccount);
+ scrollY = 0;
+ delete = false;
+ }
+
+ if(clickEffects.size() > 0) {
+ Iterator clickEffectIterator= clickEffects.iterator();
+ while(clickEffectIterator.hasNext()){
+ ClickEffect clickEffect = clickEffectIterator.next();
+ clickEffect.draw();
+ if (clickEffect.canRemove()) clickEffectIterator.remove();
+ }
+ }
+ }
+
+ @Override
+ public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
+ int addX = 140;
+ int addY = 85;
+ int x = sr.getScaledWidth() / 2 - addX;
+ int y = sr.getScaledHeight() / 2 - addY;
+ int width = addX * 2;
+ int offsetY = 36;
+
+ ClickEffect clickEffect = new ClickEffect(mouseX, mouseY);
+ clickEffects.add(clickEffect);
+
+ if(mouseButton == 0) {
+
+ if(MouseUtils.isInside(mouseX, mouseY, (x + width) - 50, y, 50, 26)) {
+ showAddAccount = true;
+ }
+
+ if(MouseUtils.isInside(mouseX, mouseY, x , y + 179, width, height - 148)) {
+ mc.displayGuiScreen(new GuiAltManager());
+ //Soar.instance.settingsManager.getSettingByClass(ClientMod.class, "DarkMode").setValBoolean(!Soar.instance.settingsManager.getSettingByClass(ClientMod.class, "DarkMode").getValBoolean());
+ }
+
+ if (MouseUtils.isInside(mouseX, mouseY, sr.getScaledWidth() - 25, 5.0, 20.0, 20.0)) {
+
+ }
+
+ if(showAddAccount) {
+
+ usernameField.mouseClicked(mouseX, mouseY, mouseButton);
+
+ if(MouseUtils.isInside(mouseX, mouseY, x + 35, y + 120, 210, 30)) {
+ click = true;
+ new Thread() {
+ @Override
+ public void run() {
+ MicrosoftAuthenticator authenticator = new MicrosoftAuthenticator();
+ /*try {
+ MicrosoftAuthResult acc = authenticator.loginWithWebview();
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.MICROSOFT, acc.getProfile().getName(), acc.getProfile().getId(), acc.getRefreshToken()));
+ mc.session = new Session(acc.getProfile().getName(), acc.getProfile().getId(), acc.getAccessToken(), "legacy");
+ showAddAccount = false;
+ } catch (MicrosoftAuthenticationException e) {
+ e.printStackTrace();
+ }*/
+ }
+ }.start();
+ }
+
+ if(MouseUtils.isInside(mouseX, mouseY, x + 35, y + 91, 100, 20)) {
+ Random random = new Random();
+ int randomValue = random.nextInt(8) + 3;
+
+ String username = RandomStringUtils.randomAlphabetic(randomValue);
+
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.CRACKED, username, "0", "0"));
+ mc.session = new Session(username, "0", "0", "legacy");
+ showAddAccount = false;
+ }
+
+ if(MouseUtils.isInside(mouseX, mouseY, (x + width) - 135, y + 91, 100, 20)) {
+ if(!usernameField.getText().isEmpty()) {
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.CRACKED, usernameField.getText(), "0", "0"));
+ mc.session = new Session(usernameField.getText(), "0", "0", "legacy");
+ showAddAccount = false;
+ usernameField.setText("");
+ }
+ }
+ }
+
+ for(Account a : Athena.INSTANCE.getAccountManager().getAccounts()) {
+
+ if(MouseUtils.isInside(mouseX, mouseY, x + width - 36, y + offsetY + 7 + scrollAnimation.getValue(), 20, 20)) {
+ deleteAccount = a;
+ delete = true;
+ }
+
+ if(!showAddAccount) {
+ if(MouseUtils.isInside(mouseX, mouseY, x + 10, y + offsetY + scrollAnimation.getValue(), width - 50, 35)) {
+ a.isDone = false;
+
+ if(a.getAccountType().equals(AccountType.MICROSOFT)) {
+
+ new Thread() {
+ @Override
+ public void run() {
+ MicrosoftAuthenticator authenticator = new MicrosoftAuthenticator();
+ a.setInfo("Loading...");
+ try {
+ MicrosoftAuthResult acc = authenticator.loginWithRefreshToken(a.getToken());
+ mc.session = new Session(acc.getProfile().getName(), acc.getProfile().getId(), acc.getAccessToken(), "mojang");
+ Athena.INSTANCE.getAccountManager().setCurrentAccount(Athena.INSTANCE.getAccountManager().getAccountByUsername(acc.getProfile().getName()));
+ a.setInfo("Success!");
+ } catch (MicrosoftAuthenticationException e) {
+ e.printStackTrace();
+ a.setInfo("Error");
+ }
+ }
+ }.start();
+ }
+
+ if(a.getAccountType().equals(AccountType.SESSION)) {
+ a.setInfo("Loading...");
+ try {
+ mc.session = new Session(a.getUsername(), a.getUuid(), a.getToken(), "mojang");
+ Athena.INSTANCE.getAccountManager().setCurrentAccount(Athena.INSTANCE.getAccountManager().getAccountByUsername(a.getUsername()));
+ a.setInfo("Success!");
+ } catch (Exception e) {
+ e.printStackTrace();
+ a.setInfo("Error");
+ }
+ }
+
+ if(a.getAccountType().equals(AccountType.CRACKED)) {
+ a.setInfo("Success!");
+ mc.session = new Session(a.getUsername(), "0", "0", "legacy");
+ Athena.INSTANCE.getAccountManager().setCurrentAccount(Athena.INSTANCE.getAccountManager().getAccountByUsername(a.getUsername()));
+ }
+ }
+ }
+
+ offsetY+=45;
+ }
+ }
+ }
+
+ @Override
+ public void keyTyped(char typedChar, int keyCode) {
+
+ if(showAddAccount) {
+ usernameField.textboxKeyTyped(typedChar, keyCode);
+ }
+
+ if(keyCode == 1) {
+ if(showAddAccount) {
+ showAddAccount = false;
+ }else {
+ Athena.INSTANCE.getAccountManager().save();
+ closeAccountManager = true;
+ }
+ }
+ }
+
+ private ResourceLocation face(String username, UUID uuid) {
+
+ File model = new File(new File(mc.mcDataDir, "Athena/cachedImages/models"), username + ".png");
+ File face = new File(new File(mc.mcDataDir, "Athena/cachedImages/faces"), username + ".png");
+
+ //loadSkin(mc, username, uuid, model, face);
+
+ try {
+ BufferedImage t = ImageIO.read(face);
+ DynamicTexture nibt = new DynamicTexture(t);
+
+ this.faceTexture = mc.getTextureManager().getDynamicTextureLocation("iasface_" + username.hashCode(), nibt);
+ } catch (Throwable throwable) {
+ this.faceTexture = new ResourceLocation("iaserror", "skin");
+ }
+
+ return this.faceTexture;
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAltManager.java b/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAltManager.java
new file mode 100644
index 00000000..32780169
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/GuiAltManager.java
@@ -0,0 +1,114 @@
+package rip.athena.client.gui.menu.altmanager;
+
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.util.ResourceLocation;
+import org.lwjgl.input.Keyboard;
+import rip.athena.client.Athena;
+import rip.athena.client.gui.menu.AthenaMenu;
+import rip.athena.client.gui.menu.altmanager.helpers.*;
+import rip.athena.client.gui.menu.altmanager.panels.*;
+import rip.athena.client.gui.screen.Screen;
+import rip.athena.client.utils.render.ColorUtil;
+import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.utils.render.RoundedUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
+import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
+
+public class GuiAltManager extends GuiScreen {
+ private final AltManagerUtils utils = new AltManagerUtils();
+ private List panels;
+ public final rip.athena.client.utils.render.TextField searchField = new rip.athena.client.utils.render.TextField();
+
+ public GuiAltManager() {
+ if (panels == null) {
+ panels = new ArrayList<>();
+ panels.add(new LoginPanel());
+ }
+ }
+
+ @Override
+ protected void keyTyped(char typedChar, int keyCode) {
+ if (keyCode == Keyboard.KEY_ESCAPE) {
+ mc.displayGuiScreen(new AthenaMenu());
+ searchField.setFocused(false);
+ }
+ searchField.keyTyped(typedChar, keyCode);
+ panels.forEach(panel -> panel.keyTyped(typedChar, keyCode));
+ }
+
+ @Override
+ public void initGui() {
+ if (mc.gameSettings.guiScale != 2) {
+ mc.gameSettings.guiScale = 2;
+ }
+
+ panels.forEach(Screen::initGui);
+ }
+
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ GlStateManager.enableBlend();
+ GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ ScaledResolution sr = new ScaledResolution(mc);
+ int screenWidth = sr.getScaledWidth();
+ int screenHeight = sr.getScaledHeight();
+
+ int xOffset = (screenWidth - 325) / 2; // Calculate horizontal offset to center the panels
+ int yOffset = (screenHeight - getTotalPanelsHeight()) / 2; // Calculate vertical offset to center the panels
+ int width = screenWidth - (2 * xOffset);
+
+ DrawUtils.drawImage(new ResourceLocation("Athena/menu/test.png"), 0, 0, (int) screenWidth, (int) screenHeight);
+
+ RoundedUtils.drawGradientRound(xOffset + 15, yOffset - 1, width + 1, getTotalPanelsHeight() - 23, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+
+ int count = 0;
+ int separation = 0;
+ for (Panel panel : panels) {
+ panel.setX(xOffset + 16);
+ panel.setY(yOffset + separation);
+ panel.setWidth(325);
+
+ panel.drawScreen(mouseX, mouseY);
+ separation += panel.getHeight() + (count >= 1 ? 10 : 25);
+ count++;
+ }
+ }
+
+ private int getTotalPanelsHeight() {
+ int totalHeight = 0;
+ for (Panel panel : panels) {
+ totalHeight += panel.getHeight() + (totalHeight >= 1 ? 10 : 25);
+ }
+ return totalHeight;
+ }
+
+ @Override
+ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+ searchField.mouseClicked(mouseX, mouseY, mouseButton);
+ panels.forEach(panel -> panel.mouseClicked(mouseX, mouseY, mouseButton));
+ }
+
+ @Override
+ protected void mouseReleased(int mouseX, int mouseY, int state) {
+ panels.forEach(panel -> panel.mouseReleased(mouseX, mouseY, state));
+ }
+
+ @Override
+ public void onGuiClosed() {
+
+ }
+
+ public AltManagerUtils getUtils() {
+ return utils;
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/Panel.java b/src/main/java/rip/athena/client/gui/menu/altmanager/Panel.java
new file mode 100644
index 00000000..590ec5ee
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/Panel.java
@@ -0,0 +1,18 @@
+package rip.athena.client.gui.menu.altmanager;
+
+import lombok.Getter;
+import lombok.Setter;
+import rip.athena.client.gui.screen.Screen;
+import rip.athena.client.utils.render.ColorUtil;
+import rip.athena.client.utils.render.RoundedUtils;
+
+@Getter
+@Setter
+public abstract class Panel implements Screen {
+ private float x, y, width, height;
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY) {
+ RoundedUtils.drawRound(x, y, width, height, 5, ColorUtil.tripleColor(27));
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltButton.java b/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltButton.java
new file mode 100644
index 00000000..999b9bfc
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltButton.java
@@ -0,0 +1,76 @@
+package rip.athena.client.gui.menu.altmanager.button;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import rip.athena.client.gui.screen.Screen;
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+import rip.athena.client.utils.animations.impl.DecelerateAnimation;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.ColorUtil;
+import rip.athena.client.utils.render.HoveringUtil;
+import rip.athena.client.utils.render.RoundedUtils;
+
+import java.awt.*;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+
+@Setter
+@Getter
+@RequiredArgsConstructor
+public class AltButton implements Screen {
+
+ private float x, y, width, height, alpha;
+ private boolean bypass = false;
+ private final String name;
+ private boolean bold = false;
+ private Color color = ColorUtil.tripleColor(55);
+ private Runnable clickAction;
+
+ private final Animation hoverAnimation = new DecelerateAnimation(250, 1);
+
+ @Override
+ public void initGui() {
+
+ }
+
+ @Override
+ public void keyTyped(char typedChar, int keyCode) {
+
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY) {
+ boolean hovering = HoveringUtil.isHovering(x, y, width, height, mouseX, mouseY);
+
+ hoverAnimation.setDirection(hovering ? Direction.FORWARDS : Direction.BACKWARDS);
+
+ Color rectColor = ColorUtil.interpolateColorC(color, color.brighter(), hoverAnimation.getOutput().floatValue());
+ RoundedUtils.drawRound(x, y, width, height, 5, ColorUtil.applyOpacity(rectColor, alpha));
+ FontManager.getProductSansRegular(22).drawCenteredString(name, x + width / 2f, y + height - FontManager.getProductSansRegular(25).height(), ColorUtil.applyOpacity(-1, alpha));
+
+
+ }
+
+ @Override
+ public void mouseClicked(int mouseX, int mouseY, int button) {
+ boolean hovering = HoveringUtil.isHovering(x, y, width, height, mouseX, mouseY);
+
+ if (hovering && button == 0) {
+ if (clickAction != null) {
+ clickAction.run();
+ }
+ }
+
+ }
+
+ @Override
+ public void mouseReleased(int mouseX, int mouseY, int state) {
+
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltTextField.java b/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltTextField.java
new file mode 100644
index 00000000..fb808878
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/button/AltTextField.java
@@ -0,0 +1,784 @@
+package rip.athena.client.gui.menu.altmanager.button;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiPageButtonList;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.WorldRenderer;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.util.ChatAllowedCharacters;
+import net.minecraft.util.MathHelper;
+import rip.athena.client.utils.font.FontManager;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class AltTextField extends Gui
+{
+ private final int id;
+ private final FontRenderer fontRendererInstance;
+ public int xPosition;
+ public int yPosition;
+ /** The width of this text field. */
+ private final int width;
+ private final int height;
+ /** Has the current text being edited on the textbox. */
+ private String text = "";
+ private int maxStringLength = 32;
+ private int cursorCounter;
+ private boolean enableBackgroundDrawing = true;
+ /** if true the textbox can lose focus by clicking elsewhere on the screen */
+ private boolean canLoseFocus = true;
+ /** If this value is true along with isEnabled, keyTyped will process the keys. */
+ private boolean isFocused;
+ /** If this value is true along with isFocused, keyTyped will process the keys. */
+ private boolean isEnabled = true;
+ /** The current character index that should be used as start of the rendered text. */
+ private int lineScrollOffset;
+ private int cursorPosition;
+ /** other selection position, maybe the same as the cursor */
+ private int selectionEnd;
+ /** True if this textbox is visible */
+ private boolean visible = true;
+ private GuiPageButtonList.GuiResponder field_175210_x;
+ private Predicate validator = Predicates.alwaysTrue();
+
+ private int color;
+
+ public AltTextField(int componentId, FontRenderer fontrendererObj, int x, int y, int par5Width, int par6Height, int color)
+ {
+ this.id = componentId;
+ this.fontRendererInstance = fontrendererObj;
+ this.xPosition = x;
+ this.yPosition = y;
+ this.width = par5Width;
+ this.height = par6Height;
+ this.color = color;
+ }
+
+ public void func_175207_a(GuiPageButtonList.GuiResponder p_175207_1_)
+ {
+ this.field_175210_x = p_175207_1_;
+ }
+
+ /**
+ * Increments the cursor counter
+ */
+ public void updateCursorCounter()
+ {
+ ++this.cursorCounter;
+ }
+
+ /**
+ * Sets the text of the textbox
+ */
+ public void setText(String p_146180_1_)
+ {
+ if (this.validator.apply(p_146180_1_))
+ {
+ if (p_146180_1_.length() > this.maxStringLength)
+ {
+ this.text = p_146180_1_.substring(0, this.maxStringLength);
+ }
+ else
+ {
+ this.text = p_146180_1_;
+ }
+
+ this.setCursorPositionEnd();
+ }
+ }
+
+ /**
+ * Returns the contents of the textbox
+ */
+ public String getText()
+ {
+ return this.text;
+ }
+
+ /**
+ * returns the text between the cursor and selectionEnd
+ */
+ public String getSelectedText()
+ {
+ int i = this.cursorPosition < this.selectionEnd ? this.cursorPosition : this.selectionEnd;
+ int j = this.cursorPosition < this.selectionEnd ? this.selectionEnd : this.cursorPosition;
+ return this.text.substring(i, j);
+ }
+
+ public void setValidator(Predicate theValidator)
+ {
+ this.validator = theValidator;
+ }
+
+ /**
+ * replaces selected text, or inserts text at the position on the cursor
+ */
+ public void writeText(String p_146191_1_)
+ {
+ String s = "";
+ String s1 = ChatAllowedCharacters.filterAllowedCharacters(p_146191_1_);
+ int i = this.cursorPosition < this.selectionEnd ? this.cursorPosition : this.selectionEnd;
+ int j = this.cursorPosition < this.selectionEnd ? this.selectionEnd : this.cursorPosition;
+ int k = this.maxStringLength - this.text.length() - (i - j);
+ int l = 0;
+
+ if (this.text.length() > 0)
+ {
+ s = s + this.text.substring(0, i);
+ }
+
+ if (k < s1.length())
+ {
+ s = s + s1.substring(0, k);
+ l = k;
+ }
+ else
+ {
+ s = s + s1;
+ l = s1.length();
+ }
+
+ if (this.text.length() > 0 && j < this.text.length())
+ {
+ s = s + this.text.substring(j);
+ }
+
+ if (this.validator.apply(s))
+ {
+ this.text = s;
+ this.moveCursorBy(i - this.selectionEnd + l);
+
+ if (this.field_175210_x != null)
+ {
+ this.field_175210_x.func_175319_a(this.id, this.text);
+ }
+ }
+ }
+
+ /**
+ * Deletes the specified number of words starting at the cursor position. Negative numbers will delete words left of
+ * the cursor.
+ */
+ public void deleteWords(int p_146177_1_)
+ {
+ if (this.text.length() != 0)
+ {
+ if (this.selectionEnd != this.cursorPosition)
+ {
+ this.writeText("");
+ }
+ else
+ {
+ this.deleteFromCursor(this.getNthWordFromCursor(p_146177_1_) - this.cursorPosition);
+ }
+ }
+ }
+
+ /**
+ * delete the selected text, otherwsie deletes characters from either side of the cursor. params: delete num
+ */
+ public void deleteFromCursor(int p_146175_1_)
+ {
+ if (this.text.length() != 0)
+ {
+ if (this.selectionEnd != this.cursorPosition)
+ {
+ this.writeText("");
+ }
+ else
+ {
+ boolean flag = p_146175_1_ < 0;
+ int i = flag ? this.cursorPosition + p_146175_1_ : this.cursorPosition;
+ int j = flag ? this.cursorPosition : this.cursorPosition + p_146175_1_;
+ String s = "";
+
+ if (i >= 0)
+ {
+ s = this.text.substring(0, i);
+ }
+
+ if (j < this.text.length())
+ {
+ s = s + this.text.substring(j);
+ }
+
+ if (this.validator.apply(s))
+ {
+ this.text = s;
+
+ if (flag)
+ {
+ this.moveCursorBy(p_146175_1_);
+ }
+
+ if (this.field_175210_x != null)
+ {
+ this.field_175210_x.func_175319_a(this.id, this.text);
+ }
+ }
+ }
+ }
+ }
+
+ public int getId()
+ {
+ return this.id;
+ }
+
+ /**
+ * see @getNthNextWordFromPos() params: N, position
+ */
+ public int getNthWordFromCursor(int p_146187_1_)
+ {
+ return this.getNthWordFromPos(p_146187_1_, this.getCursorPosition());
+ }
+
+ /**
+ * gets the position of the nth word. N may be negative, then it looks backwards. params: N, position
+ */
+ public int getNthWordFromPos(int p_146183_1_, int p_146183_2_)
+ {
+ return this.func_146197_a(p_146183_1_, p_146183_2_, true);
+ }
+
+ public int func_146197_a(int p_146197_1_, int p_146197_2_, boolean p_146197_3_)
+ {
+ int i = p_146197_2_;
+ boolean flag = p_146197_1_ < 0;
+ int j = Math.abs(p_146197_1_);
+
+ for (int k = 0; k < j; ++k)
+ {
+ if (!flag)
+ {
+ int l = this.text.length();
+ i = this.text.indexOf(32, i);
+
+ if (i == -1)
+ {
+ i = l;
+ }
+ else
+ {
+ while (p_146197_3_ && i < l && this.text.charAt(i) == 32)
+ {
+ ++i;
+ }
+ }
+ }
+ else
+ {
+ while (p_146197_3_ && i > 0 && this.text.charAt(i - 1) == 32)
+ {
+ --i;
+ }
+
+ while (i > 0 && this.text.charAt(i - 1) != 32)
+ {
+ --i;
+ }
+ }
+ }
+
+ return i;
+ }
+
+ /**
+ * Moves the text cursor by a specified number of characters and clears the selection
+ */
+ public void moveCursorBy(int p_146182_1_)
+ {
+ this.setCursorPosition(this.selectionEnd + p_146182_1_);
+ }
+
+ /**
+ * sets the position of the cursor to the provided index
+ */
+ public void setCursorPosition(int p_146190_1_)
+ {
+ this.cursorPosition = p_146190_1_;
+ int i = this.text.length();
+ this.cursorPosition = MathHelper.clamp_int(this.cursorPosition, 0, i);
+ this.setSelectionPos(this.cursorPosition);
+ }
+
+ /**
+ * sets the cursors position to the beginning
+ */
+ public void setCursorPositionZero()
+ {
+ this.setCursorPosition(0);
+ }
+
+ /**
+ * sets the cursors position to after the text
+ */
+ public void setCursorPositionEnd()
+ {
+ this.setCursorPosition(this.text.length());
+ }
+
+ /**
+ * Call this method from your GuiScreen to process the keys into the textbox
+ */
+ public boolean textboxKeyTyped(char p_146201_1_, int p_146201_2_)
+ {
+ if (!this.isFocused)
+ {
+ return false;
+ }
+ else if (GuiScreen.isKeyComboCtrlA(p_146201_2_))
+ {
+ this.setCursorPositionEnd();
+ this.setSelectionPos(0);
+ return true;
+ }
+ else if (GuiScreen.isKeyComboCtrlC(p_146201_2_))
+ {
+ GuiScreen.setClipboardString(this.getSelectedText());
+ return true;
+ }
+ else if (GuiScreen.isKeyComboCtrlV(p_146201_2_))
+ {
+ if (this.isEnabled)
+ {
+ this.writeText(GuiScreen.getClipboardString());
+ }
+
+ return true;
+ }
+ else if (GuiScreen.isKeyComboCtrlX(p_146201_2_))
+ {
+ GuiScreen.setClipboardString(this.getSelectedText());
+
+ if (this.isEnabled)
+ {
+ this.writeText("");
+ }
+
+ return true;
+ }
+ else
+ {
+ switch (p_146201_2_)
+ {
+ case 14:
+
+ if (GuiScreen.isCtrlKeyDown())
+ {
+ if (this.isEnabled)
+ {
+ this.deleteWords(-1);
+ }
+ }
+ else if (this.isEnabled)
+ {
+ this.deleteFromCursor(-1);
+ }
+
+ return true;
+ case 199:
+
+ if (GuiScreen.isShiftKeyDown())
+ {
+ this.setSelectionPos(0);
+ }
+ else
+ {
+ this.setCursorPositionZero();
+ }
+
+ return true;
+ case 203:
+
+ if (GuiScreen.isShiftKeyDown())
+ {
+ if (GuiScreen.isCtrlKeyDown())
+ {
+ this.setSelectionPos(this.getNthWordFromPos(-1, this.getSelectionEnd()));
+ }
+ else
+ {
+ this.setSelectionPos(this.getSelectionEnd() - 1);
+ }
+ }
+ else if (GuiScreen.isCtrlKeyDown())
+ {
+ this.setCursorPosition(this.getNthWordFromCursor(-1));
+ }
+ else
+ {
+ this.moveCursorBy(-1);
+ }
+
+ return true;
+ case 205:
+
+ if (GuiScreen.isShiftKeyDown())
+ {
+ if (GuiScreen.isCtrlKeyDown())
+ {
+ this.setSelectionPos(this.getNthWordFromPos(1, this.getSelectionEnd()));
+ }
+ else
+ {
+ this.setSelectionPos(this.getSelectionEnd() + 1);
+ }
+ }
+ else if (GuiScreen.isCtrlKeyDown())
+ {
+ this.setCursorPosition(this.getNthWordFromCursor(1));
+ }
+ else
+ {
+ this.moveCursorBy(1);
+ }
+
+ return true;
+ case 207:
+
+ if (GuiScreen.isShiftKeyDown())
+ {
+ this.setSelectionPos(this.text.length());
+ }
+ else
+ {
+ this.setCursorPositionEnd();
+ }
+
+ return true;
+ case 211:
+
+ if (GuiScreen.isCtrlKeyDown())
+ {
+ if (this.isEnabled)
+ {
+ this.deleteWords(1);
+ }
+ }
+ else if (this.isEnabled)
+ {
+ this.deleteFromCursor(1);
+ }
+
+ return true;
+ default:
+
+ if (ChatAllowedCharacters.isAllowedCharacter(p_146201_1_))
+ {
+ if (this.isEnabled)
+ {
+ this.writeText(Character.toString(p_146201_1_));
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ }
+
+ /**
+ * Args: x, y, buttonClicked
+ */
+ public void mouseClicked(int p_146192_1_, int p_146192_2_, int p_146192_3_)
+ {
+ boolean flag = p_146192_1_ >= this.xPosition && p_146192_1_ < this.xPosition + this.width && p_146192_2_ >= this.yPosition && p_146192_2_ < this.yPosition + this.height;
+
+ if (this.canLoseFocus)
+ {
+ this.setFocused(flag);
+ }
+
+ if (this.isFocused && flag && p_146192_3_ == 0)
+ {
+ int i = p_146192_1_ - this.xPosition;
+
+ if (this.enableBackgroundDrawing)
+ {
+ i -= 4;
+ }
+
+ String s = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
+ this.setCursorPosition(this.fontRendererInstance.trimStringToWidth(s, i).length() + this.lineScrollOffset);
+ }
+ }
+
+ /**
+ * Draws the textbox
+ */
+ public void drawTextBox()
+ {
+ if (this.getVisible())
+ {
+ int j = this.cursorPosition - this.lineScrollOffset;
+ int k = this.selectionEnd - this.lineScrollOffset;
+ String s = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
+ boolean flag = j >= 0 && j <= s.length();
+ boolean flag1 = this.isFocused && this.cursorCounter / 6 % 2 == 0 && flag;
+ int l = this.enableBackgroundDrawing ? this.xPosition + 4 : this.xPosition;
+ int i1 = this.enableBackgroundDrawing ? this.yPosition + (this.height - 8) / 2 : this.yPosition;
+ int j1 = l;
+
+ if (k > s.length())
+ {
+ k = s.length();
+ }
+
+ if (s.length() > 0)
+ {
+ String s1 = flag ? s.substring(0, j) : s;
+ j1 = FontManager.getProductSansRegular(20).drawString(s1, (float)l, (float)i1, color);
+ }
+
+ boolean flag2 = this.cursorPosition < this.text.length() || this.text.length() >= this.getMaxStringLength();
+ int k1 = j1;
+
+ if (!flag)
+ {
+ k1 = j > 0 ? l + this.width : l;
+ }
+ else if (flag2)
+ {
+ k1 = j1 - 1;
+ --j1;
+ }
+
+ if (s.length() > 0 && flag && j < s.length())
+ {
+ j1 = FontManager.getProductSansRegular(20).drawString(s.substring(j), (float)j1, (float)i1, color);
+ }
+
+ if (flag1)
+ {
+ if (flag2)
+ {
+ Gui.drawRect(k1, i1 - 1, k1 + 1, i1 + 1 + this.fontRendererInstance.FONT_HEIGHT, -3092272);
+ }
+ else
+ {
+ FontManager.getProductSansRegular(20).drawString("_", (float)k1, (float)i1, color);
+ }
+ }
+
+ if (k != j)
+ {
+ int l1 = l + this.fontRendererInstance.getStringWidth(s.substring(0, k));
+ this.drawCursorVertical(k1, i1 - 1, l1 - 1, i1 + 1 + this.fontRendererInstance.FONT_HEIGHT);
+ }
+ }
+ }
+
+ /**
+ * draws the vertical line cursor in the textbox
+ */
+ private void drawCursorVertical(int p_146188_1_, int p_146188_2_, int p_146188_3_, int p_146188_4_)
+ {
+ if (p_146188_1_ < p_146188_3_)
+ {
+ int i = p_146188_1_;
+ p_146188_1_ = p_146188_3_;
+ p_146188_3_ = i;
+ }
+
+ if (p_146188_2_ < p_146188_4_)
+ {
+ int j = p_146188_2_;
+ p_146188_2_ = p_146188_4_;
+ p_146188_4_ = j;
+ }
+
+ if (p_146188_3_ > this.xPosition + this.width)
+ {
+ p_146188_3_ = this.xPosition + this.width;
+ }
+
+ if (p_146188_1_ > this.xPosition + this.width)
+ {
+ p_146188_1_ = this.xPosition + this.width;
+ }
+
+ Tessellator tessellator = Tessellator.getInstance();
+ WorldRenderer worldrenderer = tessellator.getWorldRenderer();
+ GlStateManager.color(0.0F, 0.0F, 255.0F, 255.0F);
+ GlStateManager.disableTexture2D();
+ GlStateManager.enableColorLogic();
+ GlStateManager.colorLogicOp(5387);
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION);
+ worldrenderer.pos((double)p_146188_1_, (double)p_146188_4_, 0.0D).endVertex();
+ worldrenderer.pos((double)p_146188_3_, (double)p_146188_4_, 0.0D).endVertex();
+ worldrenderer.pos((double)p_146188_3_, (double)p_146188_2_, 0.0D).endVertex();
+ worldrenderer.pos((double)p_146188_1_, (double)p_146188_2_, 0.0D).endVertex();
+ tessellator.draw();
+ GlStateManager.disableColorLogic();
+ GlStateManager.enableTexture2D();
+ }
+
+ public void setMaxStringLength(int p_146203_1_)
+ {
+ this.maxStringLength = p_146203_1_;
+
+ if (this.text.length() > p_146203_1_)
+ {
+ this.text = this.text.substring(0, p_146203_1_);
+ }
+ }
+
+ /**
+ * returns the maximum number of character that can be contained in this textbox
+ */
+ public int getMaxStringLength()
+ {
+ return this.maxStringLength;
+ }
+
+ /**
+ * returns the current position of the cursor
+ */
+ public int getCursorPosition()
+ {
+ return this.cursorPosition;
+ }
+
+ /**
+ * get enable drawing background and outline
+ */
+ public boolean getEnableBackgroundDrawing()
+ {
+ return this.enableBackgroundDrawing;
+ }
+
+ /**
+ * enable drawing background and outline
+ */
+ public void setEnableBackgroundDrawing(boolean p_146185_1_)
+ {
+ this.enableBackgroundDrawing = p_146185_1_;
+ }
+
+ /**
+ * Sets focus to this gui element
+ */
+ public void setFocused(boolean p_146195_1_)
+ {
+ if (p_146195_1_ && !this.isFocused)
+ {
+ this.cursorCounter = 0;
+ }
+
+ this.isFocused = p_146195_1_;
+ }
+
+ /**
+ * Getter for the focused field
+ */
+ public boolean isFocused()
+ {
+ return this.isFocused;
+ }
+
+ public void setEnabled(boolean p_146184_1_)
+ {
+ this.isEnabled = p_146184_1_;
+ }
+
+ /**
+ * the side of the selection that is not the cursor, may be the same as the cursor
+ */
+ public int getSelectionEnd()
+ {
+ return this.selectionEnd;
+ }
+
+ /**
+ * returns the width of the textbox depending on if background drawing is enabled
+ */
+ public int getWidth()
+ {
+ return this.getEnableBackgroundDrawing() ? this.width - 8 : this.width;
+ }
+
+ /**
+ * Sets the position of the selection anchor (i.e. position the selection was started at)
+ */
+ public void setSelectionPos(int p_146199_1_)
+ {
+ int i = this.text.length();
+
+ if (p_146199_1_ > i)
+ {
+ p_146199_1_ = i;
+ }
+
+ if (p_146199_1_ < 0)
+ {
+ p_146199_1_ = 0;
+ }
+
+ this.selectionEnd = p_146199_1_;
+
+ if (this.fontRendererInstance != null)
+ {
+ if (this.lineScrollOffset > i)
+ {
+ this.lineScrollOffset = i;
+ }
+
+ int j = this.getWidth();
+ String s = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), j);
+ int k = s.length() + this.lineScrollOffset;
+
+ if (p_146199_1_ == this.lineScrollOffset)
+ {
+ this.lineScrollOffset -= this.fontRendererInstance.trimStringToWidth(this.text, j, true).length();
+ }
+
+ if (p_146199_1_ > k)
+ {
+ this.lineScrollOffset += p_146199_1_ - k;
+ }
+ else if (p_146199_1_ <= this.lineScrollOffset)
+ {
+ this.lineScrollOffset -= this.lineScrollOffset - p_146199_1_;
+ }
+
+ this.lineScrollOffset = MathHelper.clamp_int(this.lineScrollOffset, 0, i);
+ }
+ }
+
+ /**
+ * if true the textbox can lose focus by clicking elsewhere on the screen
+ */
+ public void setCanLoseFocus(boolean p_146205_1_)
+ {
+ this.canLoseFocus = p_146205_1_;
+ }
+
+ /**
+ * returns true if this textbox is visible
+ */
+ public boolean getVisible()
+ {
+ return this.visible;
+ }
+
+ /**
+ * Sets whether or not this textbox is visible
+ */
+ public void setVisible(boolean p_146189_1_)
+ {
+ this.visible = p_146189_1_;
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/helpers/AltManagerUtils.java b/src/main/java/rip/athena/client/gui/menu/altmanager/helpers/AltManagerUtils.java
new file mode 100644
index 00000000..ebc8edca
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/helpers/AltManagerUtils.java
@@ -0,0 +1,171 @@
+package rip.athena.client.gui.menu.altmanager.helpers;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import fr.litarvan.openauth.microsoft.MicrosoftAuthResult;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticationException;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticator;
+import lombok.Getter;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.DynamicTexture;
+import net.minecraft.util.Session;
+import rip.athena.client.Athena;
+import rip.athena.client.account.Account;
+import rip.athena.client.account.AccountType;
+import rip.athena.client.utils.render.TextField;
+import rip.athena.client.utils.time.TimerUtil;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+public class AltManagerUtils {
+
+ /*@Getter
+ private final TimerUtil timerUtil = new TimerUtil();
+ public static File altsFile = new File(Athena.MAIN_DIR, "alts.json");
+
+ public AltManagerUtils() {
+
+ }
+
+ public void writeAltsToFile() {
+ if (timerUtil.hasTimeElapsed(15000, true)) {
+ new Thread(() -> {
+ try {
+ if (!altsFile.exists()) {
+ if (altsFile.getParentFile().mkdirs()) {
+ altsFile.createNewFile();
+ }
+ }
+ Files.write(altsFile.toPath(), new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create().toJson(alts.toArray(new Alt[0])).getBytes(StandardCharsets.UTF_8));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }).start();
+ }
+ }
+
+ public void login(TextField username, TextField password) {
+ String usernameS;
+ String passwordS;
+ if (username.getText().contains(":")) {
+ String[] combo = username.getText().split(":");
+ usernameS = combo[0];
+ passwordS = combo[1];
+ } else {
+ usernameS = username.getText();
+ passwordS = password.getText();
+ }
+ boolean microsoft = Alt.currentLoginMethod == Alt.AltType.MICROSOFT;
+
+ if (usernameS.isEmpty() && passwordS.isEmpty()) return;
+
+ loginWithString(usernameS, passwordS, false);
+ }
+
+
+ public void microsoftLoginAsync(String email, String password) {
+ microsoftLoginAsync(null, email, password);
+ }
+
+
+ public void microsoftLoginAsync(Alt alt, String email, String password) {
+ //if (alt == null) {
+ //alt = new Alt(email, password);
+ //}
+ //Alt finalAlt = alt;
+ new Thread() {
+ @Override
+ public void run() {
+ MicrosoftAuthenticator authenticator = new MicrosoftAuthenticator();
+ try {
+ MicrosoftAuthResult acc = authenticator.loginWithWebview();
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.MICROSOFT, acc.getProfile().getName(), acc.getProfile().getId(), acc.getRefreshToken()));
+ Minecraft.getMinecraft().session = new Session(acc.getProfile().getName(), acc.getProfile().getId(), acc.getAccessToken(), "legacy");
+ } catch (MicrosoftAuthenticationException e) {
+ e.printStackTrace();
+ }
+ }
+ }.start();
+ /*Multithreading.runAsync(() -> {
+ CompletableFuture future = new CompletableFuture<>();
+ MicrosoftLogin.getRefreshToken(refreshToken -> {
+ if (refreshToken != null) {
+ //MicrosoftLogin.LoginData login = MicrosoftLogin.login(refreshToken);
+ //future.complete(new Session(login.username, login.uuid, login.mcToken, "microsoft"));
+ }
+ });
+ Session auth = future.join();
+ if (auth != null) {
+ //mc.session = auth;
+ finalAlt.uuid = auth.getPlayerID();
+ finalAlt.altType = Alt.AltType.MICROSOFT;
+ finalAlt.username = auth.getUsername();
+ if (auth.getUsername() == null) {
+ //NotificationManager.post(NotificationType.WARNING, "Alt Manager", "Please set an username on your Minecraft account!", 12);
+ }
+ Alt.stage = 2;
+ finalAlt.altState = Alt.AltState.LOGIN_SUCCESS;
+ AltManagerUtils.getAlts().add(finalAlt);
+ //writeAlts();
+ //Tenacity.INSTANCE.getAltManager().currentSessionAlt = finalAlt;
+ //Tenacity.INSTANCE.getAltManager().getAltPanel().refreshAlts();
+ } else {
+ Alt.stage = 1;
+ finalAlt.altState = Alt.AltState.LOGIN_FAIL;
+ }
+ });*/
+
+ // }
+
+ /*public void loginWithString(String username, String password, boolean microsoft) {
+ for (Alt alt : alts) {
+ if (alt.email.equals(username) && alt.password.equals(password)) {
+ Alt.stage = 0;
+ alt.loginAsync(microsoft);
+ return;
+ }
+ }
+ Alt alt = new Alt(username, password);
+ alts.add(alt);
+ Alt.stage = 0;
+ alt.loginAsync(microsoft);
+ }*/
+
+ /*public void getHead(Alt alt) {
+ if (alt.uuid == null || alt.head != null || alt.headTexture || alt.headTries > 5) return;
+ /*Multithreading.runAsync(() -> {
+ alt.headTries++;
+ try {
+ BufferedImage image = ImageIO.read(new URL("https://visage.surgeplay.com/bust/160/" + alt.uuid));
+ alt.headTexture = true;
+ // run on main thread for OpenGL context
+ mc.addScheduledTask(() -> {
+ DynamicTexture texture = new DynamicTexture(image);
+ alt.head = mc.getTextureManager().getDynamicTextureLocation("HEAD-" + alt.uuid, texture);
+ });
+ } catch (IOException e) {
+ alt.headTexture = false;
+ }
+ });*/
+ //}
+
+ public static void microsoftLoginAsync() {
+ //if (alt == null) {
+ //alt = new Alt(email, password);
+ //}
+ //Alt finalAlt = alt;
+
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/gui/menu/altmanager/panels/LoginPanel.java b/src/main/java/rip/athena/client/gui/menu/altmanager/panels/LoginPanel.java
new file mode 100644
index 00000000..e043e7a3
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/menu/altmanager/panels/LoginPanel.java
@@ -0,0 +1,225 @@
+package rip.athena.client.gui.menu.altmanager.panels;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthResult;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticationException;
+import fr.litarvan.openauth.microsoft.MicrosoftAuthenticator;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.Session;
+import org.apache.commons.io.IOUtils;
+import org.lwjgl.input.Keyboard;
+import rip.athena.client.Athena;
+import rip.athena.client.account.Account;
+import rip.athena.client.account.AccountType;
+import rip.athena.client.gui.menu.altmanager.Panel;
+import rip.athena.client.gui.menu.altmanager.button.AltButton;
+import rip.athena.client.gui.menu.altmanager.helpers.AltManagerUtils;
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+import rip.athena.client.utils.animations.impl.DecelerateAnimation;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.*;
+import rip.athena.client.utils.render.TextField;
+
+import java.awt.*;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoginPanel extends Panel {
+
+ private final List actionButtons = new ArrayList<>();
+ public final List textFields = new ArrayList<>();
+ private String status = "Session:";
+
+ public LoginPanel() {
+ setHeight(200);
+ actionButtons.add(new AltButton("Cracked"));
+ actionButtons.add(new AltButton("Session"));
+ textFields.add(new TextField());
+ textFields.add(new TextField());
+ }
+
+
+ @Override
+ public void initGui() {
+
+ }
+
+ public static boolean cracked = false;
+
+ @Override
+ public void keyTyped(char typedChar, int keyCode) {
+ textFields.forEach(textField -> textField.keyTyped(typedChar, keyCode));
+ if (keyCode == Keyboard.KEY_TAB) {
+ TextField username = textFields.get(0);
+ TextField pass = textFields.get(1);
+ if (username.isFocused()) {
+ username.setFocused(false);
+ pass.setFocused(true);
+ return;
+ }
+ if (pass.isFocused()) {
+ pass.setFocused(false);
+ username.setFocused(true);
+ }
+ }
+
+ }
+
+ private boolean hoveringMicrosoft = false;
+ private final Animation hoverMicrosoftAnim = new DecelerateAnimation(250, 1);
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY) {
+ super.drawScreen(mouseX, mouseY);
+ setHeight(180);
+ FontManager.getProductSansRegular(28).drawCenteredString("Login", getX() + getWidth() / 2f, getY() + 10, ColorUtil.applyOpacity(-1, .75f));
+ FontManager.getProductSansRegular(12).drawCenteredString(status, getX() + getWidth() / 2f, getY() + 25, ColorUtil.applyOpacity(-1, .75f));
+ Color noColor = ColorUtil.applyOpacity(Color.WHITE, 0);
+
+ int count = 0;
+ int spacing = 8;
+ float diff = 35;
+ for (TextField textField : textFields) {
+ textField.setXPosition(getX() + (diff / 2f));
+ textField.setYPosition(getY() + 35 + count);
+ textField.setWidth(getWidth() - diff);
+ textField.setHeight(22);
+ textField.setBackgroundText(count == 0 ? "Email or username" : "Password");
+ textField.setOutline(noColor);
+ textField.setFill(ColorUtil.tripleColor(17));
+ textField.setTextAlpha(.35f);
+ textField.setMaxStringLength(560);
+ textField.drawTextBox();
+
+ count += textField.getHeight() + spacing;
+ }
+
+ float actionY = getY() + 98;
+ float actionWidth = 90;
+ float buttonSpacing = 10;
+ float firstX = getX() + getWidth() / 2f - ((actionButtons.size() * actionWidth) + 10) / 2f;
+ int seperation = 0;
+ for (AltButton actionButton : actionButtons) {
+ actionButton.setBypass(true);
+ actionButton.setColor(ColorUtil.tripleColor(55));
+ actionButton.setAlpha(1);
+ actionButton.setX(firstX + seperation);
+ actionButton.setY(actionY);
+ actionButton.setWidth(actionWidth);
+ actionButton.setHeight(20);
+
+ actionButton.setClickAction(() -> {
+ switch (actionButton.getName()) {
+ case "Cracked":
+ TextField cracked = textFields.get(0);
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.CRACKED, cracked.getText(), "0", "0"));
+ Minecraft.getMinecraft().session = new Session(cracked.getText(), "0", "0", "legacy");
+ status = "Logged into " + cracked.getText();
+ Athena.INSTANCE.getAccountManager().setCurrentAccount(Athena.INSTANCE.getAccountManager().getAccountByUsername(cracked.getText()));
+ Athena.INSTANCE.getAccountManager().isFirstLogin = false;
+ Athena.INSTANCE.getAccountManager().save();
+
+ break;
+ case "Session":
+ TextField sessionID = textFields.get(0);
+
+ try {
+ String user, uuid, token, session = sessionID.getText();
+
+ if (session.contains(":")) { //if fully formatted string (ign:uuid:token)
+ //split string to data
+ user = session.split(":")[0];
+ uuid = session.split(":")[1];
+ token = session.split(":")[2];
+ } else { //if only token
+ //make request
+ HttpURLConnection c = (HttpURLConnection) new URL("https://api.minecraftservices.com/minecraft/profile/").openConnection();
+ c.setRequestProperty("Content-type", "application/json");
+ c.setRequestProperty("Authorization", "Bearer " + sessionID.getText());
+ c.setDoOutput(true);
+
+ //get json
+ JsonObject json = new JsonParser().parse(IOUtils.toString(c.getInputStream())).getAsJsonObject();
+
+ //get data
+ user = json.get("name").getAsString();
+ uuid = json.get("id").getAsString();
+ token = session;
+ }
+
+ //set session and return to previous screen
+ Minecraft.getMinecraft().session = new Session(user, uuid, token, "mojang");
+ status = "Logged into " + user;
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.SESSION, user, uuid, token));
+ Athena.INSTANCE.getAccountManager().setCurrentAccount(Athena.INSTANCE.getAccountManager().getAccountByUsername(user));
+ Athena.INSTANCE.getAccountManager().isFirstLogin = false;
+ Athena.INSTANCE.getAccountManager().save();
+ Athena.INSTANCE.getLog().info("Success: Logged into " + user);
+ //mc.displayGuiScreen(previousScreen);
+ } catch (Exception e) {
+ status = "Failed to login";
+ Athena.INSTANCE.getLog().error("Failed to login");
+ System.out.println(sessionID.getText());
+ e.printStackTrace();
+ }
+ break;
+ }
+ });
+
+
+ actionButton.drawScreen(mouseX, mouseY);
+
+ seperation += actionWidth + buttonSpacing;
+ }
+
+ float microsoftY = actionY + 35, microWidth = 240, microHeight = 35;
+ float microX = getX() + getWidth() / 2f - microWidth / 2f;
+
+ hoveringMicrosoft = HoveringUtil.isHovering(microX - 2, microsoftY - 2, microWidth + 4, microHeight + 4, mouseX, mouseY);
+ hoverMicrosoftAnim.setDirection(hoveringMicrosoft ? Direction.FORWARDS : Direction.BACKWARDS);
+
+ RoundedUtils.drawRound(microX, microsoftY, microWidth, microHeight, 5, ColorUtil.applyOpacity(Color.BLACK, .2f + (.25f * hoverMicrosoftAnim.getOutput().floatValue())));
+
+ FontManager.getProductSansRegular(26).drawString("Microsoft Login", microX + 10, microsoftY + 4, -1);
+ FontManager.getProductSansRegular(16).drawString("Login to your migrated account", microX + 10, microsoftY + 23, -1);
+
+ float logoSize = 22;
+ DrawUtils.drawMicrosoftLogo(microX + microWidth - (10 + logoSize), microsoftY + (microHeight / 2f) - (logoSize / 2f), logoSize, 1.5f);
+ }
+
+ @Override
+ public void mouseClicked(int mouseX, int mouseY, int button) {
+ textFields.forEach(textField -> textField.mouseClicked(mouseX, mouseY, button));
+ actionButtons.forEach(actionButton -> actionButton.mouseClicked(mouseX, mouseY, button));
+
+ if (hoveringMicrosoft && button == 0) {
+ new Thread(() -> {
+ MicrosoftAuthenticator authenticator = new MicrosoftAuthenticator();
+ /*try {
+ MicrosoftAuthResult acc = authenticator.loginWithWebview();
+ Athena.INSTANCE.getAccountManager().getAccounts().add(new Account(AccountType.MICROSOFT, acc.getProfile().getName(), acc.getProfile().getId(), acc.getRefreshToken()));
+ Minecraft.getMinecraft().session = new Session(acc.getProfile().getName(), acc.getProfile().getId(), acc.getAccessToken(), "legacy");
+ Athena.INSTANCE.getAccountManager().isFirstLogin = false;
+ } catch (MicrosoftAuthenticationException e) {
+ e.printStackTrace();
+ }*/
+ }).start();
+ resetTextFields();
+ }
+ }
+
+ @Override
+ public void mouseReleased(int mouseX, int mouseY, int state) {
+
+ }
+
+ private void resetTextFields() {
+ textFields.forEach(textField -> textField.setText(""));
+ }
+}
diff --git a/src/main/java/rip/athena/client/gui/screen/Screen.java b/src/main/java/rip/athena/client/gui/screen/Screen.java
new file mode 100644
index 00000000..f5db1418
--- /dev/null
+++ b/src/main/java/rip/athena/client/gui/screen/Screen.java
@@ -0,0 +1,20 @@
+package rip.athena.client.gui.screen;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public interface Screen {
+
+ void initGui();
+
+ void keyTyped(char typedChar, int keyCode);
+
+ void drawScreen(int mouseX, int mouseY);
+
+ void mouseClicked(int mouseX, int mouseY, int button);
+
+ void mouseReleased(int mouseX, int mouseY, int state);
+
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/mods/HitDelayFix.java b/src/main/java/rip/athena/client/modules/impl/mods/HitDelayFix.java
new file mode 100644
index 00000000..c2730123
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/mods/HitDelayFix.java
@@ -0,0 +1,16 @@
+package rip.athena.client.modules.impl.mods;
+
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/4/2023
+ */
+public class HitDelayFix extends Module {
+
+ public HitDelayFix() {
+ super("HitDelayFix", Category.MODS, "Athena/gui/mods/cps.png");
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/mods/MinimalBobbing.java b/src/main/java/rip/athena/client/modules/impl/mods/MinimalBobbing.java
new file mode 100644
index 00000000..bd1bccbb
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/mods/MinimalBobbing.java
@@ -0,0 +1,23 @@
+package rip.athena.client.modules.impl.mods;
+
+import rip.athena.client.config.ConfigValue;
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public class MinimalBobbing extends Module {
+
+ @ConfigValue.Boolean(name = "Remove Hand Bobbing")
+ public boolean handBobbing = true;
+
+ @ConfigValue.Boolean(name = "Remove Screen Bobbing")
+ public boolean screenBobbing = true;
+
+ public MinimalBobbing() {
+ super("Minimal Bobbing", Category.MODS, "Athena/gui/mods/nobobbing.png");
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/mods/ToggleSprint.java b/src/main/java/rip/athena/client/modules/impl/mods/ToggleSprint.java
new file mode 100644
index 00000000..f25832e6
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/mods/ToggleSprint.java
@@ -0,0 +1,281 @@
+package rip.athena.client.modules.impl.mods;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.util.MovementInputFromOptions;
+import org.lwjgl.opengl.GL11;
+import rip.athena.client.Athena;
+import rip.athena.client.config.ConfigValue;
+import rip.athena.client.gui.hud.HUDElement;
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.utils.render.RoundedUtils;
+
+import java.awt.*;
+import java.text.DecimalFormat;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public class ToggleSprint extends Module {
+
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
+
+ @ConfigValue.Boolean(name = "Background")
+ private boolean backGround = false;
+
+ @ConfigValue.Color(name = "Background Color")
+ private Color background = new Color(0, 0, 0, 150);
+
+ @ConfigValue.Boolean(name = "Toggle Sneak")
+ private static boolean optionToggleSneak = true;
+
+ @ConfigValue.Boolean(name = "Toggle Sprint")
+ public
+ static boolean optionToggleSprint = true;
+
+ @ConfigValue.Boolean(name = "Double Tap Sprint")
+ public
+ static boolean optionDoubleTap = false;
+
+ @ConfigValue.Boolean(name = "Fly Boost")
+ public
+ static boolean optionEnableFlyBoost = true;
+
+ @ConfigValue.Double(name = "Fly Boost Speed Vertical" , min = 0.1D, max = 20D)
+ public
+ static double flyboostspeedVertical = 2.0;
+
+ @ConfigValue.Double(name = "Fly Boost Speed Horizontal" , min = 0.1D, max = 20D)
+ public
+ static double flyboostspeedHorizontal = 2.0;
+
+ @ConfigValue.Boolean(name = "Custom Font")
+ private static boolean customFont = false;
+
+ @ConfigValue.Color(name = "Color")
+ private Color color = Color.WHITE;
+
+ public static boolean isDisabled;
+ public static boolean canDoubleTap;
+
+ public static boolean sprint = false;
+ public static boolean sprintHeldAndReleased = false;
+ public static boolean sprintDoubleTapped = false;
+
+ public static long lastPressed;
+ public static long lastSprintPressed;
+ public static boolean handledSneakPress;
+ public static boolean handledSprintPress;
+ public static boolean wasRiding;
+
+ public static boolean wasSprintDisabled = false;
+ public static String textForHUD = "";
+
+ private HUDElement hud;
+ private int width = 20;
+ private int height = 10;
+
+ public ToggleSprint() {
+ super("ToggleSprint", Category.MODS, "Athena/gui/mods/entityhud.png");
+ hud = new HUDElement("togglesprint", width, height) {
+ @Override
+ public void onRender() {
+ render();
+ }
+ };
+ addHUD(hud);
+ }
+
+ public static void update(Minecraft mc, MovementInputFromOptions options, EntityPlayerSP thisPlayer) {
+ options.moveStrafe = 0.0F;
+ options.moveForward = 0.0F;
+
+ GameSettings settings = mc.gameSettings;
+
+ if(settings.keyBindForward.isKeyDown()) {
+ ++options.moveForward;
+ }
+
+ if(settings.keyBindBack.isKeyDown()) {
+ --options.moveForward;
+ }
+
+ if(settings.keyBindLeft.isKeyDown()) {
+ ++options.moveStrafe;
+ }
+
+ if(settings.keyBindRight.isKeyDown()) {
+ --options.moveStrafe;
+ }
+
+ options.jump = settings.keyBindJump.isKeyDown();
+
+
+ if (optionToggleSneak) {
+ if (settings.keyBindSneak.isKeyDown() && !handledSneakPress) {
+ if(thisPlayer.isRiding() || thisPlayer.capabilities.isFlying) {
+ options.sneak = true;
+ wasRiding = thisPlayer.isRiding();
+ } else {
+ options.sneak = !options.sneak;
+ }
+
+ lastPressed = System.currentTimeMillis();
+ handledSneakPress = true;
+ }
+
+ if (!settings.keyBindSneak.isKeyDown() && handledSneakPress) {
+ if(thisPlayer.capabilities.isFlying || wasRiding) {
+ options.sneak = false;
+ wasRiding = false;
+ } else if(System.currentTimeMillis() - lastPressed > 300L) {
+ options.sneak = false;
+ }
+
+ handledSneakPress = false;
+ }
+ } else {
+ options.sneak = settings.keyBindSneak.isKeyDown();
+ }
+
+ if(options.sneak) {
+ options.moveStrafe = (float)((double)options.moveStrafe * 0.3D);
+ options.moveForward = (float)((double)options.moveForward * 0.3D);
+ }
+
+ boolean enoughHunger = (float)thisPlayer.getFoodStats().getFoodLevel() > 6.0F;
+ boolean canSprint = !options.sneak && enoughHunger;
+
+ isDisabled = !optionToggleSprint;
+ canDoubleTap = optionDoubleTap;
+
+ if((canSprint || isDisabled) && settings.keyBindSprint.isKeyDown() && !handledSprintPress) {
+ if(!isDisabled) {
+ sprint = !sprint;
+ lastSprintPressed = System.currentTimeMillis();
+ handledSprintPress = true;
+ sprintHeldAndReleased = false;
+ }
+ }
+
+ if((canSprint || isDisabled) && !settings.keyBindSprint.isKeyDown() && handledSprintPress) {
+ if(System.currentTimeMillis() - lastSprintPressed > 300L) {
+ sprintHeldAndReleased = true;
+ }
+ handledSprintPress = false;
+ }
+
+ UpdateStatus(options, thisPlayer, settings);
+ }
+
+ public static void UpdateSprint(boolean newValue, boolean doubleTapped)
+ {
+ sprint = newValue;
+ sprintDoubleTapped = doubleTapped;
+ }
+
+ public static void UpdateStatus(MovementInputFromOptions options, EntityPlayerSP thisPlayer, GameSettings settings)
+ {
+
+ String output = "";
+
+ boolean isFlying = thisPlayer.capabilities.isFlying;
+ boolean isRiding = thisPlayer.isRiding();
+ boolean isHoldingSneak = settings.keyBindSneak.isKeyDown();
+ boolean isHoldingSprint = settings.keyBindSprint.isKeyDown();
+
+ if(isFlying)
+ {
+ DecimalFormat numFormat = new DecimalFormat("#.00");
+
+ String speedVert = numFormat.format(flyboostspeedVertical);
+ String speedHori = numFormat.format(flyboostspeedHorizontal);
+ String label = speedVert + "x, " + speedHori + "x";
+
+ if(speedVert.equalsIgnoreCase(speedHori)) {
+ label = speedVert + "x";
+ }
+
+ if (optionEnableFlyBoost && sprint) output += "[Flying (" + label + " boost)] ";
+ else output += "[Flying] ";
+ }
+ if(isRiding) output += "[Riding] ";
+
+ if (options.sneak) {
+ if(isFlying) output += "[Descending] ";
+ else if(isRiding) output += "[Dismounting] ";
+ else if(isHoldingSneak) output += "[Sneaking (Key Held)] ";
+ else output += "[Sneaking (Toggled)] ";
+ } else if (sprint) {
+
+ if(!isFlying && !isRiding) {
+ boolean isVanilla = sprintHeldAndReleased || isDisabled || sprintDoubleTapped;
+
+ if(isHoldingSprint) output += "[Sprinting (Key Held)]";
+ else if(isVanilla) output += "[Sprinting (Vanilla)]";
+ else output += "[Sprinting (Toggled)]";
+ }
+ } else {
+ output += "[Inactive] ";
+ }
+ textForHUD = output;
+ }
+
+
+ public void render() {
+ if(!customFont) {
+ hud.setWidth(mc.fontRendererObj.getStringWidth(textForHUD) + 1);
+ hud.setHeight(mc.fontRendererObj.FONT_HEIGHT + 1);
+ } else {
+ hud.setWidth(FontManager.getProductSansRegular(25).width(textForHUD));
+ hud.setHeight((int) (FontManager.getProductSansRegular(25).height() + 3));
+ }
+
+ if (mc.gameSettings.showDebugInfo) {
+ return;
+ }
+
+ GL11.glPushMatrix();
+
+ if(backGround) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Fade")) {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + hud.getWidth(), hud.getY() + hud.getHeight(), 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColorWave().getRGB());
+ } else {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + hud.getWidth(), hud.getY() + hud.getHeight(), 12,background.getRGB());
+ }
+ }
+
+ if(!customFont) {
+ if(color.getBlue() == 5 && color.getRed() == 5 && color.getGreen() == 5) {
+ DrawUtils.drawChromaString(textForHUD, hud.getX() + 1, hud.getY() + 1, true ,true);
+ } else if(color.getBlue() == 6 && color.getRed() == 6 && color.getGreen() == 6) {
+ DrawUtils.drawChromaString(textForHUD, hud.getX() + 1, hud.getY() + 1, false ,true);
+ } else {
+ mc.fontRendererObj.drawStringWithShadow(textForHUD, (float) hud.getX() + 1, (float)hud.getY() + 1, color.getRGB());
+ }
+ } else {
+ if(color.getBlue() == 5 && color.getRed() == 5 && color.getGreen() == 5) {
+ DrawUtils.drawCustomFontChromaString(FontManager.getProductSansRegular(25),textForHUD, hud.getX() + 1, hud.getY() + 3, true ,true);
+ } else if(color.getBlue() == 6 && color.getRed() == 6 && color.getGreen() == 6) {
+ DrawUtils.drawCustomFontChromaString(FontManager.getProductSansRegular(25),textForHUD, hud.getX() + 1, hud.getY() + 3, false ,true);
+ } else {
+ FontManager.getProductSansRegular(25).drawString(textForHUD, hud.getX() + 1, hud.getY() + 3, color.getRGB());
+ }
+ }
+ GL11.glColor3f(1, 1, 1);
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/other/AimTrainer.java b/src/main/java/rip/athena/client/modules/impl/other/AimTrainer.java
new file mode 100644
index 00000000..d75239e3
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/other/AimTrainer.java
@@ -0,0 +1,316 @@
+package rip.athena.client.modules.impl.other;
+
+import com.mojang.authlib.GameProfile;
+import net.minecraft.client.entity.EntityOtherPlayerMP;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.Vec3;
+import rip.athena.client.Athena;
+import rip.athena.client.config.ConfigValue;
+import rip.athena.client.events.SubscribeEvent;
+import rip.athena.client.events.types.client.ClientTickEvent;
+import rip.athena.client.events.types.entity.AttackEntityEvent;
+import rip.athena.client.events.types.input.MouseDownEvent;
+import rip.athena.client.events.types.render.RenderEvent;
+import rip.athena.client.events.types.render.RenderType;
+import rip.athena.client.gui.hud.HUDElement;
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+import rip.athena.client.utils.NumberUtils;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.ColorUtil;
+import rip.athena.client.utils.render.DrawUtils;
+import rip.athena.client.utils.render.RoundedUtils;
+
+import java.awt.*;
+import java.text.DecimalFormat;
+import java.text.Format;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class AimTrainer extends Module {
+
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
+
+ @ConfigValue.Boolean(name = "Move")
+ private boolean move = true;
+
+ @ConfigValue.Float(name = "Speed", min = 1f, max = 10f)
+ private float speed = 4f;
+
+ @ConfigValue.Float(name = "Distance", min = 1f, max = 10f)
+ private float distance = 3f;
+
+ @ConfigValue.Boolean(name = "Background")
+ private boolean backGround = true;
+
+ @ConfigValue.Color(name = "Background Color")
+ private Color background = new Color(0, 0, 0, 150);
+
+ @ConfigValue.Color(name = "Color")
+ private Color color = Color.WHITE;
+
+ @ConfigValue.Boolean(name = "Custom Font")
+ private boolean customFont = false;
+
+ @ConfigValue.Boolean(name = "Static Chroma")
+ private boolean isUsingStaticChroma = false;
+
+ @ConfigValue.Boolean(name = "Wave Chroma")
+ private boolean isUsingWaveChroma = false;
+
+ public List bots = new ArrayList<>();
+ public EntityOtherPlayerMP bot;
+
+ public int hitCount = 0;
+ public int failedHit = 0;
+ public float accuracy;
+
+ public Vec3 position;
+
+ private HUDElement hud;
+ private int width = 56;
+ private int height = 18;
+
+ public AimTrainer() {
+ super("Aim Trainer", Category.RENDER, "Athena/gui/mods/time.png");
+
+ hud = new HUDElement("time", width, height) {
+ @Override
+ public void onRender() {
+ render();
+ }
+ };
+
+ hud.setX(1);
+ hud.setY(190);
+
+ addHUD(hud);
+ }
+
+ public void render() {
+ int width = hud.getWidth();
+ int height = hud.getHeight();
+
+ if(backGround) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
+ } else if (backgroundMode.equalsIgnoreCase("Fade")) {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ } else {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
+ }
+ }
+
+ float posY = hud.getY() + 2;
+ float posX = hud.getX() + 9;
+
+ if(customFont) {
+ hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(accuracy + "%" + 20));
+ hud.setHeight((int) FontManager.getProductSansRegular(25).height());
+
+ if(isUsingStaticChroma) {
+ DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), accuracy + "%", (int) (posX), (int) posY, true, true);
+ } else if(isUsingWaveChroma) {
+ DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), accuracy + "%", (int) (posX), (int) posY, false, true);
+ } else {
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(accuracy + "%",(int) (posX), (int)posY, color.getRGB());
+ }
+ } else {
+ hud.setWidth(mc.fontRendererObj.getStringWidth(accuracy + "%") + 16);
+ hud.setHeight(mc.fontRendererObj.FONT_HEIGHT + 9);
+
+
+ if(isUsingStaticChroma) {
+ DrawUtils.drawChromaString(accuracy + "%", posX, posY + 3, true ,true);
+ } else if(isUsingWaveChroma) {
+ DrawUtils.drawChromaString(accuracy + "%", posX, posY + 3, false ,true);
+ } else {
+ mc.fontRendererObj.drawStringWithShadow(accuracy + "%", (float) (posX), (float) posY+ 3, color.getRGB());
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onAttack(AttackEntityEvent event) {
+ if (event.getTarget() == getBot("ziue")) {
+ hitCount++;
+ delBot("ziue");
+ createBotRandomPosition("ziue");
+ Athena.INSTANCE.getLog().info("you have hit the bot");
+ event.setCancelled(true);
+ }
+
+ updateAccuracy();
+ }
+
+ @SubscribeEvent
+ public void onMouseDown(MouseDownEvent event) {
+ if(event.getButton() == 0) {
+ if(mc.objectMouseOver != null) {
+ if (mc.objectMouseOver.entityHit == null) {
+ failedHit++;
+ Athena.INSTANCE.getLog().info("YOU MISSED A HIT: " + failedHit);
+ updateAccuracy();
+ }
+ }
+ }
+ }
+
+ private void updateAccuracy() {
+ if(failedHit > 0) {
+ this.accuracy = Float.parseFloat(NumberUtils.getStringValueOfFloat((float) hitCount / failedHit * 100, NumberUtils.Format.Hundredths));
+ } else {
+ accuracy = 100;
+ }
+
+ accuracy = Math.min(accuracy, 100);
+
+ Athena.INSTANCE.getLog().info("Accuracy: " + accuracy + "%");
+ }
+
+ /**
+ * Creates a bot with the given username.
+ * @param username The username of the bot.
+ */
+ public void createBot(String username) {
+ if (!isBot(username) && mc.thePlayer != null) {
+
+ EntityOtherPlayerMP bot = new EntityOtherPlayerMP(mc.thePlayer.getEntityWorld(), new GameProfile(UUID.randomUUID(), username));
+ mc.theWorld.addEntityToWorld(bot.getEntityId(), bot);
+ bot.setPositionAndRotation(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ, mc.thePlayer.rotationYaw, mc.thePlayer.rotationPitch);
+ bots.add(bot);
+ }
+ }
+
+ /**
+ * Creates a bot with the given username.
+ * @param username The username of the bot.
+ */
+ public void createBotRandomPosition(String username) {
+ if (!isBot(username) && mc.thePlayer != null) {
+
+ double x = mc.thePlayer.posX;
+ double y = mc.thePlayer.posY;
+ double z = mc.thePlayer.posZ;
+
+ double randomX = randomDoubleNumber(false, x - 3, x + 3);
+ double randomY = randomDoubleNumber(false, y, y + 2);
+ double randomZ = randomDoubleNumber(false, z - 3, z + 3);
+
+ EntityOtherPlayerMP bot = new EntityOtherPlayerMP(mc.thePlayer.getEntityWorld(), new GameProfile(UUID.randomUUID(), username));
+ mc.theWorld.addEntityToWorld(bot.getEntityId(), bot);
+ bot.setPositionAndRotation(randomX, randomY, randomZ, mc.thePlayer.rotationYaw, mc.thePlayer.rotationPitch);
+
+ position = new Vec3(bot.posX, bot.posY, bot.posZ);
+
+ bots.add(bot);
+ }
+ }
+
+ @SubscribeEvent
+ public void onTick(RenderEvent event) {
+ if(event.getRenderType() != RenderType.INGAME_OVERLAY) return;
+
+ bot = getBot("ziue");
+ if(bot != null && move) {
+ bot.setPositionAndRotation2(position.xCoord - Math.sin(bot.ticksExisted * speed / 10) * distance, position.yCoord, position.zCoord + Math.cos(bot.ticksExisted * speed / 10) * distance, bot.rotationYaw, bot.rotationPitch, 3, true);
+ }
+ }
+
+ /**
+ * Deletes the bot with the given username.
+ * @param username The username of the bot to delete.
+ */
+ public void delBot(String username) {
+ if(isBot(username)) {
+ mc.theWorld.removeEntityFromWorld(getBot(username).getEntityId());
+ bots.remove(getBot(username));
+ }
+ }
+
+ /**
+ * Returns the number of bots in the list.
+ * @return The number of bots.
+ */
+ public void botList() {
+ if(bots.size() != 0) {
+ int numberList = 1;
+ for(EntityOtherPlayerMP b : bots) {
+ numberList++;
+ }
+ } else {
+ return;
+ }
+ }
+
+ public static double randomDoubleNumber(boolean round, double min, double max) {
+ return round ? Math.round(Math.random() * (max - min) + min) : (Math.random() * (max - min) + min);
+ }
+
+ /**
+ * Retrieves the bot with the given username.
+ * @param name The username of the bot to retrieve.
+ * @return The bot with the specified username, or null if not found.
+ */
+ public EntityOtherPlayerMP getBot(String name) {
+ for (EntityOtherPlayerMP bot : bots) {
+ if (bot.getName().equalsIgnoreCase(name)) {
+ return bot;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Checks if a bot with the given username exists.
+ * @param name The username to check.
+ * @return true if a bot with the username exists, false otherwise.
+ */
+ public boolean isBot(String name) {
+ for (EntityOtherPlayerMP bot : bots) {
+ if (bot.getName().equalsIgnoreCase(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void clearBots() {
+ for(EntityOtherPlayerMP bot : bots) {
+ mc.theWorld.removeEntityFromWorld(bot.getEntityId());
+ }
+ }
+
+ @Override
+ public void onEnable() {
+ createBot("ziue");
+ accuracy = 100;
+
+ super.onEnable();
+ }
+
+ @Override
+ public void onDisable() {
+
+ clearBots();
+ bots.clear();
+ accuracy = 0;
+ hitCount = 0;
+ failedHit = 0;
+
+ super.onDisable();
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/other/NickHider.java b/src/main/java/rip/athena/client/modules/impl/other/NickHider.java
new file mode 100644
index 00000000..9b749f50
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/other/NickHider.java
@@ -0,0 +1,20 @@
+package rip.athena.client.modules.impl.other;
+
+import rip.athena.client.config.ConfigValue;
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public class NickHider extends Module {
+
+ @ConfigValue.Text(name = "Nick", description = "Enter the name of your custom nickname")
+ public String nick = "Custom Nick";
+
+ public NickHider() {
+ super("Nick Hider", Category.OTHER, "Athena/gui/mods/nickhider.png");
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/render/CPS.java b/src/main/java/rip/athena/client/modules/impl/render/CPS.java
index 81b3216c..0aa7dfd4 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/CPS.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/CPS.java
@@ -10,6 +10,7 @@ import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
import rip.athena.client.utils.ClickCounter;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -34,8 +35,8 @@ public class CPS extends Module {
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Color(name = "Background Color")
private Color background = new Color(0, 0, 0, 150);
@@ -81,16 +82,18 @@ public class CPS extends Module {
int height = hud.getHeight();
if(backGround) {
- if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
} else {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
}
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
@@ -98,7 +101,7 @@ public class CPS extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int) rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string) + 16);
+ hud.setWidth((int) rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string) + 16);
hud.setHeight((int)FontManager.baloo17.getHeight(string) + 7);
if(isUsingStaticChroma) {
diff --git a/src/main/java/rip/athena/client/modules/impl/render/Chat.java b/src/main/java/rip/athena/client/modules/impl/render/Chat.java
index 974ff1ba..3897d285 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/Chat.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/Chat.java
@@ -11,8 +11,8 @@ import rip.athena.client.modules.Module;
*/
public class Chat extends Module {
- @ConfigValue.Boolean(name = "Custom Font")
- public static boolean customFont = false;
+ @ConfigValue.Boolean(name = "Infinite Chat")
+ public boolean infiniteChat = false;
public Chat() {
super("Chat", Category.RENDER, "Athena/gui/mods/chat.png");
diff --git a/src/main/java/rip/athena/client/modules/impl/render/Clock.java b/src/main/java/rip/athena/client/modules/impl/render/Clock.java
index 4d40b975..be240687 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/Clock.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/Clock.java
@@ -3,10 +3,11 @@ package rip.athena.client.modules.impl.render;
import org.lwjgl.opengl.GL11;
import rip.athena.client.Athena;
import rip.athena.client.config.ConfigValue;
-import rip.athena.client.font.FontManager;
import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -26,8 +27,8 @@ public class Clock extends Module {
@ConfigValue.List(name = "Clock Format", values = {"yyyy/MM/dd HH:mm:ss","MM/dd/yyyy", "dd/MM/yyyy", "dd/MM/yyyy hh:mm a" , "MM/dd/yyyy hh:mm a" ,"E, MMM dd yyyy","hh:mm a", "hh:mm:ss a", "yyyy-MM-dd"})
private String format = "yyyy/MM/dd HH:mm:ss";
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
@@ -85,11 +86,17 @@ public class Clock extends Module {
if(backGround) {
if(backgroundMode.equalsIgnoreCase("Modern")) {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
@@ -97,15 +104,15 @@ public class Clock extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string) + 16);
- hud.setHeight((int)FontManager.baloo17.getHeight(string) + 7);
+ hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string) + 16);
+ hud.setHeight((int) FontManager.getProductSansRegular(25).height());
if(isUsingStaticChroma) {
DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), string, (int) (posX), (int) posY, true, true);
} else if(isUsingWaveChroma) {
DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), string, (int) (posX), (int) posY, false, true);
} else {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(string,(int) (posX), (int)posY, color.getRGB());
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(string,(int) (posX), (int)posY, color.getRGB());
}
} else {
hud.setWidth(mc.fontRendererObj.getStringWidth(string) + 16);
diff --git a/src/main/java/rip/athena/client/modules/impl/render/Coordinates.java b/src/main/java/rip/athena/client/modules/impl/render/Coordinates.java
index a5f36b26..a747d7c7 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/Coordinates.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/Coordinates.java
@@ -21,6 +21,7 @@ import rip.athena.client.font.FontManager;
import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -65,8 +66,8 @@ public class Coordinates extends Module {
@ConfigValue.List(name = "Display Mode", values = {"Horizontal", "Vertical"}, description = "How the hud should be displayed")
private String displayMode = "Vertical";
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Color(name = "Background Color")
private Color backgroundColor = new Color(0, 0, 0, 150);
@@ -199,12 +200,19 @@ public class Coordinates extends Module {
if(this.shadedCoords) {
if(backgroundMode.equalsIgnoreCase("Modern")) {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
- RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColorWave().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, backgroundColor.getRGB(), backgroundColor.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,backgroundColor.getRGB());
}
+
}
drawString(med, (float) (posX - 2 + (width / 2 - (getStringWidth(med) / 2))), (float) posY + 5, vColor);
@@ -266,6 +274,8 @@ public class Coordinates extends Module {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else {
DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, backgroundColor.getRGB(), backgroundColor.getRGB());
}
diff --git a/src/main/java/rip/athena/client/modules/impl/render/CustomText.java b/src/main/java/rip/athena/client/modules/impl/render/CustomText.java
index 08d3dba4..c8070723 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/CustomText.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/CustomText.java
@@ -28,8 +28,8 @@ public class CustomText extends Module {
@ConfigValue.Boolean(name = "Custom Font")
private boolean customFont = false;
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
@@ -72,16 +72,16 @@ public class CustomText extends Module {
int height = hud.getHeight();
if(backGround) {
- if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
} else {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
}
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
- RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColorWave().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
@@ -89,7 +89,7 @@ public class CustomText extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int) rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(customText) + 16);
+ hud.setWidth((int) rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(customText) + 16);
hud.setHeight((int)FontManager.baloo17.getHeight(customText) + 7);
if(isUsingStaticChroma) {
@@ -97,7 +97,7 @@ public class CustomText extends Module {
} else if(isUsingWaveChroma) {
DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), customText, (int) (posX), (int) posY + 1, false, true);
} else {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(customText,(int) (posX), (int)posY + 1, color.getRGB());
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(customText,(int) (posX), (int)posY + 1, color.getRGB());
}
} else {
hud.setWidth(mc.fontRendererObj.getStringWidth(customText) + 16);
diff --git a/src/main/java/rip/athena/client/modules/impl/render/EntityHUD.java b/src/main/java/rip/athena/client/modules/impl/render/EntityHUD.java
index 2c555deb..0071ddc0 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/EntityHUD.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/EntityHUD.java
@@ -19,8 +19,8 @@ import java.awt.*;
*/
public class EntityHUD extends Module {
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
@@ -73,11 +73,15 @@ public class EntityHUD extends Module {
if(backGround) {
if(backgroundMode.equalsIgnoreCase("Modern")) {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
- RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColorWave().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
diff --git a/src/main/java/rip/athena/client/modules/impl/render/FPSMod.java b/src/main/java/rip/athena/client/modules/impl/render/FPSMod.java
index b2b80b85..175bdcbc 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/FPSMod.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/FPSMod.java
@@ -14,6 +14,7 @@ import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.gui.menu.AthenaMenu;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -28,8 +29,8 @@ import static org.lwjgl.opengl.GL11.GL_GREATER;
*/
public class FPSMod extends Module {
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
@@ -85,12 +86,14 @@ public class FPSMod extends Module {
if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
} else {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
}
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
- RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColorWave().getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
@@ -98,7 +101,7 @@ public class FPSMod extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string) + 16);
+ hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string) + 16);
hud.setHeight((int)FontManager.baloo17.getHeight(string) + 7);
if(isUsingStaticChroma) {
diff --git a/src/main/java/rip/athena/client/modules/impl/render/MemoryUsage.java b/src/main/java/rip/athena/client/modules/impl/render/MemoryUsage.java
index ecd126a4..82aba02c 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/MemoryUsage.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/MemoryUsage.java
@@ -7,6 +7,7 @@ import rip.athena.client.font.FontManager;
import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -21,8 +22,8 @@ public class MemoryUsage extends Module {
@ConfigValue.Boolean(name = "Percentage", description = "Show memory usage in percentage.")
private boolean percentage = false;
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
@@ -89,11 +90,17 @@ public class MemoryUsage extends Module {
if(backGround) {
if(backgroundMode.equalsIgnoreCase("Modern")) {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, background.getRGB(), background.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,background.getRGB());
}
}
@@ -101,7 +108,7 @@ public class MemoryUsage extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(string) + 16);
+ hud.setWidth((int)rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string) + 16);
hud.setHeight((int)FontManager.baloo17.getHeight(string) + 7);
if(isUsingStaticChroma) {
@@ -109,7 +116,7 @@ public class MemoryUsage extends Module {
} else if(isUsingWaveChroma) {
DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), string, (int) (posX), (int) posY, false, true);
} else {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(string,(int) (posX), (int)posY, color.getRGB());
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(string,(int) (posX), (int)posY, color.getRGB());
}
} else {
hud.setWidth(mc.fontRendererObj.getStringWidth(string) + 16);
diff --git a/src/main/java/rip/athena/client/modules/impl/render/PotCounter.java b/src/main/java/rip/athena/client/modules/impl/render/PotCounter.java
index f4aebf00..b35d2b52 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/PotCounter.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/PotCounter.java
@@ -12,6 +12,7 @@ import rip.athena.client.font.FontManager;
import rip.athena.client.gui.hud.HUDElement;
import rip.athena.client.modules.Category;
import rip.athena.client.modules.Module;
+import rip.athena.client.utils.render.ColorUtil;
import rip.athena.client.utils.render.DrawUtils;
import rip.athena.client.utils.render.RoundedUtils;
@@ -27,8 +28,8 @@ public class PotCounter extends Module {
@ConfigValue.Color(name = "Color")
private Color color = Color.WHITE;
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- private String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ private String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Background")
private boolean background = true;
@@ -72,8 +73,6 @@ public class PotCounter extends Module {
public void render() {
if(mc.gameSettings.showDebugInfo) return;
- GL11.glPushMatrix();
-
counter = 0;
if(mc.thePlayer != null && mc.theWorld != null) {
@@ -96,16 +95,18 @@ public class PotCounter extends Module {
int height = hud.getHeight();
if(background) {
- if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
} else {
- RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
}
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
- DrawUtils.drawGradientRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, backgroundColor.getRGB(), backgroundColor.getRGB());
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,backgroundColor.getRGB());
}
}
@@ -113,7 +114,7 @@ public class PotCounter extends Module {
float posX = hud.getX() + 9;
if(customFont) {
- hud.setWidth((int) (rip.athena.client.utils.font.FontManager.getProductSansRegular(30).width(str) + 16));
+ hud.setWidth((int) (rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(str) + 16));
hud.setHeight((int) (FontManager.baloo17.getHeight(str) + 7));
if(isUsingStaticChroma) {
@@ -121,7 +122,7 @@ public class PotCounter extends Module {
} else if (isUsingWaveChroma) {
DrawUtils.drawCustomFontChromaString(rip.athena.client.utils.font.FontManager.getProductSansRegular(25), str, (int) posX, (int) posY + 1, false, true);
} else {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(str, (int) posX, (int) posY + 1, color.getRGB());
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(str, (int) posX, (int) posY + 1, color.getRGB());
}
} else {
hud.setWidth(mc.fontRendererObj.getStringWidth(str) + 16);
@@ -135,9 +136,5 @@ public class PotCounter extends Module {
mc.fontRendererObj.drawString(str, (int) posX, (int) posY + 3, color.getRGB());
}
}
-
- GL11.glColor3f(1,1,1);
- GL11.glPopMatrix();
-
}
}
diff --git a/src/main/java/rip/athena/client/modules/impl/render/Scoreboard.java b/src/main/java/rip/athena/client/modules/impl/render/Scoreboard.java
new file mode 100644
index 00000000..e6d1767e
--- /dev/null
+++ b/src/main/java/rip/athena/client/modules/impl/render/Scoreboard.java
@@ -0,0 +1,204 @@
+package rip.athena.client.modules.impl.render;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.scoreboard.Score;
+import net.minecraft.scoreboard.ScoreObjective;
+import net.minecraft.scoreboard.ScorePlayerTeam;
+import net.minecraft.util.EnumChatFormatting;
+import org.lwjgl.opengl.GL11;
+import rip.athena.client.Athena;
+import rip.athena.client.config.ConfigValue;
+import rip.athena.client.events.SubscribeEvent;
+import rip.athena.client.events.types.render.RenderEvent;
+import rip.athena.client.events.types.render.RenderType;
+import rip.athena.client.font.FontManager;
+import rip.athena.client.gui.hud.HUDElement;
+import rip.athena.client.modules.Category;
+import rip.athena.client.modules.Module;
+
+import java.awt.*;
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Predicate;
+import rip.athena.client.utils.render.ColorUtil;
+import rip.athena.client.utils.render.RoundedUtils;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public class Scoreboard extends Module {
+
+ @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Custom", "Default"}, description = "Chose display of background")
+ private String backgroundMode = "Modern";
+
+ @ConfigValue.Color(name = "Background Color")
+ private Color backgroundColor = new Color(0, 0, 0, 150);
+
+ @ConfigValue.Boolean(name = "Background")
+ private boolean background = true;
+
+ @ConfigValue.Boolean(name = "Show Numbers")
+ private boolean showNumbers = true;
+
+ @ConfigValue.Boolean(name = "Free Move")
+ private boolean freeMove = false;
+
+ private HUDElement hud;
+ private int width = -1;
+ private int height = -1;
+
+ public Scoreboard() {
+ super("Scoreboard", Category.RENDER, "Athena/gui/mods/scoreboard.png");
+
+ hud = new HUDElement("scoreboard", width, height) {
+ @Override
+ public void onRender() {
+ render();
+ }
+ };
+
+ addHUD(hud);
+ }
+
+ @SubscribeEvent
+ public void onRender(RenderEvent event) {
+ if(event.getRenderType() != RenderType.SCOREBOARD) {
+ return;
+ }
+
+ event.setCancelled(true);
+ }
+
+ public void render() {
+ ScaledResolution scaledresolution = new ScaledResolution(mc);
+
+ net.minecraft.scoreboard.Scoreboard scoreboard = mc.theWorld.getScoreboard();
+ ScoreObjective scoreobjective = null;
+ ScorePlayerTeam scoreplayerteam = scoreboard.getPlayersTeam(mc.thePlayer.getName());
+
+ if(scoreplayerteam != null) {
+ int i1 = scoreplayerteam.getChatFormat().getColorIndex();
+
+ if(i1 >= 0) {
+ scoreobjective = scoreboard.getObjectiveInDisplaySlot(3 + i1);
+ }
+ }
+
+ ScoreObjective scoreobjective1 = scoreobjective != null ? scoreobjective : scoreboard.getObjectiveInDisplaySlot(1);
+
+ if(scoreobjective1 != null) {
+ renderScoreboard(scoreobjective1, scaledresolution);
+ }
+ }
+
+ private void renderScoreboard(ScoreObjective p_180475_1_, ScaledResolution p_180475_2_) {
+ net.minecraft.scoreboard.Scoreboard scoreboard = p_180475_1_.getScoreboard();
+ Collection collection = scoreboard.getSortedScores(p_180475_1_);
+ List list = Lists.newArrayList(Iterables.filter(collection, new Predicate() {
+ public boolean apply(Score p_apply_1_) {
+ return p_apply_1_.getPlayerName() != null && !p_apply_1_.getPlayerName().startsWith("#");
+ }
+ }));
+
+ if (list.size() > 15) {
+ collection = Lists.newArrayList(Iterables.skip(list, collection.size() - 15));
+ } else {
+ collection = list;
+ }
+
+ int i = mc.fontRendererObj.getStringWidth(p_180475_1_.getDisplayName());
+
+ for (Score score : collection) {
+ ScorePlayerTeam scoreplayerteam = scoreboard.getPlayersTeam(score.getPlayerName());
+ String s = ScorePlayerTeam.formatPlayerName(scoreplayerteam, score.getPlayerName());
+
+ if(showNumbers) {
+ s += ": " + score.getScorePoints();
+ } else {
+ s += ":";
+ }
+
+ i = Math.max(i, mc.fontRendererObj.getStringWidth(s));
+ }
+
+ int i1 = collection.size() * mc.fontRendererObj.FONT_HEIGHT;
+ int j1 = p_180475_2_.getScaledHeight() / 2 + i1 / 3;
+ int k1 = 3;
+ int l1 = j1;
+ int j = 0;
+ int yPos = 0;
+
+ if(freeMove) {
+ l1 = hud.getX() + 2;
+ yPos += hud.getY();
+ } else {
+ l1 = p_180475_2_.getScaledWidth() - i;
+ yPos = p_180475_2_.getScaledHeight() / 2 - i1 / 2;
+
+ hud.setX(l1 - 2);
+ hud.setY(yPos);
+ }
+
+
+ if(background) {
+ if(backgroundMode.equalsIgnoreCase("Modern")) {
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(hud.getX(), hud.getY(), hud.getWidth(), hud.getHeight(), 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
+ } else if (backgroundMode.equalsIgnoreCase("Fade")) {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
+ } else {
+ RoundedUtils.drawRoundedRect(hud.getX(), hud.getY(), hud.getX() + width, hud.getY() + height, 12,backgroundColor.getRGB());
+ }
+ }
+
+ for (Score score1 : collection) {
+
+ ++j;
+ ScorePlayerTeam scoreplayerteam1 = scoreboard.getPlayersTeam(score1.getPlayerName());
+ String s1 = ScorePlayerTeam.formatPlayerName(scoreplayerteam1, score1.getPlayerName());
+ String s2 = EnumChatFormatting.RED + "" + score1.getScorePoints();
+ int k = yPos + (i1 + 1 - ((j - 1) * mc.fontRendererObj.FONT_HEIGHT));
+
+ int l = hud.getX() + hud.getWidth();
+
+
+ if(background && backgroundMode.equalsIgnoreCase("Default")) {
+ GuiScreen.drawRectangle(l1 - 2, k, l, k + mc.fontRendererObj.FONT_HEIGHT, 1342177280);
+ }
+
+ mc.fontRendererObj.drawString(s1, l1, k, 553648127);
+
+ if(showNumbers) {
+ mc.fontRendererObj.drawString(s2, l - mc.fontRendererObj.getStringWidth(s2), k, 553648127);
+ }
+
+ if (j == collection.size()) {
+ String s3 = p_180475_1_.getDisplayName();
+ if(background && backgroundMode.equalsIgnoreCase("Default")) {
+ GuiScreen.drawRectangle(l1 - 2, k - mc.fontRendererObj.FONT_HEIGHT - 1, l, k - 1, 1610612736);
+ GuiScreen.drawRectangle(l1 - 2, k - 1, l, k, 1342177280);
+ }
+ mc.fontRendererObj.drawString(s3, l1 + i / 2 - mc.fontRendererObj.getStringWidth(s3) / 2, k - mc.fontRendererObj.FONT_HEIGHT, 553648127);
+ }
+ }
+
+ int height = (j + 1) * mc.fontRendererObj.FONT_HEIGHT;
+
+ hud.setWidth(i);
+ hud.setHeight(height + 1);
+
+ GL11.glColor4f(1F, 1F, 1F, 1F);
+ }
+}
diff --git a/src/main/java/rip/athena/client/modules/impl/render/TPS.java b/src/main/java/rip/athena/client/modules/impl/render/TPS.java
index 99bf0db6..b1504d9e 100644
--- a/src/main/java/rip/athena/client/modules/impl/render/TPS.java
+++ b/src/main/java/rip/athena/client/modules/impl/render/TPS.java
@@ -21,8 +21,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
*/
public class TPS extends Module {
- @ConfigValue.List(name = "Display Mode", values = {"Modern", "Fade", "Old"}, description = "Chose display of background")
- public static String backgroundMode = "Modern";
+ @ConfigValue.List(name = "Display Mode", values = {"Circle", "Modern", "Fade", "Old"}, description = "Chose display of background")
+ public static String backgroundMode = "Circle";
@ConfigValue.Boolean(name = "Preset Color")
private boolean presetColor = true;
@@ -34,7 +34,7 @@ public class TPS extends Module {
private String mode = "Number";
@ConfigValue.Boolean(name = "Custom Font")
- private boolean customFont = false;
+ public static boolean customFont = false;
@ConfigValue.Boolean(name = "Background")
private boolean backGround = true;
diff --git a/src/main/java/rip/athena/client/theme/ThemeManager.java b/src/main/java/rip/athena/client/theme/ThemeManager.java
index ae7f441b..9f27c2cf 100644
--- a/src/main/java/rip/athena/client/theme/ThemeManager.java
+++ b/src/main/java/rip/athena/client/theme/ThemeManager.java
@@ -2,6 +2,8 @@ package rip.athena.client.theme;
import lombok.Getter;
import lombok.Setter;
+import rip.athena.client.theme.impl.AccentTheme;
+import rip.athena.client.theme.impl.PrimaryTheme;
/**
* @author Athena Development
@@ -13,6 +15,7 @@ import lombok.Setter;
@Setter
public class ThemeManager {
- private Theme theme = Theme.ATHENA;
+ private AccentTheme theme = AccentTheme.ATHENA;
+ private PrimaryTheme primaryTheme = PrimaryTheme.DARK;
}
diff --git a/src/main/java/rip/athena/client/theme/Theme.java b/src/main/java/rip/athena/client/theme/impl/AccentTheme.java
similarity index 77%
rename from src/main/java/rip/athena/client/theme/Theme.java
rename to src/main/java/rip/athena/client/theme/impl/AccentTheme.java
index f9003d03..084db14e 100644
--- a/src/main/java/rip/athena/client/theme/Theme.java
+++ b/src/main/java/rip/athena/client/theme/impl/AccentTheme.java
@@ -1,4 +1,4 @@
-package rip.athena.client.theme;
+package rip.athena.client.theme.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -20,9 +20,29 @@ import static net.minecraft.util.EnumChatFormatting.DARK_GREEN;
*/
@Getter
-public enum Theme implements ColorUtil {
+public enum AccentTheme implements ColorUtil {
ATHENA("Athena", new Color(7, 64, 170), new Color(4, 83, 97), DARK_PURPLE, false, KeyColors.PURPLE, KeyColors.RED),
+ SAPPHIRE("Sapphire", new Color(0, 85, 255), new Color(0, 170, 255), BLUE, false, KeyColors.DARK_BLUE),
+ RUBY("Ruby", new Color(255, 0, 85), new Color(255, 0, 170), RED, false, KeyColors.RED),
+ EMERALD("Emerald", new Color(0, 255, 85), new Color(0, 255, 170), GREEN, false, KeyColors.DARK_GREEN),
+ SUNFLOWER_SKY("Sunflower Sky", new Color(255, 204, 0), new Color(0, 170, 255), EnumChatFormatting.AQUA, false, KeyColors.YELLOW, KeyColors.DARK_BLUE),
+ SKYFIRE("Skyfire", new Color(0, 153, 255), new Color(255, 68, 0), EnumChatFormatting.AQUA, false, KeyColors.DARK_BLUE, KeyColors.RED),
+ CITRINE("Citrine", new Color(255, 255, 0), new Color(255, 200, 0), GOLD, false, KeyColors.YELLOW),
+ LAVENDER_FIELDS("Lavender Fields", new Color(170, 102, 255), new Color(204, 153, 255), EnumChatFormatting.LIGHT_PURPLE, false, KeyColors.PURPLE, KeyColors.PINK),
+ PEACH_MANGO("Peach Mango", new Color(255, 153, 102), new Color(255, 187, 68), EnumChatFormatting.GOLD, false, KeyColors.ORANGE, KeyColors.YELLOW),
+ OCEAN_BREEZE("Ocean Breeze", new Color(0, 187, 255), new Color(68, 136, 255), EnumChatFormatting.AQUA, false, KeyColors.AQUA, KeyColors.DARK_BLUE),
+ ROSE_GOLD("Rose Gold", new Color(255, 102, 102), new Color(255, 204, 153), EnumChatFormatting.GOLD, false, KeyColors.PINK, KeyColors.ORANGE),
+ LEMON_LIME("Lemon Lime", new Color(217, 255, 0), new Color(0, 255, 68), EnumChatFormatting.AQUA, false, KeyColors.LIME, KeyColors.YELLOW),
+ MISTY_ROSE("Misty Rose", new Color(255, 228, 225), new Color(240, 128, 128), RED, false, KeyColors.PINK),
+ SERENE("Serene", new Color(183, 234, 220), new Color(92, 172, 149), GREEN, false, KeyColors.DARK_GREEN, KeyColors.DARK_GREEN),
+ SUNRISE("Sunrise", new Color(252, 186, 152), new Color(252, 97, 85), GREEN, false, KeyColors.ORANGE, KeyColors.RED),
+ COCOA("Cocoa", new Color(167, 129, 105), new Color(90, 58, 42), GRAY, false, KeyColors.GRAY, KeyColors.GRAY),
+ GARDEN("Garden", new Color(152, 226, 187), new Color(51, 160, 81), GREEN, false, KeyColors.DARK_GREEN, KeyColors.LIME),
+ MOONLIGHT("Moonlight", new Color(56, 59, 80), new Color(13, 22, 50), DARK_BLUE, false, KeyColors.DARK_BLUE, KeyColors.PURPLE),
+ SUNSET("Sunset", new Color(255, 163, 108), new Color(255, 85, 68), YELLOW, false, KeyColors.ORANGE, KeyColors.YELLOW),
+ AMETHYST("Amethyst", new Color(164, 148, 213), new Color(97, 83, 140), LIGHT_PURPLE, false, KeyColors.PURPLE, KeyColors.PURPLE),
+ TROPICAL("Tropical", new Color(0, 191, 165), new Color(255, 149, 0), GREEN, false, KeyColors.DARK_GREEN, KeyColors.YELLOW),
AUBERGINE("Aubergine", new Color(170, 7, 107), new Color(97, 4, 95), DARK_PURPLE, false, KeyColors.PURPLE, KeyColors.RED),
AQUA("Aqua", new Color(185, 250, 255), new Color(79, 199, 200), EnumChatFormatting.AQUA, false, KeyColors.AQUA),
BANANA("Banana", new Color(253, 236, 177), new Color(255, 255, 255), YELLOW, false, KeyColors.YELLOW),
@@ -59,7 +79,7 @@ public enum Theme implements ColorUtil {
private final ArrayList keyColors;
private final boolean triColor;
- Theme(String theme, Color firstColor, Color secondColor, EnumChatFormatting chatAccentColor, boolean triColor, KeyColors... keyColors) {
+ AccentTheme(String theme, Color firstColor, Color secondColor, EnumChatFormatting chatAccentColor, boolean triColor, KeyColors... keyColors) {
this.theme = theme;
this.firstColor = this.thirdColor = firstColor;
this.secondColor = secondColor;
@@ -67,7 +87,7 @@ public enum Theme implements ColorUtil {
this.keyColors = new ArrayList<>(Arrays.asList(keyColors));
this.triColor = triColor;
}
- Theme(String theme, Color firstColor, Color secondColor, Color thirdColor, EnumChatFormatting chatAccentColor, boolean triColor, KeyColors... keyColors) {
+ AccentTheme(String theme, Color firstColor, Color secondColor, Color thirdColor, EnumChatFormatting chatAccentColor, boolean triColor, KeyColors... keyColors) {
this.theme = theme;
this.firstColor = firstColor;
this.secondColor = secondColor;
diff --git a/src/main/java/rip/athena/client/theme/impl/PrimaryTheme.java b/src/main/java/rip/athena/client/theme/impl/PrimaryTheme.java
new file mode 100644
index 00000000..4061790b
--- /dev/null
+++ b/src/main/java/rip/athena/client/theme/impl/PrimaryTheme.java
@@ -0,0 +1,31 @@
+package rip.athena.client.theme.impl;
+
+import lombok.Getter;
+import rip.athena.client.utils.render.ColorUtil;
+
+import java.awt.*;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+
+@Getter
+public enum PrimaryTheme implements ColorUtil {
+
+ DARK("Dark", new Color(30, 30, 30, 255).getRGB(), new Color(50, 50, 50, 255).getRGB(), new Color(35, 35, 35, 255).getRGB(), -1),
+ WHITE("White", new Color(255, 255, 255, 255).getRGB(), new Color(100, 100, 100, 255).getRGB(), new Color(50, 50, 50, 255).getRGB(), new Color(0,0,0).getRGB()),
+ TRANSPARENT("Transparent", new Color(200, 200, 200, 80).getRGB(), new Color(150, 150, 150, 100).getRGB(), new Color(100, 100, 100, 255).getRGB(), new Color(255, 255, 255).getRGB());
+
+ private final String theme;
+ private final int firstColor, secondColor, thirdColor, textColor;
+
+ PrimaryTheme(String theme, int firstColor, int secondColor, int thirdColor, int textColor) {
+ this.theme = theme;
+ this.firstColor = firstColor;
+ this.secondColor = secondColor;
+ this.thirdColor = thirdColor;
+ this.textColor = textColor;
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/ClickCounter.java b/src/main/java/rip/athena/client/utils/ClickCounter.java
index 8d402431..3849b6f7 100644
--- a/src/main/java/rip/athena/client/utils/ClickCounter.java
+++ b/src/main/java/rip/athena/client/utils/ClickCounter.java
@@ -24,5 +24,4 @@ public class ClickCounter {
return clicks.size();
}
-
}
diff --git a/src/main/java/rip/athena/client/utils/GLUtils.java b/src/main/java/rip/athena/client/utils/GLUtils.java
new file mode 100644
index 00000000..8eb947f7
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/GLUtils.java
@@ -0,0 +1,103 @@
+package rip.athena.client.utils;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.shader.Framebuffer;
+import org.lwjgl.opengl.GL11;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class GLUtils {
+
+ private static Minecraft mc = Minecraft.getMinecraft();
+
+ public static void scissor(float x, float y, float width, float height) {
+ final int scaleFactor = getScaleFactor();
+ GL11.glScissor((int)(x * scaleFactor), (int)(mc.displayHeight - (y + height) * scaleFactor), (int)(((x + width) - x) * scaleFactor), (int)(((y + height) - y) * scaleFactor));
+ }
+
+
+ public static int getScaleFactor() {
+ int scaleFactor = 1;
+ final boolean isUnicode = mc.isUnicode();
+ int guiScale = mc.gameSettings.guiScale;
+ if (guiScale == 0) {
+ guiScale = 1000;
+ }
+
+ while (scaleFactor < guiScale && mc.displayWidth / (scaleFactor + 1) >= 320 && mc.displayHeight / (scaleFactor + 1) >= 240) {
+ ++scaleFactor;
+ }
+ if (isUnicode && scaleFactor % 2 != 0 && scaleFactor != 1) {
+ --scaleFactor;
+ }
+ return scaleFactor;
+ }
+
+ public static void setAlphaLimit(float limit) {
+ GlStateManager.enableAlpha();
+ GlStateManager.alphaFunc(GL11.GL_GREATER, (float) (limit * .01));
+ }
+
+ public static Framebuffer createFrameBuffer(Framebuffer framebuffer) {
+ if (framebuffer == null || framebuffer.framebufferWidth != mc.displayWidth || framebuffer.framebufferHeight != mc.displayHeight) {
+ if (framebuffer != null) {
+ framebuffer.deleteFramebuffer();
+ }
+ return new Framebuffer(mc.displayWidth, mc.displayHeight, true);
+ }
+ return framebuffer;
+ }
+
+ public static void bindTexture(int texture) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ }
+
+ public static void startScale(float x, float y, float scale) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(x, y, 0);
+ GlStateManager.scale(scale, scale, 1);
+ GlStateManager.translate(-x, -y, 0);
+ }
+
+ public static void startScale(float x, float y, float width, float height, float scale) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate((x + (x + width)) / 2, (y + (y + height)) / 2, 0);
+ GlStateManager.scale(scale, scale, 1);
+ GlStateManager.translate(-(x + (x + width)) / 2, -(y + (y + height)) / 2, 0);
+ }
+
+ public static void stopScale() {
+ GlStateManager.popMatrix();
+ }
+
+ public static void startTranslate(float x, float y) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(x, y, 0);
+ }
+
+ public static void stopTranslate() {
+ GlStateManager.popMatrix();
+ }
+
+ public static void fixEnchantment() {
+ GlStateManager.disableLighting();
+ GlStateManager.disableDepth();
+ GlStateManager.disableBlend();
+ GlStateManager.enableLighting();
+ GlStateManager.enableDepth();
+ GlStateManager.disableLighting();
+ GlStateManager.disableDepth();
+ GlStateManager.disableTexture2D();
+ GlStateManager.disableAlpha();
+ GlStateManager.disableBlend();
+ GlStateManager.enableBlend();
+ GlStateManager.enableAlpha();
+ GlStateManager.enableTexture2D();
+ GlStateManager.enableLighting();
+ GlStateManager.enableDepth();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/MouseUtils.java b/src/main/java/rip/athena/client/utils/MouseUtils.java
new file mode 100644
index 00000000..382e5d38
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/MouseUtils.java
@@ -0,0 +1,31 @@
+package rip.athena.client.utils;
+
+import org.lwjgl.input.Mouse;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class MouseUtils {
+
+ public enum Scroll {
+ UP, DOWN;
+ }
+
+ public static Scroll scroll() {
+ int mouse = Mouse.getDWheel();
+
+ if(mouse > 0) {
+ return Scroll.UP;
+ }else if(mouse < 0) {
+ return Scroll.DOWN;
+ }else {
+ return null;
+ }
+ }
+
+ public static boolean isInside(int mouseX, int mouseY, double x, double y, double width, double height) {
+ return (mouseX > x && mouseX < (x + width)) && (mouseY > y && mouseY < (y + height));
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/NumberUtils.java b/src/main/java/rip/athena/client/utils/NumberUtils.java
new file mode 100644
index 00000000..98113158
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/NumberUtils.java
@@ -0,0 +1,32 @@
+package rip.athena.client.utils;
+
+import java.text.DecimalFormat;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class NumberUtils {
+ public static enum Format {
+ Ones, Tenths, Hundredths;
+ }
+ public static String getStringValueOfLong(long value, Format format) {
+ return String.valueOf((new DecimalFormat(getDecimalFormat(format))).format(value));
+ }
+ public static String getStringValueOfFloat(float value, Format format) {
+ return String.valueOf((new DecimalFormat(getDecimalFormat(format))).format(value));
+ }
+ public static String getDecimalFormat(Format decimalFormat) {
+ if(decimalFormat == Format.Ones) {
+ return "#";
+ }
+ if(decimalFormat == Format.Tenths) {
+ return "#.#";
+ }
+ if(decimalFormat == Format.Hundredths) {
+ return "#.##";
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/animations/Animation.java b/src/main/java/rip/athena/client/utils/animations/Animation.java
new file mode 100644
index 00000000..03d24437
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/Animation.java
@@ -0,0 +1,145 @@
+package rip.athena.client.utils.animations;
+
+import rip.athena.client.utils.time.TimerUtil;
+
+public abstract class Animation {
+
+ public AnimationTimer timer = new AnimationTimer();
+ public TimerUtil timerUtil = new TimerUtil();
+ protected int duration;
+ protected double endPoint;
+ protected Direction direction;
+
+ public Animation(int ms, double endPoint) {
+ this(ms, endPoint, Direction.FORWARDS);
+ }
+
+ public Animation(int ms, double endPoint, Direction direction) {
+ this.duration = ms; //Time in milliseconds of how long you want the animation to take.
+ this.endPoint = endPoint; //The desired distance for the animated object to go.
+ this.direction = direction; //Direction in which the graph is going. If backwards, will start from endPoint and go to 0.
+ }
+
+
+ public boolean finished(Direction direction) {
+ return isDone() && this.direction.equals(direction);
+ }
+
+ public double getLinearOutput() {
+ return 1 - ((timerUtil.getTime() / (double) duration) * endPoint);
+ }
+
+ public double getEndPoint() {
+ return endPoint;
+ }
+
+ public void setEndPoint(double endPoint) {
+ this.endPoint = endPoint;
+ }
+
+ public void reset() {
+ timerUtil.reset();
+ }
+
+ public boolean isDone() {
+ return timerUtil.hasTimeElapsed(duration);
+ }
+
+ public boolean isDone(Direction direction) {
+ return isDone() && this.direction.equals(direction);
+ }
+
+ public void changeDirection() {
+ setDirection(direction.opposite());
+ }
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ public Animation setDirection(Direction direction) {
+ if (this.direction != direction) {
+ this.direction = direction;
+ timerUtil.setTime(System.currentTimeMillis() - (duration - Math.min(duration, timerUtil.getTime())));
+ }
+ return this;
+ }
+
+ public void setDuration(int duration) {
+ this.duration = duration;
+ }
+
+ protected boolean correctOutput() {
+ return false;
+ }
+
+ public Double getOutput() {
+ if (direction.forwards()) {
+ if (isDone()) {
+ return endPoint;
+ }
+
+ return getEquation(timerUtil.getTime() / (double) duration) * endPoint;
+ } else {
+ if (isDone()) {
+ return 0.0;
+ }
+
+ if (correctOutput()) {
+ double revTime = Math.min(duration, Math.max(0, duration - timerUtil.getTime()));
+ return getEquation(revTime / (double) duration) * endPoint;
+ }
+
+ return (1 - getEquation(timerUtil.getTime() / (double) duration)) * endPoint;
+ }
+ }
+
+ public double getValue() {
+ if (direction == Direction.FORWARDS) {
+ if (isDone())
+ return endPoint;
+ return (getEquation(timer.getTime()) * endPoint);
+ } else {
+ if (isDone()) return 0;
+ if (correctOutput()) {
+ double revTime = Math.min(duration, Math.max(0, duration - timer.getTime()));
+ return getEquation(revTime) * endPoint;
+ } else return (1 - getEquation(timer.getTime())) * endPoint;
+ }
+ }
+
+ //This is where the animation equation should go, for example, a logistic function. Output should range from 0 - 1.
+ //This will take the timer's time as an input, x.
+ protected abstract double getEquation(double x);
+
+}
+class AnimationTimer {
+
+ public long lastMS = System.currentTimeMillis();
+
+ public void reset() {
+ lastMS = System.currentTimeMillis();
+ }
+
+ public boolean hasTimeElapsed(long time, boolean reset) {
+ if (System.currentTimeMillis() - lastMS > time) {
+ if (reset) reset();
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean hasTimeElapsed(long time) {
+ return System.currentTimeMillis() - lastMS > time;
+ }
+
+ public long getTime() {
+ return System.currentTimeMillis() - lastMS;
+ }
+
+ public void setTime(long time) {
+ lastMS = time;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/animations/ContinualAnimation.java b/src/main/java/rip/athena/client/utils/animations/ContinualAnimation.java
new file mode 100644
index 00000000..aa47ac36
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/ContinualAnimation.java
@@ -0,0 +1,32 @@
+package rip.athena.client.utils.animations;
+
+import lombok.Getter;
+import rip.athena.client.utils.animations.impl.SmoothStepAnimation;
+
+public class ContinualAnimation {
+
+ private float output, endpoint;
+
+ @Getter
+ private Animation animation = new SmoothStepAnimation(0, 0, Direction.BACKWARDS);
+
+ public void animate(float destination, int ms) {
+ output = endpoint - animation.getOutput().floatValue();
+ endpoint = destination;
+ if (output != (endpoint - destination)) {
+ animation = new SmoothStepAnimation(ms, endpoint - output, Direction.BACKWARDS);
+ }
+ }
+
+
+ public boolean isDone() {
+ return output == endpoint || animation.isDone();
+ }
+
+ public float getOutput() {
+ output = endpoint - animation.getOutput().floatValue();
+ return output;
+ }
+
+
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/Direction.java b/src/main/java/rip/athena/client/utils/animations/Direction.java
new file mode 100644
index 00000000..06e966ab
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/Direction.java
@@ -0,0 +1,22 @@
+package rip.athena.client.utils.animations;
+
+public enum Direction {
+ FORWARDS,
+ BACKWARDS;
+
+ public Direction opposite() {
+ if (this == Direction.FORWARDS) {
+ return Direction.BACKWARDS;
+ } else return Direction.FORWARDS;
+ }
+
+
+ public boolean forwards() {
+ return this == Direction.FORWARDS;
+ }
+
+ public boolean backwards() {
+ return this == Direction.BACKWARDS;
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/DecelerateAnimation.java b/src/main/java/rip/athena/client/utils/animations/impl/DecelerateAnimation.java
new file mode 100644
index 00000000..01262394
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/DecelerateAnimation.java
@@ -0,0 +1,21 @@
+package rip.athena.client.utils.animations.impl;
+
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class DecelerateAnimation extends Animation {
+
+ public DecelerateAnimation(int ms, double endPoint) {
+ super(ms, endPoint);
+ }
+
+ public DecelerateAnimation(int ms, double endPoint, Direction direction) {
+ super(ms, endPoint, direction);
+ }
+
+
+ protected double getEquation(double x) {
+ return 1 - ((x - 1) * (x - 1));
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/EaseBackIn.java b/src/main/java/rip/athena/client/utils/animations/impl/EaseBackIn.java
new file mode 100644
index 00000000..039617e8
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/EaseBackIn.java
@@ -0,0 +1,30 @@
+package rip.athena.client.utils.animations.impl;
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class EaseBackIn extends Animation {
+ private final float easeAmount;
+
+ public EaseBackIn(int ms, double endPoint, float easeAmount) {
+ super(ms, endPoint);
+ this.easeAmount = easeAmount;
+ }
+
+ public EaseBackIn(int ms, double endPoint, float easeAmount, Direction direction) {
+ super(ms, endPoint, direction);
+ this.easeAmount = easeAmount;
+ }
+
+ @Override
+ protected boolean correctOutput() {
+ return true;
+ }
+
+ @Override
+ protected double getEquation(double x) {
+ float shrink = easeAmount + 1;
+ return Math.max(0, 1 + shrink * Math.pow(x - 1, 3) + easeAmount * Math.pow(x - 1, 2));
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/EaseInOutQuad.java b/src/main/java/rip/athena/client/utils/animations/impl/EaseInOutQuad.java
new file mode 100644
index 00000000..54576917
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/EaseInOutQuad.java
@@ -0,0 +1,20 @@
+package rip.athena.client.utils.animations.impl;
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class EaseInOutQuad extends Animation {
+
+ public EaseInOutQuad(int ms, double endPoint) {
+ super(ms, endPoint);
+ }
+
+ public EaseInOutQuad(int ms, double endPoint, Direction direction) {
+ super(ms, endPoint, direction);
+ }
+
+ protected double getEquation(double x) {
+ return x < 0.5 ? 2 * Math.pow(x, 2) : 1 - Math.pow(-2 * x + 2, 2) / 2;
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/EaseOutSine.java b/src/main/java/rip/athena/client/utils/animations/impl/EaseOutSine.java
new file mode 100644
index 00000000..0a3538bf
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/EaseOutSine.java
@@ -0,0 +1,26 @@
+package rip.athena.client.utils.animations.impl;
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class EaseOutSine extends Animation {
+
+
+ public EaseOutSine(int ms, double endPoint) {
+ super(ms, endPoint);
+ }
+
+ public EaseOutSine(int ms, double endPoint, Direction direction) {
+ super(ms, endPoint, direction);
+ }
+
+ @Override
+ protected boolean correctOutput() {
+ return true;
+ }
+
+ @Override
+ protected double getEquation(double x) {
+ return Math.sin(x * (Math.PI / 2));
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/ElasticAnimation.java b/src/main/java/rip/athena/client/utils/animations/impl/ElasticAnimation.java
new file mode 100644
index 00000000..d72c29ae
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/ElasticAnimation.java
@@ -0,0 +1,32 @@
+package rip.athena.client.utils.animations.impl;
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class ElasticAnimation extends Animation {
+
+ float easeAmount;
+ float smooth;
+ boolean reallyElastic;
+
+ public ElasticAnimation(int ms, double endPoint, float elasticity, float smooth, boolean moreElasticity) {
+ super(ms, endPoint);
+ this.easeAmount = elasticity;
+ this.smooth = smooth;
+ this.reallyElastic = moreElasticity;
+ }
+
+ public ElasticAnimation(int ms, double endPoint, float elasticity, float smooth, boolean moreElasticity, Direction direction) {
+ super(ms, endPoint, direction);
+ this.easeAmount = elasticity;
+ this.smooth = smooth;
+ this.reallyElastic = moreElasticity;
+ }
+
+ @Override
+ protected double getEquation(double x) {
+ x = Math.pow(x, smooth);
+ double elasticity = easeAmount * .1f;
+ return Math.pow(2, -10 * (reallyElastic ? Math.sqrt(x) : x)) * Math.sin((x - (elasticity / 4)) * ((2 * Math.PI) / elasticity)) + 1;
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/impl/SmoothStepAnimation.java b/src/main/java/rip/athena/client/utils/animations/impl/SmoothStepAnimation.java
new file mode 100644
index 00000000..2645f788
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/impl/SmoothStepAnimation.java
@@ -0,0 +1,20 @@
+package rip.athena.client.utils.animations.impl;
+
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+
+public class SmoothStepAnimation extends Animation {
+
+ public SmoothStepAnimation(int ms, double endPoint) {
+ super(ms, endPoint);
+ }
+
+ public SmoothStepAnimation(int ms, double endPoint, Direction direction) {
+ super(ms, endPoint, direction);
+ }
+
+ protected double getEquation(double x) {
+ return -2 * Math.pow(x, 3) + (3 * Math.pow(x, 2));
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/utils/animations/simple/AnimationUtils.java b/src/main/java/rip/athena/client/utils/animations/simple/AnimationUtils.java
new file mode 100644
index 00000000..7f1dfe18
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/simple/AnimationUtils.java
@@ -0,0 +1,36 @@
+package rip.athena.client.utils.animations.simple;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class AnimationUtils {
+
+ public static float calculateCompensation(final float target, float current, final double speed, long delta) {
+
+ final float diff = current - target;
+
+ double add = (delta * (speed / 50));
+
+ if (diff > speed){
+ if(current - add > target) {
+ current -= add;
+ }else {
+ current = target;
+ }
+ }
+ else if (diff < -speed) {
+ if(current + add < target) {
+ current += add;
+ }else {
+ current = target;
+ }
+ }
+ else{
+ current = target;
+ }
+
+ return current;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/animations/simple/SimpleAnimation.java b/src/main/java/rip/athena/client/utils/animations/simple/SimpleAnimation.java
new file mode 100644
index 00000000..de89b2de
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/animations/simple/SimpleAnimation.java
@@ -0,0 +1,45 @@
+package rip.athena.client.utils.animations.simple;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class SimpleAnimation {
+
+ private float value;
+ private long lastMS;
+
+ public SimpleAnimation(final float value){
+ this.value = value;
+ this.lastMS = System.currentTimeMillis();
+ }
+
+ public void setAnimation(final float value, double speed){
+
+ final long currentMS = System.currentTimeMillis();
+ final long delta = currentMS - this.lastMS;
+ this.lastMS = currentMS;
+
+ double deltaValue = 0.0;
+
+ if(speed > 28) {
+ speed = 28;
+ }
+
+ if (speed != 0.0)
+ {
+ deltaValue = Math.abs(value - this.value) * 0.35f / (10.0 / speed);
+ }
+
+ this.value = AnimationUtils.calculateCompensation(value, this.value, deltaValue, delta);
+ }
+
+ public float getValue() {
+ return value;
+ }
+
+ public void setValue(float value) {
+ this.value = value;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/font/Font.java b/src/main/java/rip/athena/client/utils/font/Font.java
index fdacf350..5b3fbcd3 100644
--- a/src/main/java/rip/athena/client/utils/font/Font.java
+++ b/src/main/java/rip/athena/client/utils/font/Font.java
@@ -14,4 +14,6 @@ public abstract class Font {
public abstract int drawRightString(final String text, final double x, final double y, final int color);
public abstract float height();
+
+
}
diff --git a/src/main/java/rip/athena/client/utils/font/impl/athena/FontRenderer.java b/src/main/java/rip/athena/client/utils/font/impl/athena/FontRenderer.java
index 1699a291..02e6d6bc 100644
--- a/src/main/java/rip/athena/client/utils/font/impl/athena/FontRenderer.java
+++ b/src/main/java/rip/athena/client/utils/font/impl/athena/FontRenderer.java
@@ -71,6 +71,10 @@ public class FontRenderer extends rip.athena.client.utils.font.Font {
this.fillCharacters(this.boldCharacters, Font.BOLD);
}
+ public float getMiddleOfBox(float height) {
+ return height / 2f - (this.fontHeight - 8) / 2 / 2f;
+ }
+
public static void calculateColorCodes() {
for (int i = 0; i < 32; ++i) {
final int amplifier = (i >> 3 & 1) * 85;
diff --git a/src/main/java/rip/athena/client/utils/render/ClickEffect.java b/src/main/java/rip/athena/client/utils/render/ClickEffect.java
new file mode 100644
index 00000000..48ba560f
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/render/ClickEffect.java
@@ -0,0 +1,34 @@
+package rip.athena.client.utils.render;
+
+import rip.athena.client.utils.animations.simple.SimpleAnimation;
+
+import java.awt.*;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+public class ClickEffect {
+
+ private float x, y;
+
+ private SimpleAnimation animation = new SimpleAnimation(0.0F);
+
+ public ClickEffect(float x, float y) {
+ this.x = x;
+ this.y = y;
+ animation.setValue(0);
+ }
+
+ public void draw() {
+ animation.setAnimation(100, 12);
+ double radius = 8 * animation.getValue() / 100;
+ int alpha = (int)(255 - 255 * animation.getValue() / 100);
+ int color = new Color(255, 255, 255, alpha).getRGB();
+ }
+
+ public boolean canRemove() {
+ return animation.getValue() > 99;
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/render/ColorUtil.java b/src/main/java/rip/athena/client/utils/render/ColorUtil.java
index eb34cf2b..3373fb82 100644
--- a/src/main/java/rip/athena/client/utils/render/ColorUtil.java
+++ b/src/main/java/rip/athena/client/utils/render/ColorUtil.java
@@ -1,6 +1,9 @@
package rip.athena.client.utils.render;
import org.lwjgl.opengl.GL11;
+import rip.athena.client.Athena;
+import rip.athena.client.theme.ThemeManager;
+import rip.athena.client.theme.impl.AccentTheme;
import rip.athena.client.utils.MathUtil;
import java.awt.*;
@@ -20,6 +23,84 @@ public interface ColorUtil {
GL11.glColor4f(r, g, b, a);
}
+ /*
+ * Credits: Tenacity
+ */
+
+ public static Color getClientColor(int index, int alpha) {
+
+ for(AccentTheme c : AccentTheme.values()) {
+ if(c.equals(Athena.INSTANCE.getThemeManager().getTheme())) {
+ return interpolateColorsBackAndForth(15, index, new Color(c.getFirstColor().getRed(), c.getFirstColor().getGreen(), c.getFirstColor().getBlue(), alpha), new Color(c.getSecondColor().getRed(), c.getSecondColor().getGreen(), c.getSecondColor().getBlue(), alpha), false);
+ }
+ }
+
+ return interpolateColorsBackAndForth(15, index, new Color(234, 107, 149, alpha), new Color(238, 164, 123, alpha), false);
+ }
+
+ public static Color interpolateColorsBackAndForth(int speed, int index, Color start, Color end, boolean trueColor) {
+ int angle = (int) (((System.currentTimeMillis()) / speed + index) % 360);
+ angle = (angle >= 180 ? 360 - angle : angle) * 2;
+ return trueColor ? interpolateColorHue(start, end, angle / 360f) : getInterpolateColor(start, end, angle / 360f);
+ }
+
+ public static Color getInterpolateColor(Color color1, Color color2, float amount) {
+ amount = Math.min(1, Math.max(0, amount));
+ return new Color(interpolateInt(color1.getRed(), color2.getRed(), amount), interpolateInt(color1.getGreen(), color2.getGreen(), amount), interpolateInt(color1.getBlue(), color2.getBlue(), amount), interpolateInt(color1.getAlpha(), color2.getAlpha(), amount));
+ }
+
+ public static Color interpolateColorHue(Color color1, Color color2, float amount) {
+ amount = Math.min(1, Math.max(0, amount));
+
+ float[] color1HSB = Color.RGBtoHSB(color1.getRed(), color1.getGreen(), color1.getBlue(), null);
+ float[] color2HSB = Color.RGBtoHSB(color2.getRed(), color2.getGreen(), color2.getBlue(), null);
+
+ Color resultColor = Color.getHSBColor(interpolateFloat(color1HSB[0], color2HSB[0], amount), interpolateFloat(color1HSB[1], color2HSB[1], amount), interpolateFloat(color1HSB[2], color2HSB[2], amount));
+
+ return new Color(resultColor.getRed(), resultColor.getGreen(), resultColor.getBlue(), interpolateInt(color1.getAlpha(), color2.getAlpha(), amount));
+ }
+
+
+ public static Color interpolateColorC(Color color1, Color color2, float amount) {
+ amount = Math.min(1, Math.max(0, amount));
+ return new Color(interpolateInt(color1.getRed(), color2.getRed(), amount),
+ interpolateInt(color1.getGreen(), color2.getGreen(), amount),
+ interpolateInt(color1.getBlue(), color2.getBlue(), amount),
+ interpolateInt(color1.getAlpha(), color2.getAlpha(), amount));
+ }
+
+ public static float interpolateFloat(float oldValue, float newValue, double interpolationValue){
+ return interpolate(oldValue, newValue, (float) interpolationValue).floatValue();
+ }
+
+ public static int interpolateInt(int oldValue, int newValue, double interpolationValue){
+ return interpolate(oldValue, newValue, (float) interpolationValue).intValue();
+ }
+
+ public static Double interpolate(double oldValue, double newValue, double interpolationValue){
+ return (oldValue + (newValue - oldValue) * interpolationValue);
+ }
+
+ // END TENACITY
+
+ public static Color applyOpacity(Color color, float opacity) {
+ opacity = Math.min(1, Math.max(0, opacity));
+ return new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) (color.getAlpha() * opacity));
+ }
+ public static int applyOpacity(int color, float opacity) {
+ Color old = new Color(color);
+ return applyOpacity(old, opacity).getRGB();
+ }
+
+ public static Color tripleColor(int rgbValue) {
+ return tripleColor(rgbValue, 1);
+ }
+
+ public static Color tripleColor(int rgbValue, float alpha) {
+ alpha = Math.min(1, Math.max(0, alpha));
+ return new Color(rgbValue, rgbValue, rgbValue, (int) (255 * alpha));
+ }
+
/**
* Method which colors using a color
*
diff --git a/src/main/java/rip/athena/client/utils/render/DrawUtils.java b/src/main/java/rip/athena/client/utils/render/DrawUtils.java
index 146dec2b..7fd22865 100644
--- a/src/main/java/rip/athena/client/utils/render/DrawUtils.java
+++ b/src/main/java/rip/athena/client/utils/render/DrawUtils.java
@@ -57,6 +57,19 @@ public enum DrawUtils {
private static final ShaderUtil gradientMaskShader = new ShaderUtil("gradientMask");
+ public static void drawMicrosoftLogo(float x, float y, float size, float spacing) {
+ drawMicrosoftLogo(x, y, size, spacing, 1f);
+ }
+
+ public static void drawMicrosoftLogo(float x, float y, float size, float spacing, float alpha) {
+ float rectSize = size /2f - spacing;
+ int alphaVal = (int) (255 * alpha);
+ Gui.drawRect2(x, y, rectSize, rectSize, new Color(244, 83, 38, alphaVal).getRGB());
+ Gui.drawRect2(x + rectSize + spacing, y, rectSize, rectSize, new Color(130, 188, 6, alphaVal).getRGB());
+ Gui.drawRect2(x, y + spacing + rectSize, rectSize, rectSize, new Color(5, 166, 241, alphaVal).getRGB());
+ Gui.drawRect2(x + rectSize + spacing, y + spacing + rectSize, rectSize, rectSize, new Color(254, 186, 7, alphaVal).getRGB());
+ }
+
public static void applyGradientHorizontal(float x, float y, float width, float height, float alpha, Color left, Color right, Runnable content) {
applyGradient(x, y, width, height, alpha, left, left, right, right, content);
}
diff --git a/src/main/java/rip/athena/client/utils/render/HUDUtil.java b/src/main/java/rip/athena/client/utils/render/HUDUtil.java
index 8f51f7f7..9dff7cc6 100644
--- a/src/main/java/rip/athena/client/utils/render/HUDUtil.java
+++ b/src/main/java/rip/athena/client/utils/render/HUDUtil.java
@@ -26,7 +26,13 @@ public class HUDUtil {
if(bG) {
if(TPS.backgroundMode.equalsIgnoreCase("Modern")) {
- RoundedUtils.drawGradientRound(x, y, width, height, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ if(Athena.INSTANCE.getThemeManager().getTheme().isTriColor()) {
+ RoundedUtils.drawGradientRound(x, y, width, height, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getThirdColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor());
+ } else {
+ RoundedUtils.drawGradientRound(x, y, width, height, 6, Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getFirstColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor(), Athena.INSTANCE.getThemeManager().getTheme().getSecondColor());
+ }
+ } else if (TPS.backgroundMode.equalsIgnoreCase("Circle")) {
+ RoundedUtils.drawGradientRound(x, y, width, height, 6, ColorUtil.getClientColor(0, 255), ColorUtil.getClientColor(90, 255), ColorUtil.getClientColor(180, 255), ColorUtil.getClientColor(270, 255));
} else if (TPS.backgroundMode.equalsIgnoreCase("Fade")) {
RoundedUtils.drawRoundedRect(x, y, x + width, y + height, 8.0f, Athena.INSTANCE.getThemeManager().getTheme().getAccentColor().getRGB());
} else {
@@ -56,7 +62,7 @@ public class HUDUtil {
String tmp = String.valueOf(letter);
if(customFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(tmp, (int) xTmp, (int) y, i);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(tmp, (int) xTmp, (int) y, i);
xTmp += FontManager.baloo17.getCharWidth(letter);
} else {
mc.fontRendererObj.drawString(tmp, (int) xTmp, (int) y, i);
@@ -67,7 +73,7 @@ public class HUDUtil {
}
if(customFont) {
- rip.athena.client.utils.font.FontManager.getProductSansRegular(30).drawString(message, x, y, c);
+ rip.athena.client.utils.font.FontManager.getProductSansRegular(25).drawString(message, x, y, c);
} else {
mc.fontRendererObj.drawString(message, x, y, c, false);
}
@@ -103,15 +109,6 @@ public class HUDUtil {
float red = hColor.getRed()/ 255.0f;
float green = hColor.getGreen()/ 255.0f;
float blue = hColor.getBlue()/ 255.0f;
- float alpha = hColor.getAlpha()/ 255.0f;
-
-
- float bx, by, bz;
-
- Tessellator tessellator = Tessellator.getInstance();
- WorldRenderer vertexBuffer = tessellator.getWorldRenderer();
-
-
double renderPosX = mc.getRenderManager().viewerPosX;
double renderPosY = mc.getRenderManager().viewerPosY;
@@ -126,7 +123,6 @@ public class HUDUtil {
GL11.glLineWidth(1);
GL11.glColor4f(red, green, blue, 0.5F);
-
AxisAlignedBB bb = block.getSelectedBoundingBox(mc.theWorld, pos).expand(0.0020000000949949026D, -0.000000000949949026D, 0.0020000000949949026D).offset(-renderPosX, -renderPosY, -renderPosZ);
drawFilledBoundingBox(bb);
@@ -225,11 +221,19 @@ public class HUDUtil {
}
public static int getStringWidth(String string) {
- return mc.fontRendererObj.getStringWidth(string);
+ if(TPS.customFont) {
+ return rip.athena.client.utils.font.FontManager.getProductSansRegular(25).width(string);
+ } else {
+ return mc.fontRendererObj.getStringWidth(string);
+ }
}
public static int getStringHeight() {
- return mc.fontRendererObj.FONT_HEIGHT;
+ if(TPS.customFont) {
+ return (int) rip.athena.client.utils.font.FontManager.getProductSansRegular(25).height();
+ } else {
+ return mc.fontRendererObj.FONT_HEIGHT;
+ }
}
}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/render/HoveringUtil.java b/src/main/java/rip/athena/client/utils/render/HoveringUtil.java
new file mode 100644
index 00000000..3d41d4db
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/render/HoveringUtil.java
@@ -0,0 +1,14 @@
+package rip.athena.client.utils.render;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/9/2023
+ */
+public class HoveringUtil {
+
+ public static boolean isHovering(float x, float y, float width, float height, int mouseX, int mouseY) {
+ return mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height;
+ }
+
+}
diff --git a/src/main/java/rip/athena/client/utils/render/RoundedUtils.java b/src/main/java/rip/athena/client/utils/render/RoundedUtils.java
index 170245f8..c6823adb 100644
--- a/src/main/java/rip/athena/client/utils/render/RoundedUtils.java
+++ b/src/main/java/rip/athena/client/utils/render/RoundedUtils.java
@@ -17,6 +17,41 @@ public class RoundedUtils {
final static FontRenderer fr = mc.fontRendererObj;
private static final ShaderUtil roundedGradientShader = new ShaderUtil("roundedRectGradient");
+ private static ShaderUtil roundedTexturedShader = new ShaderUtil("roundRectTexture");
+ public static ShaderUtil roundedShader = new ShaderUtil("roundedRect");
+
+ public static void drawRound(float x, float y, float width, float height, float radius, Color color) {
+ drawRound(x, y, width, height, radius, false, color);
+ }
+
+ public static void drawRoundTextured(float x, float y, float width, float height, float radius, float alpha) {
+ GlStateManager.color(1,1,1);
+ roundedTexturedShader.init();
+ roundedTexturedShader.setUniformi("textureIn", 0);
+ setupRoundedRectUniforms(x, y, width, height, radius, roundedTexturedShader);
+ roundedTexturedShader.setUniformf("alpha", alpha);
+ ShaderUtil.drawQuads(x - 1, y - 1, width + 2, height + 2);
+ roundedTexturedShader.unload();
+ GlStateManager.disableBlend();
+ }
+
+ public static void drawRound(float x, float y, float width, float height, float radius, boolean blur, Color color) {
+ GlStateManager.color(1,1,1,1);
+ GlStateManager.enableBlend();
+ GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.enableAlpha();
+ GlStateManager.alphaFunc(GL_GREATER, (float) (0 * .01));
+ roundedShader.init();
+
+ setupRoundedRectUniforms(x, y, width, height, radius, roundedShader);
+ roundedShader.setUniformi("blur", blur ? 1 : 0);
+ roundedShader.setUniformf("color", color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, color.getAlpha() / 255f);
+
+ ShaderUtil.drawQuads(x - 1, y - 1, width + 2, height + 2);
+ roundedShader.unload();
+ GlStateManager.disableBlend();
+ }
public static void drawGradientRound(float x, float y, float width, float height, float radius, Color bottomLeft, Color topLeft, Color bottomRight, Color topRight) {
GlStateManager.enableAlpha();
diff --git a/src/main/java/rip/athena/client/utils/render/StencilUtils.java b/src/main/java/rip/athena/client/utils/render/StencilUtils.java
new file mode 100644
index 00000000..c5eb4024
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/render/StencilUtils.java
@@ -0,0 +1,58 @@
+package rip.athena.client.utils.render;
+
+import org.lwjgl.opengl.EXTFramebufferObject;
+import org.lwjgl.opengl.EXTPackedDepthStencil;
+import org.lwjgl.opengl.GL11;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.shader.Framebuffer;
+
+/**
+ * @author Athena Development
+ * @project Athena-Client
+ * @date 6/10/2023
+ */
+
+public class StencilUtils {
+
+ private static Minecraft mc = Minecraft.getMinecraft();
+
+ public static void checkSetupFBO(Framebuffer framebuffer) {
+ if (framebuffer != null) {
+ if (framebuffer.depthBuffer > -1) {
+ setupFBO(framebuffer);
+ framebuffer.depthBuffer = -1;
+ }
+ }
+ }
+
+ public static void setupFBO(Framebuffer framebuffer) {
+ EXTFramebufferObject.glDeleteRenderbuffersEXT(framebuffer.depthBuffer);
+ final int stencilDepthBufferID = EXTFramebufferObject.glGenRenderbuffersEXT();
+ EXTFramebufferObject.glBindRenderbufferEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencilDepthBufferID);
+ EXTFramebufferObject.glRenderbufferStorageEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, EXTPackedDepthStencil.GL_DEPTH_STENCIL_EXT, mc.displayWidth, mc.displayHeight);
+ EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_STENCIL_ATTACHMENT_EXT, EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencilDepthBufferID);
+ EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT, EXTFramebufferObject.GL_RENDERBUFFER_EXT, stencilDepthBufferID);
+ }
+
+ public static void initStencilToWrite() {
+ mc.getFramebuffer().bindFramebuffer(false);
+ checkSetupFBO(mc.getFramebuffer());
+ GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT);
+ GL11.glEnable(GL11.GL_STENCIL_TEST);
+
+ GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1);
+ GL11.glStencilOp(GL11.GL_REPLACE, GL11.GL_REPLACE, GL11.GL_REPLACE);
+ GL11.glColorMask(false, false, false, false);
+ }
+
+ public static void readStencilBuffer(int ref) {
+ GL11.glColorMask(true, true, true, true);
+ GL11.glStencilFunc(GL11.GL_EQUAL, ref, 1);
+ GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ }
+
+ public static void uninitStencilBuffer() {
+ GL11.glDisable(GL11.GL_STENCIL_TEST);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/rip/athena/client/utils/render/TextField.java b/src/main/java/rip/athena/client/utils/render/TextField.java
new file mode 100644
index 00000000..dc00973b
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/render/TextField.java
@@ -0,0 +1,660 @@
+package rip.athena.client.utils.render;
+
+import lombok.Getter;
+import lombok.Setter;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.WorldRenderer;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.util.ChatAllowedCharacters;
+import net.minecraft.util.MathHelper;
+import org.lwjgl.input.Keyboard;
+import rip.athena.client.utils.animations.Animation;
+import rip.athena.client.utils.animations.Direction;
+import rip.athena.client.utils.animations.impl.DecelerateAnimation;
+import rip.athena.client.utils.font.FontManager;
+import rip.athena.client.utils.font.impl.athena.FontRenderer;
+import rip.athena.client.utils.font.impl.athena.FontUtil;
+import rip.athena.client.utils.time.TimerUtil;
+
+import java.awt.*;
+
+public class TextField extends Gui {
+ @Setter
+ public FontManager font;
+
+ @Getter
+ @Setter
+ private float xPosition, yPosition, radius = 2, alpha = 1;
+
+ @Setter
+ private float width, height, textAlpha = 1;
+
+ @Setter
+ @Getter
+ private Color outline = Color.WHITE, fill = ColorUtil.tripleColor(32);
+
+ private Color focusedTextColor = new Color(224, 224, 224);
+ private Color unfocusedTextColor = new Color(130, 130, 130);
+ /**
+ * Has the current text being edited on the textbox.
+ */
+ private String text = "";
+
+ @Setter
+ private String backgroundText;
+
+ private int maxStringLength = 32;
+
+ @Setter
+ @Getter
+ private boolean drawingBackground = true;
+
+ /**
+ * if true the textbox can lose focus by clicking elsewhere on the screen
+ */
+ private boolean canLoseFocus = true;
+
+ /**
+ * If this value is true along with isEnabled, keyTyped will process the keys.
+ */
+ @Setter
+ @Getter
+ private boolean isFocused;
+
+ /**
+ * The current character index that should be used as start of the rendered text.
+ */
+ private int lineScrollOffset;
+ private int cursorPosition;
+
+
+ /**
+ * other selection position, maybe the same as the cursor
+ */
+ private int selectionEnd;
+ private final Animation textColor = new DecelerateAnimation(250, 1);
+ private final Animation cursorBlinkAnimation = new DecelerateAnimation(750, 1);
+ private final TimerUtil timerUtil = new TimerUtil();
+
+ /**
+ * True if this textbox is visible
+ */
+ private boolean visible = true;
+
+ public TextField() {
+ }
+
+ public TextField(FontManager font, float x, float y, float par5Width, float par6Height) {
+ this.font = font;
+ this.xPosition = x;
+ this.yPosition = y;
+ this.width = par5Width;
+ this.height = par6Height;
+ }
+
+ /**
+ * Sets the text of the textbox
+ */
+ public void setText(String text) {
+ if (text.length() > this.maxStringLength) {
+ this.text = text.substring(0, this.maxStringLength);
+ } else {
+ this.text = text;
+ }
+
+ setCursorPositionZero();
+ }
+
+ /**
+ * Returns the contents of the textbox
+ */
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * returns the text between the cursor and selectionEnd
+ */
+ public String getSelectedText() {
+ int i = Math.min(this.cursorPosition, this.selectionEnd);
+ int j = Math.max(this.cursorPosition, this.selectionEnd);
+ return this.text.substring(i, j);
+ }
+
+ /**
+ * replaces selected text, or inserts text at the position on the cursor
+ */
+ public void writeText(String text) {
+ String s = "";
+ String s1 = ChatAllowedCharacters.filterAllowedCharacters(text);
+ int min = Math.min(this.cursorPosition, this.selectionEnd);
+ int max = Math.max(this.cursorPosition, this.selectionEnd);
+ int len = this.maxStringLength - this.text.length() - (min - max);
+ int l;
+
+ if (this.text.length() > 0) {
+ s = s + this.text.substring(0, min);
+ }
+
+ if (len < s1.length()) {
+ s = s + s1.substring(0, len);
+ l = len;
+ } else {
+ s = s + s1;
+ l = s1.length();
+ }
+
+ if (this.text.length() > 0 && max < this.text.length()) {
+ s = s + this.text.substring(max);
+ }
+
+ this.text = s;
+ this.moveCursorBy(min - this.selectionEnd + l);
+
+
+ }
+
+ /**
+ * Deletes the specified number of words starting at the cursor position. Negative numbers will delete words left of
+ * the cursor.
+ */
+ public void deleteWords(int num) {
+ if (this.text.length() != 0) {
+ if (this.selectionEnd != this.cursorPosition) {
+ this.writeText("");
+ } else {
+ this.deleteFromCursor(this.getNthWordFromCursor(num) - this.cursorPosition);
+ }
+ }
+ }
+
+ /**
+ * delete the selected text, otherwsie deletes characters from either side of the cursor. params: delete num
+ */
+ public void deleteFromCursor(int num) {
+ if (this.text.length() != 0) {
+ if (this.selectionEnd != this.cursorPosition) {
+ this.writeText("");
+ } else {
+ boolean negative = num < 0;
+ int i = negative ? this.cursorPosition + num : this.cursorPosition;
+ int j = negative ? this.cursorPosition : this.cursorPosition + num;
+ String s = "";
+
+ if (i >= 0) {
+ s = this.text.substring(0, i);
+ }
+
+ if (j < this.text.length()) {
+ s = s + this.text.substring(j);
+ }
+
+ this.text = s;
+
+ if (negative) {
+ this.moveCursorBy(num);
+ }
+
+ }
+ }
+ }
+
+ /**
+ * see @getNthNextWordFromPos() params: N, position
+ */
+ public int getNthWordFromCursor(int n) {
+ return this.getNthWordFromPos(n, this.getCursorPosition());
+ }
+
+ /**
+ * gets the position of the nth word. N may be negative, then it looks backwards. params: N, position
+ */
+ public int getNthWordFromPos(int n, int pos) {
+ return this.func_146197_a(n, pos);
+ }
+
+ public int func_146197_a(int n, int pos) {
+ int i = pos;
+ boolean negative = n < 0;
+ int j = Math.abs(n);
+
+ for (int k = 0; k < j; ++k) {
+ if (!negative) {
+ int l = this.text.length();
+ i = this.text.indexOf(32, i);
+
+ if (i == -1) {
+ i = l;
+ } else {
+ while (i < l && this.text.charAt(i) == 32) {
+ ++i;
+ }
+ }
+ } else {
+ while (i > 0 && this.text.charAt(i - 1) == 32) {
+ --i;
+ }
+
+ while (i > 0 && this.text.charAt(i - 1) != 32) {
+ --i;
+ }
+ }
+ }
+
+ return i;
+ }
+
+ /**
+ * Moves the text cursor by a specified number of characters and clears the selection
+ */
+ public void moveCursorBy(int p_146182_1_) {
+ this.setCursorPosition(this.selectionEnd + p_146182_1_);
+ }
+
+ /**
+ * sets the position of the cursor to the provided index
+ */
+ public void setCursorPosition(int p_146190_1_) {
+ this.cursorPosition = p_146190_1_;
+ int i = this.text.length();
+ this.cursorPosition = MathHelper.clamp_int(this.cursorPosition, 0, i);
+ this.setSelectionPos(this.cursorPosition);
+ }
+
+ /**
+ * sets the cursors position to the beginning
+ */
+ public void setCursorPositionZero() {
+ this.setCursorPosition(0);
+ }
+
+ /**
+ * sets the cursors position to after the text
+ */
+ public void setCursorPositionEnd() {
+ this.setCursorPosition(this.text.length());
+ }
+
+ /**
+ * Call this method from your GuiScreen to process the keys into the textbox
+ */
+ public boolean keyTyped(char cha, int keyCode) {
+ if (!this.isFocused) {
+ return false;
+ }
+
+ timerUtil.reset();
+
+ if (GuiScreen.isKeyComboCtrlA(keyCode)) {
+ this.setCursorPositionEnd();
+ this.setSelectionPos(0);
+ return true;
+ } else if (GuiScreen.isKeyComboCtrlC(keyCode)) {
+ GuiScreen.setClipboardString(this.getSelectedText());
+ return true;
+ } else if (GuiScreen.isKeyComboCtrlV(keyCode)) {
+ this.writeText(GuiScreen.getClipboardString());
+
+
+ return true;
+ } else if (GuiScreen.isKeyComboCtrlX(keyCode)) {
+ GuiScreen.setClipboardString(this.getSelectedText());
+ this.writeText("");
+
+
+ return true;
+ } else {
+ switch (keyCode) {
+ case Keyboard.KEY_BACK:
+ if (GuiScreen.isCtrlKeyDown()) {
+ this.deleteWords(-1);
+ } else {
+ this.deleteFromCursor(-1);
+ }
+
+ return true;
+
+ case Keyboard.KEY_HOME:
+ if (GuiScreen.isShiftKeyDown()) {
+ this.setSelectionPos(0);
+ } else {
+ this.setCursorPositionZero();
+ }
+
+ return true;
+
+ case Keyboard.KEY_LEFT:
+ if (GuiScreen.isShiftKeyDown()) {
+ if (GuiScreen.isCtrlKeyDown()) {
+ this.setSelectionPos(this.getNthWordFromPos(-1, this.getSelectionEnd()));
+ } else {
+ this.setSelectionPos(this.getSelectionEnd() - 1);
+ }
+ } else if (GuiScreen.isCtrlKeyDown()) {
+ this.setCursorPosition(this.getNthWordFromCursor(-1));
+ } else {
+ this.moveCursorBy(-1);
+ }
+
+ return true;
+
+ case Keyboard.KEY_RIGHT:
+ if (GuiScreen.isShiftKeyDown()) {
+ if (GuiScreen.isCtrlKeyDown()) {
+ this.setSelectionPos(this.getNthWordFromPos(1, this.getSelectionEnd()));
+ } else {
+ this.setSelectionPos(this.getSelectionEnd() + 1);
+ }
+ } else if (GuiScreen.isCtrlKeyDown()) {
+ this.setCursorPosition(this.getNthWordFromCursor(1));
+ } else {
+ this.moveCursorBy(1);
+ }
+
+ return true;
+
+ case Keyboard.KEY_END:
+ if (GuiScreen.isShiftKeyDown()) {
+ this.setSelectionPos(this.text.length());
+ } else {
+ this.setCursorPositionEnd();
+ }
+
+ return true;
+
+ case Keyboard.KEY_DELETE:
+ if (GuiScreen.isCtrlKeyDown()) {
+ this.deleteWords(1);
+ } else {
+ this.deleteFromCursor(1);
+ }
+
+ return true;
+
+ default:
+ if (ChatAllowedCharacters.isAllowedCharacter(cha)) {
+ this.writeText(Character.toString(cha));
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+ }
+
+ /**
+ * Args: x, y, buttonClicked
+ */
+ public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+ boolean flag = HoveringUtil.isHovering(xPosition, yPosition, width, height, mouseX, mouseY);
+
+ if (this.canLoseFocus) {
+ this.setFocused(flag);
+ }
+ }
+
+ /**
+ * Draws the textbox
+ */
+ public void drawTextBox() {
+ if (this.getVisible()) {
+
+ if (isFocused()) {
+ Keyboard.enableRepeatEvents(true);
+ }
+
+ Color textColorWithAlpha = focusedTextColor;
+ if (textAlpha != 1) {
+ textColorWithAlpha = ColorUtil.applyOpacity(focusedTextColor, textAlpha);
+ }
+
+
+ float xPos = this.xPosition + 3;
+ float yPos = this.yPosition + height;
+
+ if (this.isDrawingBackground()) {
+ if (outline != null) {
+ RoundedUtils.drawRound(this.xPosition - 1, this.yPosition - 1, this.width + 2f, this.height + 2f, radius + 1, outline);
+ }
+
+ RoundedUtils.drawRound(this.xPosition, this.yPosition, this.width, this.height, radius, ColorUtil.applyOpacity(fill, alpha));
+ } else {
+ float rectHeight = 1;
+ //Gui.drawRect2(xPosition, yPosition + height - rectHeight, width, rectHeight, ColorUtil.interpolateColor(focusedTextColor, unfocusedTextColor, textColor.getOutput().floatValue()));
+ }
+
+ textColor.setDirection(isFocused() ? Direction.BACKWARDS : Direction.FORWARDS);
+ if (backgroundText != null) {
+ Color backgroundTextColor = ColorUtil.applyOpacity(ColorUtil.applyOpacity(unfocusedTextColor, textAlpha), textColor.getOutput().floatValue());
+
+ if (text.equals("") && !textColor.finished(Direction.BACKWARDS)) {
+ FontManager.getProductSansRegular(20).drawString(backgroundText, xPos, yPos - FontManager.getProductSansRegular(25).height(), backgroundTextColor.getRGB());
+ }
+ }
+
+ int cursorPos = this.cursorPosition - this.lineScrollOffset;
+ int selEnd = this.selectionEnd - this.lineScrollOffset;
+ String text = this.text.substring(this.lineScrollOffset);
+ boolean cursorInBounds = cursorPos >= 0 && cursorPos <= text.length();
+ boolean canShowCursor = this.isFocused && cursorInBounds;
+ float j1 = xPos;
+
+ if (selEnd > text.length()) {
+ selEnd = text.length();
+ }
+
+ if (text.length() > 0) {
+ String s1 = cursorInBounds ? text.substring(0, cursorPos) : text;
+ float textWidth = FontManager.getProductSansRegular(20).width(s1); // Measure the width of the text
+
+ // Cut the text if it exceeds the width of the box
+ if (textWidth > width - 6) {
+ int endIndex = s1.length();
+ while (textWidth > width - 6 && endIndex > 0) {
+ s1 = s1.substring(0, endIndex - 1);
+ textWidth = FontManager.getProductSansRegular(20).width(s1);
+ endIndex--;
+ }
+ if (endIndex > 0) {
+ s1 += "...";
+ }
+ }
+
+ j1 = FontManager.getProductSansRegular(20).drawStringWithShadow(s1, xPos, yPos - FontManager.getProductSansRegular(25).height(), textColorWithAlpha.getRGB()) + .5f;
+ }
+
+
+ boolean cursorEndPos = this.cursorPosition < this.text.length() || this.text.length() >= this.getMaxStringLength();
+ float k1 = j1;
+
+ if (!cursorInBounds) {
+ k1 = cursorPos > 0 ? xPos + this.width : xPos;
+ } else if (cursorEndPos) {
+ k1 = j1;
+ --j1;
+ }
+
+ boolean cursorBlink = timerUtil.hasTimeElapsed(2000) || cursorEndPos;
+
+ if (canShowCursor) {
+ if (cursorBlink) {
+ if (cursorBlinkAnimation.isDone()) {
+ cursorBlinkAnimation.changeDirection();
+ }
+ } else cursorBlinkAnimation.setDirection(Direction.FORWARDS);
+
+ Gui.drawRect2(k1 - FontManager.getProductSansRegular(20).width(text) + 4, yPos - FontManager.getProductSansRegular(25).height() - 5, .5f, FontManager.getProductSansRegular(25).height() + 3,
+ ColorUtil.applyOpacity(textColorWithAlpha, cursorBlinkAnimation.getOutput().floatValue()).getRGB());
+ }
+
+ if (selEnd != cursorPos) {
+ int l1 = (int) (xPos + FontManager.getProductSansRegular(25).width(text.substring(0, selEnd)));
+ int offset = selEnd > cursorPos ? 2 : 0;
+ float widthOffset = selEnd > cursorPos ? .5f : 0;
+
+ drawSelectionBox(k1 + offset - FontManager.getProductSansRegular(25).width(text) + 10, yPos - 3 - FontManager.getProductSansRegular(25).height(), l1 + widthOffset, yPos - FontManager.getProductSansRegular(25).height() + 12);
+ }
+ }
+
+ }
+
+ /**
+ * draws the vertical line cursor in the textbox
+ */
+ private void drawSelectionBox(float x, float y, float width, float height) {
+ if (x < width) {
+ float i = x;
+ x = width;
+ width = i;
+ }
+
+ if (y < height) {
+ float j = y;
+ y = height;
+ height = j;
+ }
+
+ if (width > this.xPosition + this.width) {
+ width = this.xPosition + this.width;
+ }
+
+ if (x > this.xPosition + this.width) {
+ x = this.xPosition + this.width;
+ }
+
+ Tessellator tessellator = Tessellator.getInstance();
+ WorldRenderer worldrenderer = tessellator.getWorldRenderer();
+ GlStateManager.color(0.0F, 0.0F, 255.0F, 255.0F);
+ GlStateManager.disableTexture2D();
+ GlStateManager.enableColorLogic();
+ GlStateManager.colorLogicOp(5387);
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION);
+ worldrenderer.pos(x, height, 0.0D).endVertex();
+ worldrenderer.pos(width, height, 0.0D).endVertex();
+ worldrenderer.pos(width, y, 0.0D).endVertex();
+ worldrenderer.pos(x, y, 0.0D).endVertex();
+ tessellator.draw();
+ GlStateManager.disableColorLogic();
+ GlStateManager.enableTexture2D();
+ }
+
+ public void setMaxStringLength(int len) {
+ this.maxStringLength = len;
+
+ if (this.text.length() > len) {
+ this.text = this.text.substring(0, len);
+ }
+ }
+
+ /**
+ * returns the maximum number of character that can be contained in this textbox
+ */
+ public int getMaxStringLength() {
+ return this.maxStringLength;
+ }
+
+ /**
+ * returns the current position of the cursor
+ */
+ public int getCursorPosition() {
+ return this.cursorPosition;
+ }
+
+ /**
+ * Sets the text colour for this textbox (disabled text will not use this colour)
+ */
+ public void setTextColor(Color color) {
+ this.focusedTextColor = color;
+ }
+
+ public void setDisabledTextColour(Color color) {
+ this.unfocusedTextColor = color;
+ }
+
+ /**
+ * the side of the selection that is not the cursor, may be the same as the cursor
+ */
+ public int getSelectionEnd() {
+ return this.selectionEnd;
+ }
+
+ /**
+ * returns the width of the textbox depending on if background drawing is enabled
+ */
+ public float getWidth() {
+ boolean flag = backgroundText != null && backgroundText.equals("Search");
+ return this.isDrawingBackground() ? this.width - (flag ? 17 : 4) : this.width;
+ }
+
+ public float getRealWidth() {
+ return this.isDrawingBackground() ? this.width - 4 : this.width;
+ }
+
+ public float getHeight() {
+ return this.height;
+ }
+
+ /**
+ * Sets the position of the selection anchor (i.e. position the selection was started at)
+ */
+ public void setSelectionPos(int selectionPos) {
+ int i = this.text.length();
+
+ if (selectionPos > i) {
+ selectionPos = i;
+ }
+
+ if (selectionPos < 0) {
+ selectionPos = 0;
+ }
+
+ this.selectionEnd = selectionPos;
+
+ if (this.font != null) {
+ if (this.lineScrollOffset > i) {
+ this.lineScrollOffset = i;
+ }
+
+ float j = this.getWidth();
+ String s =this.text.substring(this.lineScrollOffset);
+ int k = s.length() + this.lineScrollOffset;
+
+ if (selectionPos == this.lineScrollOffset) {
+ this.lineScrollOffset -= FontManager.getProductSansRegular(25).width(this.text);
+ }
+
+ if (selectionPos > k) {
+ this.lineScrollOffset += selectionPos - k;
+ } else if (selectionPos <= this.lineScrollOffset) {
+ this.lineScrollOffset -= this.lineScrollOffset - selectionPos;
+ }
+
+ this.lineScrollOffset = MathHelper.clamp_int(this.lineScrollOffset, 0, i);
+ }
+ }
+
+ /**
+ * if true the textbox can lose focus by clicking elsewhere on the screen
+ */
+ public void setCanLoseFocus(boolean canLoseFocus) {
+ this.canLoseFocus = canLoseFocus;
+ }
+
+ /**
+ * returns true if this textbox is visible
+ */
+ public boolean getVisible() {
+ return this.visible;
+ }
+
+ /**
+ * Sets whether this textbox is visible
+ */
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+}
diff --git a/src/main/java/rip/athena/client/utils/shader/ShaderUtil.java b/src/main/java/rip/athena/client/utils/shader/ShaderUtil.java
index ee2a5846..b99f2263 100644
--- a/src/main/java/rip/athena/client/utils/shader/ShaderUtil.java
+++ b/src/main/java/rip/athena/client/utils/shader/ShaderUtil.java
@@ -32,6 +32,9 @@ public class ShaderUtil {
case "kawaseUpGlow":
fragmentShaderID = createShader(new ByteArrayInputStream(kawaseUpGlow.getBytes()), GL_FRAGMENT_SHADER);
break;
+ case "roundedRectTextured":
+ fragmentShaderID = createShader(new ByteArrayInputStream(roundedRectTextured.getBytes()), GL_FRAGMENT_SHADER);
+ break;
case "glow":
fragmentShaderID = createShader(new ByteArrayInputStream(glowShader.getBytes()), GL_FRAGMENT_SHADER);
break;
@@ -215,6 +218,23 @@ public class ShaderUtil {
return shader;
}
+ private String roundedRectTextured = "#version 120\n" +
+ "\n" +
+ "uniform vec2 location, rectSize;\n" +
+ "uniform sampler2D textureIn;\n" +
+ "uniform float radius, alpha;\n" +
+ "\n" +
+ "float roundedBoxSDF(vec2 centerPos, vec2 size, float radius) {\n" +
+ " return length(max(abs(centerPos) -size, 0.)) - radius;\n" +
+ "}\n" +
+ "\n" +
+ "\n" +
+ "void main() {\n" +
+ " float distance = roundedBoxSDF((rectSize * .5) - (gl_TexCoord[0].st * rectSize), (rectSize * .5) - radius - 1., radius);\n" +
+ " float smoothedAlpha = (1.0-smoothstep(0.0, 2.0, distance)) * alpha;\n" +
+ " gl_FragColor = vec4(texture2D(textureIn, gl_TexCoord[0].st).rgb, smoothedAlpha);\n" +
+ "}";
+
private String kawaseUpGlow = "#version 120\n" +
"\n" +
"uniform sampler2D inTexture, textureToCheck;\n" +
diff --git a/src/main/java/rip/athena/client/utils/time/TimerUtil.java b/src/main/java/rip/athena/client/utils/time/TimerUtil.java
new file mode 100644
index 00000000..6768a4b7
--- /dev/null
+++ b/src/main/java/rip/athena/client/utils/time/TimerUtil.java
@@ -0,0 +1,36 @@
+package rip.athena.client.utils.time;
+
+public class TimerUtil {
+
+ public long lastMS = System.currentTimeMillis();
+
+ public void reset() {
+ lastMS = System.currentTimeMillis();
+ }
+
+ public boolean hasTimeElapsed(long time, boolean reset) {
+ if (System.currentTimeMillis() - lastMS > time) {
+ if (reset) reset();
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean hasTimeElapsed(long time) {
+ return System.currentTimeMillis() - lastMS > time;
+ }
+
+ public boolean hasTimeElapsed(double time) {
+ return hasTimeElapsed((long) time);
+ }
+
+ public long getTime() {
+ return System.currentTimeMillis() - lastMS;
+ }
+
+ public void setTime(long time) {
+ lastMS = time;
+ }
+
+}
diff --git a/src/main/resources/assets/minecraft/Athena/gui/mods/nickhider.png b/src/main/resources/assets/minecraft/Athena/gui/mods/nickhider.png
new file mode 100644
index 00000000..b3ea7e33
Binary files /dev/null and b/src/main/resources/assets/minecraft/Athena/gui/mods/nickhider.png differ
diff --git a/src/main/resources/assets/minecraft/Athena/gui/mods/nobobbing.png b/src/main/resources/assets/minecraft/Athena/gui/mods/nobobbing.png
new file mode 100644
index 00000000..ec97a153
Binary files /dev/null and b/src/main/resources/assets/minecraft/Athena/gui/mods/nobobbing.png differ
diff --git a/src/main/resources/assets/minecraft/Athena/gui/mods/scoreboard.png b/src/main/resources/assets/minecraft/Athena/gui/mods/scoreboard.png
new file mode 100644
index 00000000..e72b8dc1
Binary files /dev/null and b/src/main/resources/assets/minecraft/Athena/gui/mods/scoreboard.png differ
diff --git a/src/main/resources/assets/minecraft/Athena/menu/usericon.png b/src/main/resources/assets/minecraft/Athena/menu/usericon.png
index 5d752807..490db919 100644
Binary files a/src/main/resources/assets/minecraft/Athena/menu/usericon.png and b/src/main/resources/assets/minecraft/Athena/menu/usericon.png differ
diff --git a/workspace/assets/skins/12/12f0b47e6bfcf92d8481cbc77b224e5ab38ad728d8ae4621ccc719b4a2de61e0 b/workspace/assets/skins/12/12f0b47e6bfcf92d8481cbc77b224e5ab38ad728d8ae4621ccc719b4a2de61e0
new file mode 100644
index 00000000..424e66ea
Binary files /dev/null and b/workspace/assets/skins/12/12f0b47e6bfcf92d8481cbc77b224e5ab38ad728d8ae4621ccc719b4a2de61e0 differ
diff --git a/workspace/assets/skins/13/13850780a31e33cc9dd8978c78890b16f0fbd81f8000a149edc526fcac1fe201 b/workspace/assets/skins/13/13850780a31e33cc9dd8978c78890b16f0fbd81f8000a149edc526fcac1fe201
new file mode 100644
index 00000000..e77257d6
Binary files /dev/null and b/workspace/assets/skins/13/13850780a31e33cc9dd8978c78890b16f0fbd81f8000a149edc526fcac1fe201 differ
diff --git a/workspace/assets/skins/13/13f2d12c6d9ecc5ebc6d7d4116dfcb426443119e849a53352153765d51fcb981 b/workspace/assets/skins/13/13f2d12c6d9ecc5ebc6d7d4116dfcb426443119e849a53352153765d51fcb981
new file mode 100644
index 00000000..90abf0d8
Binary files /dev/null and b/workspace/assets/skins/13/13f2d12c6d9ecc5ebc6d7d4116dfcb426443119e849a53352153765d51fcb981 differ
diff --git a/workspace/assets/skins/15/15b52aa0f7eef8bb537b40e8d8727faaeea4ad868ba3eefe07da86ed2212740e b/workspace/assets/skins/15/15b52aa0f7eef8bb537b40e8d8727faaeea4ad868ba3eefe07da86ed2212740e
new file mode 100644
index 00000000..7fbc6c8e
Binary files /dev/null and b/workspace/assets/skins/15/15b52aa0f7eef8bb537b40e8d8727faaeea4ad868ba3eefe07da86ed2212740e differ
diff --git a/workspace/assets/skins/16/16221b7bf822c3119072546f3ee9a14ef5e8da30c6bf892b19ffec9fc5a1178e b/workspace/assets/skins/16/16221b7bf822c3119072546f3ee9a14ef5e8da30c6bf892b19ffec9fc5a1178e
new file mode 100644
index 00000000..a61ee469
Binary files /dev/null and b/workspace/assets/skins/16/16221b7bf822c3119072546f3ee9a14ef5e8da30c6bf892b19ffec9fc5a1178e differ
diff --git a/workspace/assets/skins/1a/1aee6b06df0c83319e4712642973abd4a1e4fbb75ae7303ac97eeb6b4117e888 b/workspace/assets/skins/1a/1aee6b06df0c83319e4712642973abd4a1e4fbb75ae7303ac97eeb6b4117e888
new file mode 100644
index 00000000..369f12b8
Binary files /dev/null and b/workspace/assets/skins/1a/1aee6b06df0c83319e4712642973abd4a1e4fbb75ae7303ac97eeb6b4117e888 differ
diff --git a/workspace/assets/skins/1d/1dc1a635b9851e1ed67aeaed4fcf6504063a7f142f5510e657dac9878af8eb35 b/workspace/assets/skins/1d/1dc1a635b9851e1ed67aeaed4fcf6504063a7f142f5510e657dac9878af8eb35
new file mode 100644
index 00000000..c40d719c
Binary files /dev/null and b/workspace/assets/skins/1d/1dc1a635b9851e1ed67aeaed4fcf6504063a7f142f5510e657dac9878af8eb35 differ
diff --git a/workspace/assets/skins/1f/1f239694dcbc612735f500abb394acfb4bb91b1586e1f5af42491a3297f05841 b/workspace/assets/skins/1f/1f239694dcbc612735f500abb394acfb4bb91b1586e1f5af42491a3297f05841
new file mode 100644
index 00000000..b787fa6d
Binary files /dev/null and b/workspace/assets/skins/1f/1f239694dcbc612735f500abb394acfb4bb91b1586e1f5af42491a3297f05841 differ
diff --git a/workspace/assets/skins/20/2098135e5f5bbc686874ad0fcd1261007f1f18d0f8a85eac8ae4def63b7b6021 b/workspace/assets/skins/20/2098135e5f5bbc686874ad0fcd1261007f1f18d0f8a85eac8ae4def63b7b6021
new file mode 100644
index 00000000..e7fad7c3
Binary files /dev/null and b/workspace/assets/skins/20/2098135e5f5bbc686874ad0fcd1261007f1f18d0f8a85eac8ae4def63b7b6021 differ
diff --git a/workspace/assets/skins/22/220e247124c5d24b9b3d4066f57550800a6196dace67c9b93e71221ec7c9a1a9 b/workspace/assets/skins/22/220e247124c5d24b9b3d4066f57550800a6196dace67c9b93e71221ec7c9a1a9
new file mode 100644
index 00000000..eada4e3b
Binary files /dev/null and b/workspace/assets/skins/22/220e247124c5d24b9b3d4066f57550800a6196dace67c9b93e71221ec7c9a1a9 differ
diff --git a/workspace/assets/skins/22/224dc1d0ea30a84b072d063bf2ed19692060d8eb7ae72e9a69277017bb824ef1 b/workspace/assets/skins/22/224dc1d0ea30a84b072d063bf2ed19692060d8eb7ae72e9a69277017bb824ef1
new file mode 100644
index 00000000..9215a7e1
Binary files /dev/null and b/workspace/assets/skins/22/224dc1d0ea30a84b072d063bf2ed19692060d8eb7ae72e9a69277017bb824ef1 differ
diff --git a/workspace/assets/skins/22/22b81504a296226bb22f7407b019faad5d7d45a97cd7893c91593d24d85227a b/workspace/assets/skins/22/22b81504a296226bb22f7407b019faad5d7d45a97cd7893c91593d24d85227a
new file mode 100644
index 00000000..e2c6cad7
Binary files /dev/null and b/workspace/assets/skins/22/22b81504a296226bb22f7407b019faad5d7d45a97cd7893c91593d24d85227a differ
diff --git a/workspace/assets/skins/22/22cfa60180a9240c6f6e02fd2d8138e5ae6219c955b8f7e34076ff4ce294d1e7 b/workspace/assets/skins/22/22cfa60180a9240c6f6e02fd2d8138e5ae6219c955b8f7e34076ff4ce294d1e7
new file mode 100644
index 00000000..47b72606
Binary files /dev/null and b/workspace/assets/skins/22/22cfa60180a9240c6f6e02fd2d8138e5ae6219c955b8f7e34076ff4ce294d1e7 differ
diff --git a/workspace/assets/skins/22/22fb18bf46c3a003c6fd8d4e714cba246467252042fb1c0b3c7e12eeb90b34b0 b/workspace/assets/skins/22/22fb18bf46c3a003c6fd8d4e714cba246467252042fb1c0b3c7e12eeb90b34b0
new file mode 100644
index 00000000..073f712c
Binary files /dev/null and b/workspace/assets/skins/22/22fb18bf46c3a003c6fd8d4e714cba246467252042fb1c0b3c7e12eeb90b34b0 differ
diff --git a/workspace/assets/skins/23/2361e020e6b5560025b01079d4551a1cbe3708608e1add9a0f9f1ab461513198 b/workspace/assets/skins/23/2361e020e6b5560025b01079d4551a1cbe3708608e1add9a0f9f1ab461513198
new file mode 100644
index 00000000..b1219e0e
Binary files /dev/null and b/workspace/assets/skins/23/2361e020e6b5560025b01079d4551a1cbe3708608e1add9a0f9f1ab461513198 differ
diff --git a/workspace/assets/skins/25/252871b2f2a02f9d86f89f13818369b656e9bac2bb4d65e103bccb595e5b7401 b/workspace/assets/skins/25/252871b2f2a02f9d86f89f13818369b656e9bac2bb4d65e103bccb595e5b7401
new file mode 100644
index 00000000..460c5aa5
Binary files /dev/null and b/workspace/assets/skins/25/252871b2f2a02f9d86f89f13818369b656e9bac2bb4d65e103bccb595e5b7401 differ
diff --git a/workspace/assets/skins/25/25cb603d5fa1bfb6214ac28c1bbfc1a8e17484cf9b4ca0e5209276ae3739c5c5 b/workspace/assets/skins/25/25cb603d5fa1bfb6214ac28c1bbfc1a8e17484cf9b4ca0e5209276ae3739c5c5
new file mode 100644
index 00000000..c9ade70e
Binary files /dev/null and b/workspace/assets/skins/25/25cb603d5fa1bfb6214ac28c1bbfc1a8e17484cf9b4ca0e5209276ae3739c5c5 differ
diff --git a/workspace/assets/skins/26/2691493c75dbd903d993bbd077ec8c2dd7b55a01cfc5561620536cf4fa42823c b/workspace/assets/skins/26/2691493c75dbd903d993bbd077ec8c2dd7b55a01cfc5561620536cf4fa42823c
new file mode 100644
index 00000000..29c27159
Binary files /dev/null and b/workspace/assets/skins/26/2691493c75dbd903d993bbd077ec8c2dd7b55a01cfc5561620536cf4fa42823c differ
diff --git a/workspace/assets/skins/27/27f5fac3c7156aab9ab0de27fd561c579023123146cadee05ed3ab51f882a623 b/workspace/assets/skins/27/27f5fac3c7156aab9ab0de27fd561c579023123146cadee05ed3ab51f882a623
new file mode 100644
index 00000000..64eaa144
Binary files /dev/null and b/workspace/assets/skins/27/27f5fac3c7156aab9ab0de27fd561c579023123146cadee05ed3ab51f882a623 differ
diff --git a/workspace/assets/skins/28/284946bc30dfe7224961e38525c865b1b7846fc918e58e453b55a33080dd2400 b/workspace/assets/skins/28/284946bc30dfe7224961e38525c865b1b7846fc918e58e453b55a33080dd2400
new file mode 100644
index 00000000..324170a7
Binary files /dev/null and b/workspace/assets/skins/28/284946bc30dfe7224961e38525c865b1b7846fc918e58e453b55a33080dd2400 differ
diff --git a/workspace/assets/skins/28/289bb9b09009cae540dbeac88b0172b5fb56f796c5bd4aa05729b17ddd48fef2 b/workspace/assets/skins/28/289bb9b09009cae540dbeac88b0172b5fb56f796c5bd4aa05729b17ddd48fef2
new file mode 100644
index 00000000..72cd0338
Binary files /dev/null and b/workspace/assets/skins/28/289bb9b09009cae540dbeac88b0172b5fb56f796c5bd4aa05729b17ddd48fef2 differ
diff --git a/workspace/assets/skins/28/28ce283f6f2a6052510073ed58ff101e7bc09607b5b0d4b5453070e31f497396 b/workspace/assets/skins/28/28ce283f6f2a6052510073ed58ff101e7bc09607b5b0d4b5453070e31f497396
new file mode 100644
index 00000000..419617ef
Binary files /dev/null and b/workspace/assets/skins/28/28ce283f6f2a6052510073ed58ff101e7bc09607b5b0d4b5453070e31f497396 differ
diff --git a/workspace/assets/skins/29/290f936785a40372a140f13c52fd085e1d2494e82ecba3605ccae5974a5e7678 b/workspace/assets/skins/29/290f936785a40372a140f13c52fd085e1d2494e82ecba3605ccae5974a5e7678
new file mode 100644
index 00000000..99147316
Binary files /dev/null and b/workspace/assets/skins/29/290f936785a40372a140f13c52fd085e1d2494e82ecba3605ccae5974a5e7678 differ
diff --git a/workspace/assets/skins/29/29a3ad6e8d4369c5edcfecd47b04b12d0aae28c7ce351488947283a291d288e6 b/workspace/assets/skins/29/29a3ad6e8d4369c5edcfecd47b04b12d0aae28c7ce351488947283a291d288e6
new file mode 100644
index 00000000..bbc6d3ba
Binary files /dev/null and b/workspace/assets/skins/29/29a3ad6e8d4369c5edcfecd47b04b12d0aae28c7ce351488947283a291d288e6 differ
diff --git a/workspace/assets/skins/29/29e453d728cb918b46c6b43897f4bfd2e0af32878ea8a79ed29e9d1b77d2780f b/workspace/assets/skins/29/29e453d728cb918b46c6b43897f4bfd2e0af32878ea8a79ed29e9d1b77d2780f
new file mode 100644
index 00000000..bd91884f
Binary files /dev/null and b/workspace/assets/skins/29/29e453d728cb918b46c6b43897f4bfd2e0af32878ea8a79ed29e9d1b77d2780f differ
diff --git a/workspace/assets/skins/2b/2b2d430212b038c85c1a246a28e04e59506d1a506becfbd76bd78e1c8a7a7a05 b/workspace/assets/skins/2b/2b2d430212b038c85c1a246a28e04e59506d1a506becfbd76bd78e1c8a7a7a05
new file mode 100644
index 00000000..60df88b1
Binary files /dev/null and b/workspace/assets/skins/2b/2b2d430212b038c85c1a246a28e04e59506d1a506becfbd76bd78e1c8a7a7a05 differ
diff --git a/workspace/assets/skins/2c/2cbe0ae7bc90b2e80f95a819cd4fd916870b36a6bda586fe60ea529022ef172c b/workspace/assets/skins/2c/2cbe0ae7bc90b2e80f95a819cd4fd916870b36a6bda586fe60ea529022ef172c
new file mode 100644
index 00000000..f75dc23a
Binary files /dev/null and b/workspace/assets/skins/2c/2cbe0ae7bc90b2e80f95a819cd4fd916870b36a6bda586fe60ea529022ef172c differ
diff --git a/workspace/assets/skins/2e/2e50459e60914beb5050ff2916e9c6ca87a6243e0b4a469a3fe61a467eca1a3b b/workspace/assets/skins/2e/2e50459e60914beb5050ff2916e9c6ca87a6243e0b4a469a3fe61a467eca1a3b
new file mode 100644
index 00000000..5f9ad7d1
Binary files /dev/null and b/workspace/assets/skins/2e/2e50459e60914beb5050ff2916e9c6ca87a6243e0b4a469a3fe61a467eca1a3b differ
diff --git a/workspace/assets/skins/30/30b15be4c86ad3aa1f7facc0a4d8daafa35b479dcb700a86b471068a067337f3 b/workspace/assets/skins/30/30b15be4c86ad3aa1f7facc0a4d8daafa35b479dcb700a86b471068a067337f3
new file mode 100644
index 00000000..064d60ac
Binary files /dev/null and b/workspace/assets/skins/30/30b15be4c86ad3aa1f7facc0a4d8daafa35b479dcb700a86b471068a067337f3 differ
diff --git a/workspace/assets/skins/36/365d22632c358ba74ddfbf6ad02be42f54f5c828c8d2379a20e3e36f8d9e4953 b/workspace/assets/skins/36/365d22632c358ba74ddfbf6ad02be42f54f5c828c8d2379a20e3e36f8d9e4953
new file mode 100644
index 00000000..27f31f26
Binary files /dev/null and b/workspace/assets/skins/36/365d22632c358ba74ddfbf6ad02be42f54f5c828c8d2379a20e3e36f8d9e4953 differ
diff --git a/workspace/assets/skins/37/37db46b4f0614d1e94e77a34341e6dbffdfa9a2dda30e5a28bf3d66213787bdd b/workspace/assets/skins/37/37db46b4f0614d1e94e77a34341e6dbffdfa9a2dda30e5a28bf3d66213787bdd
new file mode 100644
index 00000000..4847b873
Binary files /dev/null and b/workspace/assets/skins/37/37db46b4f0614d1e94e77a34341e6dbffdfa9a2dda30e5a28bf3d66213787bdd differ
diff --git a/workspace/assets/skins/38/3835df84768a222ac871631b3c582a3eaa7327f011207ffc73179b2641f6b2be b/workspace/assets/skins/38/3835df84768a222ac871631b3c582a3eaa7327f011207ffc73179b2641f6b2be
new file mode 100644
index 00000000..1b5949f7
Binary files /dev/null and b/workspace/assets/skins/38/3835df84768a222ac871631b3c582a3eaa7327f011207ffc73179b2641f6b2be differ
diff --git a/workspace/assets/skins/38/38d7522359269453106e0d02e1e41ac4e031316a9165f28823a5e5350bfcada6 b/workspace/assets/skins/38/38d7522359269453106e0d02e1e41ac4e031316a9165f28823a5e5350bfcada6
new file mode 100644
index 00000000..1f8a31e2
Binary files /dev/null and b/workspace/assets/skins/38/38d7522359269453106e0d02e1e41ac4e031316a9165f28823a5e5350bfcada6 differ
diff --git a/workspace/assets/skins/39/390d75f7f32d6fae7a61112e13bf19a82caf1fe6dfa59244cb14e06dc6e04805 b/workspace/assets/skins/39/390d75f7f32d6fae7a61112e13bf19a82caf1fe6dfa59244cb14e06dc6e04805
new file mode 100644
index 00000000..d24d3b60
Binary files /dev/null and b/workspace/assets/skins/39/390d75f7f32d6fae7a61112e13bf19a82caf1fe6dfa59244cb14e06dc6e04805 differ
diff --git a/workspace/assets/skins/39/397e1dce90c01c48574c113b88b7254bc09b902d3d23b71c4ea6bd6149499986 b/workspace/assets/skins/39/397e1dce90c01c48574c113b88b7254bc09b902d3d23b71c4ea6bd6149499986
new file mode 100644
index 00000000..63f9aa32
Binary files /dev/null and b/workspace/assets/skins/39/397e1dce90c01c48574c113b88b7254bc09b902d3d23b71c4ea6bd6149499986 differ
diff --git a/workspace/assets/skins/39/39da792218672eb95f133e1da9896b4f1097ff43f99b50efaaf6093d561c50be b/workspace/assets/skins/39/39da792218672eb95f133e1da9896b4f1097ff43f99b50efaaf6093d561c50be
new file mode 100644
index 00000000..6027b687
Binary files /dev/null and b/workspace/assets/skins/39/39da792218672eb95f133e1da9896b4f1097ff43f99b50efaaf6093d561c50be differ
diff --git a/workspace/assets/skins/3b/3bf3faa185e07ad17276c3f18515f1169f6e28ca3965f6c5b1df930a54610fac b/workspace/assets/skins/3b/3bf3faa185e07ad17276c3f18515f1169f6e28ca3965f6c5b1df930a54610fac
new file mode 100644
index 00000000..8c6a481e
Binary files /dev/null and b/workspace/assets/skins/3b/3bf3faa185e07ad17276c3f18515f1169f6e28ca3965f6c5b1df930a54610fac differ
diff --git a/workspace/assets/skins/3e/3eaea9140af5003f104184ad628b249866bd65a9c2b1781e0f09b7600f7495af b/workspace/assets/skins/3e/3eaea9140af5003f104184ad628b249866bd65a9c2b1781e0f09b7600f7495af
new file mode 100644
index 00000000..d8681719
Binary files /dev/null and b/workspace/assets/skins/3e/3eaea9140af5003f104184ad628b249866bd65a9c2b1781e0f09b7600f7495af differ
diff --git a/workspace/assets/skins/40/40553937f1ec6ec1472fd6cb87cd4dfd3283ed66d55ae985b64d482667a204a4 b/workspace/assets/skins/40/40553937f1ec6ec1472fd6cb87cd4dfd3283ed66d55ae985b64d482667a204a4
new file mode 100644
index 00000000..31c8d235
Binary files /dev/null and b/workspace/assets/skins/40/40553937f1ec6ec1472fd6cb87cd4dfd3283ed66d55ae985b64d482667a204a4 differ
diff --git a/workspace/assets/skins/40/40909bccb6fe00ce39649adea4df63bb6a713bfc3c9f59c10c380b6d420d8733 b/workspace/assets/skins/40/40909bccb6fe00ce39649adea4df63bb6a713bfc3c9f59c10c380b6d420d8733
new file mode 100644
index 00000000..002276ec
Binary files /dev/null and b/workspace/assets/skins/40/40909bccb6fe00ce39649adea4df63bb6a713bfc3c9f59c10c380b6d420d8733 differ
diff --git a/workspace/assets/skins/40/40beb8bfc6a95a7769bb6ec9ab1013a19ffbc7e31565631eec02dcb008bdd412 b/workspace/assets/skins/40/40beb8bfc6a95a7769bb6ec9ab1013a19ffbc7e31565631eec02dcb008bdd412
new file mode 100644
index 00000000..4fef9a3c
Binary files /dev/null and b/workspace/assets/skins/40/40beb8bfc6a95a7769bb6ec9ab1013a19ffbc7e31565631eec02dcb008bdd412 differ
diff --git a/workspace/assets/skins/44/44d3d0993148bf7dcec6f767825b680b26265cb65db2349bacd858173388b48 b/workspace/assets/skins/44/44d3d0993148bf7dcec6f767825b680b26265cb65db2349bacd858173388b48
new file mode 100644
index 00000000..327c4a0c
Binary files /dev/null and b/workspace/assets/skins/44/44d3d0993148bf7dcec6f767825b680b26265cb65db2349bacd858173388b48 differ
diff --git a/workspace/assets/skins/46/4604e6993a1b6f861bb0d59336f83aa92c0460a471df14bca6985aeac24e7a68 b/workspace/assets/skins/46/4604e6993a1b6f861bb0d59336f83aa92c0460a471df14bca6985aeac24e7a68
new file mode 100644
index 00000000..3c636708
Binary files /dev/null and b/workspace/assets/skins/46/4604e6993a1b6f861bb0d59336f83aa92c0460a471df14bca6985aeac24e7a68 differ
diff --git a/workspace/assets/skins/46/46b44336051a67a1a4177fb5cfe0b3f01d8e55fe2fa6d14a7c6642ddcafb4248 b/workspace/assets/skins/46/46b44336051a67a1a4177fb5cfe0b3f01d8e55fe2fa6d14a7c6642ddcafb4248
new file mode 100644
index 00000000..c74cd0c2
Binary files /dev/null and b/workspace/assets/skins/46/46b44336051a67a1a4177fb5cfe0b3f01d8e55fe2fa6d14a7c6642ddcafb4248 differ
diff --git a/workspace/assets/skins/49/491dce6f471cbae0a17cc950b686eab44dcb3159a97c6ccf0ccb648829513b4 b/workspace/assets/skins/49/491dce6f471cbae0a17cc950b686eab44dcb3159a97c6ccf0ccb648829513b4
new file mode 100644
index 00000000..b34f9982
Binary files /dev/null and b/workspace/assets/skins/49/491dce6f471cbae0a17cc950b686eab44dcb3159a97c6ccf0ccb648829513b4 differ
diff --git a/workspace/assets/skins/4a/4a070c09e9b2433f73217e1d9f0f724662cbc65a0a707ca5ed7dc11cfd8c9242 b/workspace/assets/skins/4a/4a070c09e9b2433f73217e1d9f0f724662cbc65a0a707ca5ed7dc11cfd8c9242
new file mode 100644
index 00000000..50d4af09
Binary files /dev/null and b/workspace/assets/skins/4a/4a070c09e9b2433f73217e1d9f0f724662cbc65a0a707ca5ed7dc11cfd8c9242 differ
diff --git a/workspace/assets/skins/4b/4b71dd87dc3e7553cba7a3d12e4286c31fd3a24e581d0f6cbadc6740cab0a178 b/workspace/assets/skins/4b/4b71dd87dc3e7553cba7a3d12e4286c31fd3a24e581d0f6cbadc6740cab0a178
new file mode 100644
index 00000000..47fe932a
Binary files /dev/null and b/workspace/assets/skins/4b/4b71dd87dc3e7553cba7a3d12e4286c31fd3a24e581d0f6cbadc6740cab0a178 differ
diff --git a/workspace/assets/skins/4c/4c978ea73656e291eece446da0ffe7d8a5574c38d3b070792972a235aa8247ea b/workspace/assets/skins/4c/4c978ea73656e291eece446da0ffe7d8a5574c38d3b070792972a235aa8247ea
new file mode 100644
index 00000000..81f6ddd9
Binary files /dev/null and b/workspace/assets/skins/4c/4c978ea73656e291eece446da0ffe7d8a5574c38d3b070792972a235aa8247ea differ
diff --git a/workspace/assets/skins/4c/4cc0f1158903211d281f9bcae2d8b81de21d422925001cb7b316bd175d6fa3a3 b/workspace/assets/skins/4c/4cc0f1158903211d281f9bcae2d8b81de21d422925001cb7b316bd175d6fa3a3
new file mode 100644
index 00000000..e29c1cae
Binary files /dev/null and b/workspace/assets/skins/4c/4cc0f1158903211d281f9bcae2d8b81de21d422925001cb7b316bd175d6fa3a3 differ
diff --git a/workspace/assets/skins/50/50a08b43f01bde08528dc0442a185cec90523c72e4a0211459459e47a77ec87f b/workspace/assets/skins/50/50a08b43f01bde08528dc0442a185cec90523c72e4a0211459459e47a77ec87f
new file mode 100644
index 00000000..3e5c3c73
Binary files /dev/null and b/workspace/assets/skins/50/50a08b43f01bde08528dc0442a185cec90523c72e4a0211459459e47a77ec87f differ
diff --git a/workspace/assets/skins/50/50ee3b89e01e9f8dc4e3463551322d88d4e9a6e3cc715da4ae1f186024b56bda b/workspace/assets/skins/50/50ee3b89e01e9f8dc4e3463551322d88d4e9a6e3cc715da4ae1f186024b56bda
new file mode 100644
index 00000000..85e486b4
Binary files /dev/null and b/workspace/assets/skins/50/50ee3b89e01e9f8dc4e3463551322d88d4e9a6e3cc715da4ae1f186024b56bda differ
diff --git a/workspace/assets/skins/53/536bd50bc8711fab20635d2d0e48939add5f672e49581b06c3214523dc768a5a b/workspace/assets/skins/53/536bd50bc8711fab20635d2d0e48939add5f672e49581b06c3214523dc768a5a
new file mode 100644
index 00000000..9dafa7ca
Binary files /dev/null and b/workspace/assets/skins/53/536bd50bc8711fab20635d2d0e48939add5f672e49581b06c3214523dc768a5a differ
diff --git a/workspace/assets/skins/53/538c9a46a8da426783c88ed342437c758d839b67ba77f8dcb57ff04b519db1ce b/workspace/assets/skins/53/538c9a46a8da426783c88ed342437c758d839b67ba77f8dcb57ff04b519db1ce
new file mode 100644
index 00000000..9c55ac98
Binary files /dev/null and b/workspace/assets/skins/53/538c9a46a8da426783c88ed342437c758d839b67ba77f8dcb57ff04b519db1ce differ
diff --git a/workspace/assets/skins/53/53fc088b6417a944853d68e1fb1db64680e90f86c1130c89c93a82a60ab9cc51 b/workspace/assets/skins/53/53fc088b6417a944853d68e1fb1db64680e90f86c1130c89c93a82a60ab9cc51
new file mode 100644
index 00000000..9f0853ea
Binary files /dev/null and b/workspace/assets/skins/53/53fc088b6417a944853d68e1fb1db64680e90f86c1130c89c93a82a60ab9cc51 differ
diff --git a/workspace/assets/skins/54/5410f7d7a156589ab8706d0a196351d7412fc7baec85567700eb6668b647897d b/workspace/assets/skins/54/5410f7d7a156589ab8706d0a196351d7412fc7baec85567700eb6668b647897d
new file mode 100644
index 00000000..98fbc213
Binary files /dev/null and b/workspace/assets/skins/54/5410f7d7a156589ab8706d0a196351d7412fc7baec85567700eb6668b647897d differ
diff --git a/workspace/assets/skins/54/545f9099eff2a61f046f77497b2b849c86fbcb7e874e20d1a27426a61217d48d b/workspace/assets/skins/54/545f9099eff2a61f046f77497b2b849c86fbcb7e874e20d1a27426a61217d48d
new file mode 100644
index 00000000..0c585dc3
Binary files /dev/null and b/workspace/assets/skins/54/545f9099eff2a61f046f77497b2b849c86fbcb7e874e20d1a27426a61217d48d differ
diff --git a/workspace/assets/skins/55/55b1f3a5a1757f2fe280bb76e6c314414067f51cc537a43e9849f3342039e54d b/workspace/assets/skins/55/55b1f3a5a1757f2fe280bb76e6c314414067f51cc537a43e9849f3342039e54d
new file mode 100644
index 00000000..b714fb64
Binary files /dev/null and b/workspace/assets/skins/55/55b1f3a5a1757f2fe280bb76e6c314414067f51cc537a43e9849f3342039e54d differ
diff --git a/workspace/assets/skins/57/5730ceae0ae5a2f56d919fa8dac221dbb5329e45e78019d1063e21c7fc327fc1 b/workspace/assets/skins/57/5730ceae0ae5a2f56d919fa8dac221dbb5329e45e78019d1063e21c7fc327fc1
new file mode 100644
index 00000000..21457ea6
Binary files /dev/null and b/workspace/assets/skins/57/5730ceae0ae5a2f56d919fa8dac221dbb5329e45e78019d1063e21c7fc327fc1 differ
diff --git a/workspace/assets/skins/57/5773675e0fcaf5a123baaefa4957f848925fc7b6a69fb08893c9e26ccedf3780 b/workspace/assets/skins/57/5773675e0fcaf5a123baaefa4957f848925fc7b6a69fb08893c9e26ccedf3780
new file mode 100644
index 00000000..dd3c201c
Binary files /dev/null and b/workspace/assets/skins/57/5773675e0fcaf5a123baaefa4957f848925fc7b6a69fb08893c9e26ccedf3780 differ
diff --git a/workspace/assets/skins/58/5884d356f3a87834604cba65b92a063126b8872f2b33658e5a904d275c161ac b/workspace/assets/skins/58/5884d356f3a87834604cba65b92a063126b8872f2b33658e5a904d275c161ac
new file mode 100644
index 00000000..13971148
Binary files /dev/null and b/workspace/assets/skins/58/5884d356f3a87834604cba65b92a063126b8872f2b33658e5a904d275c161ac differ
diff --git a/workspace/assets/skins/59/5985d1761aac4c840bdab195c81bd25775811a66a79f519168e5ac9936466c63 b/workspace/assets/skins/59/5985d1761aac4c840bdab195c81bd25775811a66a79f519168e5ac9936466c63
new file mode 100644
index 00000000..f94cfddc
Binary files /dev/null and b/workspace/assets/skins/59/5985d1761aac4c840bdab195c81bd25775811a66a79f519168e5ac9936466c63 differ
diff --git a/workspace/assets/skins/59/59c08b62356a867b77886d8485beac495468a5d7d52e2977ee218d7fee89d00 b/workspace/assets/skins/59/59c08b62356a867b77886d8485beac495468a5d7d52e2977ee218d7fee89d00
new file mode 100644
index 00000000..f724b23a
Binary files /dev/null and b/workspace/assets/skins/59/59c08b62356a867b77886d8485beac495468a5d7d52e2977ee218d7fee89d00 differ
diff --git a/workspace/assets/skins/5a/5a2a37cbe9c814ba8a64ec5a0c4ed07294fda1b9d954889f65627710e0e57ec8 b/workspace/assets/skins/5a/5a2a37cbe9c814ba8a64ec5a0c4ed07294fda1b9d954889f65627710e0e57ec8
new file mode 100644
index 00000000..3a0c8523
Binary files /dev/null and b/workspace/assets/skins/5a/5a2a37cbe9c814ba8a64ec5a0c4ed07294fda1b9d954889f65627710e0e57ec8 differ
diff --git a/workspace/assets/skins/5a/5a95135f149ecde071cdad8761ec257097d4b3d61d47322d6fe44e89b56531ab b/workspace/assets/skins/5a/5a95135f149ecde071cdad8761ec257097d4b3d61d47322d6fe44e89b56531ab
new file mode 100644
index 00000000..649ea7d0
Binary files /dev/null and b/workspace/assets/skins/5a/5a95135f149ecde071cdad8761ec257097d4b3d61d47322d6fe44e89b56531ab differ
diff --git a/workspace/assets/skins/5a/5ada5d8d0485f1ac268950353bbce6c18afbf22d0b4bc11626b20a19040eb5e0 b/workspace/assets/skins/5a/5ada5d8d0485f1ac268950353bbce6c18afbf22d0b4bc11626b20a19040eb5e0
new file mode 100644
index 00000000..a53f6dfd
Binary files /dev/null and b/workspace/assets/skins/5a/5ada5d8d0485f1ac268950353bbce6c18afbf22d0b4bc11626b20a19040eb5e0 differ
diff --git a/workspace/assets/skins/5b/5b282fb0898787b96c5137baa9875801358779782a4e91218306f5e9bf49d172 b/workspace/assets/skins/5b/5b282fb0898787b96c5137baa9875801358779782a4e91218306f5e9bf49d172
new file mode 100644
index 00000000..89776ced
Binary files /dev/null and b/workspace/assets/skins/5b/5b282fb0898787b96c5137baa9875801358779782a4e91218306f5e9bf49d172 differ
diff --git a/workspace/assets/skins/5b/5bdff0cdca673fa03a11404dc713b48ae81d96dd658f6eeda21d69583a8de821 b/workspace/assets/skins/5b/5bdff0cdca673fa03a11404dc713b48ae81d96dd658f6eeda21d69583a8de821
new file mode 100644
index 00000000..0e80374d
Binary files /dev/null and b/workspace/assets/skins/5b/5bdff0cdca673fa03a11404dc713b48ae81d96dd658f6eeda21d69583a8de821 differ
diff --git a/workspace/assets/skins/5c/5c13b196932b4c04491750791f5346276643fcdf33a4aecb2737439fb6f7dc87 b/workspace/assets/skins/5c/5c13b196932b4c04491750791f5346276643fcdf33a4aecb2737439fb6f7dc87
new file mode 100644
index 00000000..6298c38e
Binary files /dev/null and b/workspace/assets/skins/5c/5c13b196932b4c04491750791f5346276643fcdf33a4aecb2737439fb6f7dc87 differ
diff --git a/workspace/assets/skins/5c/5c6d4cf805acde5ec36872730f3ae4781ab764a01975bf3d3415de0ea6aa8f07 b/workspace/assets/skins/5c/5c6d4cf805acde5ec36872730f3ae4781ab764a01975bf3d3415de0ea6aa8f07
new file mode 100644
index 00000000..52ffdb75
Binary files /dev/null and b/workspace/assets/skins/5c/5c6d4cf805acde5ec36872730f3ae4781ab764a01975bf3d3415de0ea6aa8f07 differ
diff --git a/workspace/assets/skins/5d/5d2f2ab1942739b2e09c70a34e436c98156e0db5f3c82ec1b66e1af3e6000dd2 b/workspace/assets/skins/5d/5d2f2ab1942739b2e09c70a34e436c98156e0db5f3c82ec1b66e1af3e6000dd2
new file mode 100644
index 00000000..a324fe35
Binary files /dev/null and b/workspace/assets/skins/5d/5d2f2ab1942739b2e09c70a34e436c98156e0db5f3c82ec1b66e1af3e6000dd2 differ
diff --git a/workspace/assets/skins/5d/5dbf871a06e6798bc5f29876a094c08a7fb279ccb66e959cfb85aee8d9d421bf b/workspace/assets/skins/5d/5dbf871a06e6798bc5f29876a094c08a7fb279ccb66e959cfb85aee8d9d421bf
new file mode 100644
index 00000000..7fbce1c4
Binary files /dev/null and b/workspace/assets/skins/5d/5dbf871a06e6798bc5f29876a094c08a7fb279ccb66e959cfb85aee8d9d421bf differ
diff --git a/workspace/assets/skins/5f/5f0b683d50fd417c2f45e27a8e4992417f5fad798ac105be36048233a09f014b b/workspace/assets/skins/5f/5f0b683d50fd417c2f45e27a8e4992417f5fad798ac105be36048233a09f014b
new file mode 100644
index 00000000..cb620807
Binary files /dev/null and b/workspace/assets/skins/5f/5f0b683d50fd417c2f45e27a8e4992417f5fad798ac105be36048233a09f014b differ
diff --git a/workspace/assets/skins/5f/5f7f35eb51c4edfac9bd596ba078cac207ce49691446e337fea09c9f8301cc6f b/workspace/assets/skins/5f/5f7f35eb51c4edfac9bd596ba078cac207ce49691446e337fea09c9f8301cc6f
new file mode 100644
index 00000000..12ac0a08
Binary files /dev/null and b/workspace/assets/skins/5f/5f7f35eb51c4edfac9bd596ba078cac207ce49691446e337fea09c9f8301cc6f differ
diff --git a/workspace/assets/skins/60/602a192b910b6d4e005b0537b8b62537036f5b4502d3e9143546ab9b0084bd98 b/workspace/assets/skins/60/602a192b910b6d4e005b0537b8b62537036f5b4502d3e9143546ab9b0084bd98
new file mode 100644
index 00000000..b5e70076
Binary files /dev/null and b/workspace/assets/skins/60/602a192b910b6d4e005b0537b8b62537036f5b4502d3e9143546ab9b0084bd98 differ
diff --git a/workspace/assets/skins/60/60988f5429e3cb53eb3cf5a34a89bea7abcb3a57177b81558d1b683de054cc21 b/workspace/assets/skins/60/60988f5429e3cb53eb3cf5a34a89bea7abcb3a57177b81558d1b683de054cc21
new file mode 100644
index 00000000..319f1746
Binary files /dev/null and b/workspace/assets/skins/60/60988f5429e3cb53eb3cf5a34a89bea7abcb3a57177b81558d1b683de054cc21 differ
diff --git a/workspace/assets/skins/62/62af87e39c159772c498659508e1d3aa97ef9e5b3358d7d5383fcfc28e8466d6 b/workspace/assets/skins/62/62af87e39c159772c498659508e1d3aa97ef9e5b3358d7d5383fcfc28e8466d6
new file mode 100644
index 00000000..bab65cea
Binary files /dev/null and b/workspace/assets/skins/62/62af87e39c159772c498659508e1d3aa97ef9e5b3358d7d5383fcfc28e8466d6 differ
diff --git a/workspace/assets/skins/64/64c9c4db0b825ccd7b2872203c6e1de9d43523cf934d6907037edbeac20e8752 b/workspace/assets/skins/64/64c9c4db0b825ccd7b2872203c6e1de9d43523cf934d6907037edbeac20e8752
new file mode 100644
index 00000000..64b65c70
Binary files /dev/null and b/workspace/assets/skins/64/64c9c4db0b825ccd7b2872203c6e1de9d43523cf934d6907037edbeac20e8752 differ
diff --git a/workspace/assets/skins/66/66f7ecbcd97a58baab92572e9ba3d19cb3a2f4db6d1cec274e48401b8ac7f447 b/workspace/assets/skins/66/66f7ecbcd97a58baab92572e9ba3d19cb3a2f4db6d1cec274e48401b8ac7f447
new file mode 100644
index 00000000..4105884c
Binary files /dev/null and b/workspace/assets/skins/66/66f7ecbcd97a58baab92572e9ba3d19cb3a2f4db6d1cec274e48401b8ac7f447 differ
diff --git a/workspace/assets/skins/67/67a1566cb5ea109dcababe2eff6545a640e86157f9c2882d18d1d514d0bd8376 b/workspace/assets/skins/67/67a1566cb5ea109dcababe2eff6545a640e86157f9c2882d18d1d514d0bd8376
new file mode 100644
index 00000000..0d360d06
Binary files /dev/null and b/workspace/assets/skins/67/67a1566cb5ea109dcababe2eff6545a640e86157f9c2882d18d1d514d0bd8376 differ
diff --git a/workspace/assets/skins/6a/6a502e9acd6e0bc63c5bfc4d120706b1593a7c396914bdaf04f92b22faf69eaa b/workspace/assets/skins/6a/6a502e9acd6e0bc63c5bfc4d120706b1593a7c396914bdaf04f92b22faf69eaa
new file mode 100644
index 00000000..074bb1e1
Binary files /dev/null and b/workspace/assets/skins/6a/6a502e9acd6e0bc63c5bfc4d120706b1593a7c396914bdaf04f92b22faf69eaa differ
diff --git a/workspace/assets/skins/6b/6b297e7cc153d06e6bc2b072f63ff30a9829fe5d0831ceb31437914a7858e0e4 b/workspace/assets/skins/6b/6b297e7cc153d06e6bc2b072f63ff30a9829fe5d0831ceb31437914a7858e0e4
new file mode 100644
index 00000000..67cf5897
Binary files /dev/null and b/workspace/assets/skins/6b/6b297e7cc153d06e6bc2b072f63ff30a9829fe5d0831ceb31437914a7858e0e4 differ
diff --git a/workspace/assets/skins/6c/6c3f02f8f1716bcfd9da35e43fcbead1e7b5e54975c7cf382fc5f8cdff1b9d39 b/workspace/assets/skins/6c/6c3f02f8f1716bcfd9da35e43fcbead1e7b5e54975c7cf382fc5f8cdff1b9d39
new file mode 100644
index 00000000..cf10e663
Binary files /dev/null and b/workspace/assets/skins/6c/6c3f02f8f1716bcfd9da35e43fcbead1e7b5e54975c7cf382fc5f8cdff1b9d39 differ
diff --git a/workspace/assets/skins/6c/6cb5affb8f1df14fb0ff33a75464a09b4a424dea9fcb86ab3c5afaea223dfa2a b/workspace/assets/skins/6c/6cb5affb8f1df14fb0ff33a75464a09b4a424dea9fcb86ab3c5afaea223dfa2a
new file mode 100644
index 00000000..f6ade4f1
Binary files /dev/null and b/workspace/assets/skins/6c/6cb5affb8f1df14fb0ff33a75464a09b4a424dea9fcb86ab3c5afaea223dfa2a differ
diff --git a/workspace/assets/skins/6d/6d2d365ede780e911668b4c639ba912392c04d1392bc4a731ace1e004a7d9653 b/workspace/assets/skins/6d/6d2d365ede780e911668b4c639ba912392c04d1392bc4a731ace1e004a7d9653
new file mode 100644
index 00000000..ace82aae
Binary files /dev/null and b/workspace/assets/skins/6d/6d2d365ede780e911668b4c639ba912392c04d1392bc4a731ace1e004a7d9653 differ
diff --git a/workspace/assets/skins/6d/6d774ebd3f214210f13025671f25e29ae1575cbcc6b980cb1531191c4f75145d b/workspace/assets/skins/6d/6d774ebd3f214210f13025671f25e29ae1575cbcc6b980cb1531191c4f75145d
new file mode 100644
index 00000000..549d96f8
Binary files /dev/null and b/workspace/assets/skins/6d/6d774ebd3f214210f13025671f25e29ae1575cbcc6b980cb1531191c4f75145d differ
diff --git a/workspace/assets/skins/6f/6fdd448226a81097b3bbb1da0b8d9386843d1a7a92fd3b8d6e3a8960ab28ccee b/workspace/assets/skins/6f/6fdd448226a81097b3bbb1da0b8d9386843d1a7a92fd3b8d6e3a8960ab28ccee
new file mode 100644
index 00000000..a54b7032
Binary files /dev/null and b/workspace/assets/skins/6f/6fdd448226a81097b3bbb1da0b8d9386843d1a7a92fd3b8d6e3a8960ab28ccee differ
diff --git a/workspace/assets/skins/6f/6ff552f9a3a0e20277c07e86b745a0f2e2df88b9a60f7ae3935ff0e5b0b9bce5 b/workspace/assets/skins/6f/6ff552f9a3a0e20277c07e86b745a0f2e2df88b9a60f7ae3935ff0e5b0b9bce5
new file mode 100644
index 00000000..104452aa
Binary files /dev/null and b/workspace/assets/skins/6f/6ff552f9a3a0e20277c07e86b745a0f2e2df88b9a60f7ae3935ff0e5b0b9bce5 differ
diff --git a/workspace/assets/skins/70/7024fdf5ecb2f79b84a070787da985fe78bac06298d7003ad13cbd7da74061eb b/workspace/assets/skins/70/7024fdf5ecb2f79b84a070787da985fe78bac06298d7003ad13cbd7da74061eb
new file mode 100644
index 00000000..eff4a19c
Binary files /dev/null and b/workspace/assets/skins/70/7024fdf5ecb2f79b84a070787da985fe78bac06298d7003ad13cbd7da74061eb differ
diff --git a/workspace/assets/skins/70/704d1523316ee2a0f6bc73a99297099c137b86e387f2e00208e35c405ad5265a b/workspace/assets/skins/70/704d1523316ee2a0f6bc73a99297099c137b86e387f2e00208e35c405ad5265a
new file mode 100644
index 00000000..e5e42f3b
Binary files /dev/null and b/workspace/assets/skins/70/704d1523316ee2a0f6bc73a99297099c137b86e387f2e00208e35c405ad5265a differ
diff --git a/workspace/assets/skins/70/70a1004dd8c25d56caae395a1948a39eb562e2eb2cb3da38bb5deab1b19d09c5 b/workspace/assets/skins/70/70a1004dd8c25d56caae395a1948a39eb562e2eb2cb3da38bb5deab1b19d09c5
new file mode 100644
index 00000000..40a98c63
Binary files /dev/null and b/workspace/assets/skins/70/70a1004dd8c25d56caae395a1948a39eb562e2eb2cb3da38bb5deab1b19d09c5 differ
diff --git a/workspace/assets/skins/72/7277c232f6281803a44966ed304f6d3779607ab1cfcd9a93959e8c6a69354b0a b/workspace/assets/skins/72/7277c232f6281803a44966ed304f6d3779607ab1cfcd9a93959e8c6a69354b0a
new file mode 100644
index 00000000..0c9715a5
Binary files /dev/null and b/workspace/assets/skins/72/7277c232f6281803a44966ed304f6d3779607ab1cfcd9a93959e8c6a69354b0a differ
diff --git a/workspace/assets/skins/74/74ae58c3531a2561a57c6e1cb8d284cbe507815a5394a98dfbe284ec70f78a90 b/workspace/assets/skins/74/74ae58c3531a2561a57c6e1cb8d284cbe507815a5394a98dfbe284ec70f78a90
new file mode 100644
index 00000000..90aba490
Binary files /dev/null and b/workspace/assets/skins/74/74ae58c3531a2561a57c6e1cb8d284cbe507815a5394a98dfbe284ec70f78a90 differ
diff --git a/workspace/assets/skins/78/78c06b9555eb5d0ccbab3d18d3a444d01ed9964a401fdc00de0bd0221d0f0785 b/workspace/assets/skins/78/78c06b9555eb5d0ccbab3d18d3a444d01ed9964a401fdc00de0bd0221d0f0785
new file mode 100644
index 00000000..1bb40355
Binary files /dev/null and b/workspace/assets/skins/78/78c06b9555eb5d0ccbab3d18d3a444d01ed9964a401fdc00de0bd0221d0f0785 differ
diff --git a/workspace/assets/skins/78/78c0dd9d6aa18265ea4366857b69b7fd4960c1b260dcc331cb5933a265fcf0a7 b/workspace/assets/skins/78/78c0dd9d6aa18265ea4366857b69b7fd4960c1b260dcc331cb5933a265fcf0a7
new file mode 100644
index 00000000..813d9392
Binary files /dev/null and b/workspace/assets/skins/78/78c0dd9d6aa18265ea4366857b69b7fd4960c1b260dcc331cb5933a265fcf0a7 differ
diff --git a/workspace/assets/skins/7a/7a261e745ee23232b27f0257ca48001611d8a5a35c67e7e25920f829758aaae5 b/workspace/assets/skins/7a/7a261e745ee23232b27f0257ca48001611d8a5a35c67e7e25920f829758aaae5
new file mode 100644
index 00000000..f09fcfb1
Binary files /dev/null and b/workspace/assets/skins/7a/7a261e745ee23232b27f0257ca48001611d8a5a35c67e7e25920f829758aaae5 differ
diff --git a/workspace/assets/skins/7b/7b18226ef7423330fe757518e15e081681ce2effb6ec0a2bb6dfe0570ddc16a2 b/workspace/assets/skins/7b/7b18226ef7423330fe757518e15e081681ce2effb6ec0a2bb6dfe0570ddc16a2
new file mode 100644
index 00000000..0e95ba00
Binary files /dev/null and b/workspace/assets/skins/7b/7b18226ef7423330fe757518e15e081681ce2effb6ec0a2bb6dfe0570ddc16a2 differ
diff --git a/workspace/assets/skins/7b/7b44fbc0d18d4313ab203e38def5d229ef404920e5c93a58da3290db5d2d197e b/workspace/assets/skins/7b/7b44fbc0d18d4313ab203e38def5d229ef404920e5c93a58da3290db5d2d197e
new file mode 100644
index 00000000..59ad3f0b
Binary files /dev/null and b/workspace/assets/skins/7b/7b44fbc0d18d4313ab203e38def5d229ef404920e5c93a58da3290db5d2d197e differ
diff --git a/workspace/assets/skins/7c/7c1e2e5a58474404e6711197184f3cdc6b120878b3a06a1535d11e65334736d b/workspace/assets/skins/7c/7c1e2e5a58474404e6711197184f3cdc6b120878b3a06a1535d11e65334736d
new file mode 100644
index 00000000..e86b0b27
Binary files /dev/null and b/workspace/assets/skins/7c/7c1e2e5a58474404e6711197184f3cdc6b120878b3a06a1535d11e65334736d differ
diff --git a/workspace/assets/skins/7c/7c2a57de464e4822f9ea5c5a375c9e3b9d2513fc3f2ed84672ec4d8e7752455 b/workspace/assets/skins/7c/7c2a57de464e4822f9ea5c5a375c9e3b9d2513fc3f2ed84672ec4d8e7752455
new file mode 100644
index 00000000..98f027f0
Binary files /dev/null and b/workspace/assets/skins/7c/7c2a57de464e4822f9ea5c5a375c9e3b9d2513fc3f2ed84672ec4d8e7752455 differ
diff --git a/workspace/assets/skins/7c/7cb85770e32247b85f634d6c6d29904126a63dec212fde4e6d17fa5e6b9b7d95 b/workspace/assets/skins/7c/7cb85770e32247b85f634d6c6d29904126a63dec212fde4e6d17fa5e6b9b7d95
new file mode 100644
index 00000000..82d1894f
Binary files /dev/null and b/workspace/assets/skins/7c/7cb85770e32247b85f634d6c6d29904126a63dec212fde4e6d17fa5e6b9b7d95 differ
diff --git a/workspace/assets/skins/7f/7fd5365c1f6b1a6859869665c753f5024922ae953d446aeef32044778051ac7b b/workspace/assets/skins/7f/7fd5365c1f6b1a6859869665c753f5024922ae953d446aeef32044778051ac7b
new file mode 100644
index 00000000..3b3625d5
Binary files /dev/null and b/workspace/assets/skins/7f/7fd5365c1f6b1a6859869665c753f5024922ae953d446aeef32044778051ac7b differ
diff --git a/workspace/assets/skins/7f/7feca845b4c00c56b01099ab0402ec8986b73845f5da57a266ceb923e141dc4b b/workspace/assets/skins/7f/7feca845b4c00c56b01099ab0402ec8986b73845f5da57a266ceb923e141dc4b
new file mode 100644
index 00000000..59b5a55e
Binary files /dev/null and b/workspace/assets/skins/7f/7feca845b4c00c56b01099ab0402ec8986b73845f5da57a266ceb923e141dc4b differ
diff --git a/workspace/assets/skins/81/814fbd72ff704969f0dd6b428fd3a331f08f4b082010e0d755c727eeb12181f1 b/workspace/assets/skins/81/814fbd72ff704969f0dd6b428fd3a331f08f4b082010e0d755c727eeb12181f1
new file mode 100644
index 00000000..f5e94b8b
Binary files /dev/null and b/workspace/assets/skins/81/814fbd72ff704969f0dd6b428fd3a331f08f4b082010e0d755c727eeb12181f1 differ
diff --git a/workspace/assets/skins/82/828da47d0d92cfb91b4ea367e149a2b0cc5b1874e08fb8318e2b4d7cfae3c53 b/workspace/assets/skins/82/828da47d0d92cfb91b4ea367e149a2b0cc5b1874e08fb8318e2b4d7cfae3c53
new file mode 100644
index 00000000..93be7a40
Binary files /dev/null and b/workspace/assets/skins/82/828da47d0d92cfb91b4ea367e149a2b0cc5b1874e08fb8318e2b4d7cfae3c53 differ
diff --git a/workspace/assets/skins/82/82b1099fa4dc796bbfdb0a9a5ced400767050cca834d90defe9816c3d37625a9 b/workspace/assets/skins/82/82b1099fa4dc796bbfdb0a9a5ced400767050cca834d90defe9816c3d37625a9
new file mode 100644
index 00000000..4a1aa098
Binary files /dev/null and b/workspace/assets/skins/82/82b1099fa4dc796bbfdb0a9a5ced400767050cca834d90defe9816c3d37625a9 differ
diff --git a/workspace/assets/skins/83/834c2d05d80a4b12716fae5ec8e8ccffbd872551b579638a5fecd581fda90f90 b/workspace/assets/skins/83/834c2d05d80a4b12716fae5ec8e8ccffbd872551b579638a5fecd581fda90f90
new file mode 100644
index 00000000..904a64cc
Binary files /dev/null and b/workspace/assets/skins/83/834c2d05d80a4b12716fae5ec8e8ccffbd872551b579638a5fecd581fda90f90 differ
diff --git a/workspace/assets/skins/83/83cdf2055b8eca146110a4a320aa39eb4053f6fd4ba37d503812e91c23bca33a b/workspace/assets/skins/83/83cdf2055b8eca146110a4a320aa39eb4053f6fd4ba37d503812e91c23bca33a
new file mode 100644
index 00000000..bfe41f5e
Binary files /dev/null and b/workspace/assets/skins/83/83cdf2055b8eca146110a4a320aa39eb4053f6fd4ba37d503812e91c23bca33a differ
diff --git a/workspace/assets/skins/83/83dffe832d2b5c0c17d648bdd3274e7849a50ab8204049a5a8a13f925c362765 b/workspace/assets/skins/83/83dffe832d2b5c0c17d648bdd3274e7849a50ab8204049a5a8a13f925c362765
new file mode 100644
index 00000000..6b2dc5d9
Binary files /dev/null and b/workspace/assets/skins/83/83dffe832d2b5c0c17d648bdd3274e7849a50ab8204049a5a8a13f925c362765 differ
diff --git a/workspace/assets/skins/84/8414d93790790d43c79ad3bebe89dc3f78fd87490a448786fa7683f044f4d993 b/workspace/assets/skins/84/8414d93790790d43c79ad3bebe89dc3f78fd87490a448786fa7683f044f4d993
new file mode 100644
index 00000000..f1c7b830
Binary files /dev/null and b/workspace/assets/skins/84/8414d93790790d43c79ad3bebe89dc3f78fd87490a448786fa7683f044f4d993 differ
diff --git a/workspace/assets/skins/84/8431ae499b4074cb89ddbbf9cb310201d8ea8a4b3cccb81e488dd1d515bce0e5 b/workspace/assets/skins/84/8431ae499b4074cb89ddbbf9cb310201d8ea8a4b3cccb81e488dd1d515bce0e5
new file mode 100644
index 00000000..f0b10afc
Binary files /dev/null and b/workspace/assets/skins/84/8431ae499b4074cb89ddbbf9cb310201d8ea8a4b3cccb81e488dd1d515bce0e5 differ
diff --git a/workspace/assets/skins/84/84ec54040026c391b2e371df292d0f0cb03c4e225cfc0c8d17ef073dd8b0e54 b/workspace/assets/skins/84/84ec54040026c391b2e371df292d0f0cb03c4e225cfc0c8d17ef073dd8b0e54
new file mode 100644
index 00000000..bbc4f1de
Binary files /dev/null and b/workspace/assets/skins/84/84ec54040026c391b2e371df292d0f0cb03c4e225cfc0c8d17ef073dd8b0e54 differ
diff --git a/workspace/assets/skins/86/86309fae5eca8dc1ccb9c6fae4227d27c70a75959159d14c2b1d12851c4ed18f b/workspace/assets/skins/86/86309fae5eca8dc1ccb9c6fae4227d27c70a75959159d14c2b1d12851c4ed18f
new file mode 100644
index 00000000..1efa2a13
Binary files /dev/null and b/workspace/assets/skins/86/86309fae5eca8dc1ccb9c6fae4227d27c70a75959159d14c2b1d12851c4ed18f differ
diff --git a/workspace/assets/skins/86/868f94bc8317f02b7211533e4a4df32ffdb3351ac1325d0040c4dcc0872b8c0f b/workspace/assets/skins/86/868f94bc8317f02b7211533e4a4df32ffdb3351ac1325d0040c4dcc0872b8c0f
new file mode 100644
index 00000000..529fecd8
Binary files /dev/null and b/workspace/assets/skins/86/868f94bc8317f02b7211533e4a4df32ffdb3351ac1325d0040c4dcc0872b8c0f differ
diff --git a/workspace/assets/skins/88/8827552adea642a0fedc5d1b32b7a851ab42c64a56f6175ebbd7c17cc2fcc596 b/workspace/assets/skins/88/8827552adea642a0fedc5d1b32b7a851ab42c64a56f6175ebbd7c17cc2fcc596
new file mode 100644
index 00000000..72f9d9b6
Binary files /dev/null and b/workspace/assets/skins/88/8827552adea642a0fedc5d1b32b7a851ab42c64a56f6175ebbd7c17cc2fcc596 differ
diff --git a/workspace/assets/skins/88/88c56a9d1d90a61b971e1fa83717c3ff2f3372926f40ed9c85f5c181011e2df4 b/workspace/assets/skins/88/88c56a9d1d90a61b971e1fa83717c3ff2f3372926f40ed9c85f5c181011e2df4
new file mode 100644
index 00000000..db3a19cc
Binary files /dev/null and b/workspace/assets/skins/88/88c56a9d1d90a61b971e1fa83717c3ff2f3372926f40ed9c85f5c181011e2df4 differ
diff --git a/workspace/assets/skins/89/890be1d05cf881761e5c2a52a58c3ac5f95a67d9cf0fc3c079114e0377e712f9 b/workspace/assets/skins/89/890be1d05cf881761e5c2a52a58c3ac5f95a67d9cf0fc3c079114e0377e712f9
new file mode 100644
index 00000000..530c6189
Binary files /dev/null and b/workspace/assets/skins/89/890be1d05cf881761e5c2a52a58c3ac5f95a67d9cf0fc3c079114e0377e712f9 differ
diff --git a/workspace/assets/skins/89/89f289106b2accb1938f167c6b585687983289e7510559f671ac23187310dc00 b/workspace/assets/skins/89/89f289106b2accb1938f167c6b585687983289e7510559f671ac23187310dc00
new file mode 100644
index 00000000..8a8e04de
Binary files /dev/null and b/workspace/assets/skins/89/89f289106b2accb1938f167c6b585687983289e7510559f671ac23187310dc00 differ
diff --git a/workspace/assets/skins/8b/8bb56569539eb30b8d6bd5b5ebfba3e78bc3043115b19616d9ca4fd1054fda7c b/workspace/assets/skins/8b/8bb56569539eb30b8d6bd5b5ebfba3e78bc3043115b19616d9ca4fd1054fda7c
new file mode 100644
index 00000000..b778e6a0
Binary files /dev/null and b/workspace/assets/skins/8b/8bb56569539eb30b8d6bd5b5ebfba3e78bc3043115b19616d9ca4fd1054fda7c differ
diff --git a/workspace/assets/skins/8c/8c94523fef1d9054a2f5371a93b979abb3de6e23fa20c5238e606ab55e0e6941 b/workspace/assets/skins/8c/8c94523fef1d9054a2f5371a93b979abb3de6e23fa20c5238e606ab55e0e6941
new file mode 100644
index 00000000..977b5b89
Binary files /dev/null and b/workspace/assets/skins/8c/8c94523fef1d9054a2f5371a93b979abb3de6e23fa20c5238e606ab55e0e6941 differ
diff --git a/workspace/assets/skins/8c/8cfd5c69aceb6a88d0c8cfbc133c06bd6b041fc87c0b030bd55abeedc360f3ba b/workspace/assets/skins/8c/8cfd5c69aceb6a88d0c8cfbc133c06bd6b041fc87c0b030bd55abeedc360f3ba
new file mode 100644
index 00000000..6b0f95dc
Binary files /dev/null and b/workspace/assets/skins/8c/8cfd5c69aceb6a88d0c8cfbc133c06bd6b041fc87c0b030bd55abeedc360f3ba differ
diff --git a/workspace/assets/skins/8d/8d66b0d16dfe207ac18097f996d1b14de941163c6e71d4858bb071c2d94387bd b/workspace/assets/skins/8d/8d66b0d16dfe207ac18097f996d1b14de941163c6e71d4858bb071c2d94387bd
new file mode 100644
index 00000000..441f7f65
Binary files /dev/null and b/workspace/assets/skins/8d/8d66b0d16dfe207ac18097f996d1b14de941163c6e71d4858bb071c2d94387bd differ
diff --git a/workspace/assets/skins/8e/8e27d21c48a4783b37190ae6d7116710a21ac15de5f670a0e62fdb5d297a955d b/workspace/assets/skins/8e/8e27d21c48a4783b37190ae6d7116710a21ac15de5f670a0e62fdb5d297a955d
new file mode 100644
index 00000000..50d82d38
Binary files /dev/null and b/workspace/assets/skins/8e/8e27d21c48a4783b37190ae6d7116710a21ac15de5f670a0e62fdb5d297a955d differ
diff --git a/workspace/assets/skins/90/907e7e43daa31e9fd47befbfefff1084ef58a45092666d53205390c6ec4d3506 b/workspace/assets/skins/90/907e7e43daa31e9fd47befbfefff1084ef58a45092666d53205390c6ec4d3506
new file mode 100644
index 00000000..5366ce39
Binary files /dev/null and b/workspace/assets/skins/90/907e7e43daa31e9fd47befbfefff1084ef58a45092666d53205390c6ec4d3506 differ
diff --git a/workspace/assets/skins/90/90901c9004d2714cee44f352be9ab02eb60474aae4b7f954fd1f6d15c12cccd3 b/workspace/assets/skins/90/90901c9004d2714cee44f352be9ab02eb60474aae4b7f954fd1f6d15c12cccd3
new file mode 100644
index 00000000..0c766164
Binary files /dev/null and b/workspace/assets/skins/90/90901c9004d2714cee44f352be9ab02eb60474aae4b7f954fd1f6d15c12cccd3 differ
diff --git a/workspace/assets/skins/91/910107a59d96ecbcd7c96f7641dc45f5b481f4fd693325e17a3f143d4e1be030 b/workspace/assets/skins/91/910107a59d96ecbcd7c96f7641dc45f5b481f4fd693325e17a3f143d4e1be030
new file mode 100644
index 00000000..ff069460
Binary files /dev/null and b/workspace/assets/skins/91/910107a59d96ecbcd7c96f7641dc45f5b481f4fd693325e17a3f143d4e1be030 differ
diff --git a/workspace/assets/skins/91/91e90cafce32ab67af1e60901a9a7d6b646382b8e6ce99999e2ee25435a6d1e8 b/workspace/assets/skins/91/91e90cafce32ab67af1e60901a9a7d6b646382b8e6ce99999e2ee25435a6d1e8
new file mode 100644
index 00000000..1b0dc6bb
Binary files /dev/null and b/workspace/assets/skins/91/91e90cafce32ab67af1e60901a9a7d6b646382b8e6ce99999e2ee25435a6d1e8 differ
diff --git a/workspace/assets/skins/92/9242a22c7c876f9c51d0ceb2320763dd7b21767717019e4e8eb0204efb368130 b/workspace/assets/skins/92/9242a22c7c876f9c51d0ceb2320763dd7b21767717019e4e8eb0204efb368130
new file mode 100644
index 00000000..dedcd8bd
Binary files /dev/null and b/workspace/assets/skins/92/9242a22c7c876f9c51d0ceb2320763dd7b21767717019e4e8eb0204efb368130 differ
diff --git a/workspace/assets/skins/92/925b4f8c3db46c1bfc82fa0c25159a5f969f3cc50f60dfb81c32808481ca79ae b/workspace/assets/skins/92/925b4f8c3db46c1bfc82fa0c25159a5f969f3cc50f60dfb81c32808481ca79ae
new file mode 100644
index 00000000..c551f6ee
Binary files /dev/null and b/workspace/assets/skins/92/925b4f8c3db46c1bfc82fa0c25159a5f969f3cc50f60dfb81c32808481ca79ae differ
diff --git a/workspace/assets/skins/93/933ee21c909d9320b1736ec10919f29e37ab496e192b2ded04ae21c84479e7f6 b/workspace/assets/skins/93/933ee21c909d9320b1736ec10919f29e37ab496e192b2ded04ae21c84479e7f6
new file mode 100644
index 00000000..7c17ca52
Binary files /dev/null and b/workspace/assets/skins/93/933ee21c909d9320b1736ec10919f29e37ab496e192b2ded04ae21c84479e7f6 differ
diff --git a/workspace/assets/skins/95/9599cb4d4dafea3334ccb5cccd29a302415d1dda76a262286df31126ca05cf85 b/workspace/assets/skins/95/9599cb4d4dafea3334ccb5cccd29a302415d1dda76a262286df31126ca05cf85
new file mode 100644
index 00000000..311a9af7
Binary files /dev/null and b/workspace/assets/skins/95/9599cb4d4dafea3334ccb5cccd29a302415d1dda76a262286df31126ca05cf85 differ
diff --git a/workspace/assets/skins/95/95b0c83c53876dc4e4d239e3f6dc3699283b5f19c42baff5fe272ae9f3e82be9 b/workspace/assets/skins/95/95b0c83c53876dc4e4d239e3f6dc3699283b5f19c42baff5fe272ae9f3e82be9
new file mode 100644
index 00000000..dab304af
Binary files /dev/null and b/workspace/assets/skins/95/95b0c83c53876dc4e4d239e3f6dc3699283b5f19c42baff5fe272ae9f3e82be9 differ
diff --git a/workspace/assets/skins/97/9778fa9cd8b85091b28db3f85973f2934733bba82531cf40fb4920149de1432f b/workspace/assets/skins/97/9778fa9cd8b85091b28db3f85973f2934733bba82531cf40fb4920149de1432f
new file mode 100644
index 00000000..dc7e4e77
Binary files /dev/null and b/workspace/assets/skins/97/9778fa9cd8b85091b28db3f85973f2934733bba82531cf40fb4920149de1432f differ
diff --git a/workspace/assets/skins/98/98610ecb5e813839330608c2d4979bc13c8999b7f88f17ce582e2b501dcea48f b/workspace/assets/skins/98/98610ecb5e813839330608c2d4979bc13c8999b7f88f17ce582e2b501dcea48f
new file mode 100644
index 00000000..5cd28dd0
Binary files /dev/null and b/workspace/assets/skins/98/98610ecb5e813839330608c2d4979bc13c8999b7f88f17ce582e2b501dcea48f differ
diff --git a/workspace/assets/skins/98/986463bd95ab242bdbced6180278675ca4e3730692ad0c3873a961b1d3452248 b/workspace/assets/skins/98/986463bd95ab242bdbced6180278675ca4e3730692ad0c3873a961b1d3452248
new file mode 100644
index 00000000..d4ff4fb3
Binary files /dev/null and b/workspace/assets/skins/98/986463bd95ab242bdbced6180278675ca4e3730692ad0c3873a961b1d3452248 differ
diff --git a/workspace/assets/skins/99/99652e15d9b18f51701ec181297c3f97b1f7f02bc25aba39f184f97d8e692d38 b/workspace/assets/skins/99/99652e15d9b18f51701ec181297c3f97b1f7f02bc25aba39f184f97d8e692d38
new file mode 100644
index 00000000..98076f39
Binary files /dev/null and b/workspace/assets/skins/99/99652e15d9b18f51701ec181297c3f97b1f7f02bc25aba39f184f97d8e692d38 differ
diff --git a/workspace/assets/skins/99/99b8c045ae42f0e832a5d325a78ada06f1aaf4f9bd1d1a1965dd582467ab5c15 b/workspace/assets/skins/99/99b8c045ae42f0e832a5d325a78ada06f1aaf4f9bd1d1a1965dd582467ab5c15
new file mode 100644
index 00000000..249bf14d
Binary files /dev/null and b/workspace/assets/skins/99/99b8c045ae42f0e832a5d325a78ada06f1aaf4f9bd1d1a1965dd582467ab5c15 differ
diff --git a/workspace/assets/skins/9a/9a62e7e611631fa871344347d519e98e9d220752728ec9a8bd5fcb57beacc84c b/workspace/assets/skins/9a/9a62e7e611631fa871344347d519e98e9d220752728ec9a8bd5fcb57beacc84c
new file mode 100644
index 00000000..314ccca1
Binary files /dev/null and b/workspace/assets/skins/9a/9a62e7e611631fa871344347d519e98e9d220752728ec9a8bd5fcb57beacc84c differ
diff --git a/workspace/assets/skins/9a/9acba2424b72638e4cf59d63ffb2393bfd9c107d3ba4cdc7e6c716eab98a0e2d b/workspace/assets/skins/9a/9acba2424b72638e4cf59d63ffb2393bfd9c107d3ba4cdc7e6c716eab98a0e2d
new file mode 100644
index 00000000..91f7d19b
Binary files /dev/null and b/workspace/assets/skins/9a/9acba2424b72638e4cf59d63ffb2393bfd9c107d3ba4cdc7e6c716eab98a0e2d differ
diff --git a/workspace/assets/skins/9b/9bcaecadb8be3be3b58d22d33588062b753c4aa6f9b4f96192283ffe703ca720 b/workspace/assets/skins/9b/9bcaecadb8be3be3b58d22d33588062b753c4aa6f9b4f96192283ffe703ca720
new file mode 100644
index 00000000..472183a8
Binary files /dev/null and b/workspace/assets/skins/9b/9bcaecadb8be3be3b58d22d33588062b753c4aa6f9b4f96192283ffe703ca720 differ
diff --git a/workspace/assets/skins/9d/9deadea1a3b1faf4183f83affbc03f242e92a1d5ebc4f76c2a4fa6fd48cb82b6 b/workspace/assets/skins/9d/9deadea1a3b1faf4183f83affbc03f242e92a1d5ebc4f76c2a4fa6fd48cb82b6
new file mode 100644
index 00000000..9dec7dcc
Binary files /dev/null and b/workspace/assets/skins/9d/9deadea1a3b1faf4183f83affbc03f242e92a1d5ebc4f76c2a4fa6fd48cb82b6 differ
diff --git a/workspace/assets/skins/9f/9fc359dfdb7c71de5737b2aa748f271066debcaeff1211ac85bfc43c1cad9d59 b/workspace/assets/skins/9f/9fc359dfdb7c71de5737b2aa748f271066debcaeff1211ac85bfc43c1cad9d59
new file mode 100644
index 00000000..bd5084ba
Binary files /dev/null and b/workspace/assets/skins/9f/9fc359dfdb7c71de5737b2aa748f271066debcaeff1211ac85bfc43c1cad9d59 differ
diff --git a/workspace/assets/skins/a0/a0eab4679d20f05402b2fb810d424e908b2da08486663492c1bd88544b4a7c24 b/workspace/assets/skins/a0/a0eab4679d20f05402b2fb810d424e908b2da08486663492c1bd88544b4a7c24
new file mode 100644
index 00000000..7f701dd1
Binary files /dev/null and b/workspace/assets/skins/a0/a0eab4679d20f05402b2fb810d424e908b2da08486663492c1bd88544b4a7c24 differ
diff --git a/workspace/assets/skins/a2/a28e8d7706e8c0a1e1cea18aa1c0edebb73ef7329e2a1e8b4a73cafa11e322a7 b/workspace/assets/skins/a2/a28e8d7706e8c0a1e1cea18aa1c0edebb73ef7329e2a1e8b4a73cafa11e322a7
new file mode 100644
index 00000000..dd9c70d3
Binary files /dev/null and b/workspace/assets/skins/a2/a28e8d7706e8c0a1e1cea18aa1c0edebb73ef7329e2a1e8b4a73cafa11e322a7 differ
diff --git a/workspace/assets/skins/a2/a290d89bbc675583dab19b2b21ec1d0a9c01334ab24d27d89f2e850406af7f19 b/workspace/assets/skins/a2/a290d89bbc675583dab19b2b21ec1d0a9c01334ab24d27d89f2e850406af7f19
new file mode 100644
index 00000000..cb537099
Binary files /dev/null and b/workspace/assets/skins/a2/a290d89bbc675583dab19b2b21ec1d0a9c01334ab24d27d89f2e850406af7f19 differ
diff --git a/workspace/assets/skins/a5/a511b261708c9dcf5d9b80a312996cdce93035e721b3cebccee3e5dbc2511ad9 b/workspace/assets/skins/a5/a511b261708c9dcf5d9b80a312996cdce93035e721b3cebccee3e5dbc2511ad9
new file mode 100644
index 00000000..127d29fe
Binary files /dev/null and b/workspace/assets/skins/a5/a511b261708c9dcf5d9b80a312996cdce93035e721b3cebccee3e5dbc2511ad9 differ
diff --git a/workspace/assets/skins/a6/a689f649644fa47735cc1013e77f2371f89593236023b61484ba6ce9625b7c15 b/workspace/assets/skins/a6/a689f649644fa47735cc1013e77f2371f89593236023b61484ba6ce9625b7c15
new file mode 100644
index 00000000..b13b5b91
Binary files /dev/null and b/workspace/assets/skins/a6/a689f649644fa47735cc1013e77f2371f89593236023b61484ba6ce9625b7c15 differ
diff --git a/workspace/assets/skins/a7/a74ab8e0e17ebd4aca0ff093071837fdff9e21d0027ddf9e6d99d90c474d002b b/workspace/assets/skins/a7/a74ab8e0e17ebd4aca0ff093071837fdff9e21d0027ddf9e6d99d90c474d002b
new file mode 100644
index 00000000..1dc309dc
Binary files /dev/null and b/workspace/assets/skins/a7/a74ab8e0e17ebd4aca0ff093071837fdff9e21d0027ddf9e6d99d90c474d002b differ
diff --git a/workspace/assets/skins/a7/a75c8094890d7011e08f01208f94679fb04904b1f6ef2e084dd430bdd8827195 b/workspace/assets/skins/a7/a75c8094890d7011e08f01208f94679fb04904b1f6ef2e084dd430bdd8827195
new file mode 100644
index 00000000..b91cdce6
Binary files /dev/null and b/workspace/assets/skins/a7/a75c8094890d7011e08f01208f94679fb04904b1f6ef2e084dd430bdd8827195 differ
diff --git a/workspace/assets/skins/a8/a864bd0f29f204ea3fa1cd592ef67b880779d8684e617268c13f8f54664538bb b/workspace/assets/skins/a8/a864bd0f29f204ea3fa1cd592ef67b880779d8684e617268c13f8f54664538bb
new file mode 100644
index 00000000..fce55a2a
Binary files /dev/null and b/workspace/assets/skins/a8/a864bd0f29f204ea3fa1cd592ef67b880779d8684e617268c13f8f54664538bb differ
diff --git a/workspace/assets/skins/a9/a9d916b70962cf904e61d5b38ec1e6fee42012db548c21e901ba7744c4e94c0c b/workspace/assets/skins/a9/a9d916b70962cf904e61d5b38ec1e6fee42012db548c21e901ba7744c4e94c0c
new file mode 100644
index 00000000..972d22fe
Binary files /dev/null and b/workspace/assets/skins/a9/a9d916b70962cf904e61d5b38ec1e6fee42012db548c21e901ba7744c4e94c0c differ
diff --git a/workspace/assets/skins/ab/abc4587cbaed7dbcba6fe58fd844d3d8ec8061810f6f631d8efe7b9ae7b2a3d4 b/workspace/assets/skins/ab/abc4587cbaed7dbcba6fe58fd844d3d8ec8061810f6f631d8efe7b9ae7b2a3d4
new file mode 100644
index 00000000..2775653a
Binary files /dev/null and b/workspace/assets/skins/ab/abc4587cbaed7dbcba6fe58fd844d3d8ec8061810f6f631d8efe7b9ae7b2a3d4 differ
diff --git a/workspace/assets/skins/ac/ac0e6c6481fea3012f88d5e4123e3bca33ff8f4fa3570b9af73b43a8eec05743 b/workspace/assets/skins/ac/ac0e6c6481fea3012f88d5e4123e3bca33ff8f4fa3570b9af73b43a8eec05743
new file mode 100644
index 00000000..881de5a8
Binary files /dev/null and b/workspace/assets/skins/ac/ac0e6c6481fea3012f88d5e4123e3bca33ff8f4fa3570b9af73b43a8eec05743 differ
diff --git a/workspace/assets/skins/ac/ac2d1e6efae032215710b60e1af680d826b86a59ad4282bdbe010b53785b002 b/workspace/assets/skins/ac/ac2d1e6efae032215710b60e1af680d826b86a59ad4282bdbe010b53785b002
new file mode 100644
index 00000000..9a21c9b1
Binary files /dev/null and b/workspace/assets/skins/ac/ac2d1e6efae032215710b60e1af680d826b86a59ad4282bdbe010b53785b002 differ
diff --git a/workspace/assets/skins/ac/ac81ca45c2476d4282a64fcb56bd8f17569b237197d63e779c16ef85c350bc26 b/workspace/assets/skins/ac/ac81ca45c2476d4282a64fcb56bd8f17569b237197d63e779c16ef85c350bc26
new file mode 100644
index 00000000..52ccdcc4
Binary files /dev/null and b/workspace/assets/skins/ac/ac81ca45c2476d4282a64fcb56bd8f17569b237197d63e779c16ef85c350bc26 differ
diff --git a/workspace/assets/skins/ac/acdaf5c34feaec4a82430435b8e3f9fdd33d2879bc3a9d3b0dd0a6653f413de0 b/workspace/assets/skins/ac/acdaf5c34feaec4a82430435b8e3f9fdd33d2879bc3a9d3b0dd0a6653f413de0
new file mode 100644
index 00000000..eb3966bb
Binary files /dev/null and b/workspace/assets/skins/ac/acdaf5c34feaec4a82430435b8e3f9fdd33d2879bc3a9d3b0dd0a6653f413de0 differ
diff --git a/workspace/assets/skins/ad/ad796ebad971260db0339fda3121fb39c57a6e6b405f055e68c6abe6ccd51bca b/workspace/assets/skins/ad/ad796ebad971260db0339fda3121fb39c57a6e6b405f055e68c6abe6ccd51bca
new file mode 100644
index 00000000..362cfeaf
Binary files /dev/null and b/workspace/assets/skins/ad/ad796ebad971260db0339fda3121fb39c57a6e6b405f055e68c6abe6ccd51bca differ
diff --git a/workspace/assets/skins/ae/ae46fda348a116e04ea0d87b517ab816bc7c5f0266769f674763520364170b49 b/workspace/assets/skins/ae/ae46fda348a116e04ea0d87b517ab816bc7c5f0266769f674763520364170b49
new file mode 100644
index 00000000..bcf9e08d
Binary files /dev/null and b/workspace/assets/skins/ae/ae46fda348a116e04ea0d87b517ab816bc7c5f0266769f674763520364170b49 differ
diff --git a/workspace/assets/skins/ae/ae79442e47c588bd707874b6ee7a6a1c625e77251a974679460a570bc89b9a71 b/workspace/assets/skins/ae/ae79442e47c588bd707874b6ee7a6a1c625e77251a974679460a570bc89b9a71
new file mode 100644
index 00000000..71bce772
Binary files /dev/null and b/workspace/assets/skins/ae/ae79442e47c588bd707874b6ee7a6a1c625e77251a974679460a570bc89b9a71 differ
diff --git a/workspace/assets/skins/b0/b047b8362feec3d84c255c6692c03dea46838e5843f217f36bf087cd629ce5f7 b/workspace/assets/skins/b0/b047b8362feec3d84c255c6692c03dea46838e5843f217f36bf087cd629ce5f7
new file mode 100644
index 00000000..8ce0dc2d
Binary files /dev/null and b/workspace/assets/skins/b0/b047b8362feec3d84c255c6692c03dea46838e5843f217f36bf087cd629ce5f7 differ
diff --git a/workspace/assets/skins/b0/b0573a5ef325eaca1decaa0fd658632b29f4409d99fea3f4fb6c4b47d8b7d447 b/workspace/assets/skins/b0/b0573a5ef325eaca1decaa0fd658632b29f4409d99fea3f4fb6c4b47d8b7d447
new file mode 100644
index 00000000..532d657a
Binary files /dev/null and b/workspace/assets/skins/b0/b0573a5ef325eaca1decaa0fd658632b29f4409d99fea3f4fb6c4b47d8b7d447 differ
diff --git a/workspace/assets/skins/b0/b0c1baf19507c1973b5274fa455d9b84a0716c33d1b845e2ae946d04d1c3ffdb b/workspace/assets/skins/b0/b0c1baf19507c1973b5274fa455d9b84a0716c33d1b845e2ae946d04d1c3ffdb
new file mode 100644
index 00000000..f75e75d4
Binary files /dev/null and b/workspace/assets/skins/b0/b0c1baf19507c1973b5274fa455d9b84a0716c33d1b845e2ae946d04d1c3ffdb differ
diff --git a/workspace/assets/skins/b1/b121ce6b151a552c2ac5d43bd835d0e10a5cfebf75e029bf4ebc49d94ff32b64 b/workspace/assets/skins/b1/b121ce6b151a552c2ac5d43bd835d0e10a5cfebf75e029bf4ebc49d94ff32b64
new file mode 100644
index 00000000..c52ca4e5
Binary files /dev/null and b/workspace/assets/skins/b1/b121ce6b151a552c2ac5d43bd835d0e10a5cfebf75e029bf4ebc49d94ff32b64 differ
diff --git a/workspace/assets/skins/b1/b13d846cb510b09f0260eea4a11a976ed01b869e9d936b0644837270ac246bd9 b/workspace/assets/skins/b1/b13d846cb510b09f0260eea4a11a976ed01b869e9d936b0644837270ac246bd9
new file mode 100644
index 00000000..2981df58
Binary files /dev/null and b/workspace/assets/skins/b1/b13d846cb510b09f0260eea4a11a976ed01b869e9d936b0644837270ac246bd9 differ
diff --git a/workspace/assets/skins/b2/b2fd830249df1dbc7a2b2539bec2f32e878ed674522354acf0311f608299b42b b/workspace/assets/skins/b2/b2fd830249df1dbc7a2b2539bec2f32e878ed674522354acf0311f608299b42b
new file mode 100644
index 00000000..4c1a01b3
Binary files /dev/null and b/workspace/assets/skins/b2/b2fd830249df1dbc7a2b2539bec2f32e878ed674522354acf0311f608299b42b differ
diff --git a/workspace/assets/skins/b4/b4ac1f69649084bc5b43738b361bc0481f18a3ac50ff3f19d41a7c7afe33b1ed b/workspace/assets/skins/b4/b4ac1f69649084bc5b43738b361bc0481f18a3ac50ff3f19d41a7c7afe33b1ed
new file mode 100644
index 00000000..4238c009
Binary files /dev/null and b/workspace/assets/skins/b4/b4ac1f69649084bc5b43738b361bc0481f18a3ac50ff3f19d41a7c7afe33b1ed differ
diff --git a/workspace/assets/skins/b4/b4c4b86a61b1ce3e7c4a99bc632f0858d86e32dc0903fb4fe62675d83ef6ff46 b/workspace/assets/skins/b4/b4c4b86a61b1ce3e7c4a99bc632f0858d86e32dc0903fb4fe62675d83ef6ff46
new file mode 100644
index 00000000..8f7bb54b
Binary files /dev/null and b/workspace/assets/skins/b4/b4c4b86a61b1ce3e7c4a99bc632f0858d86e32dc0903fb4fe62675d83ef6ff46 differ
diff --git a/workspace/assets/skins/b5/b5df0c828a093fc9a0e364a3380e18919d32e5f7c52c09d5b484c9c7891c7b84 b/workspace/assets/skins/b5/b5df0c828a093fc9a0e364a3380e18919d32e5f7c52c09d5b484c9c7891c7b84
new file mode 100644
index 00000000..2c7a35e2
Binary files /dev/null and b/workspace/assets/skins/b5/b5df0c828a093fc9a0e364a3380e18919d32e5f7c52c09d5b484c9c7891c7b84 differ
diff --git a/workspace/assets/skins/b6/b641fd9b805a66ad652568bfc2adc142a15fe774240be71bdc60349abc020ba1 b/workspace/assets/skins/b6/b641fd9b805a66ad652568bfc2adc142a15fe774240be71bdc60349abc020ba1
new file mode 100644
index 00000000..cc8f4f5f
Binary files /dev/null and b/workspace/assets/skins/b6/b641fd9b805a66ad652568bfc2adc142a15fe774240be71bdc60349abc020ba1 differ
diff --git a/workspace/assets/skins/b7/b7ce48a7b5e9a5b31227b6212246a90b1dd58c9910169cfda703df6cb695212f b/workspace/assets/skins/b7/b7ce48a7b5e9a5b31227b6212246a90b1dd58c9910169cfda703df6cb695212f
new file mode 100644
index 00000000..7932618c
Binary files /dev/null and b/workspace/assets/skins/b7/b7ce48a7b5e9a5b31227b6212246a90b1dd58c9910169cfda703df6cb695212f differ
diff --git a/workspace/assets/skins/b8/b8dfda28c858a0728d835ab3f4dea2e697d067292db0698873692657ade24b7f b/workspace/assets/skins/b8/b8dfda28c858a0728d835ab3f4dea2e697d067292db0698873692657ade24b7f
new file mode 100644
index 00000000..53ce282b
Binary files /dev/null and b/workspace/assets/skins/b8/b8dfda28c858a0728d835ab3f4dea2e697d067292db0698873692657ade24b7f differ
diff --git a/workspace/assets/skins/b9/b94e86a10529da4c02abd83acbe31c4a4d7df284241ce710adcdfc887bc55880 b/workspace/assets/skins/b9/b94e86a10529da4c02abd83acbe31c4a4d7df284241ce710adcdfc887bc55880
new file mode 100644
index 00000000..0ee63ec1
Binary files /dev/null and b/workspace/assets/skins/b9/b94e86a10529da4c02abd83acbe31c4a4d7df284241ce710adcdfc887bc55880 differ
diff --git a/workspace/assets/skins/b9/b96555ae7f500361fd79730f36e0ea703e7ed56e998b294cd1c492dee455e677 b/workspace/assets/skins/b9/b96555ae7f500361fd79730f36e0ea703e7ed56e998b294cd1c492dee455e677
new file mode 100644
index 00000000..617354a4
Binary files /dev/null and b/workspace/assets/skins/b9/b96555ae7f500361fd79730f36e0ea703e7ed56e998b294cd1c492dee455e677 differ
diff --git a/workspace/assets/skins/b9/b9a11acafd607f70691813d1e256e36431940dcf396522be1f5a08c45829d79e b/workspace/assets/skins/b9/b9a11acafd607f70691813d1e256e36431940dcf396522be1f5a08c45829d79e
new file mode 100644
index 00000000..6571933a
Binary files /dev/null and b/workspace/assets/skins/b9/b9a11acafd607f70691813d1e256e36431940dcf396522be1f5a08c45829d79e differ
diff --git a/workspace/assets/skins/b9/b9cc5facd2e22fc0da445c5341ab65f9983641dbfca2eaeda3e85572274cbea5 b/workspace/assets/skins/b9/b9cc5facd2e22fc0da445c5341ab65f9983641dbfca2eaeda3e85572274cbea5
new file mode 100644
index 00000000..5dfab135
Binary files /dev/null and b/workspace/assets/skins/b9/b9cc5facd2e22fc0da445c5341ab65f9983641dbfca2eaeda3e85572274cbea5 differ
diff --git a/workspace/assets/skins/b9/b9ef546b83a7f0fd225752691b2f1b5c475f5a38bc1f2b869fd9342dd251f9ec b/workspace/assets/skins/b9/b9ef546b83a7f0fd225752691b2f1b5c475f5a38bc1f2b869fd9342dd251f9ec
new file mode 100644
index 00000000..e6a9aed7
Binary files /dev/null and b/workspace/assets/skins/b9/b9ef546b83a7f0fd225752691b2f1b5c475f5a38bc1f2b869fd9342dd251f9ec differ
diff --git a/workspace/assets/skins/ba/ba1b9156e4c2108a1ccd75320bc0d3d575a63d3216dccf3c3247f076cb947c0 b/workspace/assets/skins/ba/ba1b9156e4c2108a1ccd75320bc0d3d575a63d3216dccf3c3247f076cb947c0
new file mode 100644
index 00000000..8bbf8f6f
Binary files /dev/null and b/workspace/assets/skins/ba/ba1b9156e4c2108a1ccd75320bc0d3d575a63d3216dccf3c3247f076cb947c0 differ
diff --git a/workspace/assets/skins/ba/baf0fabbfe4ce28c573cff3a5e8d42d830107df849ad116a7d750f240373ede2 b/workspace/assets/skins/ba/baf0fabbfe4ce28c573cff3a5e8d42d830107df849ad116a7d750f240373ede2
new file mode 100644
index 00000000..f9ca35f7
Binary files /dev/null and b/workspace/assets/skins/ba/baf0fabbfe4ce28c573cff3a5e8d42d830107df849ad116a7d750f240373ede2 differ
diff --git a/workspace/assets/skins/bb/bb904e70e4743ba45b84f4a2577fd4bf4c48d8c9cc2f051a8af0f8f0a1c78118 b/workspace/assets/skins/bb/bb904e70e4743ba45b84f4a2577fd4bf4c48d8c9cc2f051a8af0f8f0a1c78118
new file mode 100644
index 00000000..5f95cb44
Binary files /dev/null and b/workspace/assets/skins/bb/bb904e70e4743ba45b84f4a2577fd4bf4c48d8c9cc2f051a8af0f8f0a1c78118 differ
diff --git a/workspace/assets/skins/bd/bd7ba82feaba23ccecccd1b10da785a828417ccf1ec83f8f25847616d52309e0 b/workspace/assets/skins/bd/bd7ba82feaba23ccecccd1b10da785a828417ccf1ec83f8f25847616d52309e0
new file mode 100644
index 00000000..e14f6e26
Binary files /dev/null and b/workspace/assets/skins/bd/bd7ba82feaba23ccecccd1b10da785a828417ccf1ec83f8f25847616d52309e0 differ
diff --git a/workspace/assets/skins/bd/bda00c0daf2bc2b8d2fd80cf4f6f6e4c867df359e9dbd5b27ba933231b87b73 b/workspace/assets/skins/bd/bda00c0daf2bc2b8d2fd80cf4f6f6e4c867df359e9dbd5b27ba933231b87b73
new file mode 100644
index 00000000..6e4bc822
Binary files /dev/null and b/workspace/assets/skins/bd/bda00c0daf2bc2b8d2fd80cf4f6f6e4c867df359e9dbd5b27ba933231b87b73 differ
diff --git a/workspace/assets/skins/c0/c04204ea21ac626035db7be599c7f66c8bbc689cb9efeeb267f269109f3296cb b/workspace/assets/skins/c0/c04204ea21ac626035db7be599c7f66c8bbc689cb9efeeb267f269109f3296cb
new file mode 100644
index 00000000..88479647
Binary files /dev/null and b/workspace/assets/skins/c0/c04204ea21ac626035db7be599c7f66c8bbc689cb9efeeb267f269109f3296cb differ
diff --git a/workspace/assets/skins/c0/c0caa7023bdb43df1a528db1f8a2f6f47ee37ea5629164066725f8653469b543 b/workspace/assets/skins/c0/c0caa7023bdb43df1a528db1f8a2f6f47ee37ea5629164066725f8653469b543
new file mode 100644
index 00000000..7bd0bd28
Binary files /dev/null and b/workspace/assets/skins/c0/c0caa7023bdb43df1a528db1f8a2f6f47ee37ea5629164066725f8653469b543 differ
diff --git a/workspace/assets/skins/c2/c25988f828e147122a946e874c9d405029262b44ef85d4b521cadf9ae4158f78 b/workspace/assets/skins/c2/c25988f828e147122a946e874c9d405029262b44ef85d4b521cadf9ae4158f78
new file mode 100644
index 00000000..033f711f
Binary files /dev/null and b/workspace/assets/skins/c2/c25988f828e147122a946e874c9d405029262b44ef85d4b521cadf9ae4158f78 differ
diff --git a/workspace/assets/skins/c3/c30d149292d0c1cbceec95f194c1730b2519ef0ff69a5cfe9136f1a5cef90ca4 b/workspace/assets/skins/c3/c30d149292d0c1cbceec95f194c1730b2519ef0ff69a5cfe9136f1a5cef90ca4
new file mode 100644
index 00000000..96cd226c
Binary files /dev/null and b/workspace/assets/skins/c3/c30d149292d0c1cbceec95f194c1730b2519ef0ff69a5cfe9136f1a5cef90ca4 differ
diff --git a/workspace/assets/skins/c3/c31e7bdd08170b4f0046dbb342bc6c9dad99f0efcb870223291da7ad4418662a b/workspace/assets/skins/c3/c31e7bdd08170b4f0046dbb342bc6c9dad99f0efcb870223291da7ad4418662a
new file mode 100644
index 00000000..d3826a0a
Binary files /dev/null and b/workspace/assets/skins/c3/c31e7bdd08170b4f0046dbb342bc6c9dad99f0efcb870223291da7ad4418662a differ
diff --git a/workspace/assets/skins/c3/c3ab96a8e53af5b7cd4550b9e2a6651b17c0f8921b545feb1e9e0ffd2adf3ae b/workspace/assets/skins/c3/c3ab96a8e53af5b7cd4550b9e2a6651b17c0f8921b545feb1e9e0ffd2adf3ae
new file mode 100644
index 00000000..11d0124a
Binary files /dev/null and b/workspace/assets/skins/c3/c3ab96a8e53af5b7cd4550b9e2a6651b17c0f8921b545feb1e9e0ffd2adf3ae differ
diff --git a/workspace/assets/skins/c3/c3c15ffe5b928c09830d45f86b0b919aef6803deed0c9df5ea622a3876fbf015 b/workspace/assets/skins/c3/c3c15ffe5b928c09830d45f86b0b919aef6803deed0c9df5ea622a3876fbf015
new file mode 100644
index 00000000..e1aabae6
Binary files /dev/null and b/workspace/assets/skins/c3/c3c15ffe5b928c09830d45f86b0b919aef6803deed0c9df5ea622a3876fbf015 differ
diff --git a/workspace/assets/skins/c4/c41f51380af863e5b4fc62881631c883e5041ed77fb116600699082531854899 b/workspace/assets/skins/c4/c41f51380af863e5b4fc62881631c883e5041ed77fb116600699082531854899
new file mode 100644
index 00000000..a43e025f
Binary files /dev/null and b/workspace/assets/skins/c4/c41f51380af863e5b4fc62881631c883e5041ed77fb116600699082531854899 differ
diff --git a/workspace/assets/skins/c5/c5ab7145c9a289c8f365c418acb0ea9d747ca02efcf2a43aee53d37b8d64dea1 b/workspace/assets/skins/c5/c5ab7145c9a289c8f365c418acb0ea9d747ca02efcf2a43aee53d37b8d64dea1
new file mode 100644
index 00000000..3c57938c
Binary files /dev/null and b/workspace/assets/skins/c5/c5ab7145c9a289c8f365c418acb0ea9d747ca02efcf2a43aee53d37b8d64dea1 differ
diff --git a/workspace/assets/skins/c7/c723bad09ee1afc8cecb51b474a1b37004e020b0c03ba3c46ba6b7e748f0fbbd b/workspace/assets/skins/c7/c723bad09ee1afc8cecb51b474a1b37004e020b0c03ba3c46ba6b7e748f0fbbd
new file mode 100644
index 00000000..e294be36
Binary files /dev/null and b/workspace/assets/skins/c7/c723bad09ee1afc8cecb51b474a1b37004e020b0c03ba3c46ba6b7e748f0fbbd differ
diff --git a/workspace/assets/skins/c8/c837424a026ed4915fd4a035f3a06b8ad0be733f6c17c57b789bb931cbc70eaf b/workspace/assets/skins/c8/c837424a026ed4915fd4a035f3a06b8ad0be733f6c17c57b789bb931cbc70eaf
new file mode 100644
index 00000000..b700a40d
Binary files /dev/null and b/workspace/assets/skins/c8/c837424a026ed4915fd4a035f3a06b8ad0be733f6c17c57b789bb931cbc70eaf differ
diff --git a/workspace/assets/skins/c8/c88537a4f5da9ac9cc5e81744aad94430b9bbc5b77ca52a817472b5b281378fc b/workspace/assets/skins/c8/c88537a4f5da9ac9cc5e81744aad94430b9bbc5b77ca52a817472b5b281378fc
new file mode 100644
index 00000000..7370a08d
Binary files /dev/null and b/workspace/assets/skins/c8/c88537a4f5da9ac9cc5e81744aad94430b9bbc5b77ca52a817472b5b281378fc differ
diff --git a/workspace/assets/skins/cd/cda83ccda4c16d850c6d85b91e4d6c909820d73d2d06d6ad2251d822d64bd7af b/workspace/assets/skins/cd/cda83ccda4c16d850c6d85b91e4d6c909820d73d2d06d6ad2251d822d64bd7af
new file mode 100644
index 00000000..d3193109
Binary files /dev/null and b/workspace/assets/skins/cd/cda83ccda4c16d850c6d85b91e4d6c909820d73d2d06d6ad2251d822d64bd7af differ
diff --git a/workspace/assets/skins/ce/ce756d8b2cbf1048e40d6cf7871bb9e3e4be6488af249bf3e561ef15fce9ab90 b/workspace/assets/skins/ce/ce756d8b2cbf1048e40d6cf7871bb9e3e4be6488af249bf3e561ef15fce9ab90
new file mode 100644
index 00000000..a3bae101
Binary files /dev/null and b/workspace/assets/skins/ce/ce756d8b2cbf1048e40d6cf7871bb9e3e4be6488af249bf3e561ef15fce9ab90 differ
diff --git a/workspace/assets/skins/ce/ce9df8a9893f890fa6d2a42dddeda76c52589b6ca4002d9f588145996790ce79 b/workspace/assets/skins/ce/ce9df8a9893f890fa6d2a42dddeda76c52589b6ca4002d9f588145996790ce79
new file mode 100644
index 00000000..b47aebf6
Binary files /dev/null and b/workspace/assets/skins/ce/ce9df8a9893f890fa6d2a42dddeda76c52589b6ca4002d9f588145996790ce79 differ
diff --git a/workspace/assets/skins/ce/ced3c8dfdaa40f42335c8b4d643442643399aa370f9e852d0eabb3921de2cb78 b/workspace/assets/skins/ce/ced3c8dfdaa40f42335c8b4d643442643399aa370f9e852d0eabb3921de2cb78
new file mode 100644
index 00000000..fb83623c
Binary files /dev/null and b/workspace/assets/skins/ce/ced3c8dfdaa40f42335c8b4d643442643399aa370f9e852d0eabb3921de2cb78 differ
diff --git a/workspace/assets/skins/cf/cf667833490294d84c8a0610a18c56eaed3a4ae5512907437d1a60f0797e0cfe b/workspace/assets/skins/cf/cf667833490294d84c8a0610a18c56eaed3a4ae5512907437d1a60f0797e0cfe
new file mode 100644
index 00000000..f57604d1
Binary files /dev/null and b/workspace/assets/skins/cf/cf667833490294d84c8a0610a18c56eaed3a4ae5512907437d1a60f0797e0cfe differ
diff --git a/workspace/assets/skins/d0/d0782de63f214d2d3a033476a3d43a752fa567d21bdc6a40979909ccad4d2c73 b/workspace/assets/skins/d0/d0782de63f214d2d3a033476a3d43a752fa567d21bdc6a40979909ccad4d2c73
new file mode 100644
index 00000000..ef51bbbe
Binary files /dev/null and b/workspace/assets/skins/d0/d0782de63f214d2d3a033476a3d43a752fa567d21bdc6a40979909ccad4d2c73 differ
diff --git a/workspace/assets/skins/d0/d0ebe3ed2345dc9b5e4fc9f22febd12d682c555d616bafad918caedce6107732 b/workspace/assets/skins/d0/d0ebe3ed2345dc9b5e4fc9f22febd12d682c555d616bafad918caedce6107732
new file mode 100644
index 00000000..61cdd8c2
Binary files /dev/null and b/workspace/assets/skins/d0/d0ebe3ed2345dc9b5e4fc9f22febd12d682c555d616bafad918caedce6107732 differ
diff --git a/workspace/assets/skins/d1/d10bc60fd9143dd1b970020be5cf0f50b429f2973ae39e6c919f9b9f7e2687df b/workspace/assets/skins/d1/d10bc60fd9143dd1b970020be5cf0f50b429f2973ae39e6c919f9b9f7e2687df
new file mode 100644
index 00000000..bfa7e74c
Binary files /dev/null and b/workspace/assets/skins/d1/d10bc60fd9143dd1b970020be5cf0f50b429f2973ae39e6c919f9b9f7e2687df differ
diff --git a/workspace/assets/skins/d1/d148d53b9951da844f5c180282aba39dee06d49345e3af42f6ddcfe7384cbf5c b/workspace/assets/skins/d1/d148d53b9951da844f5c180282aba39dee06d49345e3af42f6ddcfe7384cbf5c
new file mode 100644
index 00000000..42178cea
Binary files /dev/null and b/workspace/assets/skins/d1/d148d53b9951da844f5c180282aba39dee06d49345e3af42f6ddcfe7384cbf5c differ
diff --git a/workspace/assets/skins/d1/d1f39195de2f824435e9a84b0467d7e525c87c0cfd76fea17a1005796302331d b/workspace/assets/skins/d1/d1f39195de2f824435e9a84b0467d7e525c87c0cfd76fea17a1005796302331d
new file mode 100644
index 00000000..d4cb2cb2
Binary files /dev/null and b/workspace/assets/skins/d1/d1f39195de2f824435e9a84b0467d7e525c87c0cfd76fea17a1005796302331d differ
diff --git a/workspace/assets/skins/d5/d5271ee6e6defa808f6dcc921bae770a90f0caf54b7eeaacc21c65b3337cc126 b/workspace/assets/skins/d5/d5271ee6e6defa808f6dcc921bae770a90f0caf54b7eeaacc21c65b3337cc126
new file mode 100644
index 00000000..04778988
Binary files /dev/null and b/workspace/assets/skins/d5/d5271ee6e6defa808f6dcc921bae770a90f0caf54b7eeaacc21c65b3337cc126 differ
diff --git a/workspace/assets/skins/d5/d5f571ee75f6522d1a544f75a3090cc5edcba97c674d98bea8d8fefe05cc76ca b/workspace/assets/skins/d5/d5f571ee75f6522d1a544f75a3090cc5edcba97c674d98bea8d8fefe05cc76ca
new file mode 100644
index 00000000..0a3ccde1
Binary files /dev/null and b/workspace/assets/skins/d5/d5f571ee75f6522d1a544f75a3090cc5edcba97c674d98bea8d8fefe05cc76ca differ
diff --git a/workspace/assets/skins/d6/d6504373ac18c6c29ecdfa01a06fec3a94ad448f6cd32d0e7c30bd8bf4cc990f b/workspace/assets/skins/d6/d6504373ac18c6c29ecdfa01a06fec3a94ad448f6cd32d0e7c30bd8bf4cc990f
new file mode 100644
index 00000000..d2bc2a32
Binary files /dev/null and b/workspace/assets/skins/d6/d6504373ac18c6c29ecdfa01a06fec3a94ad448f6cd32d0e7c30bd8bf4cc990f differ
diff --git a/workspace/assets/skins/d6/d68e6c10d0d8f361464d59a3dd3f8ee3816d7f86fbc3e814c7de14cf4230f2ae b/workspace/assets/skins/d6/d68e6c10d0d8f361464d59a3dd3f8ee3816d7f86fbc3e814c7de14cf4230f2ae
new file mode 100644
index 00000000..d4931fe9
Binary files /dev/null and b/workspace/assets/skins/d6/d68e6c10d0d8f361464d59a3dd3f8ee3816d7f86fbc3e814c7de14cf4230f2ae differ
diff --git a/workspace/assets/skins/d7/d76e67cb3a87d516a9133a3270f03900b7951da88d3e8e5555f0ee0164d46048 b/workspace/assets/skins/d7/d76e67cb3a87d516a9133a3270f03900b7951da88d3e8e5555f0ee0164d46048
new file mode 100644
index 00000000..b3925df6
Binary files /dev/null and b/workspace/assets/skins/d7/d76e67cb3a87d516a9133a3270f03900b7951da88d3e8e5555f0ee0164d46048 differ
diff --git a/workspace/assets/skins/d7/d7b13abeb7a6b45f4fc7f6ae0b4857d9a16179179e8d1d2fb8b5697186d8675d b/workspace/assets/skins/d7/d7b13abeb7a6b45f4fc7f6ae0b4857d9a16179179e8d1d2fb8b5697186d8675d
new file mode 100644
index 00000000..0c8c7e84
Binary files /dev/null and b/workspace/assets/skins/d7/d7b13abeb7a6b45f4fc7f6ae0b4857d9a16179179e8d1d2fb8b5697186d8675d differ
diff --git a/workspace/assets/skins/d8/d8275736c18d7328c38c02568b8643efd977a73516b0de23a0515fdb7f1c6b61 b/workspace/assets/skins/d8/d8275736c18d7328c38c02568b8643efd977a73516b0de23a0515fdb7f1c6b61
new file mode 100644
index 00000000..11b7b513
Binary files /dev/null and b/workspace/assets/skins/d8/d8275736c18d7328c38c02568b8643efd977a73516b0de23a0515fdb7f1c6b61 differ
diff --git a/workspace/assets/skins/d9/d91c1686551452e6b96074b37b7cad83a3da9a637a9017d386b0a7f809762951 b/workspace/assets/skins/d9/d91c1686551452e6b96074b37b7cad83a3da9a637a9017d386b0a7f809762951
new file mode 100644
index 00000000..502114e3
Binary files /dev/null and b/workspace/assets/skins/d9/d91c1686551452e6b96074b37b7cad83a3da9a637a9017d386b0a7f809762951 differ
diff --git a/workspace/assets/skins/da/da8049e4d7709e0ff607a1ced88932370b6c1c4bd101e4bdae9e7e4f0c0eeb31 b/workspace/assets/skins/da/da8049e4d7709e0ff607a1ced88932370b6c1c4bd101e4bdae9e7e4f0c0eeb31
new file mode 100644
index 00000000..d6898779
Binary files /dev/null and b/workspace/assets/skins/da/da8049e4d7709e0ff607a1ced88932370b6c1c4bd101e4bdae9e7e4f0c0eeb31 differ
diff --git a/workspace/assets/skins/db/db78151a73afe8a234cb0b8192959adeb54438d356dea552d63b7adf9aa96408 b/workspace/assets/skins/db/db78151a73afe8a234cb0b8192959adeb54438d356dea552d63b7adf9aa96408
new file mode 100644
index 00000000..7f153210
Binary files /dev/null and b/workspace/assets/skins/db/db78151a73afe8a234cb0b8192959adeb54438d356dea552d63b7adf9aa96408 differ
diff --git a/workspace/assets/skins/dc/dc2866e132146f8487380ca99ff11be0b2bda4b137821a291c82ae09af043d13 b/workspace/assets/skins/dc/dc2866e132146f8487380ca99ff11be0b2bda4b137821a291c82ae09af043d13
new file mode 100644
index 00000000..1bd4fb69
Binary files /dev/null and b/workspace/assets/skins/dc/dc2866e132146f8487380ca99ff11be0b2bda4b137821a291c82ae09af043d13 differ
diff --git a/workspace/assets/skins/dc/dccff29b7e3e3b4baeb4355239eb03754ab1a467ade4d0fb72cb7c361f50c618 b/workspace/assets/skins/dc/dccff29b7e3e3b4baeb4355239eb03754ab1a467ade4d0fb72cb7c361f50c618
new file mode 100644
index 00000000..4228f54b
Binary files /dev/null and b/workspace/assets/skins/dc/dccff29b7e3e3b4baeb4355239eb03754ab1a467ade4d0fb72cb7c361f50c618 differ
diff --git a/workspace/assets/skins/dc/dce853a0580e77b1e39e8364a2119f440f20505c52c82651edf16fcaee96f0b7 b/workspace/assets/skins/dc/dce853a0580e77b1e39e8364a2119f440f20505c52c82651edf16fcaee96f0b7
new file mode 100644
index 00000000..90638c4f
Binary files /dev/null and b/workspace/assets/skins/dc/dce853a0580e77b1e39e8364a2119f440f20505c52c82651edf16fcaee96f0b7 differ
diff --git a/workspace/assets/skins/dd/dd868f1cbbcd23424e88199f920379cdb75bebbbd2aa56ed1717476155583043 b/workspace/assets/skins/dd/dd868f1cbbcd23424e88199f920379cdb75bebbbd2aa56ed1717476155583043
new file mode 100644
index 00000000..8491743b
Binary files /dev/null and b/workspace/assets/skins/dd/dd868f1cbbcd23424e88199f920379cdb75bebbbd2aa56ed1717476155583043 differ
diff --git a/workspace/assets/skins/de/de630440ce7c8f20c1ca060a91f4f79543f0c0448a8608e21b0bf6397d2b813d b/workspace/assets/skins/de/de630440ce7c8f20c1ca060a91f4f79543f0c0448a8608e21b0bf6397d2b813d
new file mode 100644
index 00000000..07809d89
Binary files /dev/null and b/workspace/assets/skins/de/de630440ce7c8f20c1ca060a91f4f79543f0c0448a8608e21b0bf6397d2b813d differ
diff --git a/workspace/assets/skins/de/def59415092b0af3221fc396c2b875a27e9acc8a92ff6d825b6b0e352c5c7307 b/workspace/assets/skins/de/def59415092b0af3221fc396c2b875a27e9acc8a92ff6d825b6b0e352c5c7307
new file mode 100644
index 00000000..de3709b8
Binary files /dev/null and b/workspace/assets/skins/de/def59415092b0af3221fc396c2b875a27e9acc8a92ff6d825b6b0e352c5c7307 differ
diff --git a/workspace/assets/skins/df/df61e7f7b2fb1a3d3aa69aea7c61dec581f40a7001a6e1b58651f34e074c9a24 b/workspace/assets/skins/df/df61e7f7b2fb1a3d3aa69aea7c61dec581f40a7001a6e1b58651f34e074c9a24
new file mode 100644
index 00000000..228abf39
Binary files /dev/null and b/workspace/assets/skins/df/df61e7f7b2fb1a3d3aa69aea7c61dec581f40a7001a6e1b58651f34e074c9a24 differ
diff --git a/workspace/assets/skins/e0/e06d836092bf7ac4923caaa04c9c49d28d5cc68513a48b0c3752eb2425728482 b/workspace/assets/skins/e0/e06d836092bf7ac4923caaa04c9c49d28d5cc68513a48b0c3752eb2425728482
new file mode 100644
index 00000000..28107343
Binary files /dev/null and b/workspace/assets/skins/e0/e06d836092bf7ac4923caaa04c9c49d28d5cc68513a48b0c3752eb2425728482 differ
diff --git a/workspace/assets/skins/e0/e09d064e1eb5c52c4760e4a9e1f38151d3e3b1d238fdd376b945bc8ca4acc08b b/workspace/assets/skins/e0/e09d064e1eb5c52c4760e4a9e1f38151d3e3b1d238fdd376b945bc8ca4acc08b
new file mode 100644
index 00000000..38fef268
Binary files /dev/null and b/workspace/assets/skins/e0/e09d064e1eb5c52c4760e4a9e1f38151d3e3b1d238fdd376b945bc8ca4acc08b differ
diff --git a/workspace/assets/skins/e1/e1f742eddbd6a163735169edf7db8cd76fabc5a71c4e3a160e3d384609327d62 b/workspace/assets/skins/e1/e1f742eddbd6a163735169edf7db8cd76fabc5a71c4e3a160e3d384609327d62
new file mode 100644
index 00000000..d013d750
Binary files /dev/null and b/workspace/assets/skins/e1/e1f742eddbd6a163735169edf7db8cd76fabc5a71c4e3a160e3d384609327d62 differ
diff --git a/workspace/assets/skins/e2/e231f6db85665f9a3e5dce0d3e8bd5fc0d76b7018c45a4bae0d558e76ba46d33 b/workspace/assets/skins/e2/e231f6db85665f9a3e5dce0d3e8bd5fc0d76b7018c45a4bae0d558e76ba46d33
new file mode 100644
index 00000000..9cfc5f80
Binary files /dev/null and b/workspace/assets/skins/e2/e231f6db85665f9a3e5dce0d3e8bd5fc0d76b7018c45a4bae0d558e76ba46d33 differ
diff --git a/workspace/assets/skins/e2/e2598082e9d9ab72078246bb2b3c9f7e1c2457e4bb64ac122e5eb6b578c2ce4e b/workspace/assets/skins/e2/e2598082e9d9ab72078246bb2b3c9f7e1c2457e4bb64ac122e5eb6b578c2ce4e
new file mode 100644
index 00000000..c2506baf
Binary files /dev/null and b/workspace/assets/skins/e2/e2598082e9d9ab72078246bb2b3c9f7e1c2457e4bb64ac122e5eb6b578c2ce4e differ
diff --git a/workspace/assets/skins/e4/e46fa77c512b4b3a122572d18c6da24eed1a3334acc894fcaee596b2b32cd2c b/workspace/assets/skins/e4/e46fa77c512b4b3a122572d18c6da24eed1a3334acc894fcaee596b2b32cd2c
new file mode 100644
index 00000000..62df703a
Binary files /dev/null and b/workspace/assets/skins/e4/e46fa77c512b4b3a122572d18c6da24eed1a3334acc894fcaee596b2b32cd2c differ
diff --git a/workspace/assets/skins/e4/e4e3215f9b3022eb1d3f8f64400f2a4428ba7f59636c9156ed2dbd0daa14fc9b b/workspace/assets/skins/e4/e4e3215f9b3022eb1d3f8f64400f2a4428ba7f59636c9156ed2dbd0daa14fc9b
new file mode 100644
index 00000000..bfacf0a6
Binary files /dev/null and b/workspace/assets/skins/e4/e4e3215f9b3022eb1d3f8f64400f2a4428ba7f59636c9156ed2dbd0daa14fc9b differ
diff --git a/workspace/assets/skins/e6/e61b2a9b31c5ec653a54ae194832e81527281e3e36c2e47bc02182f1a2bf61be b/workspace/assets/skins/e6/e61b2a9b31c5ec653a54ae194832e81527281e3e36c2e47bc02182f1a2bf61be
new file mode 100644
index 00000000..749c939a
Binary files /dev/null and b/workspace/assets/skins/e6/e61b2a9b31c5ec653a54ae194832e81527281e3e36c2e47bc02182f1a2bf61be differ
diff --git a/workspace/assets/skins/e6/e6e3cd10d597b313da255634fbea6771905528e898f43d9ddf990ccc0ba7dd95 b/workspace/assets/skins/e6/e6e3cd10d597b313da255634fbea6771905528e898f43d9ddf990ccc0ba7dd95
new file mode 100644
index 00000000..b59cb099
Binary files /dev/null and b/workspace/assets/skins/e6/e6e3cd10d597b313da255634fbea6771905528e898f43d9ddf990ccc0ba7dd95 differ
diff --git a/workspace/assets/skins/e9/e95356990d0c440d78b3dbeca343f77cb4ba066db19b04dc3b47f11ecf578f76 b/workspace/assets/skins/e9/e95356990d0c440d78b3dbeca343f77cb4ba066db19b04dc3b47f11ecf578f76
new file mode 100644
index 00000000..8968e4e4
Binary files /dev/null and b/workspace/assets/skins/e9/e95356990d0c440d78b3dbeca343f77cb4ba066db19b04dc3b47f11ecf578f76 differ
diff --git a/workspace/assets/skins/e9/e9a28da5f07e2b0c49c92e6a586bfb449306aa8844eb58520cf73b451fdf1800 b/workspace/assets/skins/e9/e9a28da5f07e2b0c49c92e6a586bfb449306aa8844eb58520cf73b451fdf1800
new file mode 100644
index 00000000..b1347259
Binary files /dev/null and b/workspace/assets/skins/e9/e9a28da5f07e2b0c49c92e6a586bfb449306aa8844eb58520cf73b451fdf1800 differ
diff --git a/workspace/assets/skins/ea/ea1ce73c1f1db9879179ebc15a892e20aa12d7381ebeaa84688cd96b49a0654f b/workspace/assets/skins/ea/ea1ce73c1f1db9879179ebc15a892e20aa12d7381ebeaa84688cd96b49a0654f
new file mode 100644
index 00000000..28b9a0d4
Binary files /dev/null and b/workspace/assets/skins/ea/ea1ce73c1f1db9879179ebc15a892e20aa12d7381ebeaa84688cd96b49a0654f differ
diff --git a/workspace/assets/skins/ea/eaf981704b8678a89acf3467e85aff237b9c12f68def609a62876cdb51f06a93 b/workspace/assets/skins/ea/eaf981704b8678a89acf3467e85aff237b9c12f68def609a62876cdb51f06a93
new file mode 100644
index 00000000..73c3de28
Binary files /dev/null and b/workspace/assets/skins/ea/eaf981704b8678a89acf3467e85aff237b9c12f68def609a62876cdb51f06a93 differ
diff --git a/workspace/assets/skins/eb/eb82598d4f4cafa7c969f7b4d0b02443c6ce20ab5bf96d3886c4780b71bce6cb b/workspace/assets/skins/eb/eb82598d4f4cafa7c969f7b4d0b02443c6ce20ab5bf96d3886c4780b71bce6cb
new file mode 100644
index 00000000..a0dbf1d1
Binary files /dev/null and b/workspace/assets/skins/eb/eb82598d4f4cafa7c969f7b4d0b02443c6ce20ab5bf96d3886c4780b71bce6cb differ
diff --git a/workspace/assets/skins/eb/ebb586802c6ea678433346acda6c8fa53edd99d7efa048e8fa92383a76de7de b/workspace/assets/skins/eb/ebb586802c6ea678433346acda6c8fa53edd99d7efa048e8fa92383a76de7de
new file mode 100644
index 00000000..af6c1fa0
Binary files /dev/null and b/workspace/assets/skins/eb/ebb586802c6ea678433346acda6c8fa53edd99d7efa048e8fa92383a76de7de differ
diff --git a/workspace/assets/skins/ec/ec8866bb40924450e759fc55f1b98505f77788d5a03a3f61beda74cadb8f0d9b b/workspace/assets/skins/ec/ec8866bb40924450e759fc55f1b98505f77788d5a03a3f61beda74cadb8f0d9b
new file mode 100644
index 00000000..27457f0b
Binary files /dev/null and b/workspace/assets/skins/ec/ec8866bb40924450e759fc55f1b98505f77788d5a03a3f61beda74cadb8f0d9b differ
diff --git a/workspace/assets/skins/ee/ee094d221230537d6fbb94cd1a1553c1732d479d9f3c8dd88970633a97566666 b/workspace/assets/skins/ee/ee094d221230537d6fbb94cd1a1553c1732d479d9f3c8dd88970633a97566666
new file mode 100644
index 00000000..c5fb6522
Binary files /dev/null and b/workspace/assets/skins/ee/ee094d221230537d6fbb94cd1a1553c1732d479d9f3c8dd88970633a97566666 differ
diff --git a/workspace/assets/skins/ee/eeed1f708d69aaa44f2ed907337795b95a7f6329a3e1b7bd61cd5335bfb9f8cc b/workspace/assets/skins/ee/eeed1f708d69aaa44f2ed907337795b95a7f6329a3e1b7bd61cd5335bfb9f8cc
new file mode 100644
index 00000000..74247416
Binary files /dev/null and b/workspace/assets/skins/ee/eeed1f708d69aaa44f2ed907337795b95a7f6329a3e1b7bd61cd5335bfb9f8cc differ
diff --git a/workspace/assets/skins/ef/efeec07951e5f01d2963affcd6153b6009f93a078111155fb2d7e6abf26f7932 b/workspace/assets/skins/ef/efeec07951e5f01d2963affcd6153b6009f93a078111155fb2d7e6abf26f7932
new file mode 100644
index 00000000..4d5aed6c
Binary files /dev/null and b/workspace/assets/skins/ef/efeec07951e5f01d2963affcd6153b6009f93a078111155fb2d7e6abf26f7932 differ
diff --git a/workspace/assets/skins/f2/f22b01b62dea84a852a038908ae04e83242ed26c4412b4de6eabcd38fe317245 b/workspace/assets/skins/f2/f22b01b62dea84a852a038908ae04e83242ed26c4412b4de6eabcd38fe317245
new file mode 100644
index 00000000..43ba2820
Binary files /dev/null and b/workspace/assets/skins/f2/f22b01b62dea84a852a038908ae04e83242ed26c4412b4de6eabcd38fe317245 differ
diff --git a/workspace/assets/skins/f2/f2dd6758a7ae4f4ba2c051de60a71ff4a51cd7e892380462ed5e05621ddda718 b/workspace/assets/skins/f2/f2dd6758a7ae4f4ba2c051de60a71ff4a51cd7e892380462ed5e05621ddda718
new file mode 100644
index 00000000..82e38f60
Binary files /dev/null and b/workspace/assets/skins/f2/f2dd6758a7ae4f4ba2c051de60a71ff4a51cd7e892380462ed5e05621ddda718 differ
diff --git a/workspace/assets/skins/f3/f3ab42b4f44bc8453b59c6bfdf50b8df6918e006de44e38c48eaf7838377d166 b/workspace/assets/skins/f3/f3ab42b4f44bc8453b59c6bfdf50b8df6918e006de44e38c48eaf7838377d166
new file mode 100644
index 00000000..b2546c92
Binary files /dev/null and b/workspace/assets/skins/f3/f3ab42b4f44bc8453b59c6bfdf50b8df6918e006de44e38c48eaf7838377d166 differ
diff --git a/workspace/assets/skins/f4/f4baa537b8abdb06681d00e740b8ff292547d13fec5fafa87da427e53979e3e6 b/workspace/assets/skins/f4/f4baa537b8abdb06681d00e740b8ff292547d13fec5fafa87da427e53979e3e6
new file mode 100644
index 00000000..2fb8f91c
Binary files /dev/null and b/workspace/assets/skins/f4/f4baa537b8abdb06681d00e740b8ff292547d13fec5fafa87da427e53979e3e6 differ
diff --git a/workspace/assets/skins/f5/f592ddd0e84bdcf37a2f88b686d8025eb6eb12713ce156d9330cb9b9d63d2730 b/workspace/assets/skins/f5/f592ddd0e84bdcf37a2f88b686d8025eb6eb12713ce156d9330cb9b9d63d2730
new file mode 100644
index 00000000..7e5d095e
Binary files /dev/null and b/workspace/assets/skins/f5/f592ddd0e84bdcf37a2f88b686d8025eb6eb12713ce156d9330cb9b9d63d2730 differ
diff --git a/workspace/assets/skins/f5/f5e2ffe4d0247cb3f2985124e14bb72ce322c431ac508dcf1a767a18400e2095 b/workspace/assets/skins/f5/f5e2ffe4d0247cb3f2985124e14bb72ce322c431ac508dcf1a767a18400e2095
new file mode 100644
index 00000000..b6cf98f1
Binary files /dev/null and b/workspace/assets/skins/f5/f5e2ffe4d0247cb3f2985124e14bb72ce322c431ac508dcf1a767a18400e2095 differ
diff --git a/workspace/assets/skins/f7/f7239c68ab91625b1b5a9cb3425444790ff2f4be4d5a23be4b398266e52b19b8 b/workspace/assets/skins/f7/f7239c68ab91625b1b5a9cb3425444790ff2f4be4d5a23be4b398266e52b19b8
new file mode 100644
index 00000000..c55545aa
Binary files /dev/null and b/workspace/assets/skins/f7/f7239c68ab91625b1b5a9cb3425444790ff2f4be4d5a23be4b398266e52b19b8 differ
diff --git a/workspace/assets/skins/f7/f7272f332df28b842231fbee7f9722ee7d5b5269a92a6aba3f6d9a31066a0391 b/workspace/assets/skins/f7/f7272f332df28b842231fbee7f9722ee7d5b5269a92a6aba3f6d9a31066a0391
new file mode 100644
index 00000000..e6c67049
Binary files /dev/null and b/workspace/assets/skins/f7/f7272f332df28b842231fbee7f9722ee7d5b5269a92a6aba3f6d9a31066a0391 differ
diff --git a/workspace/assets/skins/f8/f876aeb6ab21646478b3de354cccac7bf1bcbf45eb2ccbb974d64d4af9a49eed b/workspace/assets/skins/f8/f876aeb6ab21646478b3de354cccac7bf1bcbf45eb2ccbb974d64d4af9a49eed
new file mode 100644
index 00000000..4d585dff
Binary files /dev/null and b/workspace/assets/skins/f8/f876aeb6ab21646478b3de354cccac7bf1bcbf45eb2ccbb974d64d4af9a49eed differ
diff --git a/workspace/assets/skins/f9/f998a63cd706db5cb7538ebed377d404a75eb5e7821272b2af0c5fcbde0f5e34 b/workspace/assets/skins/f9/f998a63cd706db5cb7538ebed377d404a75eb5e7821272b2af0c5fcbde0f5e34
new file mode 100644
index 00000000..3f9adb23
Binary files /dev/null and b/workspace/assets/skins/f9/f998a63cd706db5cb7538ebed377d404a75eb5e7821272b2af0c5fcbde0f5e34 differ
diff --git a/workspace/assets/skins/fb/fb9a3de9650d8d83dc8a146c37e30a86ad648153f6737038efbe5e8acf90a351 b/workspace/assets/skins/fb/fb9a3de9650d8d83dc8a146c37e30a86ad648153f6737038efbe5e8acf90a351
new file mode 100644
index 00000000..bc1ec342
Binary files /dev/null and b/workspace/assets/skins/fb/fb9a3de9650d8d83dc8a146c37e30a86ad648153f6737038efbe5e8acf90a351 differ
diff --git a/workspace/assets/skins/fb/fbbf20e1af0383b70801d3507fde717a4fb60bf361e30d1d245b1e820e0a50f3 b/workspace/assets/skins/fb/fbbf20e1af0383b70801d3507fde717a4fb60bf361e30d1d245b1e820e0a50f3
new file mode 100644
index 00000000..5133a845
Binary files /dev/null and b/workspace/assets/skins/fb/fbbf20e1af0383b70801d3507fde717a4fb60bf361e30d1d245b1e820e0a50f3 differ
diff --git a/workspace/assets/skins/fd/fd04c3bd8f110753ae094614b85256bd72b9cb6ad59369f76577feb67e0b01f1 b/workspace/assets/skins/fd/fd04c3bd8f110753ae094614b85256bd72b9cb6ad59369f76577feb67e0b01f1
new file mode 100644
index 00000000..e8b5de99
Binary files /dev/null and b/workspace/assets/skins/fd/fd04c3bd8f110753ae094614b85256bd72b9cb6ad59369f76577feb67e0b01f1 differ
diff --git a/workspace/assets/skins/fd/fd166fcd59ef908814f3c845ba3c279b2a8622b95817bef16f6acf30af940ea7 b/workspace/assets/skins/fd/fd166fcd59ef908814f3c845ba3c279b2a8622b95817bef16f6acf30af940ea7
new file mode 100644
index 00000000..097b8f21
Binary files /dev/null and b/workspace/assets/skins/fd/fd166fcd59ef908814f3c845ba3c279b2a8622b95817bef16f6acf30af940ea7 differ
diff --git a/workspace/assets/skins/fd/fde9a77252418046bb3a348c882709e013ae7e6560cd3c90880760ec340a991d b/workspace/assets/skins/fd/fde9a77252418046bb3a348c882709e013ae7e6560cd3c90880760ec340a991d
new file mode 100644
index 00000000..c4fe6acc
Binary files /dev/null and b/workspace/assets/skins/fd/fde9a77252418046bb3a348c882709e013ae7e6560cd3c90880760ec340a991d differ
diff --git a/workspace/assets/skins/fe/fe61b00a6c095e4ea0dada44969bc81322a9f23b3d2fe11ad5bb0021e0f29c73 b/workspace/assets/skins/fe/fe61b00a6c095e4ea0dada44969bc81322a9f23b3d2fe11ad5bb0021e0f29c73
new file mode 100644
index 00000000..a5e81b5c
Binary files /dev/null and b/workspace/assets/skins/fe/fe61b00a6c095e4ea0dada44969bc81322a9f23b3d2fe11ad5bb0021e0f29c73 differ
diff --git a/workspace/crash-reports/crash-2023-06-08_17.27.31-client.txt b/workspace/crash-reports/crash-2023-06-08_17.27.31-client.txt
index fe6e4d09..9fb3a9b5 100644
--- a/workspace/crash-reports/crash-2023-06-08_17.27.31-client.txt
+++ b/workspace/crash-reports/crash-2023-06-08_17.27.31-client.txt
@@ -7,8 +7,8 @@ Description: Rendering screen
java.lang.NullPointerException: Rendering screen
at rip.athena.client.utils.font.impl.athena.FontRenderer.requiresInternationalFont(FontRenderer.java:285)
at rip.athena.client.utils.font.impl.athena.FontRenderer.width(FontRenderer.java:247)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:195)
at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
@@ -27,8 +27,8 @@ A detailed walkthrough of the error, its code path and all known details is as f
Stacktrace:
at rip.athena.client.utils.font.impl.athena.FontRenderer.requiresInternationalFont(FontRenderer.java:285)
at rip.athena.client.utils.font.impl.athena.FontRenderer.width(FontRenderer.java:247)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:195)
at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
diff --git a/workspace/crash-reports/crash-2023-06-08_17.35.41-client.txt b/workspace/crash-reports/crash-2023-06-08_17.35.41-client.txt
index d86aba3e..b23d616e 100644
--- a/workspace/crash-reports/crash-2023-06-08_17.35.41-client.txt
+++ b/workspace/crash-reports/crash-2023-06-08_17.35.41-client.txt
@@ -7,8 +7,8 @@ Description: Rendering screen
java.lang.NullPointerException: Rendering screen
at rip.athena.client.utils.font.impl.athena.FontRenderer.requiresInternationalFont(FontRenderer.java:285)
at rip.athena.client.utils.font.impl.athena.FontRenderer.width(FontRenderer.java:247)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:195)
at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
@@ -27,8 +27,8 @@ A detailed walkthrough of the error, its code path and all known details is as f
Stacktrace:
at rip.athena.client.utils.font.impl.athena.FontRenderer.requiresInternationalFont(FontRenderer.java:285)
at rip.athena.client.utils.font.impl.athena.FontRenderer.width(FontRenderer.java:247)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
- at rip.athena.client.gui.clickgui.components.themes.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.getStringWidth(SimpleGradientButton.java:91)
+ at rip.athena.client.gui.clickgui.components.themes.accent.SimpleGradientButton.onRender(SimpleGradientButton.java:74)
at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:195)
at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
diff --git a/workspace/crash-reports/crash-2023-06-09_19.49.27-client.txt b/workspace/crash-reports/crash-2023-06-09_19.49.27-client.txt
new file mode 100644
index 00000000..589b6db9
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-09_19.49.27-client.txt
@@ -0,0 +1,98 @@
+---- Minecraft Crash Report ----
+// Who set us up the TNT?
+
+Time: 6/9/23 7:49 PM
+Description: Rendering screen
+
+java.lang.NullPointerException: Rendering screen
+ at rip.athena.client.gui.clickgui.components.themes.primary.PrimaryGradientButton.onRender(PrimaryGradientButton.java:68)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:196)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.clickgui.components.themes.primary.PrimaryGradientButton.onRender(PrimaryGradientButton.java:68)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:196)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.clickgui.IngameMenu
+ Mouse location: Scaled: (285, 312). Absolute: (570, 384)
+ Screen size: Scaled: (960, 505). Absolute: (1920, 1009). Scale factor of 2
+
+-- Affected level --
+Details:
+ Level name: MpServer
+ All players: 1 total; [EntityPlayerSP['Player434'/23, l='MpServer', x=6.18, y=69.00, z=1059.32]]
+ Chunk stats: MultiplayerChunkCache: 259, 259
+ Level seed: 0
+ Level generator: ID 02 - largeBiomes, ver 0. Features enabled: false
+ Level generator options:
+ Level spawn location: 5.00,64.00,557.00 - World: (5,64,557), Chunk: (at 5,4,13 in 0,34; contains blocks 0,0,544 to 15,255,559), Region: (0,1; contains chunks 0,32 to 31,63, blocks 0,0,512 to 511,255,1023)
+ Level time: 288061 game time, 288061 day time
+ Level dimension: 0
+ Level storage version: 0x00000 - Unknown?
+ Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
+ Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
+ Forced entities: 2 total; [EntityBat['Bat'/24, l='MpServer', x=7.22, y=39.10, z=1061.50], EntityPlayerSP['Player434'/23, l='MpServer', x=6.18, y=69.00, z=1059.32]]
+ Retry entities: 0 total; []
+ Server brand: vanilla
+ Server type: Integrated singleplayer server
+Stacktrace:
+ at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:401)
+ at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2796)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:452)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 176488464 bytes (168 MB) / 928514048 bytes (885 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 99
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-09_19.50.44-client.txt b/workspace/crash-reports/crash-2023-06-09_19.50.44-client.txt
new file mode 100644
index 00000000..0bb49af8
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-09_19.50.44-client.txt
@@ -0,0 +1,96 @@
+---- Minecraft Crash Report ----
+// This doesn't make any sense!
+
+Time: 6/9/23 7:50 PM
+Description: Rendering screen
+
+java.lang.NullPointerException: Rendering screen
+ at rip.athena.client.gui.clickgui.components.mods.CategoryButton.onRender(CategoryButton.java:62)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.clickgui.components.mods.CategoryButton.onRender(CategoryButton.java:62)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.clickgui.IngameMenu
+ Mouse location: Scaled: (531, 214). Absolute: (1063, 581)
+ Screen size: Scaled: (960, 505). Absolute: (1920, 1009). Scale factor of 2
+
+-- Affected level --
+Details:
+ Level name: MpServer
+ All players: 1 total; [EntityPlayerSP['Player324'/23, l='MpServer', x=6.18, y=69.00, z=1059.32]]
+ Chunk stats: MultiplayerChunkCache: 259, 259
+ Level seed: 0
+ Level generator: ID 02 - largeBiomes, ver 0. Features enabled: false
+ Level generator options:
+ Level spawn location: 5.00,64.00,557.00 - World: (5,64,557), Chunk: (at 5,4,13 in 0,34; contains blocks 0,0,544 to 15,255,559), Region: (0,1; contains chunks 0,32 to 31,63, blocks 0,0,512 to 511,255,1023)
+ Level time: 288130 game time, 288130 day time
+ Level dimension: 0
+ Level storage version: 0x00000 - Unknown?
+ Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
+ Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
+ Forced entities: 2 total; [EntityPlayerSP['Player324'/23, l='MpServer', x=6.18, y=69.00, z=1059.32], EntityBat['Bat'/24, l='MpServer', x=7.22, y=39.10, z=1061.50]]
+ Retry entities: 0 total; []
+ Server brand: vanilla
+ Server type: Integrated singleplayer server
+Stacktrace:
+ at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:401)
+ at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2796)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:452)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 509024272 bytes (485 MB) / 850919424 bytes (811 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 98
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-09_22.19.16-client.txt b/workspace/crash-reports/crash-2023-06-09_22.19.16-client.txt
new file mode 100644
index 00000000..49e4c0a1
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-09_22.19.16-client.txt
@@ -0,0 +1,93 @@
+---- Minecraft Crash Report ----
+// Who set us up the TNT?
+
+Time: 6/9/23 10:19 PM
+Description: Updating screen events
+
+java.lang.RuntimeException: java.io.IOException: Server returned HTTP response code: 401 for URL: https://api.minecraftservices.com/minecraft/profile/
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$drawScreen$1(LoginPanel.java:157)
+ at rip.athena.client.gui.menu.altmanager.button.AltButton.mouseClicked(AltButton.java:66)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$mouseClicked$3(LoginPanel.java:194)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:91)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:91)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: https://api.minecraftservices.com/minecraft/profile/
+ at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
+ at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
+ at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$drawScreen$1(LoginPanel.java:155)
+ ... 14 more
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$drawScreen$1(LoginPanel.java:157)
+ at rip.athena.client.gui.menu.altmanager.button.AltButton.mouseClicked(AltButton.java:66)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$mouseClicked$3(LoginPanel.java:194)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:91)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:91)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+
+-- Affected screen --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAltManager
+Stacktrace:
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 301600912 bytes (287 MB) / 878182400 bytes (837 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-09_23.33.48-client.txt b/workspace/crash-reports/crash-2023-06-09_23.33.48-client.txt
new file mode 100644
index 00000000..4ab2477e
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-09_23.33.48-client.txt
@@ -0,0 +1,98 @@
+---- Minecraft Crash Report ----
+// My bad.
+
+Time: 6/9/23 11:33 PM
+Description: Rendering screen
+
+java.lang.NullPointerException: Rendering screen
+ at rip.athena.client.gui.clickgui.components.mods.ModTextbox.onRender(ModTextbox.java:149)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:196)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.clickgui.components.mods.ModTextbox.onRender(ModTextbox.java:149)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:196)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.clickgui.IngameMenu
+ Mouse location: Scaled: (658, 321). Absolute: (1317, 366)
+ Screen size: Scaled: (960, 505). Absolute: (1920, 1009). Scale factor of 2
+
+-- Affected level --
+Details:
+ Level name: MpServer
+ All players: 1 total; [EntityPlayerSP['Player766'/39, l='MpServer', x=-86.13, y=65.00, z=996.77]]
+ Chunk stats: MultiplayerChunkCache: 267, 267
+ Level seed: 0
+ Level generator: ID 02 - largeBiomes, ver 0. Features enabled: false
+ Level generator options:
+ Level spawn location: 5.00,64.00,557.00 - World: (5,64,557), Chunk: (at 5,4,13 in 0,34; contains blocks 0,0,544 to 15,255,559), Region: (0,1; contains chunks 0,32 to 31,63, blocks 0,0,512 to 511,255,1023)
+ Level time: 410547 game time, 410547 day time
+ Level dimension: 0
+ Level storage version: 0x00000 - Unknown?
+ Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
+ Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
+ Forced entities: 23 total; [EntityVillager['Villager'/32, l='MpServer', x=-144.72, y=69.00, z=1066.13], EntityVillager['Villager'/33, l='MpServer', x=-149.50, y=68.00, z=1066.13], EntityBat['Bat'/65, l='MpServer', x=-85.50, y=24.97, z=926.81], EntityVillager['Villager'/34, l='MpServer', x=-158.72, y=66.00, z=1045.59], EntityBat['Bat'/66, l='MpServer', x=-85.66, y=24.19, z=924.53], EntityVillager['Villager'/35, l='MpServer', x=-151.66, y=68.00, z=1049.78], EntityVillager['Villager'/36, l='MpServer', x=-159.91, y=66.07, z=1042.47], EntityVillager['Villager'/37, l='MpServer', x=-143.29, y=69.00, z=1065.80], EntityPlayerSP['Player766'/39, l='MpServer', x=-86.13, y=65.00, z=996.77], EntityVillager['Villager'/38, l='MpServer', x=-138.53, y=68.00, z=1072.28], EntityBat['Bat'/199, l='MpServer', x=-118.25, y=53.84, z=1064.41], EntityBat['Bat'/72, l='MpServer', x=-55.25, y=52.10, z=1013.72], EntityVillager['Villager'/23, l='MpServer', x=-118.53, y=69.00, z=1056.88], EntityVillager['Villager'/55, l='MpServer', x=-162.57, y=66.50, z=1036.34], EntityVillager['Villager'/24, l='MpServer', x=-118.34, y=69.00, z=1056.00], EntityVillager['Villager'/25, l='MpServer', x=-147.50, y=67.00, z=1021.28], EntityBat['Bat'/217, l='MpServer', x=-100.81, y=21.50, z=1076.97], EntityVillager['Villager'/26, l='MpServer', x=-150.09, y=66.00, z=1028.47], EntityVillager['Villager'/27, l='MpServer', x=-146.34, y=68.00, z=1040.56], EntityVillager['Villager'/28, l='MpServer', x=-158.59, y=67.00, z=1033.06], EntityVillager['Villager'/29, l='MpServer', x=-158.72, y=67.00, z=1027.47], EntityVillager['Villager'/30, l='MpServer', x=-155.84, y=68.00, z=1057.19], EntityVillager['Villager'/31, l='MpServer', x=-156.50, y=68.00, z=1064.50]]
+ Retry entities: 0 total; []
+ Server brand: vanilla
+ Server type: Integrated singleplayer server
+Stacktrace:
+ at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:401)
+ at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2796)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:452)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 894574240 bytes (853 MB) / 1224736768 bytes (1168 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 99
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_12.29.17-client.txt b/workspace/crash-reports/crash-2023-06-10_12.29.17-client.txt
new file mode 100644
index 00000000..b028d474
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_12.29.17-client.txt
@@ -0,0 +1,106 @@
+---- Minecraft Crash Report ----
+// You're mean.
+
+Time: 6/10/23 12:29 PM
+Description: Rendering screen
+
+java.lang.IllegalArgumentException: Invalid UUID string: 74e897386c9e4f5983efd365849e6049
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.gui.clickgui.components.mods.ModuleBox.passesThrough(ModuleBox.java:129)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:154)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.gui.clickgui.components.mods.ModuleBox.passesThrough(ModuleBox.java:129)
+ at rip.athena.client.gui.clickgui.components.mods.ModScrollPane.onRender(ModScrollPane.java:154)
+ at rip.athena.client.gui.framework.Menu.onRender(Menu.java:88)
+ at rip.athena.client.gui.framework.MinecraftMenuImpl.drawScreen(MinecraftMenuImpl.java:56)
+ at rip.athena.client.gui.clickgui.IngameMenu.drawScreen(IngameMenu.java:155)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.clickgui.IngameMenu
+ Mouse location: Scaled: (431, 263). Absolute: (863, 482)
+ Screen size: Scaled: (960, 505). Absolute: (1920, 1009). Scale factor of 2
+
+-- Affected level --
+Details:
+ Level name: MpServer
+ All players: 1 total; [EntityPlayerSP['Player604'/34, l='MpServer', x=-162.40, y=71.00, z=1010.99]]
+ Chunk stats: MultiplayerChunkCache: 270, 270
+ Level seed: 0
+ Level generator: ID 02 - largeBiomes, ver 0. Features enabled: false
+ Level generator options:
+ Level spawn location: 5.00,64.00,557.00 - World: (5,64,557), Chunk: (at 5,4,13 in 0,34; contains blocks 0,0,544 to 15,255,559), Region: (0,1; contains chunks 0,32 to 31,63, blocks 0,0,512 to 511,255,1023)
+ Level time: 433036 game time, 433036 day time
+ Level dimension: 0
+ Level storage version: 0x00000 - Unknown?
+ Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
+ Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
+ Forced entities: 65 total; [EntityBat['Bat'/527, l='MpServer', x=-163.35, y=33.49, z=1001.21], EntityVillager['Villager'/18, l='MpServer', x=-150.56, y=67.00, z=1033.22], EntityVillager['Villager'/19, l='MpServer', x=-152.72, y=67.00, z=1032.38], EntityZombie['Zombie'/20, l='MpServer', x=-155.56, y=25.00, z=1008.13], EntityItem['item.item.arrow'/21, l='MpServer', x=-132.16, y=66.00, z=1010.88], EntityItem['item.item.bone'/22, l='MpServer', x=-130.44, y=66.00, z=1009.97], EntityVillager['Villager'/23, l='MpServer', x=-148.44, y=68.00, z=1041.84], EntityVillager['Villager'/24, l='MpServer', x=-151.66, y=68.00, z=1049.78], EntityVillager['Villager'/25, l='MpServer', x=-149.50, y=68.00, z=1040.84], EntityVillager['Villager'/26, l='MpServer', x=-155.28, y=68.00, z=1049.72], EntityVillager['Villager'/27, l='MpServer', x=-156.50, y=68.00, z=1064.50], EntityVillager['Villager'/28, l='MpServer', x=-144.72, y=69.00, z=1066.28], EntityVillager['Villager'/29, l='MpServer', x=-145.19, y=68.00, z=1063.50], EntityVillager['Villager'/30, l='MpServer', x=-138.53, y=68.00, z=1072.28], EntityVillager['Villager'/31, l='MpServer', x=-135.09, y=68.00, z=1072.66], EntityVillager['Villager'/32, l='MpServer', x=-148.72, y=67.13, z=1075.53], EntitySkeleton['Skeleton'/35, l='MpServer', x=-154.50, y=27.00, z=1000.50], EntityEnderman['Enderman'/36, l='MpServer', x=-145.50, y=27.00, z=998.50], EntityEnderman['Enderman'/37, l='MpServer', x=-149.50, y=27.00, z=998.50], EntityWitch['Witch'/38, l='MpServer', x=-170.50, y=24.00, z=1005.91], EntityBat['Bat'/678, l='MpServer', x=-222.34, y=55.09, z=1051.31], EntityCreeper['Creeper'/39, l='MpServer', x=-158.72, y=25.00, z=1003.88], EntityBat['Bat'/679, l='MpServer', x=-223.25, y=55.56, z=1053.50], EntityBat['Bat'/40, l='MpServer', x=-147.45, y=27.34, z=987.73], EntityCreeper['Creeper'/552, l='MpServer', x=-152.50, y=29.00, z=1019.50], EntityBat['Bat'/680, l='MpServer', x=-221.25, y=55.09, z=1050.53], EntityCreeper['Creeper'/297, l='MpServer', x=-82.50, y=38.00, z=1030.50], EntityCreeper['Creeper'/298, l='MpServer', x=-90.50, y=26.00, z=931.50], EntityCreeper['Creeper'/554, l='MpServer', x=-187.50, y=36.00, z=976.50], EntityCreeper['Creeper'/299, l='MpServer', x=-91.50, y=26.00, z=932.50], EntityCreeper['Creeper'/555, l='MpServer', x=-181.50, y=36.00, z=983.50], EntitySkeleton['Skeleton'/53, l='MpServer', x=-227.50, y=45.00, z=936.50], EntitySkeleton['Skeleton'/64, l='MpServer', x=-210.47, y=35.00, z=1086.16], EntityBat['Bat'/65, l='MpServer', x=-206.13, y=42.13, z=1076.75], EntitySquid['Squid'/76, l='MpServer', x=-201.91, y=61.53, z=1009.59], EntityBat['Bat'/77, l='MpServer', x=-194.59, y=37.09, z=1064.16], EntitySkeleton['Skeleton'/589, l='MpServer', x=-112.50, y=20.00, z=974.50], EntityBat['Bat'/79, l='MpServer', x=-202.16, y=32.09, z=1071.75], EntityBat['Bat'/80, l='MpServer', x=-201.22, y=32.41, z=1075.78], EntityZombie['Zombie'/593, l='MpServer', x=-201.50, y=42.00, z=1078.50], EntitySquid['Squid'/82, l='MpServer', x=-176.86, y=62.47, z=1009.70], EntityZombie['Zombie'/594, l='MpServer', x=-200.63, y=42.76, z=1079.62], EntitySquid['Squid'/83, l='MpServer', x=-195.50, y=60.91, z=1012.00], EntityZombie['Zombie'/84, l='MpServer', x=-170.59, y=17.00, z=1020.09], EntitySpider['Spider'/85, l='MpServer', x=-171.50, y=35.00, z=989.50], EntityCreeper['Creeper'/597, l='MpServer', x=-203.50, y=42.00, z=1075.50], EntitySkeleton['Skeleton'/86, l='MpServer', x=-168.94, y=21.00, z=996.50], EntitySpider['Spider'/87, l='MpServer', x=-163.84, y=35.00, z=993.00], EntityVillager['Villager'/88, l='MpServer', x=-147.47, y=67.00, z=1024.75], EntityVillager['Villager'/89, l='MpServer', x=-171.28, y=67.00, z=1039.50], EntityVillager['Villager'/90, l='MpServer', x=-171.56, y=67.00, z=1040.34], EntityItem['item.item.bread'/91, l='MpServer', x=-172.34, y=67.00, z=1042.66], EntityCreeper['Creeper'/219, l='MpServer', x=-127.53, y=51.00, z=1065.66], EntityBat['Bat'/94, l='MpServer', x=-150.59, y=29.10, z=975.63], EntityBat['Bat'/95, l='MpServer', x=-139.26, y=25.13, z=987.11], EntityVillager['Villager'/96, l='MpServer', x=-138.78, y=66.00, z=1036.25], EntityVillager['Villager'/97, l='MpServer', x=-122.47, y=68.00, z=1045.69], EntitySkeleton['Skeleton'/98, l='MpServer', x=-101.50, y=34.00, z=950.50], EntityBat['Bat'/100, l='MpServer', x=-85.47, y=34.53, z=1033.97], EntitySkeleton['Skeleton'/485, l='MpServer', x=-167.47, y=60.00, z=1051.31], EntityCreeper['Creeper'/486, l='MpServer', x=-168.50, y=60.00, z=1050.50], EntityCreeper['Creeper'/487, l='MpServer', x=-169.77, y=60.00, z=1051.35], EntityCreeper['Creeper'/488, l='MpServer', x=-169.02, y=60.00, z=1052.33], EntityPlayerSP['Player604'/34, l='MpServer', x=-162.40, y=71.00, z=1010.99], EntitySkeleton['Skeleton'/367, l='MpServer', x=-232.50, y=26.00, z=965.50]]
+ Retry entities: 0 total; []
+ Server brand: vanilla
+ Server type: Integrated singleplayer server
+Stacktrace:
+ at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:401)
+ at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2796)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:452)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 843575936 bytes (804 MB) / 1391460352 bytes (1327 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 99
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_12.29.35-client.txt b/workspace/crash-reports/crash-2023-06-10_12.29.35-client.txt
new file mode 100644
index 00000000..457697f8
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_12.29.35-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Surprise! Haha. Well, this is awkward.
+
+Time: 6/10/23 12:29 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 441315528 bytes (420 MB) / 499122176 bytes (476 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_12.29.48-client.txt b/workspace/crash-reports/crash-2023-06-10_12.29.48-client.txt
new file mode 100644
index 00000000..3cdb6dd8
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_12.29.48-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// You should try our sister game, Minceraft!
+
+Time: 6/10/23 12:29 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 421691864 bytes (402 MB) / 480247808 bytes (458 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_12.30.30-client.txt b/workspace/crash-reports/crash-2023-06-10_12.30.30-client.txt
new file mode 100644
index 00000000..c624caf8
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_12.30.30-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Shall we play a game?
+
+Time: 6/10/23 12:30 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:98)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 440689240 bytes (420 MB) / 498597888 bytes (475 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_12.31.29-client.txt b/workspace/crash-reports/crash-2023-06-10_12.31.29-client.txt
new file mode 100644
index 00000000..97f9eed4
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_12.31.29-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Don't be sad, have a hug! <3
+
+Time: 6/10/23 12:31 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:101)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.modules.impl.other.AimTrainer.createBot(AimTrainer.java:32)
+ at rip.athena.client.modules.impl.other.AimTrainer.onEnable(AimTrainer.java:103)
+ at rip.athena.client.modules.Module.setEnabled(Module.java:96)
+ at rip.athena.client.config.save.Config.load(Config.java:106)
+ at rip.athena.client.config.save.Config.load(Config.java:64)
+ at rip.athena.client.config.save.ConfigManager.postInit(ConfigManager.java:52)
+ at rip.athena.client.Athena.initClient(Athena.java:101)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 455673784 bytes (434 MB) / 511180800 bytes (487 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_13.58.06-client.txt b/workspace/crash-reports/crash-2023-06-10_13.58.06-client.txt
new file mode 100644
index 00000000..a3ce6d9e
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_13.58.06-client.txt
@@ -0,0 +1,81 @@
+---- Minecraft Crash Report ----
+// Why did you do that?
+
+Time: 6/10/23 1:58 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:57)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:57)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 196344856 bytes (187 MB) / 287834112 bytes (274 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_13.59.17-client.txt b/workspace/crash-reports/crash-2023-06-10_13.59.17-client.txt
new file mode 100644
index 00000000..c129384b
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_13.59.17-client.txt
@@ -0,0 +1,81 @@
+---- Minecraft Crash Report ----
+// Shall we play a game?
+
+Time: 6/10/23 1:59 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:63)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:63)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 188755328 bytes (180 MB) / 283115520 bytes (270 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_14.00.17-client.txt b/workspace/crash-reports/crash-2023-06-10_14.00.17-client.txt
new file mode 100644
index 00000000..e91327f1
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_14.00.17-client.txt
@@ -0,0 +1,81 @@
+---- Minecraft Crash Report ----
+// My bad.
+
+Time: 6/10/23 2:00 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:64)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:64)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 176506088 bytes (168 MB) / 282066944 bytes (269 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_14.01.02-client.txt b/workspace/crash-reports/crash-2023-06-10_14.01.02-client.txt
new file mode 100644
index 00000000..39ad1a87
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_14.01.02-client.txt
@@ -0,0 +1,81 @@
+---- Minecraft Crash Report ----
+// Surprise! Haha. Well, this is awkward.
+
+Time: 6/10/23 2:01 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:64)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at net.minecraft.client.Minecraft.isUnicode(Minecraft.java:792)
+ at net.minecraft.client.gui.ScaledResolution.(ScaledResolution.java:19)
+ at rip.athena.client.gui.hud.HUDElement.setX(HUDElement.java:64)
+ at rip.athena.client.modules.impl.render.MemoryUsage.(MemoryUsage.java:59)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at rip.athena.client.modules.ModuleManager.(ModuleManager.java:32)
+ at rip.athena.client.Athena.initClient(Athena.java:90)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:490)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU:
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 219024656 bytes (208 MB) / 297271296 bytes (283 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
+ GL Caps:
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: ~~ERROR~~ NullPointerException: null
+ Profiler Position: N/A (disabled)
+ CPU:
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: null
+ OpenGlRenderer: null
+ OpenGlVendor: null
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_18.31.15-client.txt b/workspace/crash-reports/crash-2023-06-10_18.31.15-client.txt
new file mode 100644
index 00000000..eeaecd48
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_18.31.15-client.txt
@@ -0,0 +1,70 @@
+---- Minecraft Crash Report ----
+// You should try our sister game, Minceraft!
+
+Time: 6/10/23 6:31 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.gui.menu.AthenaMenu.initGui(AthenaMenu.java:187)
+ at net.minecraft.client.gui.GuiScreen.setWorldAndResolution(GuiScreen.java:550)
+ at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:1021)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:584)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.menu.AthenaMenu.initGui(AthenaMenu.java:187)
+ at net.minecraft.client.gui.GuiScreen.setWorldAndResolution(GuiScreen.java:550)
+ at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:1021)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:584)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 343871880 bytes (327 MB) / 573571072 bytes (547 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_18.31.52-client.txt b/workspace/crash-reports/crash-2023-06-10_18.31.52-client.txt
new file mode 100644
index 00000000..67cb767f
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_18.31.52-client.txt
@@ -0,0 +1,70 @@
+---- Minecraft Crash Report ----
+// Daisy, daisy...
+
+Time: 6/10/23 6:31 PM
+Description: Initializing game
+
+java.lang.NullPointerException: Initializing game
+ at rip.athena.client.gui.menu.AthenaMenu.initGui(AthenaMenu.java:179)
+ at net.minecraft.client.gui.GuiScreen.setWorldAndResolution(GuiScreen.java:550)
+ at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:1021)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:584)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.gui.menu.AthenaMenu.initGui(AthenaMenu.java:179)
+ at net.minecraft.client.gui.GuiScreen.setWorldAndResolution(GuiScreen.java:550)
+ at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:1021)
+ at net.minecraft.client.Minecraft.startGame(Minecraft.java:584)
+
+-- Initialization --
+Details:
+Stacktrace:
+ at net.minecraft.client.Minecraft.run(Minecraft.java:411)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 243639712 bytes (232 MB) / 555220992 bytes (529 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_18.41.13-client.txt b/workspace/crash-reports/crash-2023-06-10_18.41.13-client.txt
new file mode 100644
index 00000000..14b38b9d
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_18.41.13-client.txt
@@ -0,0 +1,75 @@
+---- Minecraft Crash Report ----
+// Hi. I'm Minecraft, and I'm a crashaholic.
+
+Time: 6/10/23 6:41 PM
+Description: Updating screen events
+
+java.lang.NullPointerException: Updating screen events
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.keyTyped(GuiAccountManager.java:420)
+ at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:627)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:578)
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1814)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:432)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.keyTyped(GuiAccountManager.java:420)
+ at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:627)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:578)
+
+-- Affected screen --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAccountManager
+Stacktrace:
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1814)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:432)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 187962056 bytes (179 MB) / 555745280 bytes (530 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_19.17.20-client.txt b/workspace/crash-reports/crash-2023-06-10_19.17.20-client.txt
new file mode 100644
index 00000000..38f67330
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_19.17.20-client.txt
@@ -0,0 +1,75 @@
+---- Minecraft Crash Report ----
+// Don't be sad, have a hug! <3
+
+Time: 6/10/23 7:17 PM
+Description: Rendering screen
+
+java.lang.NullPointerException: Rendering screen
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.drawScreen(LoginPanel.java:184)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.drawScreen(GuiAltManager.java:80)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.drawScreen(LoginPanel.java:184)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.drawScreen(GuiAltManager.java:80)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAltManager
+ Mouse location: Scaled: (0, 239). Absolute: (0, 0)
+ Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
+Stacktrace:
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 247518856 bytes (236 MB) / 587726848 bytes (560 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_19.17.56-client.txt b/workspace/crash-reports/crash-2023-06-10_19.17.56-client.txt
new file mode 100644
index 00000000..40c53f92
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_19.17.56-client.txt
@@ -0,0 +1,75 @@
+---- Minecraft Crash Report ----
+// My bad.
+
+Time: 6/10/23 7:17 PM
+Description: Rendering screen
+
+java.lang.NullPointerException: Rendering screen
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.drawScreen(LoginPanel.java:184)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.drawScreen(GuiAltManager.java:80)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.drawScreen(LoginPanel.java:184)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.drawScreen(GuiAltManager.java:80)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAltManager
+ Mouse location: Scaled: (0, 239). Absolute: (0, 0)
+ Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
+Stacktrace:
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 224660560 bytes (214 MB) / 578813952 bytes (552 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_19.18.42-client.txt b/workspace/crash-reports/crash-2023-06-10_19.18.42-client.txt
new file mode 100644
index 00000000..70279262
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_19.18.42-client.txt
@@ -0,0 +1,81 @@
+---- Minecraft Crash Report ----
+// I bet Cylons wouldn't have this problem.
+
+Time: 6/10/23 7:18 PM
+Description: Updating screen events
+
+java.lang.NullPointerException: Updating screen events
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:238)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:97)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:97)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:238)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:97)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:97)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+
+-- Affected screen --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAltManager
+Stacktrace:
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 450490368 bytes (429 MB) / 562036736 bytes (536 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_19.20.32-client.txt b/workspace/crash-reports/crash-2023-06-10_19.20.32-client.txt
new file mode 100644
index 00000000..32f053b9
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_19.20.32-client.txt
@@ -0,0 +1,89 @@
+---- Minecraft Crash Report ----
+// This doesn't make any sense!
+
+Time: 6/10/23 7:20 PM
+Description: Updating screen events
+
+java.lang.NullPointerException: Updating screen events
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$drawScreen$1(LoginPanel.java:126)
+ at rip.athena.client.gui.menu.altmanager.button.AltButton.mouseClicked(AltButton.java:66)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$mouseClicked$3(LoginPanel.java:211)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:211)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:97)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:97)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at rip.athena.client.account.AccountManager.save(AccountManager.java:49)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$drawScreen$1(LoginPanel.java:126)
+ at rip.athena.client.gui.menu.altmanager.button.AltButton.mouseClicked(AltButton.java:66)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.lambda$mouseClicked$3(LoginPanel.java:211)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.panels.LoginPanel.mouseClicked(LoginPanel.java:211)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.lambda$mouseClicked$1(GuiAltManager.java:97)
+ at java.util.ArrayList.forEach(ArrayList.java:1257)
+ at rip.athena.client.gui.menu.altmanager.GuiAltManager.mouseClicked(GuiAltManager.java:97)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+
+-- Affected screen --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAltManager
+Stacktrace:
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 345618936 bytes (329 MB) / 540016640 bytes (515 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_21.05.34-client.txt b/workspace/crash-reports/crash-2023-06-10_21.05.34-client.txt
new file mode 100644
index 00000000..d4936502
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_21.05.34-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Uh... Did I do that?
+
+Time: 6/10/23 9:05 PM
+Description: Rendering screen
+
+java.lang.IllegalArgumentException: Invalid UUID string: 74e897386c9e4f5983efd365849e6049
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:157)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:157)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAccountManager
+ Mouse location: Scaled: (379, 17). Absolute: (759, 445)
+ Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
+Stacktrace:
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 484855384 bytes (462 MB) / 910163968 bytes (868 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_21.09.17-client.txt b/workspace/crash-reports/crash-2023-06-10_21.09.17-client.txt
new file mode 100644
index 00000000..e350b6c9
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_21.09.17-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Don't do that.
+
+Time: 6/10/23 9:09 PM
+Description: Rendering screen
+
+java.lang.IllegalArgumentException: Invalid UUID string: 74e897386c9e4f5983efd365849e6049
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:154)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:154)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAccountManager
+ Mouse location: Scaled: (382, 19). Absolute: (764, 441)
+ Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
+Stacktrace:
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 848548360 bytes (809 MB) / 973078528 bytes (928 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_21.15.42-client.txt b/workspace/crash-reports/crash-2023-06-10_21.15.42-client.txt
new file mode 100644
index 00000000..536f0542
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_21.15.42-client.txt
@@ -0,0 +1,77 @@
+---- Minecraft Crash Report ----
+// My bad.
+
+Time: 6/10/23 9:15 PM
+Description: Updating screen events
+
+java.util.ConcurrentModificationException
+ at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
+ at java.util.ArrayList$Itr.next(ArrayList.java:859)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.mouseClicked(GuiAccountManager.java:320)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
+ at java.util.ArrayList$Itr.next(ArrayList.java:859)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.mouseClicked(GuiAccountManager.java:320)
+ at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:601)
+ at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:570)
+
+-- Affected screen --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAccountManager
+Stacktrace:
+ at net.minecraft.client.Minecraft.runTick(Minecraft.java:1813)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1126)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 920873904 bytes (878 MB) / 1061683200 bytes (1012 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/crash-reports/crash-2023-06-10_21.26.18-client.txt b/workspace/crash-reports/crash-2023-06-10_21.26.18-client.txt
new file mode 100644
index 00000000..e1b2b9d4
--- /dev/null
+++ b/workspace/crash-reports/crash-2023-06-10_21.26.18-client.txt
@@ -0,0 +1,73 @@
+---- Minecraft Crash Report ----
+// Surprise! Haha. Well, this is awkward.
+
+Time: 6/10/23 9:26 PM
+Description: Rendering screen
+
+java.lang.IllegalArgumentException: Invalid UUID string: 74e897386c9e4f5983efd365849e6049
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:155)
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Stacktrace:
+ at java.util.UUID.fromString(UUID.java:194)
+ at rip.athena.client.gui.menu.altmanager.GuiAccountManager.drawScreen(GuiAccountManager.java:155)
+
+-- Screen render details --
+Details:
+ Screen name: rip.athena.client.gui.menu.altmanager.GuiAccountManager
+ Mouse location: Scaled: (386, 8). Absolute: (773, 463)
+ Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
+Stacktrace:
+ at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1442)
+ at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1152)
+ at net.minecraft.client.Minecraft.run(Minecraft.java:431)
+ at net.minecraft.client.main.Main.main(Main.java:113)
+ at Start.main(Start.java:11)
+
+-- System Details --
+Details:
+ Minecraft Version: 1.8.8
+ Operating System: Windows 10 (amd64) version 10.0
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ Java Version: 1.8.0_202, Oracle Corporation
+ Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+ Memory: 251881424 bytes (240 MB) / 766509056 bytes (731 MB) up to 3801088000 bytes (3625 MB)
+ JVM Flags: 0 total;
+ IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
+ Launched Version: mcp
+ LWJGL: 2.9.4
+ OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2 GL version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+ GL Caps: Using GL 1.3 multitexturing.
+Using GL 1.3 texture combiners.
+Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
+Shaders are available because OpenGL 2.1 is supported.
+VBOs are available because OpenGL 1.5 is supported.
+
+ Using VBOs: Yes
+ Is Modded: Very likely; Jar signature invalidated
+ Type: Client (map_client.txt)
+ Resource Packs: ! Ā§bPotfast 5kay.zip
+ Current Language: English (US)
+ Profiler Position: N/A (disabled)
+ CPU: 12x AMD Ryzen 5 5600X 6-Core Processor
+ OptiFine Version: OptiFine_1.8.8_HD_U_H8
+ Render Distance Chunks: 8
+ Mipmaps: 4
+ Anisotropic Filtering: 1
+ Antialiasing: 0
+ Multitexture: false
+ Shaders: null
+ OpenGlVersion: 4.6.0 NVIDIA 532.03
+ OpenGlRenderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+ OpenGlVendor: NVIDIA Corporation
+ CpuCount: 12
\ No newline at end of file
diff --git a/workspace/logs/2023-06-08-1.log.gz b/workspace/logs/2023-06-08-1.log.gz
index f55ea1dd..0fb89c7d 100644
Binary files a/workspace/logs/2023-06-08-1.log.gz and b/workspace/logs/2023-06-08-1.log.gz differ
diff --git a/workspace/logs/2023-06-08-2.log.gz b/workspace/logs/2023-06-08-2.log.gz
index 0fb89c7d..c30494ef 100644
Binary files a/workspace/logs/2023-06-08-2.log.gz and b/workspace/logs/2023-06-08-2.log.gz differ
diff --git a/workspace/logs/2023-06-08-3.log.gz b/workspace/logs/2023-06-08-3.log.gz
index c30494ef..90a7cfbe 100644
Binary files a/workspace/logs/2023-06-08-3.log.gz and b/workspace/logs/2023-06-08-3.log.gz differ
diff --git a/workspace/logs/2023-06-08-4.log.gz b/workspace/logs/2023-06-08-4.log.gz
index 90a7cfbe..c7d51c3a 100644
Binary files a/workspace/logs/2023-06-08-4.log.gz and b/workspace/logs/2023-06-08-4.log.gz differ
diff --git a/workspace/logs/2023-06-08-5.log.gz b/workspace/logs/2023-06-08-5.log.gz
index c7d51c3a..3b07643e 100644
Binary files a/workspace/logs/2023-06-08-5.log.gz and b/workspace/logs/2023-06-08-5.log.gz differ
diff --git a/workspace/logs/2023-06-08-6.log.gz b/workspace/logs/2023-06-08-6.log.gz
index 3b07643e..ce767b31 100644
Binary files a/workspace/logs/2023-06-08-6.log.gz and b/workspace/logs/2023-06-08-6.log.gz differ
diff --git a/workspace/logs/2023-06-08-7.log.gz b/workspace/logs/2023-06-08-7.log.gz
index ce767b31..830d9777 100644
Binary files a/workspace/logs/2023-06-08-7.log.gz and b/workspace/logs/2023-06-08-7.log.gz differ
diff --git a/workspace/logs/2023-06-09-1.log.gz b/workspace/logs/2023-06-09-1.log.gz
new file mode 100644
index 00000000..c5a02bdc
Binary files /dev/null and b/workspace/logs/2023-06-09-1.log.gz differ
diff --git a/workspace/logs/2023-06-09-2.log.gz b/workspace/logs/2023-06-09-2.log.gz
new file mode 100644
index 00000000..874ff019
Binary files /dev/null and b/workspace/logs/2023-06-09-2.log.gz differ
diff --git a/workspace/logs/2023-06-09-3.log.gz b/workspace/logs/2023-06-09-3.log.gz
new file mode 100644
index 00000000..b9e61fb5
Binary files /dev/null and b/workspace/logs/2023-06-09-3.log.gz differ
diff --git a/workspace/logs/2023-06-09-4.log.gz b/workspace/logs/2023-06-09-4.log.gz
new file mode 100644
index 00000000..51232480
Binary files /dev/null and b/workspace/logs/2023-06-09-4.log.gz differ
diff --git a/workspace/logs/2023-06-09-5.log.gz b/workspace/logs/2023-06-09-5.log.gz
new file mode 100644
index 00000000..0b3db32b
Binary files /dev/null and b/workspace/logs/2023-06-09-5.log.gz differ
diff --git a/workspace/logs/2023-06-09-6.log.gz b/workspace/logs/2023-06-09-6.log.gz
new file mode 100644
index 00000000..1cb6bbcf
Binary files /dev/null and b/workspace/logs/2023-06-09-6.log.gz differ
diff --git a/workspace/logs/2023-06-09-7.log.gz b/workspace/logs/2023-06-09-7.log.gz
new file mode 100644
index 00000000..c4c448cb
Binary files /dev/null and b/workspace/logs/2023-06-09-7.log.gz differ
diff --git a/workspace/logs/2023-06-10-1.log.gz b/workspace/logs/2023-06-10-1.log.gz
new file mode 100644
index 00000000..4887f713
Binary files /dev/null and b/workspace/logs/2023-06-10-1.log.gz differ
diff --git a/workspace/logs/2023-06-10-2.log.gz b/workspace/logs/2023-06-10-2.log.gz
new file mode 100644
index 00000000..2a949161
Binary files /dev/null and b/workspace/logs/2023-06-10-2.log.gz differ
diff --git a/workspace/logs/2023-06-10-3.log.gz b/workspace/logs/2023-06-10-3.log.gz
new file mode 100644
index 00000000..865a043e
Binary files /dev/null and b/workspace/logs/2023-06-10-3.log.gz differ
diff --git a/workspace/logs/2023-06-10-4.log.gz b/workspace/logs/2023-06-10-4.log.gz
new file mode 100644
index 00000000..49d709be
Binary files /dev/null and b/workspace/logs/2023-06-10-4.log.gz differ
diff --git a/workspace/logs/2023-06-10-5.log.gz b/workspace/logs/2023-06-10-5.log.gz
new file mode 100644
index 00000000..805f6bd1
Binary files /dev/null and b/workspace/logs/2023-06-10-5.log.gz differ
diff --git a/workspace/logs/2023-06-10-6.log.gz b/workspace/logs/2023-06-10-6.log.gz
new file mode 100644
index 00000000..6e06279d
Binary files /dev/null and b/workspace/logs/2023-06-10-6.log.gz differ
diff --git a/workspace/logs/2023-06-10-7.log.gz b/workspace/logs/2023-06-10-7.log.gz
new file mode 100644
index 00000000..62df8371
Binary files /dev/null and b/workspace/logs/2023-06-10-7.log.gz differ
diff --git a/workspace/logs/latest.log b/workspace/logs/latest.log
index 6df44a31..e88136b3 100644
--- a/workspace/logs/latest.log
+++ b/workspace/logs/latest.log
@@ -1,145 +1,1482 @@
-[21:24:09] [Client thread/INFO]: Setting user: Player53
-[21:24:09] [Client thread/INFO]: (Session ID is token:0:Player53)
-[21:24:10] [Client thread/INFO]: [OptiFine] *** Reflector Forge ***
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.Attributes
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: mods.betterfoliage.client.BetterFoliageClient
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.asm.transformers.BlamingTransformer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.world.ChunkWatchEvent$UnWatch
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.relauncher.CoreModManager
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.DimensionManager
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.GuiScreenEvent$DrawScreenEvent$Pre
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.GuiScreenEvent$DrawScreenEvent$Post
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.EntityViewRenderEvent$CameraSetup
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.EntityViewRenderEvent$FogColors
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.Event
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.EventBus
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.Event$Result
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.property.ExtendedBlockState
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.FMLClientHandler
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.FMLCommonHandler
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.biome.BiomeGenBase.getWaterColorMultiplier
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.addDestroyEffects
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.addHitEffects
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.canCreatureSpawn
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.canRenderInLayer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.doesSideBlockRendering
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.getBedDirection
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.getExtendedState
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.hasTileEntity
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isAir
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isBed
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isBedFoot
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isSideSolid
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.canRiderInteract
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Field not present: net.minecraft.entity.Entity.captureDrops
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Field not present: net.minecraft.entity.Entity.capturedDrops
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.shouldRenderInPass
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.shouldRiderSit
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.ForgeEventFactory
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.ForgeHooks
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.ForgeHooksClient
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.getDurabilityForDisplay
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.getModel
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.onEntitySwing
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.shouldCauseReequipAnimation
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.showDurabilityBar
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.ItemRecord.getRecordResource
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.ForgeModContainer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.potion.PotionEffect.isCurativeItem
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.canRenderBreaking
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.getRenderBoundingBox
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.hasFastRenderer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.shouldRenderInPass
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.preDrawBatch
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.drawBatch
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.vertex.VertexFormatElement$EnumUsage.preDraw
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.vertex.VertexFormatElement$EnumUsage.postDraw
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.World.countEntities
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.World.getPerWorldStorage
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getCloudRenderer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getSkyRenderer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getWeatherRenderer
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.GuiModList
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.IColoredBakedQuad
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.property.IExtendedBlockState
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.IRenderHandler
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.ISmartBlockModel
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.ItemModelMesherForge
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraft.launchwrapper.Launch
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.pipeline.LightUtil
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.MinecraftForge
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.MinecraftForgeClient
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.ModelLoader
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderBlockOverlayEvent$OverlayType
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.registry.RenderingRegistry
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderItemInFrameEvent
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Pre
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Post
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Specials$Pre
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Specials$Post
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.SplashProgress
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.world.WorldEvent$Load
-[21:24:10] [Client thread/INFO]: [OptiFine] *** Reflector Vanilla ***
-[21:24:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: optifine.OptiFineClassTransformer
-[21:24:13] [Client thread/ERROR]: [Athena] Failed to load resource outside namespace (C:\Users\remig\Desktop\Athena-Client\workspace\.\assets\minecraft\Athena\gui\settings.png).javax.imageio.IIOException: Can't read input file!
-[21:24:13] [Client thread/WARN]: [Athena] Tried accessing non-existing module: theme
-[21:24:13] [Client thread/WARN]: [Athena] Loaded config default with left over setting theme which is no longer used.
-[21:24:13] [Client thread/INFO]: LWJGL Version: 2.9.4
-[21:24:13] [Client thread/INFO]: [OptiFine]
-[21:24:13] [Client thread/INFO]: [OptiFine] OptiFine_1.8.8_HD_U_H8
-[21:24:13] [Client thread/INFO]: [OptiFine] Build: null
-[21:24:13] [Client thread/INFO]: [OptiFine] OS: Windows 10 (amd64) version 10.0
-[21:24:13] [Client thread/INFO]: [OptiFine] Java: 1.8.0_202, Oracle Corporation
-[21:24:13] [Client thread/INFO]: [OptiFine] VM: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
-[21:24:13] [Client thread/INFO]: [OptiFine] LWJGL: 2.9.4
-[21:24:13] [Client thread/INFO]: [OptiFine] OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2, version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
-[21:24:13] [Client thread/INFO]: [OptiFine] OpenGL Version: 4.6.0
-[21:24:13] [Client thread/INFO]: [OptiFine] Maximum texture size: 32768x32768
-[21:24:13] [Thread-7/INFO]: [OptiFine] Checking for new version
-[21:24:13] [Client thread/INFO]: [Shaders] ShadersMod version: 2.4.12
-[21:24:13] [Client thread/INFO]: [Shaders] OpenGL Version: 4.6.0 NVIDIA 532.03
-[21:24:13] [Client thread/INFO]: [Shaders] Vendor: NVIDIA Corporation
-[21:24:13] [Client thread/INFO]: [Shaders] Renderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
-[21:24:13] [Client thread/INFO]: [Shaders] Capabilities: 2.0 2.1 3.0 3.2 4.0
-[21:24:13] [Client thread/INFO]: [Shaders] GL_MAX_DRAW_BUFFERS: 8
-[21:24:13] [Client thread/INFO]: [Shaders] GL_MAX_COLOR_ATTACHMENTS_EXT: 8
-[21:24:13] [Client thread/INFO]: [Shaders] GL_MAX_TEXTURE_IMAGE_UNITS: 32
-[21:24:13] [Client thread/INFO]: [Shaders] Load ShadersMod configuration.
-[21:24:13] [Client thread/INFO]: [Shaders] No shaderpack loaded.
-[21:24:14] [Client thread/INFO]: Reloading ResourceManager: Default, ! Ā§bPotfast 5kay.zip
-[21:24:14] [Client thread/INFO]: [OptiFine] *** Reloading textures ***
-[21:24:14] [Client thread/INFO]: [OptiFine] Resource packs: ! Ā§bPotfast 5kay.zip
-[21:24:14] [Sound Library Loader/INFO]: Starting up SoundSystem...
-[21:24:14] [Thread-7/INFO]: [OptiFine] Version found: I7
-[21:24:14] [Thread-8/INFO]: Initializing LWJGL OpenAL
-[21:24:14] [Thread-8/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org)
-[21:24:14] [Thread-8/INFO]: OpenAL initialized.
-[21:24:14] [Sound Library Loader/INFO]: Sound engine started
-[21:24:15] [Client thread/INFO]: [OptiFine] Sprite size: 32
-[21:24:15] [Client thread/INFO]: [OptiFine] Mipmap levels: 5
-[21:24:15] [Client thread/INFO]: [OptiFine] Multitexture: false
-[21:24:15] [Client thread/INFO]: Created: 2048x2048 textures-atlas
-[21:24:15] [Client thread/INFO]: [OptiFine] *** Reloading custom textures ***
-[21:24:15] [Client thread/INFO]: [OptiFine] Enable face culling: acacia_leaves, birch_leaves, dark_oak_leaves, jungle_leaves, oak_leaves, spruce_leaves
-[21:24:43] [Server thread/INFO]: Starting integrated minecraft server version 1.8.8
-[21:24:43] [Server thread/INFO]: Generating keypair
-[21:24:43] [Server thread/INFO]: Preparing start region for level 0
-[21:24:44] [Server thread/INFO]: Changing view distance to 8, from 10
-[21:24:44] [Server thread/INFO]: Player53[local:E:c11c18cd] logged in with entity id 111 at (16.534366894066594, 79.76950167798101, 703.6625754346197)
-[21:24:44] [Server thread/INFO]: Player53 joined the game
-[21:24:45] [Client thread/INFO]: [CHAT] A new Ā§eOptiFineĀ§f version is available: Ā§eHD Ultra I7Ā§f
-[21:24:45] [Server thread/INFO]: Saving and pausing game...
-[21:24:45] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/Overworld
-[21:24:45] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/Nether
-[21:24:45] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/The End
-[21:24:53] [Client thread/INFO]: [CHAT] Saved screenshot as 2023-06-08_21.24.53.png
-[21:45:03] [Client thread/INFO]: Stopping!
-[21:45:03] [Client thread/INFO]: [Athena] Shutting down client
-[21:45:03] [Client thread/INFO]: SoundSystem shutting down...
-[21:45:03] [Server thread/INFO]: Stopping server
-[21:45:03] [Server thread/INFO]: Saving players
-[21:45:03] [Server thread/INFO]: Saving worlds
-[21:45:03] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/Overworld
-[21:45:03] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/Nether
-[21:45:03] [Server thread/INFO]: Saving chunks for level 'Copy of Copy of mcpworldppdsa|'/The End
-[21:45:03] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
+[23:27:09] [Client thread/INFO]: Setting user: Player246
+[23:27:09] [Client thread/INFO]: (Session ID is token:0:Player246)
+[23:27:10] [Client thread/INFO]: [OptiFine] *** Reflector Forge ***
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.Attributes
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: mods.betterfoliage.client.BetterFoliageClient
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.asm.transformers.BlamingTransformer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.world.ChunkWatchEvent$UnWatch
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.relauncher.CoreModManager
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.DimensionManager
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.GuiScreenEvent$DrawScreenEvent$Pre
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.GuiScreenEvent$DrawScreenEvent$Post
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.EntityViewRenderEvent$CameraSetup
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.EntityViewRenderEvent$FogColors
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.Event
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.EventBus
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.eventhandler.Event$Result
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.property.ExtendedBlockState
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.FMLClientHandler
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.common.FMLCommonHandler
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.biome.BiomeGenBase.getWaterColorMultiplier
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.addDestroyEffects
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.addHitEffects
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.canCreatureSpawn
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.canRenderInLayer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.doesSideBlockRendering
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.getBedDirection
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.getExtendedState
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.hasTileEntity
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isAir
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isBed
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isBedFoot
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.block.Block.isSideSolid
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.canRiderInteract
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Field not present: net.minecraft.entity.Entity.captureDrops
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Field not present: net.minecraft.entity.Entity.capturedDrops
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.shouldRenderInPass
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.entity.Entity.shouldRiderSit
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.ForgeEventFactory
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.ForgeHooks
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.ForgeHooksClient
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.getDurabilityForDisplay
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.getModel
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.onEntitySwing
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.shouldCauseReequipAnimation
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.Item.showDurabilityBar
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.item.ItemRecord.getRecordResource
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.ForgeModContainer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.potion.PotionEffect.isCurativeItem
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.canRenderBreaking
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.getRenderBoundingBox
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.hasFastRenderer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.tileentity.TileEntity.shouldRenderInPass
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.preDrawBatch
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.drawBatch
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.vertex.VertexFormatElement$EnumUsage.preDraw
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.client.renderer.vertex.VertexFormatElement$EnumUsage.postDraw
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.World.countEntities
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.World.getPerWorldStorage
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getCloudRenderer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getSkyRenderer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Method not present: net.minecraft.world.WorldProvider.getWeatherRenderer
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.GuiModList
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.IColoredBakedQuad
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.property.IExtendedBlockState
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.IRenderHandler
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.ISmartBlockModel
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.ItemModelMesherForge
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraft.launchwrapper.Launch
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.pipeline.LightUtil
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.common.MinecraftForge
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.MinecraftForgeClient
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.model.ModelLoader
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderBlockOverlayEvent$OverlayType
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.registry.RenderingRegistry
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderItemInFrameEvent
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Pre
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Post
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Specials$Pre
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.client.event.RenderLivingEvent$Specials$Post
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.fml.client.SplashProgress
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: net.minecraftforge.event.world.WorldEvent$Load
+[23:27:10] [Client thread/INFO]: [OptiFine] *** Reflector Vanilla ***
+[23:27:10] [Client thread/INFO]: [OptiFine] (Reflector) Class not present: optifine.OptiFineClassTransformer
+[23:27:13] [Client thread/ERROR]: [Athena] Failed to load resource outside namespace (C:\Users\remig\Desktop\Athena-Client\workspace\.\assets\minecraft\Athena\gui\settings.png).javax.imageio.IIOException: Can't read input file!
+[23:27:13] [Client thread/WARN]: [Athena] Tried accessing non-existing module: theme
+[23:27:13] [Client thread/WARN]: [Athena] Loaded config default with left over setting theme which is no longer used.
+[23:27:13] [Client thread/INFO]: LWJGL Version: 2.9.4
+[23:27:14] [Client thread/INFO]: [OptiFine]
+[23:27:14] [Client thread/INFO]: [OptiFine] OptiFine_1.8.8_HD_U_H8
+[23:27:14] [Client thread/INFO]: [OptiFine] Build: null
+[23:27:14] [Client thread/INFO]: [OptiFine] OS: Windows 10 (amd64) version 10.0
+[23:27:14] [Client thread/INFO]: [OptiFine] Java: 1.8.0_202, Oracle Corporation
+[23:27:14] [Client thread/INFO]: [OptiFine] VM: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
+[23:27:14] [Client thread/INFO]: [OptiFine] LWJGL: 2.9.4
+[23:27:14] [Client thread/INFO]: [OptiFine] OpenGL: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2, version 4.6.0 NVIDIA 532.03, NVIDIA Corporation
+[23:27:14] [Client thread/INFO]: [OptiFine] OpenGL Version: 4.6.0
+[23:27:14] [Client thread/INFO]: [OptiFine] Maximum texture size: 32768x32768
+[23:27:14] [Thread-7/INFO]: [OptiFine] Checking for new version
+[23:27:14] [Client thread/INFO]: [Shaders] ShadersMod version: 2.4.12
+[23:27:14] [Client thread/INFO]: [Shaders] OpenGL Version: 4.6.0 NVIDIA 532.03
+[23:27:14] [Client thread/INFO]: [Shaders] Vendor: NVIDIA Corporation
+[23:27:14] [Client thread/INFO]: [Shaders] Renderer: NVIDIA GeForce RTX 2080 SUPER/PCIe/SSE2
+[23:27:14] [Client thread/INFO]: [Shaders] Capabilities: 2.0 2.1 3.0 3.2 4.0
+[23:27:14] [Client thread/INFO]: [Shaders] GL_MAX_DRAW_BUFFERS: 8
+[23:27:14] [Client thread/INFO]: [Shaders] GL_MAX_COLOR_ATTACHMENTS_EXT: 8
+[23:27:14] [Client thread/INFO]: [Shaders] GL_MAX_TEXTURE_IMAGE_UNITS: 32
+[23:27:14] [Client thread/INFO]: [Shaders] Load ShadersMod configuration.
+[23:27:14] [Client thread/INFO]: [Shaders] No shaderpack loaded.
+[23:27:14] [Client thread/INFO]: Reloading ResourceManager: Default, ! Ā§bPotfast 5kay.zip
+[23:27:14] [Client thread/INFO]: [OptiFine] *** Reloading textures ***
+[23:27:14] [Client thread/INFO]: [OptiFine] Resource packs: ! Ā§bPotfast 5kay.zip
+[23:27:14] [Sound Library Loader/INFO]: Starting up SoundSystem...
+[23:27:14] [Thread-7/INFO]: [OptiFine] Version found: I7
+[23:27:14] [Thread-8/INFO]: Initializing LWJGL OpenAL
+[23:27:14] [Thread-8/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org)
+[23:27:14] [Thread-8/INFO]: OpenAL initialized.
+[23:27:15] [Sound Library Loader/INFO]: Sound engine started
+[23:27:15] [Client thread/INFO]: [OptiFine] Sprite size: 32
+[23:27:15] [Client thread/INFO]: [OptiFine] Mipmap levels: 5
+[23:27:15] [Client thread/INFO]: [OptiFine] Multitexture: false
+[23:27:16] [Client thread/INFO]: Created: 2048x2048 textures-atlas
+[23:27:16] [Client thread/INFO]: [OptiFine] *** Reloading custom textures ***
+[23:27:16] [Client thread/INFO]: [OptiFine] Enable face culling: acacia_leaves, birch_leaves, dark_oak_leaves, jungle_leaves, oak_leaves, spruce_leaves
+[23:27:22] [Client thread/INFO]: Connecting to eu.minemen.club, 25565
+[23:27:25] [Client thread/INFO]: [CHAT]
+[23:27:25] [Client thread/INFO]: [CHAT] Minemen Club
+[23:27:25] [Client thread/INFO]: [CHAT] ā Website: minemen.club
+[23:27:25] [Client thread/INFO]: [CHAT] ā Store: store.minemen.club
+[23:27:25] [Client thread/INFO]: [CHAT] ā Discord: minemen.club/discord
+[23:27:25] [Client thread/INFO]: [CHAT] ā Twitter: twitter.com/Minemen_Network
+[23:27:25] [Client thread/INFO]: [CHAT] ā Rules: minemen.club/rules
+[23:27:25] [Client thread/INFO]: [CHAT]
+[23:27:25] [Client thread/INFO]: [CHAT] A new Ā§eOptiFineĀ§f version is available: Ā§eHD Ultra I7Ā§f
+[23:27:25] [Client thread/INFO]: [CHAT] Club Ā» ziue joined.
+[23:27:25] [Client thread/INFO]: [CHAT] [ā·] ziue has joined the lobby!
+[23:27:28] [Client thread/INFO]: [CHAT] You've been added to the EU Practice queue.
+[23:27:28] [Client thread/INFO]: [CHAT] You're now being sent to EU Practice.
+[23:27:29] [Client thread/INFO]: [CHAT]
+[23:27:29] [Client thread/INFO]: [CHAT] EU Practice
+[23:27:29] [Client thread/INFO]: [CHAT] 1v1s, Parties, Events
+[23:27:29] [Client thread/INFO]: [CHAT] 15+ Games & Duels
+[23:27:29] [Client thread/INFO]: [CHAT]
+[23:27:29] [Client thread/INFO]: [CHAT] ā To duel a friend, do: /duel [their name].
+[23:27:29] [Client thread/INFO]: [CHAT] ā To quick play, right click with your sword.
+[23:27:29] [Client thread/INFO]: [CHAT] ā To edit a kit, right click with your book.
+[23:27:29] [Client thread/INFO]: [CHAT]
+[23:27:29] [Client thread/INFO]: [CHAT] N0tS4vy: macaric081
+[23:27:31] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: KEY & MOUSE LIVE [FR] : https://www.youtube.com/watch?v=3uoSfnO7eFs&ab_channel=StandMi
+[23:27:32] [Client thread/INFO]: [CHAT] macaric081: e
+[23:27:33] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: gg
+[23:27:33] [Client thread/INFO]: [CHAT] N0tS4vy: 1v1
+[23:27:36] [Client thread/INFO]: [CHAT] sirojcito: ???
+[23:27:38] [Client thread/INFO]: [CHAT] iridiska210: clown
+[23:27:39] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:27:44] [Client thread/INFO]: [CHAT] N0tS4vy: macaric 1v1
+[23:27:48] [Client thread/INFO]: [CHAT] Neeyo__14: ?
+[23:27:48] [Client thread/INFO]: [CHAT] CCL: yo'
+[23:27:51] [Client thread/INFO]: [CHAT] SamThing_: gg
+[23:27:56] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: KEY & MOUSE LIVE [FR] : https://www.youtube.com/watch?v=3uoSfnO7eFs&ab_channel=StandMi
+[23:27:57] [Client thread/INFO]: [CHAT] ceyio: NOO
+[23:27:59] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:27:59] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:28:01] [Client thread/INFO]: [CHAT] ceyio: italiani duellate ;()()()()
+[23:28:02] [Client thread/INFO]: [CHAT] N0tS4vy: maca 1v1
+[23:28:04] [Client thread/INFO]: [CHAT] Pznic: gg
+[23:28:06] [Client thread/INFO]: [CHAT] Talhaww: stop spam
+[23:28:13] [Client thread/INFO]: [CHAT] Neeyo__14: ?
+[23:28:17] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:28:17] [Client thread/INFO]: [CHAT] Jshal: YOU ARE ON 600 PING
+[23:28:18] [Client thread/INFO]: [CHAT]
+[23:28:18] [Client thread/INFO]: [CHAT] [MMC] Need /disguise? Buy ACE Rank: store.minemen.club
+[23:28:18] [Client thread/INFO]: [CHAT]
+[23:28:20] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:28:21] [Client thread/INFO]: [CHAT] Jshal: HOW AM I MEANT TO FIGHT YOU
+[23:28:22] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:28:22] [Client thread/INFO]: [CHAT] [ā] Snugglly: LOL
+[23:28:24] [Client thread/INFO]: [CHAT] zaweez165: push
+[23:28:24] [Client thread/INFO]: [CHAT] That player is not in spawn.
+[23:28:28] [Client thread/INFO]: [CHAT] ceyio: breo
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:31] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] EventBus - Failed supplying subscribed event rip.athena.client.events.types.render.RenderEvent to rip.athena.client.modules.impl.other.AimTrainer.onTick.
+[23:28:32] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:32] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:33] [Client thread/INFO]: [CHAT] MeowXx_: XD
+[23:28:34] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:34] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:35] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:35] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:36] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 1
+[23:28:36] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:36] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:36] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:37] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:37] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:38] [Client thread/INFO]: [CHAT] zaweez165: bro coming
+[23:28:38] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:38] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:39] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:39] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:40] [Client thread/INFO]: [CHAT] macaric081: gg
+[23:28:40] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:40] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:41] [Client thread/INFO]: [CHAT] tcmek: 7HUB
+[23:28:42] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 2
+[23:28:42] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:44] [Client thread/INFO]: [CHAT] SpammerRod: WorldsBestRodder for real you blink for that xd
+[23:28:44] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:44] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:46] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:46] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:47] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:47] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:48] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:28:48] [Client thread/INFO]: [CHAT] wkvl: NIKE ZEBI
+[23:28:48] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:48] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:50] [Client thread/INFO]: [CHAT] daredcorgi13184: shittt
+[23:28:52] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:52] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:52] [Client thread/INFO]: [CHAT] efealmac2000: SO BAD
+[23:28:53] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:53] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:55] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:55] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:56] [Client thread/INFO]: [Athena] you have hit the bot
+[23:28:56] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:28:57] [Client thread/INFO]: [CHAT] Wolfato: BRU
+[23:28:59] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:29:00] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: ahah vabe trollo
+[23:29:01] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:01] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:01] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 3
+[23:29:01] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:02] [Client thread/INFO]: [CHAT] MeowXx_: d sad
+[23:29:03] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 4
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 5
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 6
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 7
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 8
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [CHAT] Qadoi: 2023
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 9
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 10
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 11
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 12
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:03] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 13
+[23:29:03] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [CHAT] __GodWalk__: 2v2 fireball
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 14
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 15
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 16
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 17
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 18
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 19
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 94.74%
+[23:29:04] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [CHAT]
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 20
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 100.0%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 21
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 95.24%
+[23:29:04] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 22
+[23:29:04] [Client thread/INFO]: [Athena] Accuracy: 90.91%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 23
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 86.96%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 24
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 83.33%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 25
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 80.0%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 26
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 76.92%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 27
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 74.07%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 28
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 71.43%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 29
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 68.97%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 30
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 66.67%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 31
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 64.52%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 32
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 62.5%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 33
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 60.61%
+[23:29:05] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 63.64%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 34
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 61.76%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 35
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 60.0%
+[23:29:05] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 36
+[23:29:05] [Client thread/INFO]: [Athena] Accuracy: 58.33%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 37
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 56.76%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 38
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 55.26%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 39
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 53.85%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 40
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 52.5%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 41
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 51.22%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 42
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 50.0%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 43
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 48.84%
+[23:29:06] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 51.16%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 44
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 50.0%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 45
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 48.89%
+[23:29:06] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 46
+[23:29:06] [Client thread/INFO]: [Athena] Accuracy: 47.83%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 47
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 46.81%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 48
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 45.83%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 49
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 44.9%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 50
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 44.0%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 51
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 43.14%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 52
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 42.31%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 53
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 41.51%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 54
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 40.74%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 55
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 40.0%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 56
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 39.29%
+[23:29:07] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 57
+[23:29:07] [Client thread/INFO]: [Athena] Accuracy: 38.6%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 58
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 37.93%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 59
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 37.29%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 60
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 36.67%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 61
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 36.07%
+[23:29:08] [Client thread/INFO]: [CHAT] N0tS4vy: di ocane
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 62
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 35.48%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 63
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 34.92%
+[23:29:08] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 36.51%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 64
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 35.94%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 65
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 35.38%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 66
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 34.85%
+[23:29:08] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 67
+[23:29:08] [Client thread/INFO]: [Athena] Accuracy: 34.33%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 68
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 33.82%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 69
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 33.33%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 70
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 32.86%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 71
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 32.39%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 72
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 31.94%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 73
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 31.51%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 74
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 31.08%
+[23:29:09] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 32.43%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 75
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 32.0%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 76
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 31.58%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 77
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 31.17%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 78
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 30.77%
+[23:29:09] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 79
+[23:29:09] [Client thread/INFO]: [Athena] Accuracy: 30.38%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 80
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 30.0%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 81
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 29.63%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 82
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 29.27%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 83
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.92%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 84
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.57%
+[23:29:10] [Client thread/INFO]: [CHAT] Ispettore_G0d: BLUEOG_ sei un trollerino
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 85
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.24%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 86
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 27.91%
+[23:29:10] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 29.07%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 87
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.74%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 88
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.41%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 89
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 28.09%
+[23:29:10] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 90
+[23:29:10] [Client thread/INFO]: [Athena] Accuracy: 27.78%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 91
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 27.47%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 92
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 27.17%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 93
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 26.88%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 94
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 26.6%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 95
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 26.32%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 96
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 26.04%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 97
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 25.77%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 98
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 25.51%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 99
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 25.25%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 100
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 25.0%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 101
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 24.75%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 102
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 24.51%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 103
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 24.27%
+[23:29:11] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 104
+[23:29:11] [Client thread/INFO]: [Athena] Accuracy: 24.04%
+[23:29:12] [Client thread/INFO]: [Athena] you have hit the bot
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 25.0%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 105
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 24.76%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 106
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 24.53%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 107
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 24.3%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 108
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 24.07%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 109
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 23.85%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 110
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 23.64%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 111
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 23.42%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 112
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 23.21%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 113
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 23.01%
+[23:29:12] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 114
+[23:29:12] [Client thread/INFO]: [Athena] Accuracy: 22.81%
+[23:29:12] [Client thread/INFO]: [CHAT] WindBoi: gg
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 115
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 22.61%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 116
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 22.41%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 117
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 22.22%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 118
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 22.03%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 119
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 21.85%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 120
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 21.67%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 121
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 21.49%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 122
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 21.31%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 123
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 21.14%
+[23:29:13] [Client thread/INFO]: [Athena] YOU MISSED A HIT: 124
+[23:29:13] [Client thread/INFO]: [Athena] Accuracy: 20.97%
+[23:29:15] [Client thread/INFO]: [CHAT] joeyplayzmc12: go easy
+[23:29:18] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: ciao ispe
+[23:29:19] [Client thread/INFO]: [CHAT] macaric081: gg
+[23:29:20] [Client thread/INFO]: [CHAT] Kenshiwnn: me BestEngland2
+[23:29:22] [Client thread/INFO]: [CHAT] Ispettore_G0d: ciao blue :D
+[23:29:23] [Client thread/INFO]: [CHAT] N0tS4vy: Ispettore_G0d ho l'onore di fare 1v1?
+[23:29:23] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:29:25] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: gf
+[23:29:26] [Client thread/INFO]: [CHAT] Kyoouh: plugtsar sayer laisse 1v1 nan
+[23:29:27] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:29:27] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:29:28] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: KEY & MOUSE LIVE [FR] : https://www.youtube.com/watch?v=3uoSfnO7eFs&ab_channel=StandMi
+[23:29:31] [Client thread/INFO]: [CHAT] Ispettore_G0d: nah N0tS4vy
+[23:29:33] [Client thread/INFO]: [CHAT] xEnesR: gg
+[23:29:33] [Client thread/INFO]: [CHAT] Sqaky: gg
+[23:29:34] [Client thread/INFO]: [CHAT] H_yper: gg
+[23:29:34] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:29:37] [Client thread/INFO]: [CHAT] Kenshiwnn: BestEngland2 im in 1
+[23:29:39] [Client thread/INFO]: [CHAT] Wappell: fuck u
+[23:29:46] [Client thread/INFO]: [CHAT] Talhaww: stop spam
+[23:29:47] [Client thread/INFO]: [CHAT] RRevengge: is hypixel down
+[23:29:47] [Client thread/INFO]: [CHAT] N0tS4vy: Ispettore_G0d mi apri ma voglio provare
+[23:29:49] [Client thread/INFO]: [CHAT] 9bearr: gg
+[23:29:52] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:29:53] [Client thread/INFO]: [CHAT] Kenshiwnn: BestEngland2 im in q....
+[23:29:54] [Client thread/INFO]: [CHAT] Scyphe_: howe
+[23:29:57] [Client thread/INFO]: [CHAT] ceyio: lefit
+[23:29:57] [Client thread/INFO]: [CHAT] Ispettore_G0d: N0tS4vy c'ĆØ ryanfth che sta in q nelle invaded unranked
+[23:30:04] [Client thread/INFO]: [CHAT] GLOKK9NA: Kyoouh viens vocal
+[23:30:05] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:30:06] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:30:06] [Client thread/INFO]: [CHAT]
+[23:30:06] [Client thread/INFO]: [CHAT] ā 9263 was banned by AntiGamingChair for Unfair Advantage.
+[23:30:06] [Client thread/INFO]: [CHAT]
+[23:30:08] [Client thread/INFO]: [CHAT] Kyoouh: nanh jai 12and
+[23:30:08] [Client thread/INFO]: [CHAT] Talhaww: d____b 0 wtap wins
+[23:30:09] [Client thread/INFO]: [CHAT] N0tS4vy: e quindi?
+[23:30:11] [Client thread/INFO]: [CHAT] xwvho_: LOL
+[23:30:15] [Client thread/INFO]: [CHAT] 9bearr: regalo vip a chi mi batte in boxing
+[23:30:18] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:30:18] [Client thread/INFO]: [CHAT]
+[23:30:18] [Client thread/INFO]: [CHAT] [MMC] Need support? Create a ticket: minemen.club/tickets
+[23:30:18] [Client thread/INFO]: [CHAT]
+[23:30:19] [Client thread/INFO]: [CHAT] ceyio: cheatto
+[23:30:20] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:30:21] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:30:23] [Client thread/INFO]: [CHAT] SchwebbThePlant: GG
+[23:30:26] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:30:27] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:30:28] [Client thread/INFO]: [CHAT] N0tS4vy: macaric081 1v1
+[23:30:28] [Client thread/INFO]: [CHAT] Kenshiwnn: BestEngland2 im in q....
+[23:30:30] [Client thread/INFO]: [CHAT] Blissolic, Blixtrob
+[23:30:30] [Client thread/INFO]: [CHAT]
+[23:30:30] [Client thread/INFO]: [CHAT] Blissolic vs. Karmousa
+[23:30:30] [Client thread/INFO]: [CHAT] ā Type: Unranked Bed Fight
+[23:30:30] [Client thread/INFO]: [CHAT] ā Duration: 01:01
+[23:30:30] [Client thread/INFO]: [CHAT] ā Map: Castle
+[23:30:30] [Client thread/INFO]: [CHAT]
+[23:30:31] [Client thread/INFO]: [CHAT] 9bearr: regalo vip a chi mi batte in boxing -
+[23:30:33] [Client thread/INFO]: [CHAT] You aren't at spawn.
+[23:30:34] [Client thread/INFO]: [CHAT] Hurf: ĆL
+[23:30:35] [Client thread/INFO]: [CHAT] [ā·] Clqps ŪŖŪ«āŪ°ŪŖŪ«: damn u good
+[23:30:36] [Client thread/INFO]: [CHAT] Blissolic was killed!
+[23:30:40] [Client thread/INFO]: [CHAT] oCritz started spectating.
+[23:30:46] [Client thread/INFO]: [CHAT] ceyio: tu piu d me
+[23:30:46] [Client thread/INFO]: [CHAT] _Mathy207_: AyoSeba mmh stacco ti do un consiglio allenati :D
+[23:30:47] [Client thread/INFO]: [CHAT] SchwebbThePlant: dang]
+[23:30:47] [Client thread/INFO]: [CHAT] You aren't at spawn.
+[23:30:48] [Client thread/INFO]: [CHAT] Karmousa was killed by Blissolic! FINAL KILL
+[23:30:48] [Client thread/INFO]: [CHAT]
+[23:30:48] [Client thread/INFO]: [CHAT] Match Results (click player to view):
+[23:30:48] [Client thread/INFO]: [CHAT] Winner: Blissolic ā Loser: Karmousa
+[23:30:48] [Client thread/INFO]: [CHAT]
+[23:30:48] [Client thread/INFO]: [CHAT] Spectators (3): ziue, AGPS, oCritz
+[23:30:50] [Client thread/INFO]: [CHAT] 9bearr: N0tS4vy boxing
+[23:30:50] [Client thread/INFO]: [CHAT] You aren't at spawn.
+[23:30:51] [Client thread/INFO]: [CHAT] ItsStaZie29: ciao
+[23:30:53] [Client thread/INFO]: [CHAT]
+[23:30:53] [Client thread/INFO]: [CHAT] Sent Request
+[23:30:53] [Client thread/INFO]: [CHAT] ā To: Blissolic
+[23:30:53] [Client thread/INFO]: [CHAT] ā Kit: Bed Fight
+[23:30:53] [Client thread/INFO]: [CHAT] ā Map: City
+[23:30:53] [Client thread/INFO]: [CHAT]
+[23:30:55] [Client thread/INFO]: [CHAT] AyoSeba: sono le 11
+[23:30:55] [Client thread/INFO]: [CHAT] [ā½] BreakingBadCr: Accept YOUR duels! https://www.twitch.tv/newshengen
+[23:30:58] [Client thread/INFO]: [CHAT] Kenshiwnn: mhmhm
+[23:30:59] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:30:59] [Client thread/INFO]: [CHAT] N0tS4vy: macaric081 1v1
+[23:31:00] [Client thread/INFO]: [CHAT] 9bearr: 1 sec
+[23:31:00] [Client thread/INFO]: [CHAT] MeowXx_: g
+[23:31:01] [Client thread/INFO]: [CHAT]
+[23:31:01] [Client thread/INFO]: [CHAT] Bed Fight Duel
+[23:31:01] [Client thread/INFO]: [CHAT] ā Map: City
+[23:31:01] [Client thread/INFO]: [CHAT] ā Opponent: Blissolic
+[23:31:01] [Client thread/INFO]: [CHAT] ā Ping: 7 ms
+[23:31:01] [Client thread/INFO]: [CHAT]
+[23:31:01] [Client thread/INFO]: [CHAT] 5...
+[23:31:02] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:31:02] [Client thread/INFO]: [CHAT] Hazdeman1665: u good
+[23:31:02] [Client thread/INFO]: [CHAT] 4...
+[23:31:03] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:03] [Client thread/INFO]: [CHAT] AyoSeba: alle 5 gioco 10 volte meglio
+[23:31:03] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:03] [Client thread/INFO]: [CHAT] AGPS started spectating.
+[23:31:03] [Client thread/INFO]: [CHAT] 3...
+[23:31:04] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:04] [Client thread/INFO]: [CHAT] 2...
+[23:31:04] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:05] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:05] [Client thread/INFO]: [CHAT] 9bearr: vai
+[23:31:05] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:05] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:05] [Client thread/INFO]: [CHAT] 1...
+[23:31:05] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:06] [Client thread/INFO]: [CHAT] The match has started!
+[23:31:06] [Client thread/INFO]: [CHAT]
+[23:31:06] [Client thread/INFO]: [CHAT] Bed Fight
+[23:31:06] [Client thread/INFO]: [CHAT] Break the other team's bed and eliminate them!
+[23:31:06] [Client thread/INFO]: [CHAT]
+[23:31:12] [Client thread/INFO]: [CHAT] ceyio: NOO
+[23:31:15] [Client thread/INFO]: [CHAT] SchwebbThePlant: noo
+[23:31:17] [Client thread/INFO]: [CHAT] xt3m: nc cheats
+[23:31:19] [Client thread/INFO]: [CHAT] _Mathy207_: AyoSeba devo fare altre cose non posso stare 24h su mc
+[23:31:20] [Client thread/INFO]: [CHAT] [ā] JustW: helo
+[23:31:20] [Client thread/INFO]: [CHAT] qefogkr: bro didnt sort
+[23:31:23] [Client thread/INFO]: [CHAT] qefogkr: my invvv
+[23:31:24] [Client thread/INFO]: [CHAT] Audi_RS7: GG
+[23:31:24] [Client thread/INFO]: [CHAT] [ā] JustW: hala city
+[23:31:26] [Client thread/INFO]: [CHAT] _Mathy207_: AyoSeba se lo dici tu
+[23:31:28] [Client thread/INFO]: [CHAT] bonniebleuv2: gg
+[23:31:29] [Client thread/INFO]: [CHAT] MioFratello: JosipL cmon
+[23:31:30] [Client thread/INFO]: [CHAT] _Mathy207_: AyoSeba bb
+[23:31:31] [Client thread/INFO]: [CHAT] mcdonaldperry: GG
+[23:31:32] [Client thread/INFO]: [CHAT] ViperSlayer007: gg
+[23:31:32] [Client thread/INFO]: [CHAT] Abde_Nnour: wow
+[23:31:33] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:33] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:33] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:33] [Client thread/INFO]: [CHAT] You can't place there.
+[23:31:36] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:31:36] [Client thread/INFO]: [CHAT] lil_rapstar: ?:
+[23:31:40] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:31:40] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:31:40] [Client thread/INFO]: [CHAT] ProHacks: enough
+[23:31:41] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:31:42] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:31:43] [Client thread/INFO]: [CHAT] You have respawned.
+[23:31:43] [Client thread/INFO]: [CHAT] ceyio: e z
+[23:31:44] [Client thread/INFO]: [CHAT] qefogkr: my invvv
+[23:31:44] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:31:45] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:31:46] [Client thread/INFO]: [CHAT] Talhaww: no spa tgotunuzu ticem
+[23:31:46] [Client thread/INFO]: [CHAT] Abde_Nnour: toxic
+[23:31:48] [Client thread/INFO]: [CHAT] Audi_RS7: G
+[23:31:48] [Client thread/INFO]: [CHAT] JusTRicky: g
+[23:31:49] [Client thread/INFO]: [CHAT] Incomandavel: gapple
+[23:31:50] [Client thread/INFO]: [CHAT] lil_rapstar: me?
+[23:31:53] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:31:53] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:31:53] [Client thread/INFO]: [CHAT]
+[23:31:53] [Client thread/INFO]: [CHAT] Event
+[23:31:53] [Client thread/INFO]: [CHAT] ā Players: 0
+[23:31:53] [Client thread/INFO]: [CHAT] ā Event: Sumo 1v1
+[23:31:53] [Client thread/INFO]: [CHAT] ā Host: JustW
+[23:31:53] [Client thread/INFO]: [CHAT] Ā§aĀ§l[CLICK TO JOIN]
+[23:31:53] [Client thread/INFO]: [CHAT]
+[23:31:54] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:31:55] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:31:56] [Client thread/INFO]: [CHAT] You have respawned.
+[23:31:56] [Client thread/INFO]: [CHAT] ceyio: italiani duellate ;()()()()
+[23:32:00] [Client thread/INFO]: [CHAT] Club Ā» TerrellOwel joined.
+[23:32:00] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:32:02] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:32:02] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:32:03] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:32:04] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:32:04] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:32:05] [Client thread/INFO]: [CHAT] You have respawned.
+[23:32:08] [Client thread/INFO]: [CHAT]
+[23:32:08] [Client thread/INFO]: [CHAT] Event
+[23:32:08] [Client thread/INFO]: [CHAT] ā Players: 11
+[23:32:08] [Client thread/INFO]: [CHAT] ā Event: Sumo 1v1
+[23:32:08] [Client thread/INFO]: [CHAT] ā Host: JustW
+[23:32:08] [Client thread/INFO]: [CHAT] Ā§aĀ§l[CLICK TO JOIN]
+[23:32:08] [Client thread/INFO]: [CHAT]
+[23:32:09] [Client thread/ERROR]: Item entity 3910344 has no item?!
+[23:32:09] [Client thread/ERROR]: Item entity 3910344 has no item?!
+[23:32:12] [Client thread/INFO]: [CHAT] Mister_Iron: reaL
+[23:32:14] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:32:15] [Client thread/INFO]: [CHAT] Abde_Nnour: e z
+[23:32:18] [Client thread/INFO]: [CHAT]
+[23:32:18] [Client thread/INFO]: [CHAT] [Practice] Want to play with a friend? Use /duel
+[23:32:18] [Client thread/INFO]: [CHAT]
+[23:32:19] [Client thread/INFO]: [CHAT] lil_rapstar: why
+[23:32:20] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: gg
+[23:32:23] [Client thread/INFO]: [CHAT]
+[23:32:23] [Client thread/INFO]: [CHAT] Event
+[23:32:23] [Client thread/INFO]: [CHAT] ā Players: 20
+[23:32:23] [Client thread/INFO]: [CHAT] ā Event: Sumo 1v1
+[23:32:23] [Client thread/INFO]: [CHAT] ā Host: JustW
+[23:32:23] [Client thread/INFO]: [CHAT] Ā§aĀ§l[CLICK TO JOIN]
+[23:32:23] [Client thread/INFO]: [CHAT]
+[23:32:25] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:32:25] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:32:26] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:32:26] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: StandMi 1v1 nodebuff?
+[23:32:27] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:32:28] [Client thread/INFO]: [CHAT] You have respawned.
+[23:32:31] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§bRollRealQuickĀ§e wants you to play! (Join)
+[23:32:38] [Client thread/INFO]: [CHAT]
+[23:32:38] [Client thread/INFO]: [CHAT] ā Incomandavel was banned by AntiGamingChair for Unfair Advantage.
+[23:32:38] [Client thread/INFO]: [CHAT]
+[23:32:38] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:32:38] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:32:38] [Client thread/INFO]: [CHAT]
+[23:32:38] [Client thread/INFO]: [CHAT] Event
+[23:32:38] [Client thread/INFO]: [CHAT] ā Players: 25
+[23:32:38] [Client thread/INFO]: [CHAT] ā Event: Sumo 1v1
+[23:32:38] [Client thread/INFO]: [CHAT] ā Host: JustW
+[23:32:38] [Client thread/INFO]: [CHAT] Ā§aĀ§l[CLICK TO JOIN]
+[23:32:38] [Client thread/INFO]: [CHAT]
+[23:32:39] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:32:40] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:32:41] [Client thread/INFO]: [CHAT] You have respawned.
+[23:32:45] [Client thread/INFO]: [CHAT] oCritz started spectating.
+[23:32:46] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:32:49] [Client thread/INFO]: [CHAT] [ā] StandMi āøØ.Champion.āø©: KEY & MOUSE LIVE [FR] : https://www.youtube.com/watch?v=3uoSfnO7eFs&ab_channel=StandMi
+[23:32:54] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§bRollRealQuickĀ§e wants you to play! (Join)
+[23:32:56] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:32:56] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:32:57] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:32:58] [Client thread/INFO]: [CHAT] [ā·] Clqps ŪŖŪ«āŪ°ŪŖŪ«: QUEUE UNRANKED SKYAWRS
+[23:32:58] [Client thread/INFO]: [CHAT] AiYukiii: szamy tu pues la merde
+[23:32:58] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:32:58] [Client thread/INFO]: [CHAT] MeowXx_: gg
+[23:32:59] [Client thread/INFO]: [CHAT] 9bearr: gg
+[23:32:59] [Client thread/INFO]: [CHAT] You have respawned.
+[23:33:00] [Client thread/INFO]: [CHAT] Axysvl: Ć¹
+[23:33:06] [Client thread/INFO]: [CHAT] cserrbyy: non ti farmare ogni 3 secondi perĆ²
+[23:33:07] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:33:10] [Client thread/INFO]: [CHAT] oNotYou: no
+[23:33:11] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:33:12] [Client thread/INFO]: [CHAT] _Haribooo: gg
+[23:33:15] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:15] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:18] [Client thread/INFO]: [CHAT] 9bearr: REGALO VIP A CHI MI BATTE BOXING =
+[23:33:22] [Client thread/INFO]: [CHAT] cserrbyy: accetta
+[23:33:25] [Client thread/INFO]: [CHAT] iridiska210: xd
+[23:33:25] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: porcodio ho sbagliato
+[23:33:26] [Client thread/INFO]: [CHAT] cserrbyy: mi sto riscaldando
+[23:33:31] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:33:31] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:33:32] [Client thread/INFO]: [CHAT] Skowzk: bro all ppl in this server i
+[23:33:32] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:33:33] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:33:34] [Client thread/INFO]: [CHAT] You have respawned.
+[23:33:35] [Client thread/INFO]: [CHAT] Skowzk: use a autoclick
+[23:33:36] [Client thread/INFO]: [CHAT] 9bearr: cserrbyy hai perso dopo ti riduello
+[23:33:43] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:33:46] [Client thread/INFO]: [CHAT] Talhaww: spammer
+[23:33:47] [Client thread/INFO]: [CHAT] [ā·] Clqps ŪŖŪ«āŪ°ŪŖŪ«: QUEUE UNRANKED SKYAWRS
+[23:33:47] [Client thread/INFO]: [CHAT] Audi_RS7: wtf
+[23:33:47] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:48] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:49] [Client thread/INFO]: [CHAT] ateerek: gapple
+[23:33:51] [Client thread/INFO]: [CHAT] Audi_RS7: 600ms
+[23:33:51] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:52] [Client thread/INFO]: [CHAT] You can't place there.
+[23:33:54] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: be?
+[23:33:57] [Client thread/INFO]: [CHAT] BaZooka12: gf
+[23:34:00] [Client thread/INFO]: [CHAT] Dietxh: Dietxh
+[23:34:00] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:34:00] [Client thread/INFO]: [CHAT] Respawning in 3...
+[23:34:01] [Client thread/INFO]: [CHAT] Respawning in 2...
+[23:34:02] [Client thread/INFO]: [CHAT] Respawning in 1...
+[23:34:03] [Client thread/INFO]: [CHAT] You have respawned.
+[23:34:05] [Client thread/INFO]: [CHAT] 9bearr: aspee BLUEOG_
+[23:34:07] [Client thread/INFO]: [CHAT] Sqaky: gf
+[23:34:08] [Client thread/INFO]: [CHAT] 9bearr: dopo di lui ti duello
+[23:34:11] [Client thread/INFO]: [CHAT] Blissolic was killed by ziue!
+[23:34:12] [Client thread/INFO]: [CHAT] You can't place there.
+[23:34:14] [Client thread/INFO]: [CHAT] macaric081: gg
+[23:34:15] [Client thread/INFO]: [CHAT] You can't place there.
+[23:34:17] [Client thread/INFO]: [CHAT] Pznic: gg
+[23:34:18] [Client thread/INFO]: [CHAT]
+[23:34:18] [Client thread/INFO]: [CHAT] [MMC] Giveaways, Events, Updates: minemen.club/discord
+[23:34:18] [Client thread/INFO]: [CHAT]
+[23:34:22] [Client thread/INFO]: [CHAT] Razi_Gold: x)
+[23:34:24] [Client thread/INFO]: [CHAT] dontownsyou: ranked nd 0-2
+[23:34:25] [Client thread/ERROR]: Item entity 3920275 has no item?!
+[23:34:25] [Client thread/ERROR]: Item entity 3920275 has no item?!
+[23:34:26] [Client thread/INFO]: [CHAT] Amanogawa__: TTTT
+[23:34:28] [Client thread/ERROR]: Item entity 3920538 has no item?!
+[23:34:28] [Client thread/ERROR]: Item entity 3920538 has no item?!
+[23:34:28] [Client thread/ERROR]: Item entity 3920538 has no item?!
+[23:34:28] [Client thread/ERROR]: Item entity 3920538 has no item?!
+[23:34:29] [Client thread/INFO]: [CHAT] ZokeCat: no mic
+[23:34:33] [Client thread/ERROR]: Item entity 3920970 has no item?!
+[23:34:33] [Client thread/ERROR]: Item entity 3920970 has no item?!
+[23:34:34] [Client thread/ERROR]: Item entity 3921125 has no item?!
+[23:34:34] [Client thread/ERROR]: Item entity 3921125 has no item?!
+[23:34:35] [Client thread/INFO]: [CHAT] Miskafi: sweat
+[23:34:35] [Client thread/INFO]: [CHAT] daredcorgi13184: gg
+[23:34:41] [Client thread/INFO]: [CHAT]
+[23:34:41] [Client thread/INFO]: [CHAT] ā JAVhnsy was banned by AntiGamingChair for Unfair Advantage.
+[23:34:41] [Client thread/INFO]: [CHAT]
+[23:34:42] [Client thread/INFO]: [CHAT] WibbleWoobble: xd
+[23:34:43] [Client thread/INFO]: [CHAT] __GodWalk__: gg
+[23:34:46] [Client thread/INFO]: [CHAT] oBluee: nochmal
+[23:34:46] [Client thread/ERROR]: Item entity 3921946 has no item?!
+[23:34:46] [Client thread/ERROR]: Item entity 3921946 has no item?!
+[23:34:46] [Client thread/INFO]: [CHAT] [ā] BestEngland2 ā¤: RANKED INVADED WIN = LUNAR CLOAK
+[23:34:47] [Client thread/INFO]: [CHAT] Andris12: gg
+[23:34:48] [Client thread/INFO]: [CHAT] JusTRicky: aspe
+[23:34:49] [Client thread/INFO]: [CHAT]
+[23:34:49] [Client thread/INFO]: [CHAT] BED DESTRUCTION > Blue Bed was destroyed by ziue!
+[23:34:49] [Client thread/INFO]: [CHAT]
+[23:34:51] [Client thread/INFO]: [CHAT] Blissolic was killed! FINAL KILL
+[23:34:51] [Client thread/INFO]: [CHAT]
+[23:34:51] [Client thread/INFO]: [CHAT] Match Results (click player to view):
+[23:34:51] [Client thread/INFO]: [CHAT] Winner: ziue ā Loser: Blissolic
+[23:34:51] [Client thread/INFO]: [CHAT]
+[23:34:51] [Client thread/INFO]: [CHAT] Spectators (2): AGPS, oCritz
+[23:34:53] [Client thread/INFO]: [CHAT] [ā·] ziue iāā¹āi: :)
+[23:34:56] [Client thread/INFO]: [CHAT] macaric081: gg
+[23:34:59] [Client thread/INFO]: [CHAT]
+[23:34:59] [Client thread/INFO]: [CHAT] Sent Request
+[23:34:59] [Client thread/INFO]: [CHAT] ā To: Blissolic
+[23:34:59] [Client thread/INFO]: [CHAT] ā Kit: Boxing
+[23:34:59] [Client thread/INFO]: [CHAT] ā Map: Soccer
+[23:34:59] [Client thread/INFO]: [CHAT]
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:00] [Client thread/INFO]: [CHAT] You have already sent a duel request to that player. Please wait until it expires.
+[23:35:02] [Client thread/INFO]: [CHAT] Audi_RS7: i beat an nft
+[23:35:07] [Client thread/INFO]: [CHAT] oBluee: nochmal
+[23:35:10] [Client thread/INFO]: [CHAT] CCL: his ign is def ccl
+[23:35:14] [Client thread/INFO]: [CHAT] WireIess: gf
+[23:35:14] [Client thread/INFO]: [CHAT] oBluee: topfight nochakl
+[23:35:25] [Client thread/INFO]: [CHAT] CaptainChall: i am nft
+[23:35:25] [Client thread/INFO]: [CHAT] NotDestroyet: cringe
+[23:35:25] [Client thread/INFO]: [CHAT] CCL: hola
+[23:35:30] [Client thread/INFO]: [CHAT] Audi_RS7: yes
+[23:35:34] [Client thread/INFO]: [CHAT] Sqaky: ffs
+[23:35:34] [Client thread/INFO]: [CHAT] NotDestroyet: CRINGEEEEEE
+[23:35:36] [Client thread/INFO]: [CHAT] 7wayze: gg
+[23:35:37] [Client thread/INFO]: [CHAT] 9bearr: gg
+[23:35:38] [Client thread/INFO]: [CHAT] mangeurdechat: q sumo
+[23:35:38] [Client thread/INFO]: [CHAT] JavaJakob BEDFIGHT MASTER: gg
+[23:35:40] [Client thread/INFO]: [CHAT] viexuus: ggg
+[23:35:52] [Client thread/INFO]: [CHAT] h6a: gg
+[23:35:53] [Client thread/INFO]: [CHAT] Audi_RS7: nft skin
+[23:35:54] [Client thread/INFO]: [CHAT] Neeyo__14: no rod pls
+[23:35:57] [Client thread/INFO]: [CHAT] Neeyo__14: ?
+[23:35:57] [Client thread/INFO]: [CHAT] Simo809TheZombi3: dio can
+[23:35:59] [Client thread/INFO]: [CHAT] CaptainChall: i agree
+[23:36:02] [Client thread/INFO]: [CHAT] mangeurdechat: q sumo
+[23:36:06] [Client thread/INFO]: [CHAT] NotDestroyet: Qadoi cringe
+[23:36:09] [Client thread/INFO]: [CHAT] CCL: pInG SpOoFiNg!!11!
+[23:36:11] [Client thread/INFO]: [CHAT] bonniebleuv2: gf
+[23:36:12] [Client thread/INFO]: [CHAT] MioFratello: peace
+[23:36:18] [Client thread/INFO]: [CHAT]
+[23:36:18] [Client thread/INFO]: [CHAT] [MMC] Follow for updates: twitter.com/Minemen_Network
+[23:36:18] [Client thread/INFO]: [CHAT]
+[23:36:26] [Client thread/INFO]: [CHAT] Smoouky: a
+[23:36:28] [Client thread/INFO]: [CHAT] POEBEN: yoo
+[23:36:33] [Client thread/INFO]: [CHAT] ZokeCat: ILBxddy_ mi accetti sumo
+[23:36:34] [Client thread/INFO]: [CHAT] ZopreX: gf
+[23:36:36] [Client thread/INFO]: [CHAT] Please enter any additional information:
+[23:36:39] [Client thread/INFO]: [CHAT] Your report was cancelled as you didn't provide a reason within a reasonable amount of time.
+[23:36:44] [Client thread/INFO]: [CHAT] Please enter any additional information:
+[23:36:44] [Client thread/INFO]: [CHAT] Your report has been submitted.
+[23:36:49] [Client thread/INFO]: [CHAT] DavutPvP45: fgkhjlbÅngf
+[23:36:50] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:36:51] [Client thread/INFO]: [CHAT] Babunde: ungyld
+[23:36:52] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:36:53] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:36:54] [Client thread/INFO]: [CHAT] dumpXfolder: sRyaK_ dropped MDRRRRRRRR
+[23:36:54] [Client thread/INFO]: [CHAT] Kawaqh: duel moi xKazeD
+[23:36:54] [Client thread/INFO]: [CHAT] JusTRicky: g
+[23:36:54] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:36:56] [Client thread/INFO]: [CHAT] Blissolic is not in spawn.
+[23:36:58] [Client thread/INFO]: [CHAT]
+[23:36:58] [Client thread/INFO]: [CHAT] Sent Request
+[23:36:58] [Client thread/INFO]: [CHAT] ā To: Blissolic
+[23:36:58] [Client thread/INFO]: [CHAT] ā Kit: Boxing
+[23:36:58] [Client thread/INFO]: [CHAT] ā Map: Soccer
+[23:36:58] [Client thread/INFO]: [CHAT]
+[23:37:00] [Client thread/INFO]: [CHAT] halms: NotDestroyet fai cagare
+[23:37:01] [Client thread/INFO]: [CHAT]
+[23:37:01] [Client thread/INFO]: [CHAT] Boxing Duel
+[23:37:01] [Client thread/INFO]: [CHAT] ā Map: Soccer
+[23:37:01] [Client thread/INFO]: [CHAT] ā Opponent: Blissolic
+[23:37:01] [Client thread/INFO]: [CHAT] ā Ping: 7 ms
+[23:37:01] [Client thread/INFO]: [CHAT]
+[23:37:01] [Client thread/INFO]: [CHAT] 5...
+[23:37:02] [Client thread/INFO]: [CHAT] 4...
+[23:37:03] [Client thread/INFO]: [CHAT] sRyaK_: dumpXfolder????????
+[23:37:03] [Client thread/INFO]: [CHAT] 3...
+[23:37:04] [Client thread/INFO]: [CHAT] zfedq: oe
+[23:37:04] [Client thread/INFO]: [CHAT] 2...
+[23:37:05] [Client thread/INFO]: [CHAT] 1...
+[23:37:06] [Client thread/INFO]: [CHAT] NotDestroyet: halms a caso
+[23:37:06] [Client thread/INFO]: [CHAT] The match has started!
+[23:37:06] [Client thread/INFO]: [CHAT]
+[23:37:06] [Client thread/INFO]: [CHAT] Boxing
+[23:37:06] [Client thread/INFO]: [CHAT] First to 100 hits wins!
+[23:37:06] [Client thread/INFO]: [CHAT]
+[23:37:07] [Client thread/INFO]: [CHAT] Razyness: RAAAHHHH
+[23:37:12] [Client thread/INFO]: [CHAT] dumpXfolder: t'as drop
+[23:37:13] [Client thread/INFO]: [CHAT] zfedq: erti davartyimarto
+[23:37:14] [Client thread/INFO]: [CHAT] IdragonISMO: bro
+[23:37:15] [Client thread/INFO]: [CHAT] Yousef_01: bro
+[23:37:16] [Client thread/INFO]: [CHAT] zfedq: esvinaa
+[23:37:18] [Client thread/INFO]: [CHAT] 9bearr: LOL
+[23:37:19] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: be il mio vip?
+[23:37:23] [Client thread/INFO]: [CHAT] 9bearr: rifa
+[23:37:25] [Client thread/INFO]: [CHAT] NotDestroyet: halms ma stai zitto che non sia nemenno giocare XD
+[23:37:29] [Client thread/INFO]: [CHAT] WibbleWoobble: gg
+[23:37:30] [Client thread/INFO]: [CHAT] ryanfth: zRqxed leva la pot
+[23:37:34] [Client thread/INFO]: [CHAT] zRqxed: ok
+[23:37:34] [Client thread/INFO]: [CHAT] NotDestroyet: sai*
+[23:37:35] [Client thread/INFO]: [CHAT] mangeurdechat: Q
+[23:37:36] [Client thread/INFO]: [CHAT] mcdonaldperry: gg
+[23:37:37] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA SGĀ§7Ā§l Ā» Ā§dspiydrĀ§e wants you to play! (Join)
+[23:37:39] [Client thread/INFO]: [CHAT] 9bearr: lol
+[23:37:39] [Client thread/INFO]: [CHAT] DavutPvP45: LOL,
+[23:37:42] [Client thread/INFO]: [CHAT] Xa1v3r: gg
+[23:37:44] [Client thread/INFO]: [CHAT] Hipis1272: bro
+[23:37:44] [Client thread/INFO]: [CHAT] ElectroTheCow: LMAO
+[23:37:45] [Client thread/INFO]: [CHAT] Neeyo__14: gg
+[23:37:53] [Client thread/INFO]: [CHAT] NotDestroyet: halms torna a lavorare bimbo di minchia LOL
+[23:37:54] [Client thread/INFO]: [CHAT] mcdonaldperry: unranked bridge
+[23:37:56] [Client thread/INFO]: [CHAT] lil_rapstar: -
+[23:37:56] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:38:02] [Client thread/INFO]: [CHAT] WireIess: gf
+[23:38:04] [Client thread/INFO]: [CHAT] halms: NotDestroyet zitto addicted del cazzo
+[23:38:07] [Client thread/INFO]: [CHAT] iadmit: someone duel me boxing no runners plz
+[23:38:08] [Client thread/INFO]: [CHAT] AlgerienDeter: nn pas sumo
+[23:38:09] [Client thread/INFO]: [CHAT] NotDestroyet: a caso XD
+[23:38:09] [Client thread/INFO]: [CHAT] oCritz started spectating.
+[23:38:17] [Client thread/INFO]: [CHAT] OliviaRodrigoSta: ggsa
+[23:38:18] [Client thread/INFO]: [CHAT]
+[23:38:18] [Client thread/INFO]: [CHAT] [MMC] Buy perks here: store.minemen.club
+[23:38:18] [Client thread/INFO]: [CHAT]
+[23:38:20] [Client thread/INFO]: [CHAT] ziue was killed by Blissolic!
+[23:38:20] [Client thread/INFO]: [CHAT]
+[23:38:20] [Client thread/INFO]: [CHAT] Match Results (click player to view):
+[23:38:20] [Client thread/INFO]: [CHAT] Winner: Blissolic ā Loser: ziue
+[23:38:20] [Client thread/INFO]: [CHAT]
+[23:38:20] [Client thread/INFO]: [CHAT] Spectators (1): oCritz
+[23:38:21] [Client thread/INFO]: [CHAT] [ā·] ziue iāā¹āi: ggs
+[23:38:30] [Client thread/INFO]: [CHAT] That player is not in spawn.
+[23:38:33] [Client thread/INFO]: [CHAT] iadmit: someone duel me boxing plz NO RUNNERS plz
+[23:38:36] [Client thread/INFO]: [CHAT] _pociwicz: what
+[23:38:36] [Client thread/INFO]: [CHAT] Audi_RS7: LOL
+[23:38:36] [Client thread/INFO]: [CHAT] Arif000: RoiZit imagine losing with a cheat
+[23:38:40] [Client thread/INFO]: [CHAT] GucciBoyy: ??????
+[23:38:41] [Client thread/INFO]: [CHAT] Talhaww: oc
+[23:38:45] [Client thread/INFO]: [CHAT] Abde_Nnour: gg
+[23:38:45] [Client thread/INFO]: [CHAT] AiYukiii: tt
+[23:38:50] [Client thread/INFO]: [CHAT] ElectroTheCow: I just twerk
+[23:38:52] [Client thread/INFO]: [CHAT] GucciBoyy: ??????????
+[23:38:56] [Client thread/INFO]: [CHAT]
+[23:38:56] [Client thread/INFO]: [CHAT] ā mangeurdechat was banned by AntiGamingChair for Unfair Advantage.
+[23:38:56] [Client thread/INFO]: [CHAT]
+[23:38:57] [Client thread/INFO]: [CHAT] KnockUpStream: tt
+[23:38:57] [Client thread/INFO]: [CHAT] CCL: im so bad lmao
+[23:38:59] [Client thread/INFO]: [CHAT] WireIess: lmao
+[23:38:59] [Client thread/INFO]: [CHAT] Krispigaste: gg
+[23:39:19] [Client thread/INFO]: [CHAT] GucciBoyy: ??????????
+[23:39:19] [Client thread/INFO]: [CHAT] [ā½] BLUEOG_ ā: be il mio vip?
+[23:39:21] [Client thread/INFO]: [CHAT] ElectroTheCow: GG
+[23:39:24] [Client thread/INFO]: [CHAT] Talhaww: you win bro
+[23:39:26] [Client thread/INFO]: [CHAT] msiq: m
+[23:39:27] [Client thread/INFO]: [CHAT] DDMD: elchapo care esti
+[23:39:30] [Client thread/INFO]: [CHAT] NotDestroyet: GodBrdger addicted
+[23:39:30] [Client thread/INFO]: [CHAT] dontownsyou: ranked sumo
+[23:39:33] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: Eu
+[23:39:34] [Client thread/INFO]: [CHAT] CCL: gf
+[23:39:40] [Client thread/INFO]: [CHAT] Turelloxx: invaded dude who gifys lunar cloack im heare
+[23:39:43] [Client thread/INFO]: [CHAT] zRqxed: gf
+[23:39:49] [Client thread/INFO]: [CHAT] CCL: <3
+[23:39:50] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:39:53] [Client thread/INFO]: [CHAT] alexis2604: gg
+[23:39:54] [Client thread/INFO]: [CHAT] SpammerRod: :r en plus il blink le malade
+[23:39:56] [Client thread/INFO]: [CHAT]
+[23:39:56] [Client thread/INFO]: [CHAT] Event
+[23:39:56] [Client thread/INFO]: [CHAT] ā Winner: x_Anime_x
+[23:39:56] [Client thread/INFO]: [CHAT]
+[23:39:58] [Client thread/INFO]: [CHAT] 125d: gg
+[23:39:59] [Client thread/INFO]: [CHAT] Drxwlz: iridiska210 fold
+[23:40:02] [Client thread/INFO]: [CHAT] GreenBerry_: ggĆ
+[23:40:04] [Client thread/INFO]: [CHAT] Ā§dĀ§lEU SGĀ§7Ā§l Ā» Ā§dCoinMarketĀ§e wants you to play! (Join)
+[23:40:07] [Client thread/INFO]: [CHAT] Asellandro: gg reach
+[23:40:07] [Client thread/INFO]: [CHAT] sRyaK_: bella la mia rod
+[23:40:10] [Client thread/INFO]: [CHAT] [ā·] Clqps ŪŖŪ«āŪ°ŪŖŪ«: QUEUE UNRANKED SKYWARS
+[23:40:10] [Client thread/INFO]: [CHAT] DDMD: gf
+[23:40:11] [Client thread/INFO]: [CHAT] sRyaK_: funziona benissimo
+[23:40:12] [Client thread/INFO]: [CHAT] [ā·] Clqps ŪŖŪ«āŪ°ŪŖŪ«: shit
+[23:40:15] [Client thread/INFO]: [CHAT] OMGmaestru: sRyaK_ davvero
+[23:40:18] [Client thread/INFO]: [CHAT]
+[23:40:18] [Client thread/INFO]: [CHAT] [MMC] Apply for staff: minemen.club/applications
+[23:40:18] [Client thread/INFO]: [CHAT]
+[23:40:19] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: Main meu e boxing
+[23:40:20] [Client thread/INFO]: [CHAT] Ā§dĀ§lEU SGĀ§7Ā§l Ā» Ā§dCoinMarketĀ§e wants you to play! (Join)
+[23:40:28] [Client thread/INFO]: [CHAT] Andris12: gg
+[23:40:29] [Client thread/INFO]: [CHAT] Spartako_: :hub
+[23:40:30] [Client thread/INFO]: [CHAT]
+[23:40:30] [Client thread/INFO]: [CHAT] ā Plusieurs was banned by AntiGamingChair for Unfair Advantage.
+[23:40:30] [Client thread/INFO]: [CHAT]
+[23:40:37] [Client thread/INFO]: [CHAT] Andris12: revance?
+[23:40:38] [Client thread/INFO]: [CHAT] Asellandro: immagine usare la reach Krispigaste
+[23:40:42] [Client thread/INFO]: [CHAT] Ā§dĀ§lEU SGĀ§7Ā§l Ā» Ā§dCoinMarketĀ§e wants you to play! (Join)
+[23:40:46] [Client thread/INFO]: [CHAT] adriser00: r
+[23:41:03] [Client thread/INFO]: [CHAT] Ā§dĀ§lEU SGĀ§7Ā§l Ā» Ā§dCoinMarketĀ§e wants you to play! (Join)
+[23:41:06] [Client thread/INFO]: [CHAT] GreenBerry_: gg
+[23:41:09] [Client thread/INFO]: [CHAT] ZokeCat: lollo018 no
+[23:41:11] [Client thread/INFO]: [CHAT] NotDestroyet: lucky
+[23:41:11] [Client thread/INFO]: [CHAT] 9bearr: duellate boxing solo gente forte
+[23:41:13] [Client thread/INFO]: [CHAT] SierraLeonee: you are fucking awful
+[23:41:17] [Client thread/INFO]: [CHAT] ZokeCat: non lo so lollo018
+[23:41:24] [Client thread/INFO]: [CHAT] GANGMEMBERFO: 2v2 pearl fight
+[23:41:27] [Client thread/INFO]: [CHAT] ryanfth: che palle la pot
+[23:41:42] [Client thread/INFO]: [CHAT] Ā§dĀ§lEU SGĀ§7Ā§l Ā» Ā§dCoinMarketĀ§e wants you to play! (Join)
+[23:41:43] [Client thread/INFO]: [CHAT] Akazaa3: ky
+[23:41:43] [Client thread/INFO]: [CHAT] ySeb: a
+[23:41:50] [Client thread/INFO]: [CHAT] Talhaww: osopsap wh8
+[23:41:50] [Client thread/INFO]: [CHAT] Zchap NODEBUFF MASTER: wat
+[23:41:56] [Client thread/INFO]: [CHAT] zEq1n0x: BestAgany
+[23:42:01] [Client thread/INFO]: [CHAT] dontownsyou: gg
+[23:42:01] [Client thread/INFO]: [CHAT] BestAgany: bekle
+[23:42:05] [Client thread/INFO]: [CHAT] BestAgany: ark girio
+[23:42:08] [Client thread/INFO]: [CHAT] DDMD: 2-0\
+[23:42:08] [Client thread/INFO]: [CHAT] ElectroTheCow: BG
+[23:42:08] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:42:11] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: 1-0
+[23:42:15] [Client thread/INFO]: [CHAT] BestAgany: party kurn
+[23:42:16] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: Te ai tras cu s
+[23:42:18] [Client thread/INFO]: [CHAT] DDMD: 2-0
+[23:42:18] [Client thread/INFO]: [CHAT]
+[23:42:18] [Client thread/INFO]: [CHAT] [MMC] Need /disguise? Buy ACE Rank: store.minemen.club
+[23:42:18] [Client thread/INFO]: [CHAT]
+[23:42:26] [Client thread/INFO]: [CHAT] Zchap NODEBUFF MASTER: gg
+[23:42:26] [Client thread/INFO]: [CHAT] DDMD: dai accept 2-0
+[23:42:28] [Client thread/INFO]: [CHAT]
+[23:42:28] [Client thread/INFO]: [CHAT] ā BestAgany was banned by AntiGamingChair for Unfair Advantage.
+[23:42:28] [Client thread/INFO]: [CHAT]
+[23:42:31] [Client thread/INFO]: [CHAT] BodyShakes: SquadeQ1337 how are you master III while autoclicking
+[23:42:32] [Client thread/INFO]: [CHAT] Arya_Kh: kso
+[23:42:34] [Client thread/INFO]: [CHAT] Kqnnedy: q top fight
+[23:42:35] [Client thread/INFO]: [CHAT] DDMD: ndbf
+[23:42:42] [Client thread/INFO]: [CHAT] [ā”] SquadeQ1337: what
+[23:42:42] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: Nu joc nd
+[23:42:43] [Client thread/INFO]: [CHAT] DDMD: 1 eu 1 tu hai ndbf
+[23:42:43] [Client thread/INFO]: [CHAT] CapeOptfine: lol
+[23:42:45] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§dVlberĀ§e wants you to play! (Join)
+[23:42:46] [Client thread/INFO]: [CHAT] 2132: dog
+[23:42:46] [Client thread/INFO]: [CHAT] [ā”] Swoftzy āÆ: tf
+[23:42:47] [Client thread/INFO]: [CHAT] hasba122: tfk bf
+[23:42:48] [Client thread/INFO]: [CHAT] DDMD: abandon? ok
+[23:42:51] [Client thread/INFO]: [CHAT] Nethaj_Blondi121: :))))
+[23:42:51] [Client thread/INFO]: [CHAT] Kqnnedy: q top fight
+[23:42:53] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§dVlberĀ§e wants you to play! (Join)
+[23:42:54] [Client thread/INFO]: [CHAT] DDMD: gg 3-0
+[23:42:55] [Client thread/INFO]: [CHAT] zEq1n0x: ee hadi
+[23:42:59] [Client thread/INFO]: [CHAT] [ā”] MusTox: npc
+[23:42:59] [Client thread/INFO]: [CHAT] Viroze: shh
+[23:43:00] [Client thread/INFO]: [CHAT] iusemakima: ooo tĆ¼rk
+[23:43:08] [Client thread/INFO]: [CHAT] z69m: ????
+[23:43:11] [Client thread/INFO]: [CHAT] ZokeCat: ILBxddy_ la modalitĆ che non mi piacer
+[23:43:12] [Client thread/INFO]: [CHAT] DDMD: gg 3-0
+[23:43:14] [Client thread/INFO]: [CHAT] billago: gg
+[23:43:14] [Client thread/INFO]: [CHAT] iLwexy: sizi mi beklicez
+[23:43:16] [Client thread/INFO]: [CHAT] GANGMEMBERFO: 2v2 nodebuff
+[23:43:17] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§dVlberĀ§e wants you to play! (Join)
+[23:43:17] [Client thread/INFO]: [CHAT] 9bearr: so bad remusted
+[23:43:19] [Client thread/INFO]: [CHAT] Caslte: _Bladeris stop deance
+[23:43:26] [Client thread/INFO]: [CHAT] bestthor: la durun 2dk
+[23:43:27] [Client thread/INFO]: [CHAT] FatalLucas: stop combo sur le mur
+[23:43:29] [Client thread/INFO]: [CHAT] hasba122: t bad nul
+[23:43:31] [Client thread/INFO]: [CHAT] Dream97391: Lol
+[23:43:32] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§dVlberĀ§e wants you to play! (Join)
+[23:43:32] [Client thread/INFO]: [CHAT] hasba122: tg t nul
+[23:43:38] [Client thread/INFO]: [CHAT] aduz: dgo
+[23:43:39] [Client thread/INFO]: [CHAT] hasba122: veski le mmc pour ca
+[23:43:44] [Client thread/INFO]: [CHAT] Arya_Kh: XD
+[23:43:44] [Client thread/INFO]: [CHAT] BlueberryMilk_: battle rush someone pls
+[23:43:48] [Client thread/INFO]: [CHAT] Ā§dĀ§lNA UHC MeetupĀ§7Ā§l Ā» Ā§dVlberĀ§e wants you to play! (Join)
+[23:43:48] [Client thread/INFO]: [CHAT] adriser00: r
+[23:43:49] [Client thread/INFO]: [CHAT] M3tty_Pr3: 1s
+[23:43:49] [Client thread/INFO]: [CHAT] Krispigaste: gf
+[23:43:49] [Client thread/INFO]: [CHAT] JusTRicky: aspe
+[23:43:49] [Client thread/INFO]: [CHAT] FatalLucas: je tryhard pas le jeu de cube encore moins a 00j
+[23:43:52] [Client thread/INFO]: [CHAT] LAVIONDEPABLO: https://kick.com/dashboard/stream
+[23:43:52] [Client thread/INFO]: [CHAT] NotDestroyet: lucky
+[23:43:54] [Client thread/INFO]: [CHAT] hasba122: pareil
+[23:43:59] [Client thread/INFO]: [CHAT] CalleyLothBrok: geldim
+[23:44:04] [Client thread/INFO]: [CHAT]
+[23:44:04] [Client thread/INFO]: [CHAT] ā Kiding was banned by AntiGamingChair for Unfair Advantage.
+[23:44:04] [Client thread/INFO]: [CHAT]
+[23:44:09] [Client thread/INFO]: [CHAT] hasba122: e z
+[23:44:18] [Client thread/INFO]: [CHAT]
+[23:44:18] [Client thread/INFO]: [CHAT] [MMC] Need support? Create a ticket: minemen.club/tickets
+[23:44:18] [Client thread/INFO]: [CHAT]
+[23:44:19] [Client thread/INFO]: [CHAT] ElectroTheCow: Stop running kid
+[23:44:19] [Client thread/INFO]: [CHAT] Arya_Kh: XD
+[23:44:23] [Client thread/INFO]: [CHAT] swear1447: s
+[23:44:32] [Client thread/INFO]: [CHAT] ElectroTheCow: No
+[23:44:33] [Client thread/INFO]: [CHAT] usbr: fatass
+[23:44:38] [Client thread/INFO]: [CHAT] swear1447: sisko eqinox
+[23:44:41] [Client thread/INFO]: [CHAT] ySeb: gg
+[23:44:46] [Client thread/INFO]: [CHAT] Wizoxycek: ?
+[23:44:47] [Client thread/INFO]: [CHAT] Caslte: STAFF HELP RUNNER
+[23:44:48] [Client thread/INFO]: [CHAT] Dream97391: LOL
+[23:44:53] [Client thread/INFO]: [CHAT] GLOKK9NA: HAHAHAHAH APUCERON
+[23:44:57] [Client thread/INFO]: [CHAT] WibbleWoobble: how i can save my kit?
+[23:44:58] [Client thread/INFO]: [CHAT] ElectroTheCow: Fuck u kiddo
+[23:44:59] [Client thread/INFO]: [CHAT] _Zasuwkaa: aha
+[23:45:00] [Client thread/INFO]: [CHAT] CapeOptfine: lol
+[23:45:05] [Client thread/INFO]: [CHAT] JusTRicky: aspe
+[23:45:06] [Client thread/INFO]: [CHAT] Zcvo: nah u cheat
+[23:45:07] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:45:10] [Client thread/INFO]: [CHAT] NotDestroyet: cringe
+[23:45:10] [Client thread/INFO]: [CHAT] Zcvo: cheats#
+[23:45:15] [Client thread/INFO]: [CHAT] LAVIONDEPABLO: https://kick.com/mqrcelinho
+[23:45:15] [Client thread/INFO]: [CHAT] WibbleWoobble: ,
+[23:45:18] [Client thread/INFO]: [CHAT] WibbleWoobble: how i can save my kit???
+[23:45:20] [Client thread/INFO]: [CHAT] Zcvo: nah no way
+[23:45:23] [Client thread/INFO]: [CHAT] iLwexy: lfmao
+[23:45:23] [Client thread/INFO]: [CHAT] _Zasuwkaa: nn
+[23:45:24] [Client thread/INFO]: [CHAT] SumoTechnology: Ranked Sumo
+[23:45:25] [Client thread/INFO]: [CHAT] Talhaww: cee
+[23:45:34] [Client thread/INFO]: [CHAT] WibbleWoobble: x
+[23:45:36] [Client thread/INFO]: [CHAT] Miskafi: SO CRINGE BRO
+[23:45:38] [Client thread/INFO]: [CHAT] WibbleWoobble: how i can save my kit???
+[23:45:41] [Client thread/INFO]: [CHAT] NotDestroyet: cringe
+[23:45:43] [Client thread/INFO]: [CHAT] _pociwicz: off wifsh
+[23:45:43] [Client thread/INFO]: [CHAT] ZokeCat: xD
+[23:45:44] [Client thread/INFO]: Stopping!
+[23:45:44] [Client thread/INFO]: [Athena] Shutting down client
+[23:45:44] [Client thread/INFO]: SoundSystem shutting down...
+[23:45:44] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
diff --git a/workspace/options.txt b/workspace/options.txt
index ed9f63b3..70dcc7b0 100644
--- a/workspace/options.txt
+++ b/workspace/options.txt
@@ -12,7 +12,7 @@ maxFps:260
fboEnable:true
difficulty:1
fancyGraphics:false
-ao:2
+ao:0
renderClouds:false
resourcePacks:["! Ā§bPotfast 5kay.zip"]
incompatibleResourcePacks:[]
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/Mineshaft.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/Mineshaft.dat
index 195aacae..cc1f122a 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/Mineshaft.dat and b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/Mineshaft.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages.dat
index 29ee6796..7ed17885 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages.dat and b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_end.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_end.dat
index 29ee6796..7ed17885 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_end.dat and b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_end.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_nether.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_nether.dat
index 29ee6796..7ed17885 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_nether.dat and b/workspace/saves/Copy of Copy of mcpworldppdsa_/data/villages_nether.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat
deleted file mode 100644
index 5762ea2e..00000000
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat and /dev/null differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_new b/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_new
new file mode 100644
index 00000000..a291fbe0
Binary files /dev/null and b/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_new differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_old b/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_old
deleted file mode 100644
index 709dfe55..00000000
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/level.dat_old and /dev/null differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/34c6f761-a0d4-3d62-b5ee-df15e4530215.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/34c6f761-a0d4-3d62-b5ee-df15e4530215.dat
new file mode 100644
index 00000000..3f25d325
Binary files /dev/null and b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/34c6f761-a0d4-3d62-b5ee-df15e4530215.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.dat
new file mode 100644
index 00000000..59ff67b4
Binary files /dev/null and b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat
new file mode 100644
index 00000000..000293c7
Binary files /dev/null and b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/fe171829-6121-3106-a1a5-6a3600a4ef7d.dat b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/fe171829-6121-3106-a1a5-6a3600a4ef7d.dat
new file mode 100644
index 00000000..e7b467b7
Binary files /dev/null and b/workspace/saves/Copy of Copy of mcpworldppdsa_/playerdata/fe171829-6121-3106-a1a5-6a3600a4ef7d.dat differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.0.mca b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.0.mca
index f94e0525..c8b3beb1 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.0.mca and b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.0.mca differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.1.mca b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.1.mca
index 3a61656b..cab2793f 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.1.mca and b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.-1.1.mca differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.0.mca b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.0.mca
index 8acb9aeb..bff470df 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.0.mca and b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.0.mca differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.1.mca b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.1.mca
index 2b769b29..4e19cc35 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.1.mca and b/workspace/saves/Copy of Copy of mcpworldppdsa_/region/r.0.1.mca differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/session.lock b/workspace/saves/Copy of Copy of mcpworldppdsa_/session.lock
index be5d4fca..5b64699d 100644
Binary files a/workspace/saves/Copy of Copy of mcpworldppdsa_/session.lock and b/workspace/saves/Copy of Copy of mcpworldppdsa_/session.lock differ
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/34c6f761-a0d4-3d62-b5ee-df15e4530215.json b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/34c6f761-a0d4-3d62-b5ee-df15e4530215.json
new file mode 100644
index 00000000..3c6df88e
--- /dev/null
+++ b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/34c6f761-a0d4-3d62-b5ee-df15e4530215.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":1,"stat.leaveGame":1,"stat.timeSinceDeath":1}
\ No newline at end of file
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.json b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.json
new file mode 100644
index 00000000..dbde9c83
--- /dev/null
+++ b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/a7507e7e-f998-31cf-a2de-0cc0fd0a4de6.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":218,"stat.walkOneCm":425,"stat.jump":1,"stat.playOneMinute":2371,"stat.fallOneCm":1732,"stat.leaveGame":1,"stat.damageTaken":150,"stat.timeSinceDeath":2371,"stat.sprintOneCm":116,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json
new file mode 100644
index 00000000..ae734fde
--- /dev/null
+++ b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":259,"stat.leaveGame":1,"stat.timeSinceDeath":259,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/fe171829-6121-3106-a1a5-6a3600a4ef7d.json b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/fe171829-6121-3106-a1a5-6a3600a4ef7d.json
new file mode 100644
index 00000000..976dd08f
--- /dev/null
+++ b/workspace/saves/Copy of Copy of mcpworldppdsa_/stats/fe171829-6121-3106-a1a5-6a3600a4ef7d.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":6896,"stat.killEntity.Skeleton":2,"stat.walkOneCm":30570,"stat.drop":1,"stat.jump":43,"stat.playOneMinute":15801,"stat.fallOneCm":422,"achievement.openInventory":1,"stat.useItem.minecraft.stone":15,"stat.useItem.minecraft.cooked_beef":1,"stat.leaveGame":1,"stat.damageTaken":200,"stat.damageDealt":2080,"stat.crouchOneCm":24,"stat.killEntity.Zombie":5,"stat.timeSinceDeath":15801,"stat.sprintOneCm":19013,"stat.mobKills":8,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]},"stat.killEntity.Creeper":1,"stat.useItem.minecraft.diamond_sword":23}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/data/Mineshaft.dat b/workspace/saves/Copy of mcpworldpp/data/Mineshaft.dat
index 32f551f7..1d0d5b19 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/Mineshaft.dat and b/workspace/saves/Copy of mcpworldpp/data/Mineshaft.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/data/Temple.dat b/workspace/saves/Copy of mcpworldpp/data/Temple.dat
index 1eed3f8e..fd98edd4 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/Temple.dat and b/workspace/saves/Copy of mcpworldpp/data/Temple.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/data/Village.dat b/workspace/saves/Copy of mcpworldpp/data/Village.dat
index 0c4a1150..0fef8c60 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/Village.dat and b/workspace/saves/Copy of mcpworldpp/data/Village.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/data/villages.dat b/workspace/saves/Copy of mcpworldpp/data/villages.dat
index a66887b4..b14317ca 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/villages.dat and b/workspace/saves/Copy of mcpworldpp/data/villages.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/data/villages_end.dat b/workspace/saves/Copy of mcpworldpp/data/villages_end.dat
index 41bc4ddf..36625837 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/villages_end.dat and b/workspace/saves/Copy of mcpworldpp/data/villages_end.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/data/villages_nether.dat b/workspace/saves/Copy of mcpworldpp/data/villages_nether.dat
index 41bc4ddf..36625837 100644
Binary files a/workspace/saves/Copy of mcpworldpp/data/villages_nether.dat and b/workspace/saves/Copy of mcpworldpp/data/villages_nether.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/level.dat b/workspace/saves/Copy of mcpworldpp/level.dat
index 9f75d03c..420d08dc 100644
Binary files a/workspace/saves/Copy of mcpworldpp/level.dat and b/workspace/saves/Copy of mcpworldpp/level.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/level.dat_old b/workspace/saves/Copy of mcpworldpp/level.dat_old
index 0bf8fe83..cf643d19 100644
Binary files a/workspace/saves/Copy of mcpworldpp/level.dat_old and b/workspace/saves/Copy of mcpworldpp/level.dat_old differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/094b1c52-a449-3e9f-896c-59239b943c71.dat b/workspace/saves/Copy of mcpworldpp/playerdata/094b1c52-a449-3e9f-896c-59239b943c71.dat
new file mode 100644
index 00000000..a6d9b6a1
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/094b1c52-a449-3e9f-896c-59239b943c71.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/11cdf046-d362-394c-93e8-583f0c5ef255.dat b/workspace/saves/Copy of mcpworldpp/playerdata/11cdf046-d362-394c-93e8-583f0c5ef255.dat
new file mode 100644
index 00000000..32bc582a
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/11cdf046-d362-394c-93e8-583f0c5ef255.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/168f5f60-1523-35b7-93b7-01b2c42226b4.dat b/workspace/saves/Copy of mcpworldpp/playerdata/168f5f60-1523-35b7-93b7-01b2c42226b4.dat
new file mode 100644
index 00000000..4158b9ad
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/168f5f60-1523-35b7-93b7-01b2c42226b4.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/1714a812-885f-3243-b534-9a660fba6e8b.dat b/workspace/saves/Copy of mcpworldpp/playerdata/1714a812-885f-3243-b534-9a660fba6e8b.dat
new file mode 100644
index 00000000..cbbfe1ca
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/1714a812-885f-3243-b534-9a660fba6e8b.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/197d9491-ff34-3fd1-8394-1aadd56cfa2c.dat b/workspace/saves/Copy of mcpworldpp/playerdata/197d9491-ff34-3fd1-8394-1aadd56cfa2c.dat
new file mode 100644
index 00000000..c9509c0a
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/197d9491-ff34-3fd1-8394-1aadd56cfa2c.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat
new file mode 100644
index 00000000..b083bfa0
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/1b03cef3-3bb0-3335-8575-75a992fee2b9.dat b/workspace/saves/Copy of mcpworldpp/playerdata/1b03cef3-3bb0-3335-8575-75a992fee2b9.dat
new file mode 100644
index 00000000..dac1db9d
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/1b03cef3-3bb0-3335-8575-75a992fee2b9.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/29aa321a-1ce7-35de-bfab-f37fa4095c7d.dat b/workspace/saves/Copy of mcpworldpp/playerdata/29aa321a-1ce7-35de-bfab-f37fa4095c7d.dat
new file mode 100644
index 00000000..fb2bd198
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/29aa321a-1ce7-35de-bfab-f37fa4095c7d.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/2a68c4a4-c1ba-3396-a626-ac7041e25da5.dat b/workspace/saves/Copy of mcpworldpp/playerdata/2a68c4a4-c1ba-3396-a626-ac7041e25da5.dat
new file mode 100644
index 00000000..d6221a79
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/2a68c4a4-c1ba-3396-a626-ac7041e25da5.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.dat b/workspace/saves/Copy of mcpworldpp/playerdata/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.dat
new file mode 100644
index 00000000..4cfcd2d7
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.dat b/workspace/saves/Copy of mcpworldpp/playerdata/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.dat
new file mode 100644
index 00000000..a8dbf71c
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/3247b050-58df-3a7e-91f5-44a3d807681c.dat b/workspace/saves/Copy of mcpworldpp/playerdata/3247b050-58df-3a7e-91f5-44a3d807681c.dat
new file mode 100644
index 00000000..f7effb26
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/3247b050-58df-3a7e-91f5-44a3d807681c.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/3c28cca8-db38-324d-ac91-779beed87c8d.dat b/workspace/saves/Copy of mcpworldpp/playerdata/3c28cca8-db38-324d-ac91-779beed87c8d.dat
new file mode 100644
index 00000000..1b6992c8
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/3c28cca8-db38-324d-ac91-779beed87c8d.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/3eec9f18-1d0e-3f17-917c-6994e7d034d1.dat b/workspace/saves/Copy of mcpworldpp/playerdata/3eec9f18-1d0e-3f17-917c-6994e7d034d1.dat
new file mode 100644
index 00000000..198fa9fe
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/3eec9f18-1d0e-3f17-917c-6994e7d034d1.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.dat b/workspace/saves/Copy of mcpworldpp/playerdata/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.dat
new file mode 100644
index 00000000..ecb93348
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/43c314ca-2c75-349f-b8fe-ad7c6fada15e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/43c314ca-2c75-349f-b8fe-ad7c6fada15e.dat
new file mode 100644
index 00000000..0fce8bab
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/43c314ca-2c75-349f-b8fe-ad7c6fada15e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/4bb7849b-3b46-3d6a-81b9-13bb408e8517.dat b/workspace/saves/Copy of mcpworldpp/playerdata/4bb7849b-3b46-3d6a-81b9-13bb408e8517.dat
new file mode 100644
index 00000000..378def37
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/4bb7849b-3b46-3d6a-81b9-13bb408e8517.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.dat b/workspace/saves/Copy of mcpworldpp/playerdata/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.dat
new file mode 100644
index 00000000..32f7616d
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.dat b/workspace/saves/Copy of mcpworldpp/playerdata/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.dat
new file mode 100644
index 00000000..3fb63221
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.dat b/workspace/saves/Copy of mcpworldpp/playerdata/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.dat
new file mode 100644
index 00000000..60a44234
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/4fdf550e-f3b3-3a06-8485-0916b2b491bc.dat b/workspace/saves/Copy of mcpworldpp/playerdata/4fdf550e-f3b3-3a06-8485-0916b2b491bc.dat
new file mode 100644
index 00000000..9c7b7945
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/4fdf550e-f3b3-3a06-8485-0916b2b491bc.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/530fa97a-357f-3c19-94d3-0c5c65c18fe8.dat b/workspace/saves/Copy of mcpworldpp/playerdata/530fa97a-357f-3c19-94d3-0c5c65c18fe8.dat
new file mode 100644
index 00000000..a8e32fae
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/530fa97a-357f-3c19-94d3-0c5c65c18fe8.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.dat b/workspace/saves/Copy of mcpworldpp/playerdata/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.dat
new file mode 100644
index 00000000..d80659e2
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/5cc48495-676c-3721-aed2-7336730ff405.dat b/workspace/saves/Copy of mcpworldpp/playerdata/5cc48495-676c-3721-aed2-7336730ff405.dat
new file mode 100644
index 00000000..caccaa4e
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/5cc48495-676c-3721-aed2-7336730ff405.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/638f7175-5dde-3b0d-a13d-f593ecd79b38.dat b/workspace/saves/Copy of mcpworldpp/playerdata/638f7175-5dde-3b0d-a13d-f593ecd79b38.dat
new file mode 100644
index 00000000..32cbf371
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/638f7175-5dde-3b0d-a13d-f593ecd79b38.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/66157e7a-53e0-3299-9208-7674efd706f9.dat b/workspace/saves/Copy of mcpworldpp/playerdata/66157e7a-53e0-3299-9208-7674efd706f9.dat
new file mode 100644
index 00000000..6fca95c2
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/66157e7a-53e0-3299-9208-7674efd706f9.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/68cf6d02-03bc-3f3b-ab98-76a8ec749597.dat b/workspace/saves/Copy of mcpworldpp/playerdata/68cf6d02-03bc-3f3b-ab98-76a8ec749597.dat
new file mode 100644
index 00000000..b0d3dbd6
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/68cf6d02-03bc-3f3b-ab98-76a8ec749597.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/6db1171d-4fa6-31cb-b425-1896281a26e2.dat b/workspace/saves/Copy of mcpworldpp/playerdata/6db1171d-4fa6-31cb-b425-1896281a26e2.dat
new file mode 100644
index 00000000..fe24ba95
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/6db1171d-4fa6-31cb-b425-1896281a26e2.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/71ee4b7e-330e-3d50-90a4-3d964a618ea8.dat b/workspace/saves/Copy of mcpworldpp/playerdata/71ee4b7e-330e-3d50-90a4-3d964a618ea8.dat
new file mode 100644
index 00000000..fbbb70a4
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/71ee4b7e-330e-3d50-90a4-3d964a618ea8.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/7328fbd9-6879-3343-b321-ed1f1a1e9892.dat b/workspace/saves/Copy of mcpworldpp/playerdata/7328fbd9-6879-3343-b321-ed1f1a1e9892.dat
new file mode 100644
index 00000000..cac0e4b4
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/7328fbd9-6879-3343-b321-ed1f1a1e9892.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/74e89738-6c9e-4f59-83ef-d365849e6049.dat b/workspace/saves/Copy of mcpworldpp/playerdata/74e89738-6c9e-4f59-83ef-d365849e6049.dat
new file mode 100644
index 00000000..a91af48f
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/74e89738-6c9e-4f59-83ef-d365849e6049.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/75e52373-1963-3666-bda9-8904d639e38b.dat b/workspace/saves/Copy of mcpworldpp/playerdata/75e52373-1963-3666-bda9-8904d639e38b.dat
new file mode 100644
index 00000000..52178cde
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/75e52373-1963-3666-bda9-8904d639e38b.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/77167de3-5df9-3c83-b06a-bed9a476e835.dat b/workspace/saves/Copy of mcpworldpp/playerdata/77167de3-5df9-3c83-b06a-bed9a476e835.dat
index 2121c7db..24e87f53 100644
Binary files a/workspace/saves/Copy of mcpworldpp/playerdata/77167de3-5df9-3c83-b06a-bed9a476e835.dat and b/workspace/saves/Copy of mcpworldpp/playerdata/77167de3-5df9-3c83-b06a-bed9a476e835.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.dat b/workspace/saves/Copy of mcpworldpp/playerdata/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.dat
new file mode 100644
index 00000000..1373d86f
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/7fef5833-06c9-398a-84c0-fbd3a81ff548.dat b/workspace/saves/Copy of mcpworldpp/playerdata/7fef5833-06c9-398a-84c0-fbd3a81ff548.dat
new file mode 100644
index 00000000..4bb294da
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/7fef5833-06c9-398a-84c0-fbd3a81ff548.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/8cfc5391-e37d-328f-a689-9b5f6c4663f5.dat b/workspace/saves/Copy of mcpworldpp/playerdata/8cfc5391-e37d-328f-a689-9b5f6c4663f5.dat
index 228ee3f7..9e4b2c06 100644
Binary files a/workspace/saves/Copy of mcpworldpp/playerdata/8cfc5391-e37d-328f-a689-9b5f6c4663f5.dat and b/workspace/saves/Copy of mcpworldpp/playerdata/8cfc5391-e37d-328f-a689-9b5f6c4663f5.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.dat b/workspace/saves/Copy of mcpworldpp/playerdata/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.dat
new file mode 100644
index 00000000..9ccdb700
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/942531dd-7690-3c0a-ad42-657bb212e7b6.dat b/workspace/saves/Copy of mcpworldpp/playerdata/942531dd-7690-3c0a-ad42-657bb212e7b6.dat
new file mode 100644
index 00000000..b629cced
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/942531dd-7690-3c0a-ad42-657bb212e7b6.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/989691b1-d197-3995-a55e-281cda3663ae.dat b/workspace/saves/Copy of mcpworldpp/playerdata/989691b1-d197-3995-a55e-281cda3663ae.dat
new file mode 100644
index 00000000..2f8f5736
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/989691b1-d197-3995-a55e-281cda3663ae.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/9df70e84-3251-33fb-9047-d59112057246.dat b/workspace/saves/Copy of mcpworldpp/playerdata/9df70e84-3251-33fb-9047-d59112057246.dat
new file mode 100644
index 00000000..32d0b3c9
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/9df70e84-3251-33fb-9047-d59112057246.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/9e5d41e7-4785-3b2f-8261-593dade57f6e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/9e5d41e7-4785-3b2f-8261-593dade57f6e.dat
new file mode 100644
index 00000000..1158307a
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/9e5d41e7-4785-3b2f-8261-593dade57f6e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/a08e137b-04fa-3fce-96cc-517c7a87690d.dat b/workspace/saves/Copy of mcpworldpp/playerdata/a08e137b-04fa-3fce-96cc-517c7a87690d.dat
new file mode 100644
index 00000000..f52bd356
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/a08e137b-04fa-3fce-96cc-517c7a87690d.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/aeca01bf-232e-37a2-985b-599827b3226a.dat b/workspace/saves/Copy of mcpworldpp/playerdata/aeca01bf-232e-37a2-985b-599827b3226a.dat
new file mode 100644
index 00000000..8acb3c4a
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/aeca01bf-232e-37a2-985b-599827b3226a.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/b136c8aa-0654-3583-8db1-8749e12181a1.dat b/workspace/saves/Copy of mcpworldpp/playerdata/b136c8aa-0654-3583-8db1-8749e12181a1.dat
new file mode 100644
index 00000000..7504b5f0
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/b136c8aa-0654-3583-8db1-8749e12181a1.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/b25e3f31-3d0d-30a3-b307-8902510a505e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/b25e3f31-3d0d-30a3-b307-8902510a505e.dat
new file mode 100644
index 00000000..edbab1b3
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/b25e3f31-3d0d-30a3-b307-8902510a505e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/babe9e7f-35b2-34ef-82f9-4869d34a0755.dat b/workspace/saves/Copy of mcpworldpp/playerdata/babe9e7f-35b2-34ef-82f9-4869d34a0755.dat
new file mode 100644
index 00000000..bd3b9305
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/babe9e7f-35b2-34ef-82f9-4869d34a0755.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/bf0c47d3-02b6-3463-8e38-457226b1407c.dat b/workspace/saves/Copy of mcpworldpp/playerdata/bf0c47d3-02b6-3463-8e38-457226b1407c.dat
new file mode 100644
index 00000000..37b089a5
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/bf0c47d3-02b6-3463-8e38-457226b1407c.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/ccf0c278-c21f-3ec3-a87c-05202673a5dd.dat b/workspace/saves/Copy of mcpworldpp/playerdata/ccf0c278-c21f-3ec3-a87c-05202673a5dd.dat
new file mode 100644
index 00000000..9b52ebff
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/ccf0c278-c21f-3ec3-a87c-05202673a5dd.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/d1b650bf-5f9c-37d3-a469-4d66d1968f90.dat b/workspace/saves/Copy of mcpworldpp/playerdata/d1b650bf-5f9c-37d3-a469-4d66d1968f90.dat
new file mode 100644
index 00000000..f89c08b2
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/d1b650bf-5f9c-37d3-a469-4d66d1968f90.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat b/workspace/saves/Copy of mcpworldpp/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat
new file mode 100644
index 00000000..d417fb49
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/dcea94fd-efa4-3c29-93d8-2d56666245c7.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/df2d3e26-a8b7-3aae-9296-f3a891282132.dat b/workspace/saves/Copy of mcpworldpp/playerdata/df2d3e26-a8b7-3aae-9296-f3a891282132.dat
new file mode 100644
index 00000000..d587b595
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/df2d3e26-a8b7-3aae-9296-f3a891282132.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.dat b/workspace/saves/Copy of mcpworldpp/playerdata/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.dat
new file mode 100644
index 00000000..6456ae63
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/e012d939-bd4c-38f9-ae46-831d4959ff05.dat b/workspace/saves/Copy of mcpworldpp/playerdata/e012d939-bd4c-38f9-ae46-831d4959ff05.dat
new file mode 100644
index 00000000..4d140048
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/e012d939-bd4c-38f9-ae46-831d4959ff05.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/e122e0b0-374f-3b1b-a986-63f4fefee57a.dat b/workspace/saves/Copy of mcpworldpp/playerdata/e122e0b0-374f-3b1b-a986-63f4fefee57a.dat
new file mode 100644
index 00000000..98d81e66
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/e122e0b0-374f-3b1b-a986-63f4fefee57a.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/e4358028-bc3b-38cc-b645-4d08d3b4f456.dat b/workspace/saves/Copy of mcpworldpp/playerdata/e4358028-bc3b-38cc-b645-4d08d3b4f456.dat
new file mode 100644
index 00000000..46262590
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/e4358028-bc3b-38cc-b645-4d08d3b4f456.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.dat b/workspace/saves/Copy of mcpworldpp/playerdata/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.dat
new file mode 100644
index 00000000..ea7d37cf
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/e664a043-6e9c-3d0d-9b38-cc385e35aba9.dat b/workspace/saves/Copy of mcpworldpp/playerdata/e664a043-6e9c-3d0d-9b38-cc385e35aba9.dat
new file mode 100644
index 00000000..c6b6ddc4
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/e664a043-6e9c-3d0d-9b38-cc385e35aba9.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/eadcccd1-5981-31ce-8342-c727c73b0197.dat b/workspace/saves/Copy of mcpworldpp/playerdata/eadcccd1-5981-31ce-8342-c727c73b0197.dat
new file mode 100644
index 00000000..09f97cfb
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/eadcccd1-5981-31ce-8342-c727c73b0197.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.dat b/workspace/saves/Copy of mcpworldpp/playerdata/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.dat
new file mode 100644
index 00000000..e30961d4
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/eee10812-13cd-3f90-b77f-2195c9c5b71e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/eee10812-13cd-3f90-b77f-2195c9c5b71e.dat
new file mode 100644
index 00000000..d5204892
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/eee10812-13cd-3f90-b77f-2195c9c5b71e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.dat b/workspace/saves/Copy of mcpworldpp/playerdata/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.dat
new file mode 100644
index 00000000..025faf0f
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.dat b/workspace/saves/Copy of mcpworldpp/playerdata/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.dat
new file mode 100644
index 00000000..2ebb7a1c
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.dat b/workspace/saves/Copy of mcpworldpp/playerdata/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.dat
new file mode 100644
index 00000000..3de5d364
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.dat b/workspace/saves/Copy of mcpworldpp/playerdata/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.dat
new file mode 100644
index 00000000..40ab9734
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.dat b/workspace/saves/Copy of mcpworldpp/playerdata/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.dat
index b7d141f1..03193160 100644
Binary files a/workspace/saves/Copy of mcpworldpp/playerdata/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.dat and b/workspace/saves/Copy of mcpworldpp/playerdata/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/playerdata/fd09468e-08e7-31aa-bab7-195a6ef31320.dat b/workspace/saves/Copy of mcpworldpp/playerdata/fd09468e-08e7-31aa-bab7-195a6ef31320.dat
new file mode 100644
index 00000000..84f15474
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/playerdata/fd09468e-08e7-31aa-bab7-195a6ef31320.dat differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.-1.0.mca b/workspace/saves/Copy of mcpworldpp/region/r.-1.0.mca
index 37382c04..3d9847ad 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.-1.0.mca and b/workspace/saves/Copy of mcpworldpp/region/r.-1.0.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.-1.1.mca b/workspace/saves/Copy of mcpworldpp/region/r.-1.1.mca
index 778d5e38..b19ae12a 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.-1.1.mca and b/workspace/saves/Copy of mcpworldpp/region/r.-1.1.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.-1.2.mca b/workspace/saves/Copy of mcpworldpp/region/r.-1.2.mca
index d87e34d6..1aa9d8a5 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.-1.2.mca and b/workspace/saves/Copy of mcpworldpp/region/r.-1.2.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.0.0.mca b/workspace/saves/Copy of mcpworldpp/region/r.0.0.mca
index d34564c4..852c65f0 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.0.0.mca and b/workspace/saves/Copy of mcpworldpp/region/r.0.0.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.0.1.mca b/workspace/saves/Copy of mcpworldpp/region/r.0.1.mca
index 9cb275df..6ae64d75 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.0.1.mca and b/workspace/saves/Copy of mcpworldpp/region/r.0.1.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.0.2.mca b/workspace/saves/Copy of mcpworldpp/region/r.0.2.mca
index d91e9d70..45b06b9f 100644
Binary files a/workspace/saves/Copy of mcpworldpp/region/r.0.2.mca and b/workspace/saves/Copy of mcpworldpp/region/r.0.2.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/region/r.1.2.mca b/workspace/saves/Copy of mcpworldpp/region/r.1.2.mca
new file mode 100644
index 00000000..5203cd95
Binary files /dev/null and b/workspace/saves/Copy of mcpworldpp/region/r.1.2.mca differ
diff --git a/workspace/saves/Copy of mcpworldpp/session.lock b/workspace/saves/Copy of mcpworldpp/session.lock
index 87e7d5df..1f5919e7 100644
Binary files a/workspace/saves/Copy of mcpworldpp/session.lock and b/workspace/saves/Copy of mcpworldpp/session.lock differ
diff --git a/workspace/saves/Copy of mcpworldpp/stats/094b1c52-a449-3e9f-896c-59239b943c71.json b/workspace/saves/Copy of mcpworldpp/stats/094b1c52-a449-3e9f-896c-59239b943c71.json
new file mode 100644
index 00000000..fd533f1c
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/094b1c52-a449-3e9f-896c-59239b943c71.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":11661,"stat.walkOneCm":1686,"stat.jump":12,"stat.playOneMinute":18719,"stat.leaveGame":1,"stat.timeSinceDeath":18719,"stat.sprintOneCm":1059,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/11cdf046-d362-394c-93e8-583f0c5ef255.json b/workspace/saves/Copy of mcpworldpp/stats/11cdf046-d362-394c-93e8-583f0c5ef255.json
new file mode 100644
index 00000000..03f60beb
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/11cdf046-d362-394c-93e8-583f0c5ef255.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":1673,"stat.walkOneCm":1878,"stat.jump":4,"stat.playOneMinute":815,"stat.leaveGame":1,"stat.timeSinceDeath":815,"stat.sprintOneCm":221,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/168f5f60-1523-35b7-93b7-01b2c42226b4.json b/workspace/saves/Copy of mcpworldpp/stats/168f5f60-1523-35b7-93b7-01b2c42226b4.json
new file mode 100644
index 00000000..5e54975b
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/168f5f60-1523-35b7-93b7-01b2c42226b4.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":2904,"stat.walkOneCm":13977,"stat.drop":2,"stat.jump":29,"stat.useItem.minecraft.sand":1,"stat.playOneMinute":98452,"stat.leaveGame":1,"stat.timeSinceDeath":98452,"stat.sprintOneCm":5613,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/1714a812-885f-3243-b534-9a660fba6e8b.json b/workspace/saves/Copy of mcpworldpp/stats/1714a812-885f-3243-b534-9a660fba6e8b.json
new file mode 100644
index 00000000..e7ef90ca
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/1714a812-885f-3243-b534-9a660fba6e8b.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":1495,"stat.walkOneCm":8128,"stat.jump":9,"stat.playOneMinute":28599,"stat.leaveGame":1,"stat.timeSinceDeath":28599,"stat.sprintOneCm":7592,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/197d9491-ff34-3fd1-8394-1aadd56cfa2c.json b/workspace/saves/Copy of mcpworldpp/stats/197d9491-ff34-3fd1-8394-1aadd56cfa2c.json
new file mode 100644
index 00000000..d6326aa1
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/197d9491-ff34-3fd1-8394-1aadd56cfa2c.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":672,"stat.leaveGame":1,"stat.timeSinceDeath":672,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json b/workspace/saves/Copy of mcpworldpp/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json
new file mode 100644
index 00000000..afe697b4
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":241,"stat.walkOneCm":1246,"stat.jump":2,"stat.playOneMinute":4999,"stat.leaveGame":1,"stat.timeSinceDeath":4999,"stat.sprintOneCm":238,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/1b03cef3-3bb0-3335-8575-75a992fee2b9.json b/workspace/saves/Copy of mcpworldpp/stats/1b03cef3-3bb0-3335-8575-75a992fee2b9.json
new file mode 100644
index 00000000..d60d5732
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/1b03cef3-3bb0-3335-8575-75a992fee2b9.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":157,"stat.walkOneCm":202,"stat.jump":1,"stat.playOneMinute":89,"stat.leaveGame":2,"stat.timeSinceDeath":89,"stat.sprintOneCm":92,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/29aa321a-1ce7-35de-bfab-f37fa4095c7d.json b/workspace/saves/Copy of mcpworldpp/stats/29aa321a-1ce7-35de-bfab-f37fa4095c7d.json
new file mode 100644
index 00000000..19d065de
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/29aa321a-1ce7-35de-bfab-f37fa4095c7d.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":86,"stat.walkOneCm":355,"stat.jump":3,"stat.playOneMinute":1167,"stat.leaveGame":1,"stat.timeSinceDeath":1167,"stat.sprintOneCm":37,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/2a68c4a4-c1ba-3396-a626-ac7041e25da5.json b/workspace/saves/Copy of mcpworldpp/stats/2a68c4a4-c1ba-3396-a626-ac7041e25da5.json
new file mode 100644
index 00000000..b760075c
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/2a68c4a4-c1ba-3396-a626-ac7041e25da5.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":7329,"stat.leaveGame":1,"stat.timeSinceDeath":7329,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.json b/workspace/saves/Copy of mcpworldpp/stats/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.json
new file mode 100644
index 00000000..8d159c0d
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/2adbb68a-c561-3c7a-ac3a-f724c1f981bb.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":510,"stat.walkOneCm":296,"stat.jump":3,"stat.playOneMinute":109,"stat.leaveGame":2,"stat.timeSinceDeath":109,"stat.sprintOneCm":264,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.json b/workspace/saves/Copy of mcpworldpp/stats/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.json
new file mode 100644
index 00000000..81fa4b38
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/2e2bad62-fd9f-3bb5-a89e-b314a4f30e73.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":875,"stat.walkOneCm":2545,"stat.jump":3,"stat.playOneMinute":1418,"stat.leaveGame":1,"stat.timeSinceDeath":1418,"stat.sprintOneCm":2453,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/3247b050-58df-3a7e-91f5-44a3d807681c.json b/workspace/saves/Copy of mcpworldpp/stats/3247b050-58df-3a7e-91f5-44a3d807681c.json
new file mode 100644
index 00000000..f7c78708
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/3247b050-58df-3a7e-91f5-44a3d807681c.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":3191,"stat.leaveGame":1,"stat.timeSinceDeath":3191,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/3c28cca8-db38-324d-ac91-779beed87c8d.json b/workspace/saves/Copy of mcpworldpp/stats/3c28cca8-db38-324d-ac91-779beed87c8d.json
new file mode 100644
index 00000000..2573a536
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/3c28cca8-db38-324d-ac91-779beed87c8d.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":687,"stat.walkOneCm":2489,"stat.jump":5,"stat.playOneMinute":444,"stat.leaveGame":1,"stat.timeSinceDeath":444,"stat.sprintOneCm":2374,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/3eec9f18-1d0e-3f17-917c-6994e7d034d1.json b/workspace/saves/Copy of mcpworldpp/stats/3eec9f18-1d0e-3f17-917c-6994e7d034d1.json
new file mode 100644
index 00000000..3bc1fd15
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/3eec9f18-1d0e-3f17-917c-6994e7d034d1.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":13,"stat.leaveGame":1,"stat.timeSinceDeath":13,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.json b/workspace/saves/Copy of mcpworldpp/stats/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.json
new file mode 100644
index 00000000..9d26e7ca
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/3fff7d86-24d6-33b1-8ce1-9423a13c7c89.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":1207,"stat.walkOneCm":3530,"stat.jump":6,"stat.playOneMinute":5170,"stat.leaveGame":1,"stat.timeSinceDeath":5170,"stat.sprintOneCm":3389,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/43c314ca-2c75-349f-b8fe-ad7c6fada15e.json b/workspace/saves/Copy of mcpworldpp/stats/43c314ca-2c75-349f-b8fe-ad7c6fada15e.json
new file mode 100644
index 00000000..98ae4da4
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/43c314ca-2c75-349f-b8fe-ad7c6fada15e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":45,"stat.walkOneCm":188,"stat.jump":1,"stat.playOneMinute":30,"stat.leaveGame":1,"stat.timeSinceDeath":30,"stat.sprintOneCm":188,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/4bb7849b-3b46-3d6a-81b9-13bb408e8517.json b/workspace/saves/Copy of mcpworldpp/stats/4bb7849b-3b46-3d6a-81b9-13bb408e8517.json
new file mode 100644
index 00000000..10c222bd
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/4bb7849b-3b46-3d6a-81b9-13bb408e8517.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":8893,"stat.leaveGame":1,"stat.timeSinceDeath":8893,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.json b/workspace/saves/Copy of mcpworldpp/stats/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.json
new file mode 100644
index 00000000..2b29894e
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/4e1f5e28-f05f-3acf-ac65-db01d9d51f95.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":21,"stat.playOneMinute":2961,"stat.leaveGame":1,"stat.timeSinceDeath":2961,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.json b/workspace/saves/Copy of mcpworldpp/stats/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.json
new file mode 100644
index 00000000..fd958586
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/4ed9b5cf-d91a-3bc8-9000-b0476eccd342.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":64,"stat.jump":1,"stat.playOneMinute":21861,"stat.leaveGame":1,"stat.timeSinceDeath":21861,"stat.sprintOneCm":56,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.json b/workspace/saves/Copy of mcpworldpp/stats/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.json
new file mode 100644
index 00000000..0a5fc4a5
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/4f2b9d55-5b3e-32ee-ad58-c8df44a23337.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":240,"stat.leaveGame":1,"stat.timeSinceDeath":240,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/4fdf550e-f3b3-3a06-8485-0916b2b491bc.json b/workspace/saves/Copy of mcpworldpp/stats/4fdf550e-f3b3-3a06-8485-0916b2b491bc.json
new file mode 100644
index 00000000..c32c14ee
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/4fdf550e-f3b3-3a06-8485-0916b2b491bc.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":385,"stat.playOneMinute":27,"stat.leaveGame":1,"stat.timeSinceDeath":27,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/530fa97a-357f-3c19-94d3-0c5c65c18fe8.json b/workspace/saves/Copy of mcpworldpp/stats/530fa97a-357f-3c19-94d3-0c5c65c18fe8.json
new file mode 100644
index 00000000..aa80e867
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/530fa97a-357f-3c19-94d3-0c5c65c18fe8.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":338,"stat.walkOneCm":414,"stat.jump":2,"stat.playOneMinute":58,"stat.leaveGame":2,"stat.timeSinceDeath":58,"stat.sprintOneCm":122}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.json b/workspace/saves/Copy of mcpworldpp/stats/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.json
new file mode 100644
index 00000000..f04e8018
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":43,"stat.walkOneCm":83,"stat.jump":1,"stat.playOneMinute":4160,"stat.leaveGame":1,"stat.timeSinceDeath":4160,"stat.sprintOneCm":33,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/5cc48495-676c-3721-aed2-7336730ff405.json b/workspace/saves/Copy of mcpworldpp/stats/5cc48495-676c-3721-aed2-7336730ff405.json
new file mode 100644
index 00000000..1f5d8f49
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/5cc48495-676c-3721-aed2-7336730ff405.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":4814,"stat.walkOneCm":1435,"stat.jump":20,"stat.playOneMinute":41997,"stat.leaveGame":3,"stat.timeSinceDeath":41997,"stat.sprintOneCm":1122,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/638f7175-5dde-3b0d-a13d-f593ecd79b38.json b/workspace/saves/Copy of mcpworldpp/stats/638f7175-5dde-3b0d-a13d-f593ecd79b38.json
new file mode 100644
index 00000000..d6792dfd
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/638f7175-5dde-3b0d-a13d-f593ecd79b38.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":41,"stat.walkOneCm":507,"stat.jump":1,"stat.playOneMinute":4137,"achievement.openInventory":1,"stat.leaveGame":1,"stat.timeSinceDeath":4137,"stat.sprintOneCm":108,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/66157e7a-53e0-3299-9208-7674efd706f9.json b/workspace/saves/Copy of mcpworldpp/stats/66157e7a-53e0-3299-9208-7674efd706f9.json
new file mode 100644
index 00000000..027762c9
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/66157e7a-53e0-3299-9208-7674efd706f9.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":661,"stat.leaveGame":1,"stat.timeSinceDeath":661,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/68cf6d02-03bc-3f3b-ab98-76a8ec749597.json b/workspace/saves/Copy of mcpworldpp/stats/68cf6d02-03bc-3f3b-ab98-76a8ec749597.json
new file mode 100644
index 00000000..6fc0484f
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/68cf6d02-03bc-3f3b-ab98-76a8ec749597.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":282,"stat.jump":2,"stat.playOneMinute":1654,"stat.leaveGame":1,"stat.timeSinceDeath":1654,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/6db1171d-4fa6-31cb-b425-1896281a26e2.json b/workspace/saves/Copy of mcpworldpp/stats/6db1171d-4fa6-31cb-b425-1896281a26e2.json
new file mode 100644
index 00000000..225ce48f
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/6db1171d-4fa6-31cb-b425-1896281a26e2.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":10226,"stat.walkOneCm":11264,"stat.jump":36,"stat.playOneMinute":20627,"stat.leaveGame":1,"stat.timeSinceDeath":20627,"stat.sprintOneCm":4437,"achievement.exploreAllBiomes":{"value":0,"progress":["River","Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/71ee4b7e-330e-3d50-90a4-3d964a618ea8.json b/workspace/saves/Copy of mcpworldpp/stats/71ee4b7e-330e-3d50-90a4-3d964a618ea8.json
new file mode 100644
index 00000000..fc3cc21e
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/71ee4b7e-330e-3d50-90a4-3d964a618ea8.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":461,"stat.walkOneCm":430,"stat.jump":4,"stat.playOneMinute":259,"stat.leaveGame":1,"stat.timeSinceDeath":259,"stat.sprintOneCm":316,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/7328fbd9-6879-3343-b321-ed1f1a1e9892.json b/workspace/saves/Copy of mcpworldpp/stats/7328fbd9-6879-3343-b321-ed1f1a1e9892.json
new file mode 100644
index 00000000..1ba32cf5
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/7328fbd9-6879-3343-b321-ed1f1a1e9892.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":1205,"stat.leaveGame":1,"stat.timeSinceDeath":1205,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/74e89738-6c9e-4f59-83ef-d365849e6049.json b/workspace/saves/Copy of mcpworldpp/stats/74e89738-6c9e-4f59-83ef-d365849e6049.json
new file mode 100644
index 00000000..2f761818
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/74e89738-6c9e-4f59-83ef-d365849e6049.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":4450,"stat.walkOneCm":1368,"stat.jump":7,"stat.playOneMinute":54580,"achievement.openInventory":2,"stat.leaveGame":9,"stat.timeSinceDeath":54580,"stat.sprintOneCm":584,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills","Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/75e52373-1963-3666-bda9-8904d639e38b.json b/workspace/saves/Copy of mcpworldpp/stats/75e52373-1963-3666-bda9-8904d639e38b.json
new file mode 100644
index 00000000..c0f61636
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/75e52373-1963-3666-bda9-8904d639e38b.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":7,"stat.playOneMinute":43,"stat.leaveGame":1,"stat.timeSinceDeath":43,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/77167de3-5df9-3c83-b06a-bed9a476e835.json b/workspace/saves/Copy of mcpworldpp/stats/77167de3-5df9-3c83-b06a-bed9a476e835.json
index f19d2905..3b28edd3 100644
--- a/workspace/saves/Copy of mcpworldpp/stats/77167de3-5df9-3c83-b06a-bed9a476e835.json
+++ b/workspace/saves/Copy of mcpworldpp/stats/77167de3-5df9-3c83-b06a-bed9a476e835.json
@@ -1 +1 @@
-{"stat.playOneMinute":8103,"stat.leaveGame":1,"stat.timeSinceDeath":8103,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
+{"stat.flyOneCm":96,"stat.walkOneCm":127,"stat.jump":1,"stat.playOneMinute":19749,"stat.leaveGame":2,"stat.timeSinceDeath":19749,"stat.sprintOneCm":82,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.json b/workspace/saves/Copy of mcpworldpp/stats/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.json
new file mode 100644
index 00000000..4131a7dc
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/7ba45a5a-c3de-3909-ba3c-f9f78edf15b6.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":2772,"stat.walkOneCm":1100,"stat.jump":8,"stat.playOneMinute":4370,"stat.leaveGame":1,"stat.timeSinceDeath":4370,"stat.sprintOneCm":513,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/7fef5833-06c9-398a-84c0-fbd3a81ff548.json b/workspace/saves/Copy of mcpworldpp/stats/7fef5833-06c9-398a-84c0-fbd3a81ff548.json
new file mode 100644
index 00000000..081ef1ad
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/7fef5833-06c9-398a-84c0-fbd3a81ff548.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":2185,"stat.walkOneCm":9906,"stat.jump":4,"stat.playOneMinute":6102,"achievement.openInventory":1,"stat.leaveGame":1,"stat.damageDealt":50,"stat.timeSinceDeath":6102,"stat.sprintOneCm":3230,"stat.useItem.minecraft.spawn_egg":1,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/8cfc5391-e37d-328f-a689-9b5f6c4663f5.json b/workspace/saves/Copy of mcpworldpp/stats/8cfc5391-e37d-328f-a689-9b5f6c4663f5.json
index 0720c3d9..13ee8491 100644
--- a/workspace/saves/Copy of mcpworldpp/stats/8cfc5391-e37d-328f-a689-9b5f6c4663f5.json
+++ b/workspace/saves/Copy of mcpworldpp/stats/8cfc5391-e37d-328f-a689-9b5f6c4663f5.json
@@ -1 +1 @@
-{"stat.playOneMinute":32,"stat.leaveGame":1,"stat.timeSinceDeath":32}
\ No newline at end of file
+{"stat.flyOneCm":534,"stat.walkOneCm":94,"stat.jump":1,"stat.playOneMinute":2816,"achievement.openInventory":1,"stat.leaveGame":2,"stat.timeSinceDeath":2816,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.json b/workspace/saves/Copy of mcpworldpp/stats/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.json
new file mode 100644
index 00000000..11f00566
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/93bfa0b6-cc14-3c0c-8efa-0bcc48245274.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":50411,"stat.walkOneCm":8890,"stat.jump":38,"stat.playOneMinute":25404,"achievement.openInventory":1,"stat.leaveGame":1,"stat.crouchOneCm":122,"stat.timeSinceDeath":25404,"stat.sprintOneCm":5195,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/942531dd-7690-3c0a-ad42-657bb212e7b6.json b/workspace/saves/Copy of mcpworldpp/stats/942531dd-7690-3c0a-ad42-657bb212e7b6.json
new file mode 100644
index 00000000..ebf1e850
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/942531dd-7690-3c0a-ad42-657bb212e7b6.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":47,"stat.leaveGame":1,"stat.timeSinceDeath":47,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/989691b1-d197-3995-a55e-281cda3663ae.json b/workspace/saves/Copy of mcpworldpp/stats/989691b1-d197-3995-a55e-281cda3663ae.json
new file mode 100644
index 00000000..307b6647
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/989691b1-d197-3995-a55e-281cda3663ae.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":895,"stat.walkOneCm":960,"stat.jump":4,"stat.playOneMinute":17259,"stat.leaveGame":1,"stat.timeSinceDeath":17259,"stat.sprintOneCm":531,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/9df70e84-3251-33fb-9047-d59112057246.json b/workspace/saves/Copy of mcpworldpp/stats/9df70e84-3251-33fb-9047-d59112057246.json
new file mode 100644
index 00000000..8d2a2222
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/9df70e84-3251-33fb-9047-d59112057246.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":2436,"stat.leaveGame":1,"stat.timeSinceDeath":2436,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/9e5d41e7-4785-3b2f-8261-593dade57f6e.json b/workspace/saves/Copy of mcpworldpp/stats/9e5d41e7-4785-3b2f-8261-593dade57f6e.json
new file mode 100644
index 00000000..58e43738
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/9e5d41e7-4785-3b2f-8261-593dade57f6e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":632,"stat.walkOneCm":18937,"stat.jump":5,"stat.playOneMinute":9881,"achievement.openInventory":1,"stat.leaveGame":2,"stat.damageDealt":310,"stat.crouchOneCm":483,"stat.timeSinceDeath":9881,"stat.sprintOneCm":539,"stat.mobKills":1,"stat.useItem.minecraft.spawn_egg":2,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]},"stat.killEntity.Creeper":1,"stat.useItem.minecraft.diamond_sword":3}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/a08e137b-04fa-3fce-96cc-517c7a87690d.json b/workspace/saves/Copy of mcpworldpp/stats/a08e137b-04fa-3fce-96cc-517c7a87690d.json
new file mode 100644
index 00000000..042a889d
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/a08e137b-04fa-3fce-96cc-517c7a87690d.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":4106,"stat.leaveGame":1,"stat.timeSinceDeath":4106,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/aeca01bf-232e-37a2-985b-599827b3226a.json b/workspace/saves/Copy of mcpworldpp/stats/aeca01bf-232e-37a2-985b-599827b3226a.json
new file mode 100644
index 00000000..d70cb609
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/aeca01bf-232e-37a2-985b-599827b3226a.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":4436,"stat.leaveGame":1,"stat.timeSinceDeath":4436,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/b136c8aa-0654-3583-8db1-8749e12181a1.json b/workspace/saves/Copy of mcpworldpp/stats/b136c8aa-0654-3583-8db1-8749e12181a1.json
new file mode 100644
index 00000000..c6da850d
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/b136c8aa-0654-3583-8db1-8749e12181a1.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":43172,"stat.walkOneCm":1646,"stat.jump":17,"stat.playOneMinute":6051,"stat.leaveGame":1,"stat.timeSinceDeath":6051,"stat.sprintOneCm":1565,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills","Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/b25e3f31-3d0d-30a3-b307-8902510a505e.json b/workspace/saves/Copy of mcpworldpp/stats/b25e3f31-3d0d-30a3-b307-8902510a505e.json
new file mode 100644
index 00000000..0e5aa1ff
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/b25e3f31-3d0d-30a3-b307-8902510a505e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":479,"stat.walkOneCm":3889,"stat.jump":10,"stat.playOneMinute":4743,"stat.leaveGame":1,"stat.timeSinceDeath":4743,"stat.sprintOneCm":1686,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/babe9e7f-35b2-34ef-82f9-4869d34a0755.json b/workspace/saves/Copy of mcpworldpp/stats/babe9e7f-35b2-34ef-82f9-4869d34a0755.json
new file mode 100644
index 00000000..86b149d7
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/babe9e7f-35b2-34ef-82f9-4869d34a0755.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":13153,"stat.leaveGame":1,"stat.timeSinceDeath":13153,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/bf0c47d3-02b6-3463-8e38-457226b1407c.json b/workspace/saves/Copy of mcpworldpp/stats/bf0c47d3-02b6-3463-8e38-457226b1407c.json
new file mode 100644
index 00000000..1f8852af
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/bf0c47d3-02b6-3463-8e38-457226b1407c.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":829,"stat.playOneMinute":3254,"stat.leaveGame":1,"stat.timeSinceDeath":3254,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/ccf0c278-c21f-3ec3-a87c-05202673a5dd.json b/workspace/saves/Copy of mcpworldpp/stats/ccf0c278-c21f-3ec3-a87c-05202673a5dd.json
new file mode 100644
index 00000000..8ed1d208
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/ccf0c278-c21f-3ec3-a87c-05202673a5dd.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":1825,"stat.leaveGame":1,"stat.timeSinceDeath":1825,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/d1b650bf-5f9c-37d3-a469-4d66d1968f90.json b/workspace/saves/Copy of mcpworldpp/stats/d1b650bf-5f9c-37d3-a469-4d66d1968f90.json
new file mode 100644
index 00000000..28f8f4dc
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/d1b650bf-5f9c-37d3-a469-4d66d1968f90.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":33,"stat.jump":1,"stat.playOneMinute":26,"stat.leaveGame":1,"stat.timeSinceDeath":26,"stat.sprintOneCm":33,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json b/workspace/saves/Copy of mcpworldpp/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json
new file mode 100644
index 00000000..21cd8e7b
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/dcea94fd-efa4-3c29-93d8-2d56666245c7.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":252,"stat.walkOneCm":7329,"stat.drop":1,"stat.jump":19,"stat.playOneMinute":4761,"stat.leaveGame":1,"stat.timeSinceDeath":4761,"stat.sprintOneCm":1920,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/df2d3e26-a8b7-3aae-9296-f3a891282132.json b/workspace/saves/Copy of mcpworldpp/stats/df2d3e26-a8b7-3aae-9296-f3a891282132.json
new file mode 100644
index 00000000..d52a1adf
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/df2d3e26-a8b7-3aae-9296-f3a891282132.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":89,"stat.walkOneCm":528,"stat.jump":4,"stat.playOneMinute":10266,"stat.leaveGame":1,"stat.timeSinceDeath":10266,"stat.sprintOneCm":363,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.json b/workspace/saves/Copy of mcpworldpp/stats/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.json
new file mode 100644
index 00000000..e2086628
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/df7bffa7-7a2f-3fb4-9898-fa23c41e49b8.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":1831,"stat.walkOneCm":673,"stat.jump":12,"stat.playOneMinute":11174,"stat.leaveGame":1,"stat.timeSinceDeath":11174,"stat.sprintOneCm":517,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/e012d939-bd4c-38f9-ae46-831d4959ff05.json b/workspace/saves/Copy of mcpworldpp/stats/e012d939-bd4c-38f9-ae46-831d4959ff05.json
new file mode 100644
index 00000000..e7b22240
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/e012d939-bd4c-38f9-ae46-831d4959ff05.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":103,"stat.jump":1,"stat.playOneMinute":3517,"stat.leaveGame":1,"stat.timeSinceDeath":3517,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/e122e0b0-374f-3b1b-a986-63f4fefee57a.json b/workspace/saves/Copy of mcpworldpp/stats/e122e0b0-374f-3b1b-a986-63f4fefee57a.json
new file mode 100644
index 00000000..221980e6
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/e122e0b0-374f-3b1b-a986-63f4fefee57a.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":736,"stat.leaveGame":1,"stat.timeSinceDeath":736,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/e4358028-bc3b-38cc-b645-4d08d3b4f456.json b/workspace/saves/Copy of mcpworldpp/stats/e4358028-bc3b-38cc-b645-4d08d3b4f456.json
new file mode 100644
index 00000000..48c1769f
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/e4358028-bc3b-38cc-b645-4d08d3b4f456.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":11502,"stat.leaveGame":1,"stat.timeSinceDeath":11502,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.json b/workspace/saves/Copy of mcpworldpp/stats/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.json
new file mode 100644
index 00000000..ee1477ee
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/e4e5b30f-b972-382c-b5e5-86c2e785a8a6.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":11079,"stat.walkOneCm":2824,"stat.jump":26,"stat.playOneMinute":2878,"stat.leaveGame":1,"stat.timeSinceDeath":2878,"stat.sprintOneCm":2307,"achievement.exploreAllBiomes":{"value":0,"progress":["River","Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/e664a043-6e9c-3d0d-9b38-cc385e35aba9.json b/workspace/saves/Copy of mcpworldpp/stats/e664a043-6e9c-3d0d-9b38-cc385e35aba9.json
new file mode 100644
index 00000000..a77831f4
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/e664a043-6e9c-3d0d-9b38-cc385e35aba9.json
@@ -0,0 +1 @@
+{"stat.walkOneCm":333,"stat.playOneMinute":133,"stat.leaveGame":1,"stat.timeSinceDeath":133,"stat.sprintOneCm":155,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/eadcccd1-5981-31ce-8342-c727c73b0197.json b/workspace/saves/Copy of mcpworldpp/stats/eadcccd1-5981-31ce-8342-c727c73b0197.json
new file mode 100644
index 00000000..05aba0a8
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/eadcccd1-5981-31ce-8342-c727c73b0197.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":3542,"stat.leaveGame":1,"stat.timeSinceDeath":3542,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.json b/workspace/saves/Copy of mcpworldpp/stats/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.json
new file mode 100644
index 00000000..e49a2e61
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/eed453d8-1b3a-3fa3-9fc5-1cf433d73521.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":95,"stat.walkOneCm":158,"stat.jump":2,"stat.playOneMinute":729,"stat.leaveGame":1,"stat.timeSinceDeath":729,"stat.sprintOneCm":57,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/eee10812-13cd-3f90-b77f-2195c9c5b71e.json b/workspace/saves/Copy of mcpworldpp/stats/eee10812-13cd-3f90-b77f-2195c9c5b71e.json
new file mode 100644
index 00000000..6f4b79f4
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/eee10812-13cd-3f90-b77f-2195c9c5b71e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":5320,"stat.walkOneCm":7178,"stat.drop":1,"stat.jump":44,"stat.useItem.minecraft.sand":5,"stat.playOneMinute":12659,"achievement.openInventory":1,"stat.leaveGame":1,"stat.timeSinceDeath":12659,"stat.sprintOneCm":5959,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.json b/workspace/saves/Copy of mcpworldpp/stats/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.json
new file mode 100644
index 00000000..b4170a49
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/f0c5379b-0e4e-34aa-808d-37fef9b5ce6c.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":526,"stat.walkOneCm":1699,"stat.jump":8,"stat.playOneMinute":2429,"stat.leaveGame":1,"stat.timeSinceDeath":2429,"stat.sprintOneCm":370,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.json b/workspace/saves/Copy of mcpworldpp/stats/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.json
new file mode 100644
index 00000000..661403e5
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/f318a6c7-0ff1-368e-9d3e-1b850b84da5e.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":299,"stat.walkOneCm":325,"stat.jump":2,"stat.playOneMinute":5545,"stat.leaveGame":1,"stat.timeSinceDeath":5545,"stat.sprintOneCm":193,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.json b/workspace/saves/Copy of mcpworldpp/stats/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.json
new file mode 100644
index 00000000..2a3bc6ee
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/f72636fb-c7db-3c44-8cd4-8a6790fd9b69.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":190,"stat.walkOneCm":2217,"stat.jump":1,"stat.playOneMinute":3021,"stat.leaveGame":1,"stat.timeSinceDeath":3021,"stat.sprintOneCm":960,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.json b/workspace/saves/Copy of mcpworldpp/stats/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.json
new file mode 100644
index 00000000..9f11cb5b
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/fc74fe37-e9f9-3198-8e46-1eee97cacfa6.json
@@ -0,0 +1 @@
+{"stat.flyOneCm":2043,"stat.walkOneCm":9425,"stat.jump":10,"stat.playOneMinute":6417,"stat.leaveGame":1,"stat.crouchOneCm":256,"stat.timeSinceDeath":6417,"stat.sprintOneCm":3279,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.json b/workspace/saves/Copy of mcpworldpp/stats/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.json
index 864d330e..4b8798ed 100644
--- a/workspace/saves/Copy of mcpworldpp/stats/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.json
+++ b/workspace/saves/Copy of mcpworldpp/stats/fcaa91cc-3a77-3318-a8ae-f2f3862b7fde.json
@@ -1 +1 @@
-{"stat.playOneMinute":41,"stat.leaveGame":1,"stat.timeSinceDeath":41,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
+{"stat.walkOneCm":320,"stat.playOneMinute":1635,"stat.leaveGame":2,"stat.timeSinceDeath":1635,"achievement.exploreAllBiomes":{"value":0,"progress":["DesertHills","Desert"]}}
\ No newline at end of file
diff --git a/workspace/saves/Copy of mcpworldpp/stats/fd09468e-08e7-31aa-bab7-195a6ef31320.json b/workspace/saves/Copy of mcpworldpp/stats/fd09468e-08e7-31aa-bab7-195a6ef31320.json
new file mode 100644
index 00000000..0720c3d9
--- /dev/null
+++ b/workspace/saves/Copy of mcpworldpp/stats/fd09468e-08e7-31aa-bab7-195a6ef31320.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":32,"stat.leaveGame":1,"stat.timeSinceDeath":32}
\ No newline at end of file
diff --git a/workspace/saves/MCP Development World/level.dat b/workspace/saves/MCP Development World/level.dat
index 1809b8d6..4dbfc683 100644
Binary files a/workspace/saves/MCP Development World/level.dat and b/workspace/saves/MCP Development World/level.dat differ
diff --git a/workspace/saves/MCP Development World/level.dat_old b/workspace/saves/MCP Development World/level.dat_old
index 2e5acb6c..675180a6 100644
Binary files a/workspace/saves/MCP Development World/level.dat_old and b/workspace/saves/MCP Development World/level.dat_old differ
diff --git a/workspace/saves/MCP Development World/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat b/workspace/saves/MCP Development World/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat
new file mode 100644
index 00000000..19542b89
Binary files /dev/null and b/workspace/saves/MCP Development World/playerdata/1aca2fd8-a080-3d28-afe0-430fc033484e.dat differ
diff --git a/workspace/saves/MCP Development World/region/r.0.-1.mca b/workspace/saves/MCP Development World/region/r.0.-1.mca
index 3ba63241..0a0a87ef 100644
Binary files a/workspace/saves/MCP Development World/region/r.0.-1.mca and b/workspace/saves/MCP Development World/region/r.0.-1.mca differ
diff --git a/workspace/saves/MCP Development World/region/r.0.0.mca b/workspace/saves/MCP Development World/region/r.0.0.mca
index c12caa71..b3ed6812 100644
Binary files a/workspace/saves/MCP Development World/region/r.0.0.mca and b/workspace/saves/MCP Development World/region/r.0.0.mca differ
diff --git a/workspace/saves/MCP Development World/region/r.1.-1.mca b/workspace/saves/MCP Development World/region/r.1.-1.mca
index 2527a742..83065cb3 100644
Binary files a/workspace/saves/MCP Development World/region/r.1.-1.mca and b/workspace/saves/MCP Development World/region/r.1.-1.mca differ
diff --git a/workspace/saves/MCP Development World/region/r.1.0.mca b/workspace/saves/MCP Development World/region/r.1.0.mca
index 411b8af5..bbf3dce1 100644
Binary files a/workspace/saves/MCP Development World/region/r.1.0.mca and b/workspace/saves/MCP Development World/region/r.1.0.mca differ
diff --git a/workspace/saves/MCP Development World/region/r.1.1.mca b/workspace/saves/MCP Development World/region/r.1.1.mca
index b1c1818e..08fe5178 100644
Binary files a/workspace/saves/MCP Development World/region/r.1.1.mca and b/workspace/saves/MCP Development World/region/r.1.1.mca differ
diff --git a/workspace/saves/MCP Development World/session.lock b/workspace/saves/MCP Development World/session.lock
index 85fb5855..4530b938 100644
Binary files a/workspace/saves/MCP Development World/session.lock and b/workspace/saves/MCP Development World/session.lock differ
diff --git a/workspace/saves/MCP Development World/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json b/workspace/saves/MCP Development World/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json
new file mode 100644
index 00000000..dedb46ad
--- /dev/null
+++ b/workspace/saves/MCP Development World/stats/1aca2fd8-a080-3d28-afe0-430fc033484e.json
@@ -0,0 +1 @@
+{"stat.playOneMinute":11,"stat.leaveGame":1,"stat.timeSinceDeath":11,"achievement.exploreAllBiomes":{"value":0,"progress":["Desert"]}}
\ No newline at end of file
diff --git a/workspace/screenshots/2023-06-09_22.21.46.png b/workspace/screenshots/2023-06-09_22.21.46.png
new file mode 100644
index 00000000..077206fd
Binary files /dev/null and b/workspace/screenshots/2023-06-09_22.21.46.png differ
diff --git a/workspace/screenshots/2023-06-09_23.50.04.png b/workspace/screenshots/2023-06-09_23.50.04.png
new file mode 100644
index 00000000..6a8681f8
Binary files /dev/null and b/workspace/screenshots/2023-06-09_23.50.04.png differ
diff --git a/workspace/screenshots/2023-06-09_23.50.52.png b/workspace/screenshots/2023-06-09_23.50.52.png
new file mode 100644
index 00000000..64594942
Binary files /dev/null and b/workspace/screenshots/2023-06-09_23.50.52.png differ
diff --git a/workspace/screenshots/2023-06-09_23.52.48.png b/workspace/screenshots/2023-06-09_23.52.48.png
new file mode 100644
index 00000000..d980d724
Binary files /dev/null and b/workspace/screenshots/2023-06-09_23.52.48.png differ
diff --git a/workspace/screenshots/2023-06-10_15.53.53.png b/workspace/screenshots/2023-06-10_15.53.53.png
new file mode 100644
index 00000000..3f49b723
Binary files /dev/null and b/workspace/screenshots/2023-06-10_15.53.53.png differ
diff --git a/workspace/settings/accounts.json b/workspace/settings/accounts.json
new file mode 100644
index 00000000..0f6ac15d
--- /dev/null
+++ b/workspace/settings/accounts.json
@@ -0,0 +1,2 @@
+Account:SESSION:ziue:74e897386c9e4f5983efd365849e6049:eyJraWQiOiJhYzg0YSIsImFsZyI6IkhTMjU2In0.eyJ4dWlkIjoiMjUzNTQ1NzY0NzAzOTc0NCIsImFnZyI6IkFkdWx0Iiwic3ViIjoiZmJjMWNmNDAtOGVmYi00NTJiLTk0OWQtM2FmYTljYTUxNDNmIiwiYXV0aCI6IlhCT1giLCJucyI6ImRlZmF1bHQiLCJyb2xlcyI6W10sImlzcyI6ImF1dGhlbnRpY2F0aW9uIiwiZmxhZ3MiOlsidHdvZmFjdG9yYXV0aCIsIm9yZGVyc18yMDIyIl0sInBsYXRmb3JtIjoiVU5LTk9XTiIsInl1aWQiOiIxOGY1OTcyZGJkZTg0YTUwODhkODM3ODZkN2RmNzA2YiIsIm5iZiI6MTY4NjQwMjM2NiwiZXhwIjoxNjg2NDg4NzY2LCJpYXQiOjE2ODY0MDIzNjZ9.O6VuXdS13ypM71k6B3qcQDbzV78XDvh18H76bI4g52E
+Current:ziue
diff --git a/workspace/settings/configs/default.json b/workspace/settings/configs/default.json
index 92f33ac1..2f89a09c 100644
--- a/workspace/settings/configs/default.json
+++ b/workspace/settings/configs/default.json
@@ -4,7 +4,7 @@
"bind": 0,
"hud": {},
"bindtype": "Toggle",
- "enabled": false
+ "enabled": true
},
"Optimizer": {
"settings": {
@@ -12,7 +12,7 @@
"Remove chat background": false,
"Merge TNT": true,
"Better skin loading": true,
- "Chunk update limiter": true,
+ "Chunk update limiter": false,
"Remove item glint": true,
"Chunk updates per second": 50,
"Better Chests": false,
@@ -39,6 +39,16 @@
"bindtype": "Toggle",
"enabled": false
},
+ "Minimal Bobbing": {
+ "settings": {
+ "Remove Screen Bobbing": true,
+ "Remove Hand Bobbing": true
+ },
+ "bind": 0,
+ "hud": {},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
"Crosshair": {
"settings": {
"Draw color": {
@@ -60,7 +70,7 @@
"settings": {
"Static Chroma": false,
"Background": true,
- "Custom Font": false,
+ "Custom Font": true,
"Wave Chroma": false,
"Color": {
"red": 255,
@@ -74,30 +84,30 @@
"blue": 0,
"alpha": 153
},
- "Display Mode": "Modern",
- "Right Click Counter": false
+ "Display Mode": "Circle",
+ "Right Click Counter": true
},
"bind": 0,
"hud": {"cps": {
"visible": true,
- "x": 107,
- "y": 208,
+ "x": 314,
+ "y": 519,
"scale": 1
}},
"bindtype": "Toggle",
- "enabled": false
+ "enabled": true
},
"FPS": {
"settings": {
"Static Chroma": false,
"Background": true,
- "Custom Font": false,
+ "Custom Font": true,
"Wave Chroma": false,
"Background Color": {
"red": 0,
"green": 0,
"blue": 0,
- "alpha": 150
+ "alpha": 153
},
"Color": {
"red": 255,
@@ -105,17 +115,17 @@
"blue": 255,
"alpha": 255
},
- "Display Mode": "Modern"
+ "Display Mode": "Circle"
},
"bind": 0,
"hud": {"fps": {
"visible": true,
- "x": 1,
- "y": 175,
+ "x": 573,
+ "y": 519,
"scale": 1
}},
"bindtype": "Toggle",
- "enabled": false
+ "enabled": true
},
"Block Overlay": {
"settings": {
@@ -126,8 +136,8 @@
"blue": 250,
"alpha": 255
},
- "Line Width": 4.3,
- "Mode": "Highlight",
+ "Line Width": 1,
+ "Mode": "Outline",
"Highlight Color": {
"red": 252,
"green": 252,
@@ -140,6 +150,37 @@
"bindtype": "Toggle",
"enabled": true
},
+ "Clock": {
+ "settings": {
+ "Static Chroma": false,
+ "Background": true,
+ "Custom Font": false,
+ "Wave Chroma": false,
+ "Color": {
+ "red": 255,
+ "green": 255,
+ "blue": 255,
+ "alpha": 255
+ },
+ "Background Color": {
+ "red": 0,
+ "green": 0,
+ "blue": 0,
+ "alpha": 150
+ },
+ "Display Mode": "Circle",
+ "Clock Format": "yyyy/MM/dd HH:mm:ss"
+ },
+ "bind": 0,
+ "hud": {"time": {
+ "visible": true,
+ "x": 1,
+ "y": 190,
+ "scale": 1
+ }},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
"Custom Text": {
"settings": {
"Static Chroma": false,
@@ -158,7 +199,7 @@
"blue": 0,
"alpha": 150
},
- "Display Mode": "Modern",
+ "Display Mode": "Circle",
"Custom Text": "Custom Text Here"
},
"bind": 0,
@@ -171,26 +212,28 @@
"bindtype": "Toggle",
"enabled": false
},
- "Clock": {
+ "Aim Trainer": {
"settings": {
+ "Speed": 1.64,
"Static Chroma": false,
"Background": true,
"Custom Font": false,
"Wave Chroma": false,
- "Color": {
- "red": 255,
- "green": 255,
- "blue": 255,
- "alpha": 255
- },
+ "Move": false,
"Background Color": {
"red": 0,
"green": 0,
"blue": 0,
"alpha": 153
},
- "Display Mode": "Modern",
- "Clock Format": "yyyy/MM/dd HH:mm:ss"
+ "Color": {
+ "red": 255,
+ "green": 255,
+ "blue": 255,
+ "alpha": 255
+ },
+ "Display Mode": "Circle",
+ "Distance": 1.48
},
"bind": 0,
"hud": {"time": {
@@ -202,31 +245,24 @@
"bindtype": "Toggle",
"enabled": false
},
- "TPS": {
+ "Scoreboard": {
"settings": {
- "Custom Font": false,
"Background": true,
- "Mode": "Number",
"Background Color": {
"red": 0,
"green": 0,
"blue": 0,
- "alpha": 90
+ "alpha": 153
},
- "Display Mode": "Modern",
- "Preset Color": true,
- "TPS Color": {
- "red": 255,
- "green": 255,
- "blue": 255,
- "alpha": 255
- }
+ "Free Move": false,
+ "Display Mode": "Fade",
+ "Show Numbers": false
},
"bind": 0,
- "hud": {"tps": {
+ "hud": {"scoreboard": {
"visible": true,
- "x": 0,
- "y": 0,
+ "x": 842,
+ "y": 243,
"scale": 1
}},
"bindtype": "Toggle",
@@ -251,7 +287,7 @@
"blue": 0,
"alpha": 150
},
- "Display Mode": "Modern"
+ "Display Mode": "Circle"
},
"bind": 0,
"hud": {"memory usage": {
@@ -263,6 +299,43 @@
"bindtype": "Toggle",
"enabled": false
},
+ "HitDelayFix": {
+ "settings": {},
+ "bind": 0,
+ "hud": {},
+ "bindtype": "Toggle",
+ "enabled": true
+ },
+ "TPS": {
+ "settings": {
+ "Custom Font": false,
+ "Background": true,
+ "Mode": "Number",
+ "Background Color": {
+ "red": 0,
+ "green": 0,
+ "blue": 0,
+ "alpha": 90
+ },
+ "Display Mode": "Circle",
+ "Preset Color": true,
+ "TPS Color": {
+ "red": 255,
+ "green": 255,
+ "blue": 255,
+ "alpha": 255
+ }
+ },
+ "bind": 0,
+ "hud": {"tps": {
+ "visible": true,
+ "x": 0,
+ "y": 0,
+ "scale": 1
+ }},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
"Armor Status": {
"settings": {
"Value Display": "Value Damage",
@@ -290,11 +363,11 @@
"enabled": false
},
"Chat": {
- "settings": {"Custom Font": false},
+ "settings": {"Infinite Chat": true},
"bind": 0,
"hud": {},
"bindtype": "Toggle",
- "enabled": false
+ "enabled": true
},
"Zoom": {
"settings": {
@@ -315,7 +388,7 @@
"bindtype": "Toggle",
"enabled": false
},
- "theme": "ATHENA",
+ "theme": "MOONLIGHT",
"Freelook": {
"settings": {
"Perspective Key": 0,
@@ -338,12 +411,12 @@
},
"Background": true,
"Show Direction": true,
- "Display Mode": "Modern",
+ "Display Mode": "Circle",
"Shout Coordinates Key": 0,
"Chat Format": "X: {x}, Y: {y}, Z: {z}",
"Show Label": true,
"Show Biome": true,
- "Show Avatar": false,
+ "Show Avatar": true,
"Value Color": {
"red": 255,
"green": 255,
@@ -351,7 +424,7 @@
"alpha": 255
},
"Biome Preset Color": true,
- "Custom Font": false,
+ "Custom Font": true,
"Label Color": {
"red": 255,
"green": 255,
@@ -374,8 +447,8 @@
"bind": 0,
"hud": {"coordinates": {
"visible": true,
- "x": 51,
- "y": 73,
+ "x": 164,
+ "y": 120,
"scale": 1
}},
"bindtype": "Toggle",
@@ -404,15 +477,49 @@
"red": 0,
"green": 0,
"blue": 0,
- "alpha": 153
+ "alpha": 150
},
- "Display Mode": "Modern"
+ "Display Mode": "Circle"
},
"bind": 0,
"hud": {"entityhud": {
"visible": true,
- "x": 51,
- "y": 159,
+ "x": 1,
+ "y": 175,
+ "scale": 1
+ }},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
+ "ToggleSprint": {
+ "settings": {
+ "Toggle Sprint": true,
+ "Double Tap Sprint": false,
+ "Background": false,
+ "Fly Boost Speed Vertical": 2,
+ "Fly Boost Speed Horizontal": 2,
+ "Custom Font": false,
+ "Toggle Sneak": true,
+ "Background Color": {
+ "red": 0,
+ "green": 0,
+ "blue": 0,
+ "alpha": 150
+ },
+ "Color": {
+ "red": 255,
+ "green": 255,
+ "blue": 255,
+ "alpha": 255
+ },
+ "Display Mode": "Circle",
+ "Fly Boost": true
+ },
+ "bind": 0,
+ "hud": {"togglesprint": {
+ "visible": true,
+ "x": 0,
+ "y": 0,
"scale": 1
}},
"bindtype": "Toggle",
@@ -480,18 +587,7 @@
"bind": 0,
"hud": {},
"bindtype": "Toggle",
- "enabled": false
- },
- "General Settings": {
- "settings": {
- "Show Logo On Tab": false,
- "F5 Nametags": false,
- "Custom GUI Font": true
- },
- "bind": 0,
- "hud": {},
- "bindtype": "Toggle",
- "enabled": false
+ "enabled": true
},
"Pot Counter": {
"settings": {
@@ -512,7 +608,7 @@
"blue": 0,
"alpha": 150
},
- "Display Mode": "Modern"
+ "Display Mode": "Circle"
},
"bind": 0,
"hud": {"potioncounter": {
@@ -524,6 +620,24 @@
"bindtype": "Toggle",
"enabled": false
},
+ "General Settings": {
+ "settings": {
+ "Show Logo On Tab": true,
+ "F5 Nametags": true,
+ "Custom GUI Font": true
+ },
+ "bind": 0,
+ "hud": {},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
+ "Nick Hider": {
+ "settings": {"Nick": "hello"},
+ "bind": 0,
+ "hud": {},
+ "bindtype": "Toggle",
+ "enabled": false
+ },
"Motion Blur": {
"settings": {"Blur Amount": 2},
"bind": 0,
@@ -536,6 +650,6 @@
"bind": 0,
"hud": {},
"bindtype": "Toggle",
- "enabled": false
+ "enabled": true
}
}
\ No newline at end of file
diff --git a/workspace/usercache.json b/workspace/usercache.json
index d9c13327..b24dd152 100644
--- a/workspace/usercache.json
+++ b/workspace/usercache.json
@@ -1 +1 @@
-[{"name":"Player53","uuid":"12477fb0-fd41-3fca-893f-e59684d982a8","expiresOn":"2023-07-08 21:24:44 +0200"},{"name":"Player491","uuid":"46f780a1-2e26-3e88-a90a-02cf37fe1547","expiresOn":"2023-07-08 19:10:32 +0200"},{"name":"Player412","uuid":"d978d670-4b07-3a90-bfb6-b4e7c70fe7fc","expiresOn":"2023-07-08 18:15:08 +0200"},{"name":"Player268","uuid":"b84ce5d9-353d-370c-a2cf-b4a66513f5a8","expiresOn":"2023-07-08 10:42:07 +0200"},{"name":"Player999","uuid":"3c28cca8-db38-324d-ac91-779beed87c8d","expiresOn":"2023-07-08 17:28:24 +0200"},{"name":"ziue","uuid":"74e89738-6c9e-4f59-83ef-d365849e6049","expiresOn":"2023-07-08 15:25:38 +0200"},{"name":"Player597","uuid":"618c707a-83d7-31ad-b075-bd98e2c75926","expiresOn":"2023-07-08 16:49:56 +0200"},{"name":"Player730","uuid":"409ad871-75ba-3dbd-b116-807d64800e7d","expiresOn":"2023-07-08 17:48:36 +0200"},{"name":"Player920","uuid":"ad8236b9-e26f-349c-902e-7100197cd86d","expiresOn":"2023-07-08 19:13:30 +0200"},{"name":"Player939","uuid":"0704e0ba-eaf6-3b26-b880-53fd45ec3b48","expiresOn":"2023-07-08 19:15:56 +0200"},{"name":"Player854","uuid":"2a68c4a4-c1ba-3396-a626-ac7041e25da5","expiresOn":"2023-07-08 17:15:46 +0200"},{"name":"Player203","uuid":"d96be705-d0ae-31d3-afba-31a637d80f6d","expiresOn":"2023-07-08 16:29:04 +0200"},{"name":"Player962","uuid":"7ef37f89-ec95-314c-ad83-8a71ac6e461c","expiresOn":"2023-07-08 18:46:33 +0200"},{"name":"Player426","uuid":"71f66ac1-c861-3de2-8cda-9d0f80277f27","expiresOn":"2023-07-08 19:55:34 +0200"},{"name":"Player579","uuid":"6ae8fe40-3ccb-3755-8fd2-c5445728b386","expiresOn":"2023-07-08 19:18:18 +0200"},{"name":"Player621","uuid":"55199b58-d04f-3d22-9ce2-5472509a024b","expiresOn":"2023-07-08 16:26:24 +0200"},{"name":"Player3","uuid":"f318a6c7-0ff1-368e-9d3e-1b850b84da5e","expiresOn":"2023-07-08 16:41:01 +0200"},{"name":"Player405","uuid":"600ef575-e50b-3323-b0f1-19e3a176b08b","expiresOn":"2023-07-08 19:15:08 +0200"},{"name":"Player336","uuid":"2eef3335-8d1f-3428-af42-f3cec9010d4c","expiresOn":"2023-07-08 19:21:04 +0200"},{"name":"Player742","uuid":"01d9f825-5509-3b83-aacf-c98ce0dce1c7","expiresOn":"2023-07-08 17:55:59 +0200"},{"name":"Player755","uuid":"8dbdaed5-4750-31ee-aa4f-4c3b2bfbc6f7","expiresOn":"2023-07-08 19:11:24 +0200"},{"name":"Player136","uuid":"f4642d2b-29f9-34b7-8b90-e6570e856434","expiresOn":"2023-07-08 16:32:44 +0200"},{"name":"Player6","uuid":"6e946422-0041-3048-9c85-48e4f886211a","expiresOn":"2023-07-08 18:00:50 +0200"},{"name":"Player773","uuid":"b7a940e4-3cde-3275-9c73-2f71fe593c98","expiresOn":"2023-07-08 16:37:19 +0200"},{"name":"Player790","uuid":"2f0d3d8c-afbe-358f-b8f3-786d7b0f9259","expiresOn":"2023-07-08 16:44:53 +0200"},{"name":"Player308","uuid":"6db1171d-4fa6-31cb-b425-1896281a26e2","expiresOn":"2023-07-08 13:43:03 +0200"},{"name":"Player422","uuid":"cb3fd6c5-1d0c-334b-a8d4-85d2c85eb576","expiresOn":"2023-07-08 17:21:41 +0200"},{"name":"Player847","uuid":"6004b361-ef29-34d2-b89c-32df237908c7","expiresOn":"2023-07-08 19:29:12 +0200"},{"name":"Player750","uuid":"2659329e-1c65-3850-9659-d27fc655aa3c","expiresOn":"2023-07-08 19:27:39 +0200"},{"name":"Player465","uuid":"d447d002-8f00-3c6c-8a29-93b028d90375","expiresOn":"2023-07-08 20:12:40 +0200"},{"name":"Player601","uuid":"3b1946fe-c2d1-3fab-8b74-bd39d8b52fb4","expiresOn":"2023-07-08 13:17:47 +0200"},{"name":"Player87","uuid":"3eec9f18-1d0e-3f17-917c-6994e7d034d1","expiresOn":"2023-07-08 20:22:04 +0200"},{"name":"Player571","uuid":"5d4844c1-110f-375f-8c73-6803b7a61e5d","expiresOn":"2023-07-08 08:06:30 +0200"},{"name":"Player889","uuid":"a205b8da-efc6-37ad-8e1d-84c0239cdd21","expiresOn":"2023-07-08 16:14:54 +0200"},{"name":"Player467","uuid":"ed3ff7cb-6a3b-37aa-85ff-4e536390779c","expiresOn":"2023-07-08 20:52:15 +0200"},{"name":"Player693","uuid":"f2937d48-a72f-3375-bb6f-69c5f204d185","expiresOn":"2023-07-08 19:16:58 +0200"},{"name":"Player918","uuid":"7fac0f4d-6ee9-33e9-a874-7b4a3cc238c6","expiresOn":"2023-07-08 19:37:58 +0200"},{"name":"Player810","uuid":"24a37f0a-2af1-3ac4-9024-e5424f979e18","expiresOn":"2023-07-08 20:10:21 +0200"},{"name":"Player697","uuid":"09805145-bb70-3fc1-9783-30845f8dd6d0","expiresOn":"2023-07-08 16:35:52 +0200"},{"name":"Player155","uuid":"60d19c6d-8381-348f-9d23-cb28708609fc","expiresOn":"2023-07-08 17:36:23 +0200"},{"name":"Player813","uuid":"fb8576b0-fae6-3c1e-b44e-6422260d3c41","expiresOn":"2023-07-08 17:27:24 +0200"},{"name":"Player414","uuid":"408d12c9-559c-3212-bca5-d1a3fc38a0f7","expiresOn":"2023-07-08 18:22:02 +0200"},{"name":"Player814","uuid":"777409db-46bf-31bf-844f-6d600c083d6c","expiresOn":"2023-07-08 09:47:50 +0200"},{"name":"Player815","uuid":"41dc22e0-3e7d-3bce-88c0-a274eb3e3859","expiresOn":"2023-07-08 19:16:28 +0200"},{"name":"Player172","uuid":"31a9aee6-8c2b-389d-b14e-b75d71479611","expiresOn":"2023-07-08 16:15:57 +0200"},{"name":"Player980","uuid":"d1b650bf-5f9c-37d3-a469-4d66d1968f90","expiresOn":"2023-07-08 20:54:52 +0200"}]
\ No newline at end of file
+[{"name":"ziue","uuid":"74e89738-6c9e-4f59-83ef-d365849e6049","expiresOn":"2023-07-10 22:14:54 +0200"},{"name":"Player367","uuid":"dcea94fd-efa4-3c29-93d8-2d56666245c7","expiresOn":"2023-07-10 12:57:12 +0200"},{"name":"Player651","uuid":"5c4f0ba0-5b89-33cd-bd9d-007c51e4a99f","expiresOn":"2023-07-09 20:07:16 +0200"},{"name":"Player602","uuid":"7fef5833-06c9-398a-84c0-fbd3a81ff548","expiresOn":"2023-07-10 13:22:13 +0200"},{"name":"Player773","uuid":"b7a940e4-3cde-3275-9c73-2f71fe593c98","expiresOn":"2023-07-08 16:37:19 +0200"},{"name":"Player480","uuid":"1714a812-885f-3243-b534-9a660fba6e8b","expiresOn":"2023-07-09 18:17:13 +0200"},{"name":"Player103","uuid":"f0c5379b-0e4e-34aa-808d-37fef9b5ce6c","expiresOn":"2023-07-10 12:33:50 +0200"},{"name":"Player336","uuid":"2eef3335-8d1f-3428-af42-f3cec9010d4c","expiresOn":"2023-07-08 19:21:04 +0200"},{"name":"Player889","uuid":"a205b8da-efc6-37ad-8e1d-84c0239cdd21","expiresOn":"2023-07-08 16:14:54 +0200"},{"name":"Player755","uuid":"8dbdaed5-4750-31ee-aa4f-4c3b2bfbc6f7","expiresOn":"2023-07-08 19:11:24 +0200"},{"name":"Player169","uuid":"3247b050-58df-3a7e-91f5-44a3d807681c","expiresOn":"2023-07-09 19:35:50 +0200"},{"name":"Player999","uuid":"3c28cca8-db38-324d-ac91-779beed87c8d","expiresOn":"2023-07-09 18:15:03 +0200"},{"name":"Player155","uuid":"60d19c6d-8381-348f-9d23-cb28708609fc","expiresOn":"2023-07-08 17:36:23 +0200"},{"name":"Player565","uuid":"f72636fb-c7db-3c44-8cd4-8a6790fd9b69","expiresOn":"2023-07-10 14:15:29 +0200"},{"name":"Player529","uuid":"989691b1-d197-3995-a55e-281cda3663ae","expiresOn":"2023-07-10 14:26:11 +0200"},{"name":"Player809","uuid":"e664a043-6e9c-3d0d-9b38-cc385e35aba9","expiresOn":"2023-07-10 12:36:27 +0200"},{"name":"Player742","uuid":"01d9f825-5509-3b83-aacf-c98ce0dce1c7","expiresOn":"2023-07-08 17:55:59 +0200"},{"name":"Player697","uuid":"09805145-bb70-3fc1-9783-30845f8dd6d0","expiresOn":"2023-07-08 16:35:52 +0200"},{"name":"Player434","uuid":"fd09468e-08e7-31aa-bab7-195a6ef31320","expiresOn":"2023-07-09 19:49:25 +0200"},{"name":"Player6","uuid":"6e946422-0041-3048-9c85-48e4f886211a","expiresOn":"2023-07-08 18:00:50 +0200"},{"name":"Player744","uuid":"aeca01bf-232e-37a2-985b-599827b3226a","expiresOn":"2023-07-10 14:09:54 +0200"},{"name":"Player766","uuid":"71ee4b7e-330e-3d50-90a4-3d964a618ea8","expiresOn":"2023-07-09 23:33:32 +0200"},{"name":"Player426","uuid":"71f66ac1-c861-3de2-8cda-9d0f80277f27","expiresOn":"2023-07-08 19:55:34 +0200"},{"name":"Player484","uuid":"29aa321a-1ce7-35de-bfab-f37fa4095c7d","expiresOn":"2023-07-10 12:37:26 +0200"},{"name":"Player268","uuid":"b84ce5d9-353d-370c-a2cf-b4a66513f5a8","expiresOn":"2023-07-08 10:42:07 +0200"},{"name":"Player813","uuid":"fb8576b0-fae6-3c1e-b44e-6422260d3c41","expiresOn":"2023-07-08 17:27:24 +0200"},{"name":"Player325","uuid":"1aca2fd8-a080-3d28-afe0-430fc033484e","expiresOn":"2023-07-10 15:43:49 +0200"},{"name":"Player527","uuid":"638f7175-5dde-3b0d-a13d-f593ecd79b38","expiresOn":"2023-07-10 12:52:57 +0200"},{"name":"Player810","uuid":"24a37f0a-2af1-3ac4-9024-e5424f979e18","expiresOn":"2023-07-08 20:10:21 +0200"},{"name":"Player467","uuid":"ed3ff7cb-6a3b-37aa-85ff-4e536390779c","expiresOn":"2023-07-08 20:52:15 +0200"},{"name":"Player914","uuid":"9df70e84-3251-33fb-9047-d59112057246","expiresOn":"2023-07-09 19:51:26 +0200"},{"name":"Player854","uuid":"2a68c4a4-c1ba-3396-a626-ac7041e25da5","expiresOn":"2023-07-09 19:29:22 +0200"},{"name":"Player712","uuid":"e4358028-bc3b-38cc-b645-4d08d3b4f456","expiresOn":"2023-07-09 20:11:05 +0200"},{"name":"Player601","uuid":"3b1946fe-c2d1-3fab-8b74-bd39d8b52fb4","expiresOn":"2023-07-08 13:17:47 +0200"},{"name":"Player815","uuid":"41dc22e0-3e7d-3bce-88c0-a274eb3e3859","expiresOn":"2023-07-08 19:16:28 +0200"},{"name":"Player939","uuid":"0704e0ba-eaf6-3b26-b880-53fd45ec3b48","expiresOn":"2023-07-08 19:15:56 +0200"},{"name":"Player920","uuid":"ad8236b9-e26f-349c-902e-7100197cd86d","expiresOn":"2023-07-08 19:13:30 +0200"},{"name":"Player693","uuid":"f2937d48-a72f-3375-bb6f-69c5f204d185","expiresOn":"2023-07-08 19:16:58 +0200"},{"name":"Player641","uuid":"34c6f761-a0d4-3d62-b5ee-df15e4530215","expiresOn":"2023-07-09 17:34:30 +0200"},{"name":"Player887","uuid":"df2d3e26-a8b7-3aae-9296-f3a891282132","expiresOn":"2023-07-09 22:02:05 +0200"},{"name":"Player324","uuid":"942531dd-7690-3c0a-ad42-657bb212e7b6","expiresOn":"2023-07-09 19:50:40 +0200"},{"name":"Player24","uuid":"68cf6d02-03bc-3f3b-ab98-76a8ec749597","expiresOn":"2023-07-10 12:40:04 +0200"},{"name":"Player3","uuid":"f318a6c7-0ff1-368e-9d3e-1b850b84da5e","expiresOn":"2023-07-10 14:04:29 +0200"},{"name":"Player405","uuid":"600ef575-e50b-3323-b0f1-19e3a176b08b","expiresOn":"2023-07-08 19:15:08 +0200"},{"name":"Player995","uuid":"93bfa0b6-cc14-3c0c-8efa-0bcc48245274","expiresOn":"2023-07-09 18:45:54 +0200"},{"name":"Player320","uuid":"77167de3-5df9-3c83-b06a-bed9a476e835","expiresOn":"2023-07-09 19:39:10 +0200"},{"name":"Player87","uuid":"3eec9f18-1d0e-3f17-917c-6994e7d034d1","expiresOn":"2023-07-09 19:11:12 +0200"},{"name":"Player491","uuid":"46f780a1-2e26-3e88-a90a-02cf37fe1547","expiresOn":"2023-07-08 19:10:32 +0200"},{"name":"Player959","uuid":"e4e5b30f-b972-382c-b5e5-86c2e785a8a6","expiresOn":"2023-07-09 23:52:34 +0200"},{"name":"Player444","uuid":"b136c8aa-0654-3583-8db1-8749e12181a1","expiresOn":"2023-07-10 15:37:49 +0200"},{"name":"Player841","uuid":"197d9491-ff34-3fd1-8394-1aadd56cfa2c","expiresOn":"2023-07-10 13:32:20 +0200"},{"name":"Player77","uuid":"2e2bad62-fd9f-3bb5-a89e-b314a4f30e73","expiresOn":"2023-07-10 15:24:13 +0200"},{"name":"Player847","uuid":"6004b361-ef29-34d2-b89c-32df237908c7","expiresOn":"2023-07-08 19:29:12 +0200"},{"name":"Player781","uuid":"bf0c47d3-02b6-3463-8e38-457226b1407c","expiresOn":"2023-07-10 15:48:29 +0200"},{"name":"Player893","uuid":"e012d939-bd4c-38f9-ae46-831d4959ff05","expiresOn":"2023-07-09 21:58:42 +0200"},{"name":"Player980","uuid":"d1b650bf-5f9c-37d3-a469-4d66d1968f90","expiresOn":"2023-07-10 21:48:02 +0200"},{"name":"Player829","uuid":"4e1f5e28-f05f-3acf-ac65-db01d9d51f95","expiresOn":"2023-07-10 14:19:41 +0200"},{"name":"Player422","uuid":"cb3fd6c5-1d0c-334b-a8d4-85d2c85eb576","expiresOn":"2023-07-08 17:21:41 +0200"},{"name":"nigger","uuid":"1b03cef3-3bb0-3335-8575-75a992fee2b9","expiresOn":"2023-07-10 20:17:29 +0200"},{"name":"Player579","uuid":"6ae8fe40-3ccb-3755-8fd2-c5445728b386","expiresOn":"2023-07-08 19:18:18 +0200"},{"name":"Player597","uuid":"618c707a-83d7-31ad-b075-bd98e2c75926","expiresOn":"2023-07-08 16:49:56 +0200"},{"name":"Player814","uuid":"777409db-46bf-31bf-844f-6d600c083d6c","expiresOn":"2023-07-08 09:47:50 +0200"},{"name":"Player571","uuid":"5d4844c1-110f-375f-8c73-6803b7a61e5d","expiresOn":"2023-07-08 08:06:30 +0200"},{"name":"Player107","uuid":"eed453d8-1b3a-3fa3-9fc5-1cf433d73521","expiresOn":"2023-07-10 12:32:33 +0200"},{"name":"Player536","uuid":"8cfc5391-e37d-328f-a689-9b5f6c4663f5","expiresOn":"2023-07-10 13:43:43 +0200"},{"name":"Player210","uuid":"66157e7a-53e0-3299-9208-7674efd706f9","expiresOn":"2023-07-09 19:28:27 +0200"},{"name":"Player82","uuid":"7328fbd9-6879-3343-b321-ed1f1a1e9892","expiresOn":"2023-07-10 14:02:44 +0200"},{"name":"Player790","uuid":"2f0d3d8c-afbe-358f-b8f3-786d7b0f9259","expiresOn":"2023-07-08 16:44:53 +0200"},{"name":"Player962","uuid":"7ef37f89-ec95-314c-ad83-8a71ac6e461c","expiresOn":"2023-07-08 18:46:33 +0200"},{"name":"Player621","uuid":"55199b58-d04f-3d22-9ce2-5472509a024b","expiresOn":"2023-07-08 16:26:24 +0200"},{"name":"Player302","uuid":"babe9e7f-35b2-34ef-82f9-4869d34a0755","expiresOn":"2023-07-09 19:54:04 +0200"},{"name":"Player685","uuid":"4f2b9d55-5b3e-32ee-ad58-c8df44a23337","expiresOn":"2023-07-09 19:08:06 +0200"},{"name":"Player306","uuid":"a08e137b-04fa-3fce-96cc-517c7a87690d","expiresOn":"2023-07-09 19:24:35 +0200"},{"name":"Player270","uuid":"e122e0b0-374f-3b1b-a986-63f4fefee57a","expiresOn":"2023-07-10 14:49:10 +0200"},{"name":"Player172","uuid":"31a9aee6-8c2b-389d-b14e-b75d71479611","expiresOn":"2023-07-08 16:15:57 +0200"},{"name":"Player118","uuid":"df7bffa7-7a2f-3fb4-9898-fa23c41e49b8","expiresOn":"2023-07-09 20:39:44 +0200"},{"name":"test","uuid":"530fa97a-357f-3c19-94d3-0c5c65c18fe8","expiresOn":"2023-07-10 19:15:10 +0200"},{"name":"Player396","uuid":"7ba45a5a-c3de-3909-ba3c-f9f78edf15b6","expiresOn":"2023-07-10 15:32:01 +0200"},{"name":"tesfdrsdfsdf","uuid":"2adbb68a-c561-3c7a-ac3a-f724c1f981bb","expiresOn":"2023-07-10 20:17:14 +0200"},{"name":"Player69","uuid":"eee10812-13cd-3f90-b77f-2195c9c5b71e","expiresOn":"2023-07-10 12:41:47 +0200"},{"name":"Player514","uuid":"4ed9b5cf-d91a-3bc8-9000-b0476eccd342","expiresOn":"2023-07-09 20:21:06 +0200"},{"name":"Player870","uuid":"eadcccd1-5981-31ce-8342-c727c73b0197","expiresOn":"2023-07-10 14:22:37 +0200"},{"name":"Player977","uuid":"9e5d41e7-4785-3b2f-8261-593dade57f6e","expiresOn":"2023-07-10 13:36:09 +0200"},{"name":"Player918","uuid":"7fac0f4d-6ee9-33e9-a874-7b4a3cc238c6","expiresOn":"2023-07-08 19:37:58 +0200"},{"name":"Player894","uuid":"b25e3f31-3d0d-30a3-b307-8902510a505e","expiresOn":"2023-07-10 13:27:49 +0200"},{"name":"Player189","uuid":"43c314ca-2c75-349f-b8fe-ad7c6fada15e","expiresOn":"2023-07-10 19:28:13 +0200"},{"name":"Player957","uuid":"094b1c52-a449-3e9f-896c-59239b943c71","expiresOn":"2023-07-09 23:34:47 +0200"},{"name":"Player901","uuid":"fcaa91cc-3a77-3318-a8ae-f2f3862b7fde","expiresOn":"2023-07-10 15:51:32 +0200"},{"name":"Player197","uuid":"ccf0c278-c21f-3ec3-a87c-05202673a5dd","expiresOn":"2023-07-09 20:05:23 +0200"},{"name":"Player991","uuid":"fe171829-6121-3106-a1a5-6a3600a4ef7d","expiresOn":"2023-07-09 17:48:04 +0200"},{"name":"Player604","uuid":"11cdf046-d362-394c-93e8-583f0c5ef255","expiresOn":"2023-07-10 12:27:52 +0200"},{"name":"Player750","uuid":"2659329e-1c65-3850-9659-d27fc655aa3c","expiresOn":"2023-07-08 19:27:39 +0200"},{"name":"Player730","uuid":"409ad871-75ba-3dbd-b116-807d64800e7d","expiresOn":"2023-07-08 17:48:36 +0200"},{"name":"Player335","uuid":"168f5f60-1523-35b7-93b7-01b2c42226b4","expiresOn":"2023-07-10 15:53:11 +0200"},{"name":"teste","uuid":"4fdf550e-f3b3-3a06-8485-0916b2b491bc","expiresOn":"2023-07-10 18:59:51 +0200"},{"name":"Player414","uuid":"408d12c9-559c-3212-bca5-d1a3fc38a0f7","expiresOn":"2023-07-08 18:22:02 +0200"},{"name":"Player136","uuid":"f4642d2b-29f9-34b7-8b90-e6570e856434","expiresOn":"2023-07-08 16:32:44 +0200"},{"name":"Player465","uuid":"d447d002-8f00-3c6c-8a29-93b028d90375","expiresOn":"2023-07-08 20:12:40 +0200"},{"name":"Player401","uuid":"a7507e7e-f998-31cf-a2de-0cc0fd0a4de6","expiresOn":"2023-07-09 17:45:25 +0200"},{"name":"Player517","uuid":"3fff7d86-24d6-33b1-8ce1-9423a13c7c89","expiresOn":"2023-07-09 18:10:12 +0200"},{"name":"Player132","uuid":"5cc48495-676c-3721-aed2-7336730ff405","expiresOn":"2023-07-09 20:59:28 +0200"},{"name":"Player308","uuid":"6db1171d-4fa6-31cb-b425-1896281a26e2","expiresOn":"2023-07-10 13:03:00 +0200"},{"name":"Player412","uuid":"d978d670-4b07-3a90-bfb6-b4e7c70fe7fc","expiresOn":"2023-07-08 18:15:08 +0200"},{"name":"Player239","uuid":"75e52373-1963-3666-bda9-8904d639e38b","expiresOn":"2023-07-10 15:37:14 +0200"},{"name":"Player53","uuid":"12477fb0-fd41-3fca-893f-e59684d982a8","expiresOn":"2023-07-08 21:24:44 +0200"},{"name":"Player203","uuid":"d96be705-d0ae-31d3-afba-31a637d80f6d","expiresOn":"2023-07-08 16:29:04 +0200"},{"name":"Player455","uuid":"fc74fe37-e9f9-3198-8e46-1eee97cacfa6","expiresOn":"2023-07-10 13:46:20 +0200"},{"name":"Player101","uuid":"4bb7849b-3b46-3d6a-81b9-13bb408e8517","expiresOn":"2023-07-10 14:41:18 +0200"}]
\ No newline at end of file