From af4f6cd8fefcb069cbc2f1b0ac5bff26e4925e0e Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Fri, 24 Nov 2023 20:02:45 +0100 Subject: [PATCH] Cleanup some stuff --- .../serverwrecker/AttackManager.java | 48 +-- .../serverwrecker/ServerWreckerBootstrap.java | 10 +- .../serverwrecker/ServerWreckerLoader.java | 1 - .../serverwrecker/ServerWreckerServer.java | 12 +- .../cli/SWCommandDefinition.java | 5 - .../serverwrecker/data/OffsetData.java | 10 +- .../serverwrecker/grpc/ConfigServiceImpl.java | 31 +- .../serverwrecker/gui/GUIFrame.java | 84 ++-- .../serverwrecker/gui/GUIManager.java | 1 - .../gui/navigation/AccountPanel.java | 6 +- .../gui/navigation/CardsContainer.java | 4 +- .../gui/navigation/DeveloperPanel.java | 3 +- .../gui/navigation/ProxyPanel.java | 8 +- .../serverwrecker/plugins/AutoArmor.java | 12 +- .../serverwrecker/plugins/AutoEat.java | 12 +- .../serverwrecker/plugins/AutoJump.java | 12 +- .../serverwrecker/plugins/AutoReconnect.java | 10 +- .../serverwrecker/plugins/AutoRegister.java | 12 +- .../serverwrecker/plugins/AutoRespawn.java | 12 +- .../serverwrecker/plugins/AutoTotem.java | 12 +- .../serverwrecker/plugins/BotTicker.java | 10 +- .../plugins/ChatMessageLogger.java | 16 +- .../serverwrecker/plugins/ClientBrand.java | 12 +- .../serverwrecker/plugins/ClientSettings.java | 12 +- .../plugins/ForwardingBypass.java | 10 +- .../plugins/ServerListBypass.java | 12 +- .../protocol/bot/BotActionManager.java | 82 ++-- .../protocol/bot/container/SWItemStack.java | 8 +- .../bot/movement/BotMovementManager.java | 405 +++++++++--------- .../bot/state/EntityAttributesState.java | 16 +- .../settings/lib/SettingsHolder.java | 2 - .../settings/lib/property/Property.java | 8 +- 32 files changed, 442 insertions(+), 456 deletions(-) diff --git a/src/main/java/net/pistonmaster/serverwrecker/AttackManager.java b/src/main/java/net/pistonmaster/serverwrecker/AttackManager.java index 69ab8d454..fd000cabe 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/AttackManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/AttackManager.java @@ -76,6 +76,30 @@ public class AttackManager { @Setter private AttackState attackState = AttackState.STOPPED; + private static MinecraftAccount getAccount(SettingsHolder settingsHolder, List accounts, int botId) { + if (accounts.isEmpty()) { + return new MinecraftAccount(String.format(settingsHolder.get(AccountSettings.NAME_FORMAT), botId)); + } + + return accounts.remove(0); + } + + private static Optional getProxy(int accountsPerProxy, Object2IntMap proxyUseMap) { + if (proxyUseMap.isEmpty()) { + return Optional.empty(); // No proxies available + } + + var selectedProxy = proxyUseMap.object2IntEntrySet().stream() + .filter(entry -> accountsPerProxy == -1 || entry.getIntValue() < accountsPerProxy) + .min(Comparator.comparingInt(Map.Entry::getValue)) + .orElseThrow(() -> new IllegalStateException("No proxies available!")); // Should never happen + + // Always present + selectedProxy.setValue(selectedProxy.getIntValue() + 1); + + return Optional.of(selectedProxy.getKey()); + } + public CompletableFuture start(SettingsHolder settingsHolder) { if (!attackState.isStopped()) { throw new IllegalStateException("Attack is already running"); @@ -195,30 +219,6 @@ public CompletableFuture start(SettingsHolder settingsHolder) { }); } - private static MinecraftAccount getAccount(SettingsHolder settingsHolder, List accounts, int botId) { - if (accounts.isEmpty()) { - return new MinecraftAccount(String.format(settingsHolder.get(AccountSettings.NAME_FORMAT), botId)); - } - - return accounts.remove(0); - } - - private static Optional getProxy(int accountsPerProxy, Object2IntMap proxyUseMap) { - if (proxyUseMap.isEmpty()) { - return Optional.empty(); // No proxies available - } - - var selectedProxy = proxyUseMap.object2IntEntrySet().stream() - .filter(entry -> accountsPerProxy == -1 || entry.getIntValue() < accountsPerProxy) - .min(Comparator.comparingInt(Map.Entry::getValue)) - .orElseThrow(() -> new IllegalStateException("No proxies available!")); // Should never happen - - // Always present - selectedProxy.setValue(selectedProxy.getIntValue() + 1); - - return Optional.of(selectedProxy.getKey()); - } - public CompletableFuture stop() { if (attackState.isStopped()) { return CompletableFuture.completedFuture(null); diff --git a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerBootstrap.java b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerBootstrap.java index 2337942a8..37beaa4d2 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerBootstrap.java +++ b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerBootstrap.java @@ -48,6 +48,11 @@ * setting up logging. */ public class ServerWreckerBootstrap { + public static final Path DATA_FOLDER = Path.of(System.getProperty("user.home"), ".serverwrecker"); + public static final Path PLUGINS_FOLDER = DATA_FOLDER.resolve("plugins"); + public static final PluginManager PLUGIN_MANAGER = new JarPluginManager(PLUGINS_FOLDER); + private static final Logger LOGGER = LoggerFactory.getLogger(ServerWreckerBootstrap.class); + static { System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); @@ -64,11 +69,6 @@ public class ServerWreckerBootstrap { } } - public static final Path DATA_FOLDER = Path.of(System.getProperty("user.home"), ".serverwrecker"); - public static final Path PLUGINS_FOLDER = DATA_FOLDER.resolve("plugins"); - public static final PluginManager PLUGIN_MANAGER = new JarPluginManager(PLUGINS_FOLDER); - private static final Logger LOGGER = LoggerFactory.getLogger(ServerWreckerBootstrap.class); - private ServerWreckerBootstrap() { } diff --git a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java index 9edd832e4..a1d5de34a 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java +++ b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerLoader.java @@ -19,7 +19,6 @@ */ package net.pistonmaster.serverwrecker; -import net.pistonmaster.serverwrecker.api.ServerWreckerAPI; import net.pistonmaster.serverwrecker.cli.SWCommandDefinition; import net.pistonmaster.serverwrecker.common.OperationMode; import net.pistonmaster.serverwrecker.grpc.RPCClient; diff --git a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerServer.java b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerServer.java index 323487983..c3d876d4c 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerServer.java +++ b/src/main/java/net/pistonmaster/serverwrecker/ServerWreckerServer.java @@ -253,6 +253,12 @@ private static boolean checkForUpdates() { return false; } + @SuppressWarnings("UnstableApiUsage") + public static void setupLoggingAndVia(SettingsHolder settingsHolder) { + Via.getManager().debugHandler().setEnabled(settingsHolder.get(DevSettings.VIA_DEBUG)); + ServerWreckerBootstrap.setupLogging(settingsHolder); + } + /** * Generates a JWT for the admin user. * @@ -265,12 +271,6 @@ public String generateAdminJWT() { .compact(); } - @SuppressWarnings("UnstableApiUsage") - public static void setupLoggingAndVia(SettingsHolder settingsHolder) { - Via.getManager().debugHandler().setEnabled(settingsHolder.get(DevSettings.VIA_DEBUG)); - ServerWreckerBootstrap.setupLogging(settingsHolder); - } - private void shutdownHook() { // Shutdown the attacks if there is any stopAllAttacks().join(); diff --git a/src/main/java/net/pistonmaster/serverwrecker/cli/SWCommandDefinition.java b/src/main/java/net/pistonmaster/serverwrecker/cli/SWCommandDefinition.java index 617ae5d1a..974b7a86d 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/cli/SWCommandDefinition.java +++ b/src/main/java/net/pistonmaster/serverwrecker/cli/SWCommandDefinition.java @@ -19,19 +19,14 @@ */ package net.pistonmaster.serverwrecker.cli; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import lombok.RequiredArgsConstructor; import lombok.Setter; import net.pistonmaster.serverwrecker.ServerWreckerServer; -import net.pistonmaster.serverwrecker.auth.AccountSettings; import net.pistonmaster.serverwrecker.auth.AuthType; import net.pistonmaster.serverwrecker.builddata.BuildData; import net.pistonmaster.serverwrecker.command.SWTerminalConsole; import net.pistonmaster.serverwrecker.grpc.RPCClient; -import net.pistonmaster.serverwrecker.proxy.ProxySettings; import net.pistonmaster.serverwrecker.proxy.ProxyType; -import net.pistonmaster.serverwrecker.settings.BotSettings; -import net.pistonmaster.serverwrecker.settings.DevSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import picocli.CommandLine; diff --git a/src/main/java/net/pistonmaster/serverwrecker/data/OffsetData.java b/src/main/java/net/pistonmaster/serverwrecker/data/OffsetData.java index b1a082b79..ca24a9f3d 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/data/OffsetData.java +++ b/src/main/java/net/pistonmaster/serverwrecker/data/OffsetData.java @@ -25,11 +25,6 @@ import org.cloudburstmc.math.vector.Vector3i; public record OffsetData(OffsetType type, float maxHorizontalOffset, float maxVerticalOffset) { - public enum OffsetType { - XZ, - XYZ - } - public Vector3d getOffsetForBlock(Vector3i block) { return switch (type) { case XYZ -> { @@ -47,4 +42,9 @@ public Vector3d getOffsetForBlock(Vector3i block) { } }; } + + public enum OffsetType { + XZ, + XYZ + } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/grpc/ConfigServiceImpl.java b/src/main/java/net/pistonmaster/serverwrecker/grpc/ConfigServiceImpl.java index 21340cd63..3f5d96927 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/grpc/ConfigServiceImpl.java +++ b/src/main/java/net/pistonmaster/serverwrecker/grpc/ConfigServiceImpl.java @@ -23,7 +23,10 @@ import lombok.RequiredArgsConstructor; import net.pistonmaster.serverwrecker.ServerWreckerBootstrap; import net.pistonmaster.serverwrecker.ServerWreckerServer; -import net.pistonmaster.serverwrecker.grpc.generated.*; +import net.pistonmaster.serverwrecker.grpc.generated.ClientDataRequest; +import net.pistonmaster.serverwrecker.grpc.generated.ClientPlugin; +import net.pistonmaster.serverwrecker.grpc.generated.ConfigServiceGrpc; +import net.pistonmaster.serverwrecker.grpc.generated.UIClientDataResponse; import javax.inject.Inject; import java.util.ArrayList; @@ -33,19 +36,6 @@ public class ConfigServiceImpl extends ConfigServiceGrpc.ConfigServiceImplBase { private final ServerWreckerServer serverWreckerServer; - @Override - public void getUIClientData(ClientDataRequest request, StreamObserver responseObserver) { - var username = Constant.CLIENT_ID_CONTEXT_KEY.get(); - responseObserver.onNext( - UIClientDataResponse.newBuilder() - .setUsername(username) - .addAllPlugins(getExtensions()) - .addAllPluginSettings(serverWreckerServer.getSettingsManager().exportSettingsMeta()) - .build() - ); - responseObserver.onCompleted(); - } - private static Collection getExtensions() { var plugins = new ArrayList(); for (var pluginWrapper : ServerWreckerBootstrap.PLUGIN_MANAGER.getPlugins()) { @@ -66,4 +56,17 @@ private static Collection getExtensions() { return plugins; } + + @Override + public void getUIClientData(ClientDataRequest request, StreamObserver responseObserver) { + var username = Constant.CLIENT_ID_CONTEXT_KEY.get(); + responseObserver.onNext( + UIClientDataResponse.newBuilder() + .setUsername(username) + .addAllPlugins(getExtensions()) + .addAllPluginSettings(serverWreckerServer.getSettingsManager().exportSettingsMeta()) + .build() + ); + responseObserver.onCompleted(); + } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIFrame.java b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIFrame.java index 0d6e5cc0d..c74594356 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIFrame.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIFrame.java @@ -35,6 +35,48 @@ public GUIFrame() { super("ServerWrecker"); } + public static void showHints(Injector injector) { + var logPanel = injector.getSingleton(LogPanel.class); + var cardContainer = injector.getSingleton(CardsContainer.class); + + var commandsHint = new HintManager.Hint( + "Use \"help\" to get a list of all commands.", + (Component) logPanel.getClientProperty("log-panel-command-input"), + SwingConstants.TOP, "hint.commandInput", null); + + var controlsHint = new HintManager.Hint( + "Here you can start, pause and stop a attack.", + injector.getSingleton(ControlPanel.class), + SwingConstants.TOP, "hint.controls", commandsHint); + + var pluginsHint = new HintManager.Hint( + "Click to configure plugins to make the attack more effective.", + (Component) cardContainer.getClientProperty("plugin-menu-button"), + SwingConstants.BOTTOM, "hint.pluginsButton", controlsHint); + + var proxyHint = new HintManager.Hint( + "Click to import HTTP, SOCKS4 and SOCKS5 proxies", + (Component) cardContainer.getClientProperty("proxy-menu-button"), + SwingConstants.LEFT, "hint.proxyButton", pluginsHint); + + var accountsHint = new HintManager.Hint( + "Click to configure the bot offline-mode name format or bring your own accounts.", + (Component) cardContainer.getClientProperty("account-menu-button"), + SwingConstants.RIGHT, "hint.accountsButton", proxyHint); + + var settingsHint = new HintManager.Hint( + "Click to configure host, port, version and more.", + (Component) cardContainer.getClientProperty("settings-menu-button"), + SwingConstants.BOTTOM, "hint.settingsButton", accountsHint); + + var logsHint = new HintManager.Hint( + "Here are all logs of the software displayed. You can select text and right click it to upload it to pastes.dev", + logPanel, + SwingConstants.LEFT, "hint.logPanel", settingsHint); + + HintManager.showHint(logsHint); + } + public void initComponents(Injector injector) { if (SystemInfo.isMacOS) { // Hide window title because we want to avoid dark-mode name issues @@ -91,46 +133,4 @@ public void open(Injector injector) { } } } - - public static void showHints(Injector injector) { - var logPanel = injector.getSingleton(LogPanel.class); - var cardContainer = injector.getSingleton(CardsContainer.class); - - var commandsHint = new HintManager.Hint( - "Use \"help\" to get a list of all commands.", - (Component) logPanel.getClientProperty("log-panel-command-input"), - SwingConstants.TOP, "hint.commandInput", null); - - var controlsHint = new HintManager.Hint( - "Here you can start, pause and stop a attack.", - injector.getSingleton(ControlPanel.class), - SwingConstants.TOP, "hint.controls", commandsHint); - - var pluginsHint = new HintManager.Hint( - "Click to configure plugins to make the attack more effective.", - (Component) cardContainer.getClientProperty("plugin-menu-button"), - SwingConstants.BOTTOM, "hint.pluginsButton", controlsHint); - - var proxyHint = new HintManager.Hint( - "Click to import HTTP, SOCKS4 and SOCKS5 proxies", - (Component) cardContainer.getClientProperty("proxy-menu-button"), - SwingConstants.LEFT, "hint.proxyButton", pluginsHint); - - var accountsHint = new HintManager.Hint( - "Click to configure the bot offline-mode name format or bring your own accounts.", - (Component) cardContainer.getClientProperty("account-menu-button"), - SwingConstants.RIGHT, "hint.accountsButton", proxyHint); - - var settingsHint = new HintManager.Hint( - "Click to configure host, port, version and more.", - (Component) cardContainer.getClientProperty("settings-menu-button"), - SwingConstants.BOTTOM, "hint.settingsButton", accountsHint); - - var logsHint = new HintManager.Hint( - "Here are all logs of the software displayed. You can select text and right click it to upload it to pastes.dev", - logPanel, - SwingConstants.LEFT, "hint.logPanel", settingsHint); - - HintManager.showHint(logsHint); - } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java index 760a76009..4467d8fba 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/GUIManager.java @@ -24,7 +24,6 @@ import javafx.embed.swing.JFXPanel; import lombok.Getter; import net.lenni0451.reflect.Modules; -import net.pistonmaster.serverwrecker.ServerWreckerServer; import net.pistonmaster.serverwrecker.auth.AccountRegistry; import net.pistonmaster.serverwrecker.command.SWTerminalConsole; import net.pistonmaster.serverwrecker.command.ShutdownManager; diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/AccountPanel.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/AccountPanel.java index c5dc7c70e..8c48721d1 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/AccountPanel.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/AccountPanel.java @@ -19,17 +19,13 @@ */ package net.pistonmaster.serverwrecker.gui.navigation; -import net.pistonmaster.serverwrecker.auth.AccountSettings; import net.pistonmaster.serverwrecker.auth.AuthType; import net.pistonmaster.serverwrecker.auth.MinecraftAccount; import net.pistonmaster.serverwrecker.gui.GUIFrame; import net.pistonmaster.serverwrecker.gui.GUIManager; import net.pistonmaster.serverwrecker.gui.libs.JEnumComboBox; -import net.pistonmaster.serverwrecker.gui.libs.PresetJCheckBox; import net.pistonmaster.serverwrecker.gui.libs.SwingTextUtils; import net.pistonmaster.serverwrecker.gui.popups.ImportTextDialog; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.swing.*; @@ -60,7 +56,7 @@ public AccountPanel(GUIManager guiManager, GUIFrame parent, CardsContainer cards var accountSettingsPanel = new JPanel(); accountSettingsPanel.setLayout(new GridLayout(0, 2)); - GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("account")); + GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("account"), guiManager.getSettingsManager()); accountOptionsPanel.add(accountSettingsPanel); diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java index ce0bca8d0..70c39b7f1 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/CardsContainer.java @@ -40,9 +40,10 @@ public class CardsContainer extends JPanel { private final GUIManager guiManager; @Getter private final List pluginPages = new ArrayList<>(); + private final CardLayout cardLayout = new CardLayout(); public void create() { - setLayout(new CardLayout()); + setLayout(cardLayout); // Add bot settings panels.add(new GeneratedPanel(guiManager.getSettingsManager(), getByNamespace("bot"))); @@ -80,7 +81,6 @@ public ClientPluginSettingsPage getByNamespace(String namespace) { } public void show(String id) { - var cardLayout = (CardLayout) getLayout(); cardLayout.show(this, id); } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/DeveloperPanel.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/DeveloperPanel.java index d2bfaa78d..795178754 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/DeveloperPanel.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/DeveloperPanel.java @@ -24,7 +24,6 @@ import net.pistonmaster.serverwrecker.gui.GUIManager; import net.pistonmaster.serverwrecker.gui.LogPanel; import net.pistonmaster.serverwrecker.gui.libs.JFXFileHelper; -import net.pistonmaster.serverwrecker.settings.DevSettings; import javax.inject.Inject; import javax.swing.*; @@ -37,7 +36,7 @@ public class DeveloperPanel extends NavigationItem { public DeveloperPanel(GUIManager guiManager, LogPanel logPanel, CardsContainer cardsContainer) { setLayout(new GridLayout(0, 2)); - GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("dev")); + GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("dev"), guiManager.getSettingsManager()); add(new JLabel("Save Log:")); var saveLog = new JButton("Save Log"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/ProxyPanel.java b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/ProxyPanel.java index 9b2709f13..ba86b1e9f 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/ProxyPanel.java +++ b/src/main/java/net/pistonmaster/serverwrecker/gui/navigation/ProxyPanel.java @@ -24,11 +24,8 @@ import net.pistonmaster.serverwrecker.gui.libs.JEnumComboBox; import net.pistonmaster.serverwrecker.gui.libs.SwingTextUtils; import net.pistonmaster.serverwrecker.gui.popups.ImportTextDialog; -import net.pistonmaster.serverwrecker.proxy.ProxySettings; import net.pistonmaster.serverwrecker.proxy.ProxyType; import net.pistonmaster.serverwrecker.proxy.SWProxy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.swing.*; @@ -37,7 +34,8 @@ import java.nio.file.Path; import java.util.ArrayList; -public class ProxyPanel extends NavigationItem { @Inject +public class ProxyPanel extends NavigationItem { + @Inject public ProxyPanel(GUIManager guiManager, GUIFrame parent, CardsContainer cardsContainer) { setLayout(new GridLayout(2, 1, 10, 10)); @@ -56,7 +54,7 @@ public ProxyPanel(GUIManager guiManager, GUIFrame parent, CardsContainer cardsCo var proxySettingsPanel = new JPanel(); proxySettingsPanel.setLayout(new GridLayout(0, 2)); - GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("proxy")); + GeneratedPanel.addComponents(this, cardsContainer.getByNamespace("proxy"), guiManager.getSettingsManager()); proxyOptionsPanel.add(proxySettingsPanel); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoArmor.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoArmor.java index 145b0880a..fd3987970 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoArmor.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoArmor.java @@ -43,12 +43,6 @@ import java.util.concurrent.TimeUnit; public class AutoArmor implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoArmor.class); - PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoArmor::onJoined); - } - private static void putOn(InventoryManager inventoryManager, PlayerInventoryContainer inventory, ContainerSlot targetSlot, ArmorType armorType) { var bestItem = Arrays.stream(inventory.getStorage()).filter(s -> { if (s.item() == null) { @@ -130,6 +124,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoArmorSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoArmor.class); + PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoArmor::onJoined); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class AutoArmorSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-armor"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoEat.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoEat.java index 1a3d33e8f..36dd87903 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoEat.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoEat.java @@ -40,12 +40,6 @@ import java.util.concurrent.TimeUnit; public class AutoEat implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoEat.class); - PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoEat::onJoined); - } - public static void onJoined(BotJoinedEvent event) { var connection = event.connection(); var settingsHolder = connection.settingsHolder(); @@ -142,6 +136,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoEatSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoEat.class); + PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoEat::onJoined); + } + @NoArgsConstructor(access = AccessLevel.PRIVATE) private static class AutoEatSettings implements SettingsObject { public static final Property.Builder BUILDER = Property.builder("auto-eat"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoJump.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoJump.java index 3825b1d5e..45f992060 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoJump.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoJump.java @@ -34,12 +34,6 @@ import net.pistonmaster.serverwrecker.settings.lib.property.Property; public class AutoJump implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoJump.class); - PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoJump::onJoined); - } - public static void onJoined(BotJoinedEvent event) { var connection = event.connection(); var settingsHolder = connection.settingsHolder(); @@ -66,6 +60,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoJumpSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoJump.class); + PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoJump::onJoined); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class AutoJumpSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-jump"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoReconnect.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoReconnect.java index 8dc414787..44b6d61d1 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoReconnect.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoReconnect.java @@ -40,6 +40,11 @@ public class AutoReconnect implements InternalExtension { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + @EventHandler + public static void onSettingsManagerInit(SettingsManagerInitEvent event) { + event.settingsManager().addClass(AutoReconnectSettings.class); + } + @Override public void onLoad() { ServerWreckerAPI.registerListeners(AutoReconnect.class); @@ -69,11 +74,6 @@ public void onDisconnect(BotDisconnectedEvent event) { }, RandomUtil.getRandomInt(settingsHolder.get(AutoReconnectSettings.MIN_DELAY), settingsHolder.get(AutoReconnectSettings.MAX_DELAY)), TimeUnit.SECONDS); } - @EventHandler - public static void onSettingsManagerInit(SettingsManagerInitEvent event) { - event.settingsManager().addClass(AutoReconnectSettings.class); - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) private static class AutoReconnectSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-reconnect"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRegister.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRegister.java index c47b612fd..0975685e1 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRegister.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRegister.java @@ -32,12 +32,6 @@ import net.pistonmaster.serverwrecker.settings.lib.property.StringProperty; public class AutoRegister implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoRegister.class); - PluginHelper.registerBotEventConsumer(ChatMessageReceiveEvent.class, AutoRegister::onChat); - } - public static void onChat(ChatMessageReceiveEvent event) { var connection = event.connection(); var settingsHolder = connection.settingsHolder(); @@ -72,6 +66,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoRegisterSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoRegister.class); + PluginHelper.registerBotEventConsumer(ChatMessageReceiveEvent.class, AutoRegister::onChat); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class AutoRegisterSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-register"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRespawn.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRespawn.java index 8dc3526be..a6e2e569b 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRespawn.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoRespawn.java @@ -40,12 +40,6 @@ import java.util.concurrent.TimeUnit; public class AutoRespawn implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoRespawn.class); - PluginHelper.registerBotEventConsumer(SWPacketReceiveEvent.class, AutoRespawn::onPacket); - } - public static void onPacket(SWPacketReceiveEvent event) { if (event.getPacket() instanceof ClientboundPlayerCombatKillPacket combatKillPacket) { var settingsHolder = event.connection().settingsHolder(); @@ -68,6 +62,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoRespawnSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoRespawn.class); + PluginHelper.registerBotEventConsumer(SWPacketReceiveEvent.class, AutoRespawn::onPacket); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class AutoRespawnSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-respawn"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoTotem.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoTotem.java index a2522a99c..0d52f8ff9 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoTotem.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/AutoTotem.java @@ -38,12 +38,6 @@ import java.util.concurrent.TimeUnit; public class AutoTotem implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(AutoTotem.class); - PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoTotem::onJoined); - } - public static void onJoined(BotJoinedEvent event) { var connection = event.connection(); var settingsHolder = connection.settingsHolder(); @@ -92,6 +86,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(AutoTotemSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(AutoTotem.class); + PluginHelper.registerBotEventConsumer(BotJoinedEvent.class, AutoTotem::onJoined); + } + @NoArgsConstructor(access = AccessLevel.PRIVATE) private static class AutoTotemSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("auto-totem"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/BotTicker.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/BotTicker.java index b26c061aa..6db830380 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/BotTicker.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/BotTicker.java @@ -28,11 +28,6 @@ import java.util.concurrent.TimeUnit; public class BotTicker implements InternalExtension { - @Override - public void onLoad() { - PluginHelper.registerAttackEventConsumer(BotConnectionInitEvent.class, BotTicker::onConnectionInit); - } - public static void onConnectionInit(BotConnectionInitEvent event) { startTicker(event.connection(), event.connection().executorManager().newScheduledExecutorService("Tick"), @@ -51,4 +46,9 @@ private static void startTicker(BotConnection connection, ScheduledExecutorServi } }, 0, 50, TimeUnit.MILLISECONDS); // 20 TPS } + + @Override + public void onLoad() { + PluginHelper.registerAttackEventConsumer(BotConnectionInitEvent.class, BotTicker::onConnectionInit); + } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/ChatMessageLogger.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/ChatMessageLogger.java index caf55018c..69c14056c 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/ChatMessageLogger.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/ChatMessageLogger.java @@ -43,12 +43,6 @@ import java.util.function.Consumer; public class ChatMessageLogger implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(ChatMessageLogger.class); - PluginHelper.registerAttackEventConsumer(BotConnectionInitEvent.class, ChatMessageLogger::onConnectionInit); - } - public static void onConnectionInit(BotConnectionInitEvent event) { var connection = event.connection(); var settingsHolder = connection.settingsHolder(); @@ -67,6 +61,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(ChatMessageSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(ChatMessageLogger.class); + PluginHelper.registerAttackEventConsumer(BotConnectionInitEvent.class, ChatMessageLogger::onConnectionInit); + } + private record BotChatListener(UUID connectionId, Logger logger, ScheduledExecutorService executor, Set messageQueue, SettingsHolder settingsHolder) implements Consumer { @@ -102,14 +102,14 @@ private static class ChatMessageSettings implements SettingsObject { "log-chat", "Log chat to terminal", "If this is enabled, all chat messages will be logged to the terminal", - new String[] {"--log-chat"}, + new String[]{"--log-chat"}, true ); public static IntProperty INTERVAL = BUILDER.ofInt( "chat-interval", "Minimum delay between logging chat", "This is the minimum delay between logging chat messages", - new String[] {"--chat-interval"}, + new String[]{"--chat-interval"}, 2 ); } diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientBrand.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientBrand.java index 4e35f4fdf..b19828d8d 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientBrand.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientBrand.java @@ -36,12 +36,6 @@ import net.pistonmaster.serverwrecker.settings.lib.property.StringProperty; public class ClientBrand implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(ClientBrand.class); - PluginHelper.registerBotEventConsumer(SWPacketSentEvent.class, ClientBrand::onPacket); - } - public static void onPacket(SWPacketSentEvent event) { if (event.packet() instanceof ServerboundLoginAcknowledgedPacket) { var connection = event.connection(); @@ -67,6 +61,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(ClientBrandSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(ClientBrand.class); + PluginHelper.registerBotEventConsumer(SWPacketSentEvent.class, ClientBrand::onPacket); + } + @NoArgsConstructor(access = AccessLevel.PRIVATE) private static class ClientBrandSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("client-brand"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientSettings.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientSettings.java index ab188723d..1aebc22de 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientSettings.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/ClientSettings.java @@ -40,12 +40,6 @@ @RequiredArgsConstructor(onConstructor_ = @Inject) public class ClientSettings implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(ClientSettings.class); - PluginHelper.registerBotEventConsumer(SWPacketSentEvent.class, ClientSettings::onPacket); - } - public static void onPacket(SWPacketSentEvent event) { if (event.packet() instanceof ServerboundLoginAcknowledgedPacket) { var connection = event.connection(); @@ -95,6 +89,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(ClientSettingsSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(ClientSettings.class); + PluginHelper.registerBotEventConsumer(SWPacketSentEvent.class, ClientSettings::onPacket); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class ClientSettingsSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("client-settings"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/ForwardingBypass.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/ForwardingBypass.java index 4a5563a69..27a2b6938 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/ForwardingBypass.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/ForwardingBypass.java @@ -142,6 +142,11 @@ private static ByteBuf createForwardingData(String hmacSecret, String address, } } + @EventHandler + public static void onSettingsManagerInit(SettingsManagerInitEvent event) { + event.settingsManager().addClass(ForwardingBypassSettings.class); + } + @Override public void onLoad() { ServerWreckerAPI.registerListeners(ForwardingBypass.class); @@ -206,11 +211,6 @@ private String getForwardedIp() { return "127.0.0.1"; } - @EventHandler - public static void onSettingsManagerInit(SettingsManagerInitEvent event) { - event.settingsManager().addClass(ForwardingBypassSettings.class); - } - /* * This is a modified version of the code from Velocity. */ diff --git a/src/main/java/net/pistonmaster/serverwrecker/plugins/ServerListBypass.java b/src/main/java/net/pistonmaster/serverwrecker/plugins/ServerListBypass.java index 272bdace6..ba615ec8f 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/plugins/ServerListBypass.java +++ b/src/main/java/net/pistonmaster/serverwrecker/plugins/ServerListBypass.java @@ -38,12 +38,6 @@ import java.util.concurrent.TimeUnit; public class ServerListBypass implements InternalExtension { - @Override - public void onLoad() { - ServerWreckerAPI.registerListeners(ServerListBypass.class); - PluginHelper.registerAttackEventConsumer(PreBotConnectEvent.class, ServerListBypass::onPreConnect); - } - public static void onPreConnect(PreBotConnectEvent event) { var connection = event.connection(); if (connection.meta().getTargetState() == ProtocolState.STATUS) { @@ -66,6 +60,12 @@ public static void onSettingsManagerInit(SettingsManagerInitEvent event) { event.settingsManager().addClass(ServerListBypassSettings.class); } + @Override + public void onLoad() { + ServerWreckerAPI.registerListeners(ServerListBypass.class); + PluginHelper.registerAttackEventConsumer(PreBotConnectEvent.class, ServerListBypass::onPreConnect); + } + @NoArgsConstructor(access = AccessLevel.NONE) private static class ServerListBypassSettings implements SettingsObject { private static final Property.Builder BUILDER = Property.builder("server-list-bypass"); diff --git a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/BotActionManager.java b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/BotActionManager.java index 40cbb3ae0..15aad786f 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/BotActionManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/BotActionManager.java @@ -48,6 +48,47 @@ public class BotActionManager { private final SessionDataManager dataManager; private int sequenceNumber = 0; + private static Optional rayCastToBlock(BlockStateMeta blockStateMeta, Vector3d eyePosition, Vector3d headRotation, Vector3i targetBlock) { + var intersections = new ArrayList(); + + for (var shape : blockStateMeta.getCollisionBoxes(targetBlock)) { + shape.getIntersection(eyePosition, headRotation) + .map(Vector3d::toFloat) + .ifPresent(intersections::add); + } + + if (intersections.isEmpty()) { + return Optional.empty(); + } + + Vector3f closestIntersection = null; + var closestDistance = Double.MAX_VALUE; + + for (var intersection : intersections) { + double distance = intersection.distance(eyePosition.getX(), eyePosition.getY(), eyePosition.getZ()); + + if (distance < closestDistance) { + closestIntersection = intersection; + closestDistance = distance; + } + } + + assert closestIntersection != null; + return Optional.of(closestIntersection); + } + + public static Vector3d getMiddleBlockFace(Vector3i blockPos, Direction blockFace) { + var blockPosDouble = blockPos.toDouble(); + return switch (blockFace) { + case DOWN -> blockPosDouble.add(0.5, 0, 0.5); + case UP -> blockPosDouble.add(0.5, 1, 0.5); + case NORTH -> blockPosDouble.add(0.5, 0.5, 0); + case SOUTH -> blockPosDouble.add(0.5, 0.5, 1); + case WEST -> blockPosDouble.add(0, 0.5, 0.5); + case EAST -> blockPosDouble.add(1, 0.5, 0.5); + }; + } + public void incrementSequenceNumber() { sequenceNumber++; } @@ -104,47 +145,6 @@ public void placeBlock(Hand hand, Vector3i againstBlock, Direction againstFace) )); } - private static Optional rayCastToBlock(BlockStateMeta blockStateMeta, Vector3d eyePosition, Vector3d headRotation, Vector3i targetBlock) { - var intersections = new ArrayList(); - - for (var shape : blockStateMeta.getCollisionBoxes(targetBlock)) { - shape.getIntersection(eyePosition, headRotation) - .map(Vector3d::toFloat) - .ifPresent(intersections::add); - } - - if (intersections.isEmpty()) { - return Optional.empty(); - } - - Vector3f closestIntersection = null; - var closestDistance = Double.MAX_VALUE; - - for (var intersection : intersections) { - double distance = intersection.distance(eyePosition.getX(), eyePosition.getY(), eyePosition.getZ()); - - if (distance < closestDistance) { - closestIntersection = intersection; - closestDistance = distance; - } - } - - assert closestIntersection != null; - return Optional.of(closestIntersection); - } - - public static Vector3d getMiddleBlockFace(Vector3i blockPos, Direction blockFace) { - var blockPosDouble = blockPos.toDouble(); - return switch (blockFace) { - case DOWN -> blockPosDouble.add(0.5, 0, 0.5); - case UP -> blockPosDouble.add(0.5, 1, 0.5); - case NORTH -> blockPosDouble.add(0.5, 0.5, 0); - case SOUTH -> blockPosDouble.add(0.5, 0.5, 1); - case WEST -> blockPosDouble.add(0, 0.5, 0.5); - case EAST -> blockPosDouble.add(1, 0.5, 0.5); - }; - } - public void sendStartBreakBlock(Vector3i blockPos) { incrementSequenceNumber(); var blockFace = getBlockFaceLookedAt(blockPos); diff --git a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/container/SWItemStack.java b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/container/SWItemStack.java index 1a986f1fb..a2ad574ef 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/container/SWItemStack.java +++ b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/container/SWItemStack.java @@ -82,14 +82,14 @@ public static SWItemStack from(ItemStack itemStack) { return new SWItemStack(itemStack); } - public short getEnchantmentLevel(String enchantment) { - return this.enchantments.getShort(enchantment); - } - public static SWItemStack forType(ItemType itemType) { return new SWItemStack(itemType, 1); } + public short getEnchantmentLevel(String enchantment) { + return this.enchantments.getShort(enchantment); + } + private int precalculateHash() { return Objects.hash(this.type, this.enchantments); } diff --git a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/movement/BotMovementManager.java b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/movement/BotMovementManager.java index 73846903d..25a391e6f 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/movement/BotMovementManager.java +++ b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/movement/BotMovementManager.java @@ -55,6 +55,12 @@ public class BotMovementManager { @Getter private final PlayerMovementState entity; private final SessionDataManager dataManager; + private final List WATER_TYPES = List.of(BlockType.WATER); + private final List LAVA_TYPES = List.of(BlockType.WATER); + private final List WATER_LIKE_TYPES = List.of( + BlockType.WATER, BlockType.SEAGRASS, BlockType.TALL_SEAGRASS, + BlockType.KELP, BlockType.KELP_PLANT, BlockType.BUBBLE_COLUMN + ); private double lastX = 0; private double lastY = 0; private double lastZ = 0; @@ -63,13 +69,6 @@ public class BotMovementManager { private boolean lastOnGround = false; private int positionReminder = 0; - private final List WATER_TYPES = List.of(BlockType.WATER); - private final List LAVA_TYPES = List.of(BlockType.WATER); - private final List WATER_LIKE_TYPES = List.of( - BlockType.WATER, BlockType.SEAGRASS, BlockType.TALL_SEAGRASS, - BlockType.KELP, BlockType.KELP_PLANT, BlockType.BUBBLE_COLUMN - ); - public BotMovementManager(SessionDataManager dataManager, double x, double y, double z, float yaw, float pitch) { this.entity = new PlayerMovementState( dataManager.getSelfAttributeState(), @@ -83,6 +82,188 @@ public BotMovementManager(SessionDataManager dataManager, double x, double y, do this.dataManager = dataManager; } + private static void consumeIntersectedBlocks(LevelState world, AABB queryBB, BiConsumer consumer) { + var startX = MathHelper.floorDouble(queryBB.minX - 1.0E-7) - 1; + var endX = MathHelper.floorDouble(queryBB.maxX + 1.0E-7) + 1; + var startY = MathHelper.floorDouble(queryBB.minY - 1.0E-7) - 1; + var endY = MathHelper.floorDouble(queryBB.maxY + 1.0E-7) + 1; + var startZ = MathHelper.floorDouble(queryBB.minZ - 1.0E-7) - 1; + var endZ = MathHelper.floorDouble(queryBB.maxZ + 1.0E-7) + 1; + + for (var x = startX; x <= endX; x++) { + for (var y = startY; y <= endY; y++) { + for (var z = startZ; z <= endZ; z++) { + var cursor = Vector3i.from(x, y, z); + var block = world.getBlockStateAt(cursor); + if (block.isEmpty()) { + continue; + } + + for (var collisionBox : block.get().getCollisionBoxes(cursor)) { + if (collisionBox.intersects(queryBB)) { + consumer.accept(block.get(), cursor); + break; + } + } + } + } + } + } + + private static double horizontalDistanceSqr(Vector3d vec) { + return vec.getX() * vec.getX() + vec.getZ() * vec.getZ(); + } + + public static Vector3d collideBoundingBox(LevelState world, Vector3d targetVec, AABB queryBB) { + return collideWith(targetVec, queryBB, world.getCollisionBoxes(queryBB.expandTowards(targetVec))); + } + + private static Vector3d collideWith(Vector3d direction, AABB boundingBox, List collisionBoxes) { + var dx = direction.getX(); + var dy = direction.getY(); + var dz = direction.getZ(); + + if (dy != 0) { + for (var blockBB : collisionBoxes) { + dy = blockBB.computeOffsetY(boundingBox, dy); + } + + if (dy != 0) { + boundingBox = boundingBox.move(0, dy, 0); + } + } + + var xLessThanZ = Math.abs(dx) < Math.abs(dz); + if (xLessThanZ && dz != 0) { + for (var blockBB : collisionBoxes) { + dz = blockBB.computeOffsetZ(boundingBox, dz); + } + + if (dz != 0) { + boundingBox = boundingBox.move(0, 0, dz); + } + } + + if (dx != 0) { + for (var blockBB : collisionBoxes) { + dx = blockBB.computeOffsetX(boundingBox, dx); + } + + if (!xLessThanZ && dx != 0) { + boundingBox = boundingBox.move(dx, 0, 0); + } + } + + if (!xLessThanZ && dz != 0.0) { + for (var blockBB : collisionBoxes) { + dz = blockBB.computeOffsetZ(boundingBox, dz); + } + } + + return Vector3d.from(dx, dy, dz); + } + + private static LookingVectorData getLookingVector(PlayerMovementState entity) { + // given a yaw pitch, we need the looking vector + + // yaw is right handed rotation about y (up) starting from -z (north) + // pitch is -90 looking down, 90 looking up, 0 looking at horizon + // lets get its coordinate system. + // var x' = -z (north) + // var y' = -x (west) + // var z' = y (up) + + // the non normalized looking vector in x', y', z' space is + // x' is cos(yaw) + // y' is sin(yaw) + // z' is tan(pitch) + + // substituting back in x, y, z, we get the looking vector in the normal x, y, z space + // -z = cos(yaw) => z = -cos(yaw) + // -x = sin(yaw) => x = -sin(yaw) + // y = tan(pitch) + + // normalizing the vectors, we divide each by |sqrt(x*x + y*y + z*z)| + // x*x + z*z = sin^2 + cos^2 = 1 + // so |sqrt(xx+yy+zz)| = |sqrt(1+tan^2(pitch))| + // = |sqrt(1+sin^2(pitch)/cos^2(pitch))| + // = |sqrt((cos^2+sin^2)/cos^2(pitch))| + // = |sqrt(1/cos^2(pitch))| + // = |+/- 1/cos(pitch)| + // = 1/cos(pitch) since pitch in [-90, 90] + + // the looking vector is therefore + // x = -sin(yaw) * cos(pitch) + // y = tan(pitch) * cos(pitch) = sin(pitch) + // z = -cos(yaw) * cos(pitch) + + var yaw = entity.yaw; + var pitch = entity.pitch; + var sinYaw = Math.sin(yaw); + var cosYaw = Math.cos(yaw); + var sinPitch = Math.sin(pitch); + var cosPitch = Math.cos(pitch); + var lookX = -sinYaw * cosPitch; + var lookZ = -cosYaw * cosPitch; + var lookDir = new MutableVector3d(lookX, sinPitch, lookZ); + return new LookingVectorData( + yaw, + pitch, + sinYaw, + cosYaw, + sinPitch, + cosPitch, + lookX, + sinPitch, + lookZ, + lookDir + ); + } + + public static boolean isOnLadder(LevelState world, Vector3i pos) { + var block = world.getBlockStateAt(pos); + if (block.isEmpty()) { + return false; + } + + var blockType = block.get().blockType(); + return blockType == BlockType.LADDER || blockType == BlockType.VINE; + } + + public static boolean isMaterialInBB(LevelState world, AABB queryBB, List types) { + var minX = MathHelper.floorDouble(queryBB.minX); + var minY = MathHelper.floorDouble(queryBB.minY); + var minZ = MathHelper.floorDouble(queryBB.minZ); + + var maxX = MathHelper.floorDouble(queryBB.maxX); + var maxY = MathHelper.floorDouble(queryBB.maxY); + var maxZ = MathHelper.floorDouble(queryBB.maxZ); + + for (var x = minX; x <= maxX; x++) { + for (var y = minY; y <= maxY; y++) { + for (var z = minZ; z <= maxZ; z++) { + var block = world.getBlockStateAt(Vector3i.from(x, y, z)); + + if (block.isEmpty()) { + continue; + } + + if (types.contains(block.get().blockType())) { + return true; + } + } + } + } + + return false; + } + + public static void setPositionToBB(AABB bb, MutableVector3d pos) { + pos.x = (bb.minX + bb.maxX) / 2; + pos.y = bb.minY; + pos.z = (bb.minZ + bb.maxZ) / 2; + } + public void tick() { var world = dataManager.getCurrentLevel(); if (world == null) return; @@ -540,34 +721,6 @@ public void moveEntity(LevelState world, double dx, double dy, double dz) { } } - private static void consumeIntersectedBlocks(LevelState world, AABB queryBB, BiConsumer consumer) { - var startX = MathHelper.floorDouble(queryBB.minX - 1.0E-7) - 1; - var endX = MathHelper.floorDouble(queryBB.maxX + 1.0E-7) + 1; - var startY = MathHelper.floorDouble(queryBB.minY - 1.0E-7) - 1; - var endY = MathHelper.floorDouble(queryBB.maxY + 1.0E-7) + 1; - var startZ = MathHelper.floorDouble(queryBB.minZ - 1.0E-7) - 1; - var endZ = MathHelper.floorDouble(queryBB.maxZ + 1.0E-7) + 1; - - for (var x = startX; x <= endX; x++) { - for (var y = startY; y <= endY; y++) { - for (var z = startZ; z <= endZ; z++) { - var cursor = Vector3i.from(x, y, z); - var block = world.getBlockStateAt(cursor); - if (block.isEmpty()) { - continue; - } - - for (var collisionBox : block.get().getCollisionBoxes(cursor)) { - if (collisionBox.intersects(queryBB)) { - consumer.accept(block.get(), cursor); - break; - } - } - } - } - } - } - private Vector3d collide(LevelState world, AABB playerBB, Vector3d targetVec) { var initialCollisionVec = targetVec.lengthSquared() == 0.0 ? targetVec : collideBoundingBox(world, targetVec, playerBB); var xChanged = targetVec.getX() != initialCollisionVec.getY(); @@ -594,59 +747,6 @@ private Vector3d collide(LevelState world, AABB playerBB, Vector3d targetVec) { return initialCollisionVec; } - private static double horizontalDistanceSqr(Vector3d vec) { - return vec.getX() * vec.getX() + vec.getZ() * vec.getZ(); - } - - public static Vector3d collideBoundingBox(LevelState world, Vector3d targetVec, AABB queryBB) { - return collideWith(targetVec, queryBB, world.getCollisionBoxes(queryBB.expandTowards(targetVec))); - } - - private static Vector3d collideWith(Vector3d direction, AABB boundingBox, List collisionBoxes) { - var dx = direction.getX(); - var dy = direction.getY(); - var dz = direction.getZ(); - - if (dy != 0) { - for (var blockBB : collisionBoxes) { - dy = blockBB.computeOffsetY(boundingBox, dy); - } - - if (dy != 0) { - boundingBox = boundingBox.move(0, dy, 0); - } - } - - var xLessThanZ = Math.abs(dx) < Math.abs(dz); - if (xLessThanZ && dz != 0) { - for (var blockBB : collisionBoxes) { - dz = blockBB.computeOffsetZ(boundingBox, dz); - } - - if (dz != 0) { - boundingBox = boundingBox.move(0, 0, dz); - } - } - - if (dx != 0) { - for (var blockBB : collisionBoxes) { - dx = blockBB.computeOffsetX(boundingBox, dx); - } - - if (!xLessThanZ && dx != 0) { - boundingBox = boundingBox.move(dx, 0, 0); - } - } - - if (!xLessThanZ && dz != 0.0) { - for (var blockBB : collisionBoxes) { - dz = blockBB.computeOffsetZ(boundingBox, dz); - } - } - - return Vector3d.from(dx, dy, dz); - } - public void applyHeading(double strafe, double forward, float speed) { var distanceSquared = strafe * strafe + forward * forward; if (distanceSquared < 1.0E-7) { @@ -671,63 +771,6 @@ public void applyHeading(double strafe, double forward, float speed) { vel.z += forward * cos + strafe * sin; } - private static LookingVectorData getLookingVector(PlayerMovementState entity) { - // given a yaw pitch, we need the looking vector - - // yaw is right handed rotation about y (up) starting from -z (north) - // pitch is -90 looking down, 90 looking up, 0 looking at horizon - // lets get its coordinate system. - // var x' = -z (north) - // var y' = -x (west) - // var z' = y (up) - - // the non normalized looking vector in x', y', z' space is - // x' is cos(yaw) - // y' is sin(yaw) - // z' is tan(pitch) - - // substituting back in x, y, z, we get the looking vector in the normal x, y, z space - // -z = cos(yaw) => z = -cos(yaw) - // -x = sin(yaw) => x = -sin(yaw) - // y = tan(pitch) - - // normalizing the vectors, we divide each by |sqrt(x*x + y*y + z*z)| - // x*x + z*z = sin^2 + cos^2 = 1 - // so |sqrt(xx+yy+zz)| = |sqrt(1+tan^2(pitch))| - // = |sqrt(1+sin^2(pitch)/cos^2(pitch))| - // = |sqrt((cos^2+sin^2)/cos^2(pitch))| - // = |sqrt(1/cos^2(pitch))| - // = |+/- 1/cos(pitch)| - // = 1/cos(pitch) since pitch in [-90, 90] - - // the looking vector is therefore - // x = -sin(yaw) * cos(pitch) - // y = tan(pitch) * cos(pitch) = sin(pitch) - // z = -cos(yaw) * cos(pitch) - - var yaw = entity.yaw; - var pitch = entity.pitch; - var sinYaw = Math.sin(yaw); - var cosYaw = Math.cos(yaw); - var sinPitch = Math.sin(pitch); - var cosPitch = Math.cos(pitch); - var lookX = -sinYaw * cosPitch; - var lookZ = -cosYaw * cosPitch; - var lookDir = new MutableVector3d(lookX, sinPitch, lookZ); - return new LookingVectorData( - yaw, - pitch, - sinYaw, - cosYaw, - sinPitch, - cosPitch, - lookX, - sinPitch, - lookZ, - lookDir - ); - } - public void setMotion(double motionX, double motionY, double motionZ) { entity.vel.x = motionX; entity.vel.y = motionY; @@ -770,30 +813,6 @@ public Vector3d getRotationVector() { return Vector3d.from(x, y, z); } - record LookingVectorData( - float yaw, - float pitch, - double sinYaw, - double cosYaw, - double sinPitch, - double cosPitch, - double lookX, - double lookY, - double lookZ, - MutableVector3d lookDir - ) { - } - - public static boolean isOnLadder(LevelState world, Vector3i pos) { - var block = world.getBlockStateAt(pos); - if (block.isEmpty()) { - return false; - } - - var blockType = block.get().blockType(); - return blockType == BlockType.LADDER || blockType == BlockType.VINE; - } - public boolean doesNotCollide(LevelState world, MutableVector3d pos) { var pBB = getPlayerBB(pos); return world.getCollisionBoxes(pBB).isEmpty() && getWaterInBB(world, pBB).isEmpty(); @@ -858,34 +877,6 @@ public Vector3i getFlow(LevelState world, BlockStateMeta meta, Vector3i block) { return flow.normalize().toImmutableInt(); } - public static boolean isMaterialInBB(LevelState world, AABB queryBB, List types) { - var minX = MathHelper.floorDouble(queryBB.minX); - var minY = MathHelper.floorDouble(queryBB.minY); - var minZ = MathHelper.floorDouble(queryBB.minZ); - - var maxX = MathHelper.floorDouble(queryBB.maxX); - var maxY = MathHelper.floorDouble(queryBB.maxY); - var maxZ = MathHelper.floorDouble(queryBB.maxZ); - - for (var x = minX; x <= maxX; x++) { - for (var y = minY; y <= maxY; y++) { - for (var z = minZ; z <= maxZ; z++) { - var block = world.getBlockStateAt(Vector3i.from(x, y, z)); - - if (block.isEmpty()) { - continue; - } - - if (types.contains(block.get().blockType())) { - return true; - } - } - } - } - - return false; - } - public List> getWaterInBB(LevelState world, AABB bb) { var waterBlocks = new ArrayList>(); @@ -927,12 +918,6 @@ public AABB getPlayerBB(MutableVector3d pos) { return new AABB(pos.x - w, pos.y, pos.z - w, pos.x + w, pos.y + h, pos.z + w); } - public static void setPositionToBB(AABB bb, MutableVector3d pos) { - pos.x = (bb.minX + bb.maxX) / 2; - pos.y = bb.minY; - pos.z = (bb.minZ + bb.maxZ) / 2; - } - public void jump() { entity.jumpQueued = true; } @@ -985,4 +970,18 @@ private float getBlockFriction(BlockType blockType) { return physics.defaultSlipperiness; // Normal block } } + + record LookingVectorData( + float yaw, + float pitch, + double sinYaw, + double cosYaw, + double sinPitch, + double cosPitch, + double lookX, + double lookY, + double lookZ, + MutableVector3d lookDir + ) { + } } diff --git a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/state/EntityAttributesState.java b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/state/EntityAttributesState.java index fd9dfa2ad..c386d6613 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/state/EntityAttributesState.java +++ b/src/main/java/net/pistonmaster/serverwrecker/protocol/bot/state/EntityAttributesState.java @@ -31,14 +31,6 @@ public class EntityAttributesState { private final Map attributeStore = new Object2ObjectOpenHashMap<>(); - public boolean hasAttribute(AttributeType type) { - return attributeStore.containsKey(type); - } - - public Attribute getAttribute(AttributeType type) { - return attributeStore.get(type); - } - public static double getAttributeValue(Attribute attribute) { var value = attribute.getValue(); @@ -53,6 +45,14 @@ public static double getAttributeValue(Attribute attribute) { return value; } + public boolean hasAttribute(AttributeType type) { + return attributeStore.containsKey(type); + } + + public Attribute getAttribute(AttributeType type) { + return attributeStore.get(type); + } + public double getAttributeValue(AttributeType type) { var attribute = attributeStore.get(type); if (attribute == null) { diff --git a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsHolder.java b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsHolder.java index 395b6aa82..e5db0c52d 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsHolder.java +++ b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/SettingsHolder.java @@ -25,8 +25,6 @@ import net.pistonmaster.serverwrecker.settings.lib.property.*; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.function.Function; public record SettingsHolder( diff --git a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/property/Property.java b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/property/Property.java index 0f8321c13..67b00167f 100644 --- a/src/main/java/net/pistonmaster/serverwrecker/settings/lib/property/Property.java +++ b/src/main/java/net/pistonmaster/serverwrecker/settings/lib/property/Property.java @@ -20,6 +20,10 @@ package net.pistonmaster.serverwrecker.settings.lib.property; public sealed interface Property permits BooleanProperty, ComboProperty, IntProperty, StringProperty { + static Builder builder(String namespace) { + return new Builder(namespace); + } + String namespace(); String name(); @@ -28,10 +32,6 @@ default PropertyKey propertyKey() { return new PropertyKey(namespace(), name()); } - static Builder builder(String namespace) { - return new Builder(namespace); - } - record Builder(String namespace) { public BooleanProperty ofBoolean(String name, String uiDescription, String cliDescription, String[] cliNames, boolean defaultValue) { return new BooleanProperty(namespace, name, uiDescription, cliDescription, cliNames, defaultValue);