Compare commits
32 commits
Author | SHA1 | Date | |
---|---|---|---|
10ca2e4e06 | |||
0fcc68c7a2 | |||
22c736c67d | |||
8d81084f8d | |||
11ed0c5eb1 | |||
88ceb46d71 | |||
d63adca59a | |||
5cef742fef | |||
bcdbf5c2f3 | |||
9a55cd11f4 | |||
d6f68cd2fa | |||
84853b78c4 | |||
67a6f409af | |||
ac0437ab48 | |||
26ef63b176 | |||
801ce9cbd2 | |||
372cdce2fa | |||
7306377a3f | |||
25d983c71c | |||
ae837c897c | |||
4d3c05c439 | |||
e20571f2be | |||
9f32784279 | |||
56ddfded75 | |||
5d56589c2e | |||
0ad227acae | |||
eb78e8de5c | |||
9a0261ccad | |||
e45d2c1f48 | |||
ce3bd2ebc1 | |||
005cb0d3a4 | |||
18fb46c008 |
45 changed files with 654 additions and 317 deletions
|
@ -2,6 +2,7 @@
|
|||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile default="true" name="Default" enabled="true" />
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
|
|
7
.idea/discord.xml
Normal file
7
.idea/discord.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="PROJECT_FILES" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
</project>
|
|
@ -6,16 +6,46 @@
|
|||
<option name="name" value="Minecraft Libraries" />
|
||||
<option name="url" value="https://libraries.minecraft.net" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="CollabNet" />
|
||||
<option name="name" value="CollabNet" />
|
||||
<option name="url" value="https://repo.opencollab.dev/main/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="opencollab" />
|
||||
<option name="name" value="opencollab" />
|
||||
<option name="url" value="https://repo.opencollab.dev/main" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Central Repository" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="opencollab" />
|
||||
<option name="name" value="opencollab" />
|
||||
<option name="url" value="https://repo.opencollab.dev/main/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="CollabNetSnapshots" />
|
||||
<option name="name" value="CollabNetSnapshots" />
|
||||
<option name="url" value="https://repo.opencollab.dev/maven-snapshots/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="opencollab" />
|
||||
<option name="name" value="opencollab" />
|
||||
<option name="url" value="https://repo.opencollab.dev/maven-snapshots/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="CollabNetReleases" />
|
||||
<option name="name" value="CollabNetReleases" />
|
||||
<option name="url" value="https://repo.opencollab.dev/maven-releases/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
|
|
|
@ -8,5 +8,5 @@
|
|||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="19" project-jdk-type="JavaSDK" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_20" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/chipmunkbot.iml" filepath="$PROJECT_DIR$/chipmunkbot.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -1,2 +1,2 @@
|
|||
# chipmunkbot
|
||||
A work-in-progress mcprotocollib utility bot, created for free-op servers with minimal restrictions
|
||||
# Chipmunk Sex Bot
|
||||
Sexy version of [ChipmunkBot](https://code.chipmunk.land/ChipmunkMC/chipmunkbot)!!!!!!
|
||||
|
|
12
chipmunkbot.iml
Normal file
12
chipmunkbot.iml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>ADVENTURE</platformType>
|
||||
</autoDetectTypes>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
</module>
|
24
pom.xml
24
pom.xml
|
@ -13,23 +13,31 @@
|
|||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>opencollab</id>
|
||||
<url>https://repo.opencollab.dev/maven-snapshots/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>minecraft-libraries</id>
|
||||
<name>Minecraft Libraries</name>
|
||||
<url>https://libraries.minecraft.net</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>CollabNet</id>
|
||||
<url>https://repo.opencollab.dev/main/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>CollabNetSnapshots</id>
|
||||
<url>https://repo.opencollab.dev/maven-snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>CollabNetReleases</id>
|
||||
<url>https://repo.opencollab.dev/maven-releases/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.steveice10</groupId>
|
||||
<artifactId>mcprotocollib</artifactId>
|
||||
<version>1.20-1-SNAPSHOT</version>
|
||||
<groupId>org.geysermc.mcprotocollib</groupId>
|
||||
<artifactId>protocol</artifactId>
|
||||
<version>1.21-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
|
|
@ -1,18 +1,14 @@
|
|||
package land.chipmunk.chipmunkbot;
|
||||
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import com.github.steveice10.packetlib.ProxyInfo;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.tcp.TcpClientSession;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.lang.reflect.Constructor;
|
||||
import lombok.Getter;
|
||||
import land.chipmunk.chipmunkbot.plugins.*;
|
||||
import org.geysermc.mcprotocollib.protocol.MinecraftProtocol;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ChipmunkBot extends Client {
|
||||
@Getter private final Configuration config;
|
||||
|
||||
@Getter private final TickLoop tickLoop;
|
||||
@Getter private final ChatPlugin chat;
|
||||
@Getter private final TabCompletePlugin tabComplete;
|
||||
|
@ -26,9 +22,11 @@ public class ChipmunkBot extends Client {
|
|||
@Getter private final SelfCarePlugin selfCare;
|
||||
@Getter private final SongPlayer songPlayer;
|
||||
|
||||
public ChipmunkBot (Options options, List<Client> allClients) {
|
||||
public ChipmunkBot (Configuration config, Configuration.Bot options, List<Client> allClients) {
|
||||
super(options.host, options.port, new MinecraftProtocol(options.username), null, options.reconnectDelay, allClients);
|
||||
|
||||
this.config = config;
|
||||
|
||||
this.tickLoop = new TickLoop(this);
|
||||
this.chat = new ChatPlugin(this);
|
||||
this.tabComplete = new TabCompletePlugin(this);
|
||||
|
@ -39,7 +37,7 @@ public class ChipmunkBot extends Client {
|
|||
this.playerCommandHandler = new PlayerCommandHandler(this, options);
|
||||
this.position = new PositionManager(this);
|
||||
this.core = new CommandCore(this, options);
|
||||
this.selfCare = new SelfCarePlugin(this);
|
||||
this.selfCare = new SelfCarePlugin(this, options);
|
||||
this.songPlayer = new SongPlayer(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package land.chipmunk.chipmunkbot;
|
||||
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import com.github.steveice10.packetlib.ProxyInfo;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.tcp.TcpClientSession;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.event.session.*;
|
||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||
import com.github.steveice10.mc.protocol.packet.login.clientbound.ClientboundGameProfilePacket;
|
||||
import land.chipmunk.chipmunkbot.util.ComponentUtilities;
|
||||
import org.geysermc.mcprotocollib.auth.GameProfile;
|
||||
import org.geysermc.mcprotocollib.network.ProxyInfo;
|
||||
import org.geysermc.mcprotocollib.protocol.MinecraftProtocol;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.tcp.TcpClientSession;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.event.session.*;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.login.clientbound.ClientboundGameProfilePacket;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.List;
|
||||
|
|
47
src/main/java/land/chipmunk/chipmunkbot/Configuration.java
Normal file
47
src/main/java/land/chipmunk/chipmunkbot/Configuration.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
package land.chipmunk.chipmunkbot;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public class Configuration {
|
||||
@Getter public Color color = new Color();
|
||||
|
||||
public Bot[] bots = new Bot[]{};
|
||||
|
||||
public static class Color {
|
||||
@Getter public String primary = "#ffc0cb";
|
||||
@Getter public String secondary = "#c95367";
|
||||
}
|
||||
|
||||
public static class Bot {
|
||||
public String host = "0.0.0.0";
|
||||
public int port = 25565;
|
||||
public String username = "Player";
|
||||
// public ProxyInfo proxy;
|
||||
public long reconnectDelay = 1000;
|
||||
|
||||
public Commands commands = new Commands();
|
||||
|
||||
public Core core = new Core();
|
||||
|
||||
public SelfCares selfCares = new SelfCares();
|
||||
|
||||
public static class SelfCares {
|
||||
public boolean cspy = true;
|
||||
public PrefixSelfCare prefix = new PrefixSelfCare();
|
||||
|
||||
public static class PrefixSelfCare {
|
||||
public boolean enabled = true;
|
||||
public String prefix = "&x&c&9&5&3&6&7[&x&f&f&c&0&c&bPrefix: s'&x&c&9&5&3&6&7]";
|
||||
}
|
||||
}
|
||||
|
||||
public static class Commands {
|
||||
public String prefix = "default.";
|
||||
public String cspyPrefix = "default.";
|
||||
}
|
||||
|
||||
public static class Core {
|
||||
public boolean enabled = true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,11 +1,5 @@
|
|||
package land.chipmunk.chipmunkbot;
|
||||
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
@ -65,13 +59,9 @@ public class Main {
|
|||
|
||||
List<Client> allClients = new ArrayList<>();
|
||||
|
||||
for (Options options : config.bots) {
|
||||
final Client client = new ChipmunkBot(options, allClients);
|
||||
for (Configuration.Bot options : config.bots) {
|
||||
final Client client = new ChipmunkBot(config, options, allClients);
|
||||
allClients.add(client);
|
||||
}
|
||||
}
|
||||
|
||||
private static class Configuration {
|
||||
public Options[] bots;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
package land.chipmunk.chipmunkbot;
|
||||
|
||||
public class Options {
|
||||
public String host = "0.0.0.0";
|
||||
public int port = 25565;
|
||||
public String username = "Player";
|
||||
// public ProxyInfo proxy;
|
||||
public long reconnectDelay = 1000;
|
||||
|
||||
public Commands commands = new Commands();
|
||||
|
||||
public Core core = new Core();
|
||||
|
||||
public class Commands {
|
||||
public String prefix = "default.";
|
||||
public String cspyPrefix = "default.";
|
||||
}
|
||||
|
||||
public class Core {
|
||||
public boolean enabled = true;
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@ package land.chipmunk.chipmunkbot.command;
|
|||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
|
||||
public class ConsoleCommandSource extends CommandSource {
|
||||
|
|
|
@ -3,14 +3,16 @@ package land.chipmunk.chipmunkbot.command;
|
|||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
import land.chipmunk.chipmunkbot.util.UUIDUtilities;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import org.geysermc.mcprotocollib.auth.GameProfile;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerCommandSource extends CommandSource {
|
||||
|
|
|
@ -58,7 +58,7 @@ public class LocationArgumentType implements ArgumentType<Object> {
|
|||
public Path parsePath (StringReader reader) throws CommandSyntaxException {
|
||||
final String pathString = reader.readString();
|
||||
final Path path = Path.of(root.toString(), pathString).toAbsolutePath().normalize();
|
||||
if (!path.startsWith(root)) throw OOB_FILEPATH.create();
|
||||
// if (!path.startsWith(root)) throw OOB_FILEPATH.create(); for the funnies
|
||||
return path;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package land.chipmunk.chipmunkbot.commands;
|
||||
|
||||
import com.mojang.brigadier.Message;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.Configuration;
|
||||
import land.chipmunk.chipmunkbot.command.*;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
|
@ -13,6 +15,9 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
|||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.JoinConfiguration;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
@ -22,11 +27,11 @@ public class HelpCommand {
|
|||
|
||||
dispatcher.register(
|
||||
literal("help")
|
||||
.executes(instance::sendCommandList)
|
||||
.then(
|
||||
argument("command", greedyString())
|
||||
.executes(instance::sendUsage)
|
||||
)
|
||||
.executes(instance::sendCommandList)
|
||||
.then(
|
||||
argument("command", greedyString())
|
||||
.executes(instance::sendUsage)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -36,7 +41,7 @@ public class HelpCommand {
|
|||
|
||||
final CommandDispatcher<CommandSource> dispatcher = client.commandManager().dispatcher();
|
||||
|
||||
source.sendOutput(generateCommandList(dispatcher), false);
|
||||
source.sendOutput(generateCommandList(client, dispatcher), false);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -50,7 +55,7 @@ public class HelpCommand {
|
|||
final CommandDispatcher<CommandSource> dispatcher = client.commandManager().dispatcher();
|
||||
for (CommandNode<CommandSource> node : dispatcher.getRoot().getChildren()) {
|
||||
if (!node.getName().equals(commandName)) continue;
|
||||
source.sendOutput(generateUsages(dispatcher, node), false);
|
||||
source.sendOutput(generateUsages(client.config(), dispatcher, node), false);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -58,29 +63,57 @@ public class HelpCommand {
|
|||
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand().create();
|
||||
}
|
||||
|
||||
public Component generateCommandList (CommandDispatcher<CommandSource> dispatcher) {
|
||||
public Component generateCommandList (ChipmunkBot client, CommandDispatcher<CommandSource> dispatcher) {
|
||||
final List<Component> list = new ArrayList<>();
|
||||
|
||||
for (CommandNode<CommandSource> node : dispatcher.getRoot().getChildren()) {
|
||||
final String name = node.getName();
|
||||
|
||||
final Component usages = generateUsages(dispatcher, node);
|
||||
final Component usages = generateUsages(client.config(), dispatcher, node);
|
||||
final HoverEvent hoverEvent = HoverEvent.showText(usages);
|
||||
|
||||
list.add(Component.text(name).hoverEvent(hoverEvent));
|
||||
list.add(
|
||||
Component
|
||||
.text(name)
|
||||
.color(TextColor.fromHexString(client.config().color().primary()))
|
||||
.hoverEvent(hoverEvent)
|
||||
);
|
||||
}
|
||||
|
||||
return Component.translatable("Commands - %s", Component.join(JoinConfiguration.separator(Component.space()), list));
|
||||
return Component.translatable(
|
||||
"%s - %s",
|
||||
Component.text("Commands").color(NamedTextColor.GRAY),
|
||||
Component.join(JoinConfiguration.separator(Component.space()), list)
|
||||
).color(NamedTextColor.DARK_GRAY);
|
||||
}
|
||||
|
||||
public Component generateUsages (CommandDispatcher dispatcher, CommandNode<CommandSource> node) {
|
||||
public Component generateUsages (Configuration config, CommandDispatcher dispatcher, CommandNode<CommandSource> node) {
|
||||
final List<Component> components = new ArrayList<>();
|
||||
final List<Component> usages = new ArrayList<>();
|
||||
|
||||
for (String usage : dispatcher.getAllUsage(node, null, true)) {
|
||||
final String text = (node.getName() + " " + usage).trim();
|
||||
usages.add(Component.text(text));
|
||||
usages.add(
|
||||
Component
|
||||
.text(node.getName())
|
||||
.color(TextColor.fromHexString(config.color().secondary()))
|
||||
.append(Component.space())
|
||||
.append(
|
||||
Component
|
||||
.text(usage)
|
||||
.color(TextColor.fromHexString(config.color().primary()))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return Component.join(JoinConfiguration.separator(Component.newline()), usages);
|
||||
components.add(
|
||||
Component.translatable(
|
||||
"%s",
|
||||
Component.text(node.getName()).color(TextColor.fromHexString(config.color().primary()))
|
||||
).color(NamedTextColor.DARK_GRAY)
|
||||
);
|
||||
|
||||
components.add(Component.join(JoinConfiguration.separator(Component.newline()), usages));
|
||||
|
||||
return Component.join(JoinConfiguration.separator(Component.newline()), components);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,24 +1,27 @@
|
|||
package land.chipmunk.chipmunkbot.commands;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.util.CPUInfo;
|
||||
import land.chipmunk.chipmunkbot.command.*;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.lang.management.*;
|
||||
import java.io.IOException;
|
||||
|
||||
public class InfoCommand {
|
||||
private static final String REPOSITORY_URL = "https://code.chipmunk.land/ChipmunkMC/chipmunkbot";
|
||||
private static final String ORIGINAL_REPOSITORY_URL = "https://code.chipmunk.land/ChipmunkMC/chipmunkbot";
|
||||
private static final String FORK_URL = "https://code.chipmunk.land/ChomeNS/chipmunkbot";
|
||||
|
||||
private static ChipmunkBot client;
|
||||
|
||||
public static void register (CommandDispatcher dispatcher) {
|
||||
final InfoCommand instance = new InfoCommand();
|
||||
|
@ -35,17 +38,30 @@ public class InfoCommand {
|
|||
|
||||
public int sendBotInfo (CommandContext<CommandSource> context) {
|
||||
final CommandSource source = context.getSource();
|
||||
client = source.client();
|
||||
|
||||
final Component component = Component.empty()
|
||||
.append(Component.text("ChipmunkBot", NamedTextColor.GREEN))
|
||||
.append(Component.text("ChipmunkBot", TextColor.fromHexString(client.config().color().primary())))
|
||||
.append(Component.text(" - A utility bot for free-operator servers with minimal or no restrictions", NamedTextColor.GRAY))
|
||||
.append(Component.newline())
|
||||
.append(Component.text("Made by ", NamedTextColor.GRAY))
|
||||
.append(Component.text("_ChipMC_", NamedTextColor.DARK_GREEN))
|
||||
.append(Component.text("_ChipMC_", TextColor.fromHexString(client.config().color().secondary())))
|
||||
.append(Component.text(", ", TextColor.fromHexString(client.config().color().primary())))
|
||||
.append(Component.text("chayapak", TextColor.fromHexString(client.config().color().secondary())))
|
||||
.append(Component.text(" (").color(NamedTextColor.DARK_GRAY))
|
||||
.append(
|
||||
Component
|
||||
.text(":3")
|
||||
.color(NamedTextColor.RED)
|
||||
)
|
||||
.append(Component.text(")").color(NamedTextColor.DARK_GRAY))
|
||||
.append(Component.text(" and contributors", NamedTextColor.GRAY))
|
||||
.append(Component.newline())
|
||||
.append(Component.text("Repository: ", NamedTextColor.GRAY))
|
||||
.append(Component.text(REPOSITORY_URL, NamedTextColor.GREEN).clickEvent(ClickEvent.openUrl(REPOSITORY_URL)));
|
||||
.append(Component.text("Original Repository: ", NamedTextColor.GRAY))
|
||||
.append(Component.text(ORIGINAL_REPOSITORY_URL, TextColor.fromHexString(client.config().color().primary())).clickEvent(ClickEvent.openUrl(ORIGINAL_REPOSITORY_URL)))
|
||||
.append(Component.newline())
|
||||
.append(Component.text("My fork: ", NamedTextColor.GRAY))
|
||||
.append(Component.text(FORK_URL, TextColor.fromHexString(client.config().color().primary())).clickEvent(ClickEvent.openUrl(FORK_URL)));
|
||||
|
||||
source.sendOutput(component, false);
|
||||
|
||||
|
@ -55,6 +71,8 @@ public class InfoCommand {
|
|||
public int sendServerInfo (CommandContext<CommandSource> context) {
|
||||
final CommandSource source = context.getSource();
|
||||
|
||||
client = source.client();
|
||||
|
||||
final Runtime runtime = Runtime.getRuntime();
|
||||
final OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
|
||||
final RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
|
||||
|
@ -98,8 +116,8 @@ public class InfoCommand {
|
|||
public Component formatEntry (Component key, Component value) {
|
||||
return Component.translatable(
|
||||
"%s: %s",
|
||||
key.color(NamedTextColor.GREEN),
|
||||
value.color(NamedTextColor.DARK_GREEN)
|
||||
key.color(TextColor.fromHexString(client.config().color().primary())),
|
||||
value.color(TextColor.fromHexString(client.config().color().secondary()))
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,29 +1,32 @@
|
|||
package land.chipmunk.chipmunkbot.commands;
|
||||
|
||||
import land.chipmunk.chipmunkbot.util.Logging;
|
||||
import land.chipmunk.chipmunkbot.command.*;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.command.CommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.ComponentMessage;
|
||||
import land.chipmunk.chipmunkbot.util.Logging;
|
||||
import lombok.AllArgsConstructor;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Scanner;
|
||||
import java.util.Arrays;
|
||||
import java.util.Scanner;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
|
||||
public class LogQueryCommand {
|
||||
private LogQueryThread thread;
|
||||
|
||||
|
@ -86,20 +89,24 @@ public class LogQueryCommand {
|
|||
|
||||
final CommandSource source = context.getSource();
|
||||
|
||||
final ChipmunkBot client = source.client();
|
||||
|
||||
final String text = getString(context, "text");
|
||||
|
||||
thread = new CountThread(line -> line.contains(text), Logging.LOGS_DIR, source);
|
||||
thread.start();
|
||||
|
||||
source.sendOutput(Component.translatable("Searching for instances of %s in the logs", Component.text(text, NamedTextColor.GREEN)));
|
||||
source.sendOutput(Component.translatable("Searching for instances of %s in the logs", Component.text(text, TextColor.fromHexString(client.config().color().primary()))));
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
public int progressCommand (CommandContext<CommandSource> context) {
|
||||
final ChipmunkBot client = context.getSource().client();
|
||||
|
||||
final Component progress = Component.translatable(
|
||||
"Currently reading %s (%s/%s)",
|
||||
Component.text(thread.currentFilename, NamedTextColor.GREEN),
|
||||
Component.text(thread.currentFilename, TextColor.fromHexString(client.config().color().primary())),
|
||||
Component.text(thread.currentIndex + 1),
|
||||
Component.text(thread.totalFiles)
|
||||
);
|
||||
|
@ -185,8 +192,9 @@ public class LogQueryCommand {
|
|||
}
|
||||
|
||||
public void onFinish () {
|
||||
final ChipmunkBot client = source.client();
|
||||
double seconds = (double) (System.currentTimeMillis() - startTime) / 1000d;
|
||||
source.sendOutput(Component.translatable("Found %s instances of the specified query in %s seconds", Component.text(instances, NamedTextColor.GREEN), Component.text(seconds, NamedTextColor.GREEN)));
|
||||
source.sendOutput(Component.translatable("Found %s instances of the specified query in %s seconds", Component.text(instances, TextColor.fromHexString(client.config().color().primary())), Component.text(seconds, TextColor.fromHexString(client.config().color().primary()))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,34 +1,35 @@
|
|||
package land.chipmunk.chipmunkbot.commands;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.song.Song;
|
||||
import land.chipmunk.chipmunkbot.plugins.SongPlayer;
|
||||
import land.chipmunk.chipmunkbot.command.*;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
|
||||
import static com.mojang.brigadier.arguments.IntegerArgumentType.getInteger;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.LocationArgumentType.location;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.LocationArgumentType.filepath;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.LocationArgumentType.getPath;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.LocationArgumentType.getUrl;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.TimestampArgumentType.timestamp;
|
||||
import static com.mojang.brigadier.arguments.LongArgumentType.getLong;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.command.CommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.ComponentMessage;
|
||||
import land.chipmunk.chipmunkbot.plugins.SongPlayer;
|
||||
import land.chipmunk.chipmunkbot.song.Song;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.JoinConfiguration;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.JoinConfiguration;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.mojang.brigadier.arguments.FloatArgumentType.getFloat;
|
||||
import static com.mojang.brigadier.arguments.IntegerArgumentType.getInteger;
|
||||
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
|
||||
import static com.mojang.brigadier.arguments.FloatArgumentType.floatArg;
|
||||
import static com.mojang.brigadier.arguments.LongArgumentType.getLong;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.LocationArgumentType.*;
|
||||
import static land.chipmunk.chipmunkbot.command.arguments.TimestampArgumentType.timestamp;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
|
||||
public class MusicCommand {
|
||||
private static SimpleCommandExceptionType NO_SONG_IS_CURRENTLY_PLAYING = new SimpleCommandExceptionType(ComponentMessage.wrap(Component.translatable("No song is currently playing")));
|
||||
|
@ -79,11 +80,21 @@ public class MusicCommand {
|
|||
.executes(instance::gotoCommand)
|
||||
)
|
||||
)
|
||||
|
||||
.then(
|
||||
literal("pitch")
|
||||
.then(
|
||||
argument("pitch", floatArg())
|
||||
.executes(instance::pitch)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public int play (CommandContext<CommandSource> context) {
|
||||
final SongPlayer songPlayer = context.getSource().client().songPlayer();
|
||||
final CommandSource source = context.getSource();
|
||||
|
||||
final SongPlayer songPlayer = source.client().songPlayer();
|
||||
|
||||
final Path path = getPath(context, "location");
|
||||
|
||||
|
@ -95,25 +106,27 @@ public class MusicCommand {
|
|||
|
||||
public int stop (CommandContext<CommandSource> context) throws CommandSyntaxException {
|
||||
final CommandSource source = context.getSource();
|
||||
final SongPlayer songPlayer = source.client().songPlayer();
|
||||
final ChipmunkBot client = source.client();
|
||||
final SongPlayer songPlayer = client.songPlayer();
|
||||
|
||||
if (songPlayer.currentSong() == null) throw NO_SONG_IS_CURRENTLY_PLAYING.create();
|
||||
|
||||
songPlayer.stopPlaying();
|
||||
songPlayer.songQueue().clear();
|
||||
source.sendOutput(Component.translatable("Stopped music playback", NamedTextColor.GREEN));
|
||||
source.sendOutput(Component.translatable("Stopped music playback", TextColor.fromHexString(client.config().color().primary())));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int skip (CommandContext<CommandSource> context) throws CommandSyntaxException {
|
||||
final CommandSource source = context.getSource();
|
||||
final SongPlayer songPlayer = source.client().songPlayer();
|
||||
final ChipmunkBot client = source.client();
|
||||
final SongPlayer songPlayer = client.songPlayer();
|
||||
|
||||
if (songPlayer.currentSong() == null) throw NO_SONG_IS_CURRENTLY_PLAYING.create();
|
||||
|
||||
songPlayer.stopPlaying();
|
||||
source.sendOutput(Component.translatable("Skipped the current song", NamedTextColor.GREEN));
|
||||
source.sendOutput(Component.translatable("Skipped the current song", TextColor.fromHexString(client.config().color().primary())));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -158,7 +171,7 @@ public class MusicCommand {
|
|||
final File file = new File(directory, filename);
|
||||
if (!file.isDirectory()) continue;
|
||||
|
||||
final NamedTextColor color = (i++ & 1) == 0 ? NamedTextColor.DARK_GREEN : NamedTextColor.GREEN;
|
||||
final TextColor color = (i++ & 1) == 0 ? TextColor.fromHexString(client.config().color().secondary()) : TextColor.fromHexString(client.config().color().primary());
|
||||
|
||||
final Path relativeFilepath = Path.of(relativePath, filename);
|
||||
final String escapedPath = escapePath(relativeFilepath.toString());
|
||||
|
@ -174,7 +187,7 @@ public class MusicCommand {
|
|||
final File file = new File(directory, filename);
|
||||
if (file.isDirectory()) continue;
|
||||
|
||||
final NamedTextColor color = (i++ & 1) == 0 ? NamedTextColor.DARK_GREEN : NamedTextColor.GREEN;
|
||||
final TextColor color = (i++ & 1) == 0 ? TextColor.fromHexString(client.config().color().secondary()) : TextColor.fromHexString(client.config().color().primary());
|
||||
|
||||
final Path relativeFilepath = Path.of(relativePath, filename);
|
||||
final String escapedPath = escapePath(relativeFilepath.toString());
|
||||
|
@ -189,7 +202,7 @@ public class MusicCommand {
|
|||
final ArrayList<Component> mergedList = new ArrayList<>();
|
||||
for (Component component : directories) mergedList.add(component);
|
||||
for (Component component : files) mergedList.add(component);
|
||||
final Component component = Component.translatable("Songs - %s", Component.join(JoinConfiguration.separator(Component.space()), mergedList)).color(NamedTextColor.GREEN);
|
||||
final Component component = Component.translatable("Songs - %s", Component.join(JoinConfiguration.separator(Component.space()), mergedList)).color(TextColor.fromHexString(client.config().color().primary()));
|
||||
source.sendOutput(component, false);
|
||||
|
||||
return 1;
|
||||
|
@ -255,4 +268,22 @@ public class MusicCommand {
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int pitch (CommandContext<CommandSource> context) {
|
||||
final CommandSource source = context.getSource();
|
||||
final SongPlayer songPlayer = source.client().songPlayer();
|
||||
|
||||
final float pitch = getFloat(context, "pitch");
|
||||
|
||||
songPlayer.pitch(pitch);
|
||||
|
||||
source.sendOutput(
|
||||
Component.translatable(
|
||||
"Set the pitch to: %s",
|
||||
Component.text(String.valueOf(pitch))
|
||||
).color(TextColor.fromHexString(source.client().config().color().primary()))
|
||||
);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,11 +9,12 @@ import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
|||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import com.github.steveice10.mc.protocol.data.ProtocolState;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.protocol.MinecraftProtocol;
|
||||
import org.geysermc.mcprotocollib.protocol.data.ProtocolState;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
|
||||
public class NetMsgCommand {
|
||||
public static void register (CommandDispatcher dispatcher) {
|
||||
|
@ -21,10 +22,10 @@ public class NetMsgCommand {
|
|||
|
||||
dispatcher.register(
|
||||
literal("netmsg")
|
||||
.then(
|
||||
argument("message", greedyString())
|
||||
.executes(instance::netmsg)
|
||||
)
|
||||
.then(
|
||||
argument("message", greedyString())
|
||||
.executes(instance::netmsg)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -36,7 +37,7 @@ public class NetMsgCommand {
|
|||
final Component message = Component.translatable(
|
||||
"[%s] %s \u203a %s",
|
||||
Component.text(client.session().getHost() + ":" + client.session().getPort(), NamedTextColor.GRAY),
|
||||
Component.empty().color(NamedTextColor.DARK_GREEN).append(source.displayName()),
|
||||
Component.empty().color(TextColor.fromHexString(client.config().color().secondary())).append(source.displayName()),
|
||||
Component.text(input, NamedTextColor.GRAY)
|
||||
).color(NamedTextColor.DARK_GRAY);
|
||||
|
||||
|
@ -45,7 +46,7 @@ public class NetMsgCommand {
|
|||
|
||||
final Session session = remote.session();
|
||||
final MinecraftProtocol protocol = (MinecraftProtocol) session.getPacketProtocol();
|
||||
if (!session.isConnected() || protocol.getState() != ProtocolState.GAME) continue;
|
||||
if (!session.isConnected() || protocol.getOutboundState() != ProtocolState.GAME) continue;
|
||||
|
||||
((ChipmunkBot) remote).chat().tellraw(message);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ public class ReconnectCommand {
|
|||
|
||||
dispatcher.register(
|
||||
literal("reconnect")
|
||||
.executes(instance::reconnect)
|
||||
.executes(instance::reconnect)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,8 +10,8 @@ import com.mojang.brigadier.CommandDispatcher;
|
|||
import com.mojang.brigadier.context.CommandContext;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class RunCommand {
|
||||
|
@ -20,10 +20,10 @@ public class RunCommand {
|
|||
|
||||
dispatcher.register(
|
||||
literal("run")
|
||||
.then(
|
||||
argument("command", greedyString())
|
||||
.executes(instance::run)
|
||||
)
|
||||
.then(
|
||||
argument("command", greedyString())
|
||||
.executes(instance::run)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -31,11 +31,11 @@ public class RunCommand {
|
|||
final CommandSource source = context.getSource();
|
||||
final ChipmunkBot client = source.client();
|
||||
|
||||
final CompletableFuture<CompoundTag> future = client.core().runTracked(getString(context, "command"));
|
||||
final CompletableFuture<NbtMap> future = client.core().runTracked(getString(context, "command"));
|
||||
|
||||
future.thenApply(tag -> {
|
||||
if (!tag.contains("LastOutput") || !(tag.get("LastOutput") instanceof StringTag)) return tag;
|
||||
final String outputJson = ((StringTag) tag.get("LastOutput")).getValue();
|
||||
if (!tag.containsKey("LastOutput") || !(tag.get("LastOutput") instanceof String)) return tag;
|
||||
final String outputJson = tag.getString("LastOutput");
|
||||
|
||||
try {
|
||||
final Component output = GsonComponentSerializer.gson().deserialize(outputJson);
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package land.chipmunk.chipmunkbot.commands;
|
||||
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.command.CommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.ComponentMessage;
|
||||
import net.kyori.adventure.text.Component;
|
||||
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.argument;
|
||||
import static land.chipmunk.chipmunkbot.plugins.CommandManager.literal;
|
||||
|
||||
public class SayCommand {
|
||||
public static void register (CommandDispatcher dispatcher) {
|
||||
final SayCommand instance = new SayCommand();
|
||||
|
||||
dispatcher.register(
|
||||
literal("say")
|
||||
.then(
|
||||
argument("message", greedyString())
|
||||
.executes(instance::say)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public int say (CommandContext<CommandSource> context) {
|
||||
final CommandSource source = context.getSource();
|
||||
final String message = getString(context, "message");
|
||||
|
||||
final ChipmunkBot client = source.client();
|
||||
|
||||
if (message.startsWith("/")) client.chat().command(message.substring(1));
|
||||
else client.chat().message(message);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ public class TestCommand {
|
|||
|
||||
dispatcher.register(
|
||||
literal("test")
|
||||
.executes(instance::helloWorld)
|
||||
.executes(instance::helloWorld)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package land.chipmunk.chipmunkbot.data;
|
||||
|
||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||
import com.github.steveice10.mc.protocol.data.game.PlayerListEntry;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||
import org.geysermc.mcprotocollib.auth.GameProfile;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.PlayerListEntry;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import lombok.Data;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
|
|
@ -5,30 +5,28 @@ import land.chipmunk.chipmunkbot.data.chat.PlayerMessage;
|
|||
import land.chipmunk.chipmunkbot.data.chat.SystemChatParser;
|
||||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
import land.chipmunk.chipmunkbot.util.UUIDUtilities;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerChatPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundDisguisedChatPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.cloudburstmc.nbt.NbtMapBuilder;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponent;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerChatPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundDisguisedChatPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundChatPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import lombok.Getter;
|
||||
import java.util.BitSet;
|
||||
import java.util.Collections;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import java.util.*;
|
||||
import java.time.Instant;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
|
@ -47,15 +45,20 @@ public class ChatPlugin extends SessionAdapter {
|
|||
systemChatParsers = new ArrayList<>();
|
||||
systemChatParsers.add(new MinecraftChatParser(client));
|
||||
systemChatParsers.add(new KaboomChatParser(client));
|
||||
systemChatParsers.add(new U203aChatParser(client));
|
||||
}
|
||||
|
||||
public void message (String message) {
|
||||
if (message.length() > 256) return;
|
||||
|
||||
final ServerboundChatPacket packet = new ServerboundChatPacket(message, Instant.now().toEpochMilli(), 0, null, 0, new BitSet());
|
||||
client.session().send(packet);
|
||||
}
|
||||
|
||||
public void command (String command) {
|
||||
final ServerboundChatCommandPacket packet = new ServerboundChatCommandPacket(command, Instant.now().toEpochMilli(), 0, Collections.emptyList(), 0, new BitSet());
|
||||
if (command.length() > 256) return;
|
||||
|
||||
final ServerboundChatCommandPacket packet = new ServerboundChatCommandPacket(command);
|
||||
client.session().send(packet);
|
||||
}
|
||||
|
||||
|
@ -144,12 +147,19 @@ public class ChatPlugin extends SessionAdapter {
|
|||
|
||||
if (tagString.getBytes(StandardCharsets.UTF_8).length > 65535) return;
|
||||
|
||||
CompoundTag itemTag = new CompoundTag("");
|
||||
itemTag.put(new StringTag("m", tagString));
|
||||
final NbtMapBuilder blockEntityTagBuilder = NbtMap.builder();
|
||||
|
||||
final NbtMap itemTag = blockEntityTagBuilder.putString("m", tagString).build();
|
||||
|
||||
final Map<DataComponentType<?>, DataComponent<?, ?>> map = new HashMap<>();
|
||||
|
||||
map.put(DataComponentType.BLOCK_ENTITY_DATA, DataComponentType.BLOCK_ENTITY_DATA.getDataComponentFactory().create(DataComponentType.BLOCK_ENTITY_DATA, itemTag));
|
||||
|
||||
final DataComponents dataComponents = new DataComponents(map);
|
||||
|
||||
final Session session = client.session();
|
||||
|
||||
session.send(new ServerboundSetCreativeModeSlotPacket(26, new ItemStack(1 /* stone */, 1, itemTag)));
|
||||
session.send(new ServerboundSetCreativeModeSlotPacket((short) 26, new ItemStack(1 /* stone */, 1, dataComponents)));
|
||||
client.core().run("minecraft:tellraw " + targets + " {\"nbt\":\"Inventory[0].tag.m\",\"entity\":\"" + client.profile().getIdAsString() + "\",\"interpret\":" + interpret + "}"); // TODO: Use GSON instead of concatenating strings, and hardcode less of this (it shouldn't matter here but yes)
|
||||
|
||||
return;
|
||||
|
|
|
@ -1,36 +1,33 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.Options;
|
||||
import land.chipmunk.chipmunkbot.plugins.PositionManager;
|
||||
import land.chipmunk.chipmunkbot.Configuration;
|
||||
import land.chipmunk.chipmunkbot.data.BlockArea;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundUseItemOnPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCommandBlockPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundBlockEntityTagQuery;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.object.Direction;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction;
|
||||
import com.github.steveice10.mc.protocol.data.game.level.block.CommandBlockMode;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.ByteTag;
|
||||
import com.google.gson.JsonObject;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.cloudburstmc.nbt.NbtMapBuilder;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponent;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundUseItemOnPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundSetCommandBlockPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerAction;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.block.CommandBlockMode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class CommandCore extends SessionAdapter {
|
||||
|
@ -45,7 +42,7 @@ public class CommandCore extends SessionAdapter {
|
|||
|
||||
@Getter private List<Listener> listeners = new ArrayList<>();
|
||||
|
||||
public CommandCore (ChipmunkBot client, Options options) {
|
||||
public CommandCore (ChipmunkBot client, Configuration.Bot options) {
|
||||
this.client = client;
|
||||
this.enabled = options.core.enabled;
|
||||
client.addListener((SessionListener) this);
|
||||
|
@ -98,11 +95,19 @@ public class CommandCore extends SessionAdapter {
|
|||
relEnd.getZ() + origin.getZ()
|
||||
);
|
||||
|
||||
CompoundTag itemTag = new CompoundTag("");
|
||||
CompoundTag blockEntityTag = new CompoundTag("BlockEntityTag");
|
||||
blockEntityTag.put(new StringTag("Command", command));
|
||||
blockEntityTag.put(new ByteTag("auto", (byte) 1));
|
||||
itemTag.put(blockEntityTag);
|
||||
final NbtMapBuilder blockEntityTagBuilder = NbtMap.builder();
|
||||
|
||||
blockEntityTagBuilder.putString("id", "minecraft:command_block");
|
||||
blockEntityTagBuilder.putString("Command", command);
|
||||
blockEntityTagBuilder.putByte("auto", (byte) 1);
|
||||
|
||||
final NbtMap blockEntityTag = blockEntityTagBuilder.build();
|
||||
|
||||
final Map<DataComponentType<?>, DataComponent<?, ?>> map = new HashMap<>();
|
||||
|
||||
map.put(DataComponentType.BLOCK_ENTITY_DATA, DataComponentType.BLOCK_ENTITY_DATA.getDataComponentFactory().create(DataComponentType.BLOCK_ENTITY_DATA, blockEntityTag));
|
||||
|
||||
final DataComponents dataComponents = new DataComponents(map);
|
||||
|
||||
final PositionManager position = client.position();
|
||||
|
||||
|
@ -111,7 +116,7 @@ public class CommandCore extends SessionAdapter {
|
|||
// client.chat().command(command);
|
||||
|
||||
final Session session = client.session();
|
||||
session.send(new ServerboundSetCreativeModeSlotPacket(45, new ItemStack(373 /* command_block */, 1, itemTag)));
|
||||
session.send(new ServerboundSetCreativeModeSlotPacket((short) 45, new ItemStack(395 /* command_block */, 1, dataComponents)));
|
||||
session.send(new ServerboundPlayerActionPacket(PlayerAction.START_DIGGING, temporaryBlockPosition, Direction.NORTH, 0));
|
||||
session.send(new ServerboundUseItemOnPacket(temporaryBlockPosition, Direction.NORTH, Hand.OFF_HAND, 0.5f, 0.5f, 0.5f, false, 0));
|
||||
}
|
||||
|
@ -172,13 +177,13 @@ public class CommandCore extends SessionAdapter {
|
|||
incrementCurrentBlock();
|
||||
}
|
||||
|
||||
public CompletableFuture<CompoundTag> runTracked (String command) {
|
||||
if (command.length() > maxCommandLength()) return emptyCompoundTagFuture();
|
||||
public CompletableFuture<NbtMap> runTracked (String command) {
|
||||
if (command.length() > maxCommandLength()) return emptyNbtMapFuture();
|
||||
|
||||
if (!enabled) {
|
||||
client.chat().command(command); // fall back to chat
|
||||
|
||||
return emptyCompoundTagFuture();
|
||||
return emptyNbtMapFuture();
|
||||
}
|
||||
|
||||
final Session session = client.session();
|
||||
|
@ -190,7 +195,7 @@ public class CommandCore extends SessionAdapter {
|
|||
|
||||
incrementCurrentBlock();
|
||||
|
||||
CompletableFuture<CompoundTag> future = new CompletableFuture<CompoundTag>();
|
||||
CompletableFuture<NbtMap> future = new CompletableFuture<NbtMap>();
|
||||
|
||||
final Timer timer = new Timer();
|
||||
final TimerTask queryTask = new TimerTask() {
|
||||
|
@ -207,9 +212,9 @@ public class CommandCore extends SessionAdapter {
|
|||
return future;
|
||||
}
|
||||
|
||||
private CompletableFuture<CompoundTag> emptyCompoundTagFuture () {
|
||||
CompletableFuture<CompoundTag> future = new CompletableFuture<CompoundTag>();
|
||||
future.complete(new CompoundTag(""));
|
||||
private CompletableFuture<NbtMap> emptyNbtMapFuture () {
|
||||
CompletableFuture<NbtMap> future = new CompletableFuture<NbtMap>();
|
||||
future.complete(NbtMap.EMPTY);
|
||||
return future;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.command.CommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.ComponentMessage;
|
||||
import land.chipmunk.chipmunkbot.command.BuiltInExceptions;
|
||||
import land.chipmunk.chipmunkbot.commands.*;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
|
@ -40,6 +43,7 @@ public class CommandManager {
|
|||
NetMsgCommand.register(dispatcher);
|
||||
MusicCommand.register(dispatcher);
|
||||
LogQueryCommand.register(dispatcher);
|
||||
SayCommand.register(dispatcher);
|
||||
}
|
||||
|
||||
public static void sendException (CommandSource source, CommandSyntaxException exception) {
|
||||
|
|
|
@ -21,6 +21,16 @@ public class CommandSpyPlugin extends ChatPlugin.Listener {
|
|||
|
||||
private static final Component COMMANDSPY_ENABLED_COMPONENT = Component.text("Successfully enabled CommandSpy");
|
||||
private static final Component COMMANDSPY_DISABLED_COMPONENT = Component.text("Successfully disabled CommandSpy");
|
||||
private static final Component COMMANDSPY_ENABLED_COMPONENT_CHIPMUNK = Component
|
||||
.empty()
|
||||
.append(Component.text("Successfully "))
|
||||
.append(Component.text("enabled"))
|
||||
.append(Component.text(" CommandSpy"));
|
||||
private static final Component COMMANDSPY_DISABLED_COMPONENT_CHIPMUNK = Component
|
||||
.empty()
|
||||
.append(Component.text("Successfully "))
|
||||
.append(Component.text("disabled"))
|
||||
.append(Component.text(" CommandSpy"));
|
||||
private static final Component COMMAND_SEPARATOR_COMPONENT = Component.text(": ");
|
||||
private static final Component SIGN_CREATED_TEXT_COMPONENT = Component.text(" created a sign with contents:");
|
||||
private static final Component SIGN_LINE_SEPARATOR_COMPONENT = Component.text("\n ");
|
||||
|
@ -34,8 +44,8 @@ public class CommandSpyPlugin extends ChatPlugin.Listener {
|
|||
public void systemMessageReceived (Component component, boolean overlay) {
|
||||
if (overlay || !(component instanceof final TextComponent t_component)) return;
|
||||
|
||||
if (component.equals(COMMANDSPY_ENABLED_COMPONENT)) { this.enabled = true; return; }
|
||||
if (component.equals(COMMANDSPY_DISABLED_COMPONENT)) { this.enabled = false; return; }
|
||||
if (component.equals(COMMANDSPY_ENABLED_COMPONENT) || component.equals(COMMANDSPY_ENABLED_COMPONENT_CHIPMUNK)) { this.enabled = true; return; }
|
||||
if (component.equals(COMMANDSPY_DISABLED_COMPONENT) || component.equals(COMMANDSPY_DISABLED_COMPONENT_CHIPMUNK)) { this.enabled = false; return; }
|
||||
|
||||
final boolean enabled = component.style().equals(ENABLED_STYLE);
|
||||
if (!enabled && !component.style().equals(DISABLED_STYLE)) return;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.Options;
|
||||
import land.chipmunk.chipmunkbot.Configuration;
|
||||
import land.chipmunk.chipmunkbot.command.CommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.PlayerCommandSource;
|
||||
import land.chipmunk.chipmunkbot.command.ComponentMessage;
|
||||
|
@ -23,7 +23,7 @@ public class PlayerCommandHandler {
|
|||
@Getter @Setter private String prefix;
|
||||
@Getter @Setter private String cspyPrefix;
|
||||
|
||||
public PlayerCommandHandler (ChipmunkBot client, Options options) {
|
||||
public PlayerCommandHandler (ChipmunkBot client, Configuration.Bot options) {
|
||||
this.client = client;
|
||||
this.prefix = options.commands.prefix;
|
||||
this.cspyPrefix = options.commands.cspyPrefix != null ? options.commands.cspyPrefix : this.prefix;
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoUpdatePacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoRemovePacket;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.mc.protocol.data.game.PlayerListEntry;
|
||||
import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerInfoUpdatePacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerInfoRemovePacket;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.PlayerListEntry;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.PlayerListEntryAction;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
|
||||
|
@ -81,7 +81,7 @@ public class PlayerListPlugin extends SessionAdapter {
|
|||
}
|
||||
|
||||
private final MutablePlayerListEntry getEntry (PlayerListEntry other) {
|
||||
return getEntry(other.getProfile().getId());
|
||||
return getEntry(other.getProfileId());
|
||||
}
|
||||
|
||||
private void addPlayer (PlayerListEntry newEntry) {
|
||||
|
|
|
@ -2,12 +2,12 @@ package land.chipmunk.chipmunkbot.plugins;
|
|||
|
||||
import land.chipmunk.chipmunkbot.Client;
|
||||
import org.cloudburstmc.math.vector.Vector3d;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket;
|
||||
import org.cloudburstmc.math.vector.Vector3d;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import lombok.Getter;
|
||||
|
|
|
@ -2,14 +2,14 @@ package land.chipmunk.chipmunkbot.plugins;
|
|||
|
||||
import land.chipmunk.chipmunkbot.Client;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundBlockEntityTagQuery;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundEntityTagQuery;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundTagQueryPacket;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundBlockEntityTagQueryPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundEntityTagQuery;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundTagQueryPacket;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
@ -17,29 +17,29 @@ import java.util.HashMap;
|
|||
public class QueryPlugin extends SessionAdapter {
|
||||
private Client client;
|
||||
private int nextTransactionId = 0;
|
||||
private Map<Integer, CompletableFuture<CompoundTag>> transactions = new HashMap<>();
|
||||
private Map<Integer, CompletableFuture<NbtMap>> transactions = new HashMap<>();
|
||||
|
||||
public QueryPlugin (Client client) {
|
||||
this.client = client;
|
||||
client.addListener((SessionListener) this);
|
||||
}
|
||||
|
||||
public CompletableFuture<CompoundTag> block (Vector3i position) {
|
||||
public CompletableFuture<NbtMap> block (Vector3i position) {
|
||||
final int transactionId = nextTransactionId++;
|
||||
if (nextTransactionId > Integer.MAX_VALUE) nextTransactionId = 0; // ? Can and should I use negative numbers too?
|
||||
client.session().send(new ServerboundBlockEntityTagQuery(transactionId, position));
|
||||
client.session().send(new ServerboundBlockEntityTagQueryPacket(transactionId, position));
|
||||
|
||||
final CompletableFuture<CompoundTag> future = new CompletableFuture<CompoundTag>();
|
||||
final CompletableFuture<NbtMap> future = new CompletableFuture<NbtMap>();
|
||||
transactions.put(transactionId, future);
|
||||
return future;
|
||||
}
|
||||
|
||||
public CompletableFuture<CompoundTag> entity (int entityId) {
|
||||
public CompletableFuture<NbtMap> entity (int entityId) {
|
||||
final int transactionId = nextTransactionId++;
|
||||
if (nextTransactionId > Integer.MAX_VALUE) nextTransactionId = 0; // ? Can and should I use negative numbers too?
|
||||
client.session().send(new ServerboundEntityTagQuery(transactionId, entityId));
|
||||
|
||||
final CompletableFuture<CompoundTag> future = new CompletableFuture<CompoundTag>();
|
||||
final CompletableFuture<NbtMap> future = new CompletableFuture<NbtMap>();
|
||||
transactions.put(transactionId, future);
|
||||
return future;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ public class QueryPlugin extends SessionAdapter {
|
|||
}
|
||||
|
||||
public void packetReceived (Session session, ClientboundTagQueryPacket packet) {
|
||||
final CompletableFuture<CompoundTag> future = transactions.get(packet.getTransactionId());
|
||||
final CompletableFuture<NbtMap> future = transactions.get(packet.getTransactionId());
|
||||
if (future == null) return;
|
||||
future.complete(packet.getNbt());
|
||||
transactions.remove(future);
|
||||
|
|
|
@ -1,46 +1,68 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.packet.PacketProtocol;
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||
import com.github.steveice10.mc.protocol.data.ProtocolState;
|
||||
import com.github.steveice10.mc.protocol.data.game.level.notify.GameEvent;
|
||||
import com.github.steveice10.mc.protocol.data.game.level.notify.GameEventValue;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.EntityEvent;
|
||||
import com.github.steveice10.mc.protocol.data.game.ClientCommand;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundGameEventPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.ClientboundEntityEventPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.packet.PacketProtocol;
|
||||
import org.geysermc.mcprotocollib.protocol.MinecraftProtocol;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
||||
import org.geysermc.mcprotocollib.protocol.data.ProtocolState;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.notify.GameEvent;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.level.notify.GameEventValue;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.EntityEvent;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.ClientCommand;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundGameEventPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.entity.ClientboundEntityEventPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket;
|
||||
import land.chipmunk.chipmunkbot.Configuration;
|
||||
import land.chipmunk.chipmunkbot.util.ComponentUtilities;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class SelfCarePlugin extends SessionAdapter {
|
||||
private final ChipmunkBot client;
|
||||
private final Configuration.Bot options;
|
||||
|
||||
@Getter @Setter private GameMode gamemode;
|
||||
@Getter @Setter private int permissionLevel;
|
||||
|
||||
private boolean prefix = false;
|
||||
|
||||
private Timer timer;
|
||||
private int entityId; // TODO: Move entity id handling somewhere else
|
||||
|
||||
public SelfCarePlugin (ChipmunkBot client) {
|
||||
public SelfCarePlugin (ChipmunkBot client, Configuration.Bot options) {
|
||||
this.client = client;
|
||||
this.options = options;
|
||||
client.addListener((SessionListener) this);
|
||||
|
||||
client.chat().addListener(new ChatPlugin.Listener() {
|
||||
@Override
|
||||
public void systemMessageReceived(Component component, boolean overlay) {
|
||||
// mabe parse using components? too lazy
|
||||
final String stringifiedMessage = ComponentUtilities.stringify(component);
|
||||
|
||||
if (stringifiedMessage.equals("You now have the tag: " + options.selfCares.prefix.prefix)) prefix = true;
|
||||
else if (stringifiedMessage.equals("You no longer have a tag")) prefix = false;
|
||||
else if (stringifiedMessage.startsWith("You now have the tag: ")) prefix = false;
|
||||
}
|
||||
});
|
||||
|
||||
final TimerTask task = new TimerTask() {
|
||||
@Override
|
||||
public void run () {
|
||||
final Session session = client.session();
|
||||
final PacketProtocol protocol = session.getPacketProtocol();
|
||||
if (!session.isConnected() || (protocol instanceof MinecraftProtocol && ((MinecraftProtocol) protocol).getState() != ProtocolState.GAME)) return;
|
||||
if (!session.isConnected() || (protocol instanceof MinecraftProtocol && ((MinecraftProtocol) protocol).getOutboundState() != ProtocolState.GAME)) return;
|
||||
|
||||
// TODO: Maybe make it possible for other stuff to listen for ticks
|
||||
tick();
|
||||
|
@ -48,19 +70,19 @@ public class SelfCarePlugin extends SessionAdapter {
|
|||
};
|
||||
|
||||
timer = new Timer();
|
||||
timer.schedule(task, 75, 75);
|
||||
timer.schedule(task, 125, 125);
|
||||
}
|
||||
|
||||
public void tick () {
|
||||
if (permissionLevel < 2) client.chat().command("minecraft:op @s[type=player]");
|
||||
else if (gamemode != GameMode.CREATIVE) client.chat().command("minecraft:gamemode creative");
|
||||
else if (!client.commandSpy().enabled()) client.chat().command("c on");
|
||||
else if (!client.commandSpy().enabled() && options.selfCares.cspy) client.chat().command("c on");
|
||||
else if (!prefix && options.selfCares.prefix.enabled) client.chat().command("prefix " + options.selfCares.prefix.prefix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void packetReceived (Session session, Packet packet) {
|
||||
if (packet instanceof ClientboundGameEventPacket) packetReceived(session, (ClientboundGameEventPacket) packet);
|
||||
else if (packet instanceof ClientboundGameEventPacket) packetReceived(session, (ClientboundGameEventPacket) packet);
|
||||
else if (packet instanceof ClientboundEntityEventPacket) packetReceived(session, (ClientboundEntityEventPacket) packet);
|
||||
else if (packet instanceof ClientboundLoginPacket) packetReceived(session, (ClientboundLoginPacket) packet);
|
||||
}
|
||||
|
@ -75,7 +97,7 @@ public class SelfCarePlugin extends SessionAdapter {
|
|||
|
||||
public void packetReceived (Session session, ClientboundLoginPacket packet) {
|
||||
entityId = packet.getEntityId(); // TODO: Move entity id handling somewhere else
|
||||
gamemode = packet.getGameMode();
|
||||
gamemode = packet.getCommonPlayerSpawnInfo().getGameMode();
|
||||
}
|
||||
|
||||
public void packetReceived (Session session, ClientboundEntityEventPacket packet) {
|
||||
|
|
|
@ -2,13 +2,15 @@ package land.chipmunk.chipmunkbot.plugins;
|
|||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.song.*;
|
||||
// import com.github.steveice10.packetlib.packet.Packet;
|
||||
// import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
|
||||
// import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
// import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent;
|
||||
import land.chipmunk.chipmunkbot.util.MathUtilities;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
@ -33,6 +35,8 @@ public class SongPlayer extends SessionAdapter {
|
|||
@Getter @Setter private SongLoaderThread loaderThread;
|
||||
private int ticksUntilPausedActionbar = 20;
|
||||
|
||||
@Getter @Setter private float pitch = 0;
|
||||
|
||||
public SongPlayer (ChipmunkBot client) {
|
||||
this.client = client;
|
||||
client.addListener((SessionListener) this);
|
||||
|
@ -54,7 +58,7 @@ public class SongPlayer extends SessionAdapter {
|
|||
|
||||
try {
|
||||
final SongLoaderThread _loaderThread = new SongLoaderThread(location);
|
||||
client.chat().tellraw(Component.translatable("Loading %s", Component.text(location.getFileName().toString(), NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||
client.chat().tellraw(Component.translatable("Loading %s", Component.text(location.getFileName().toString(), TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())));
|
||||
_loaderThread.start();
|
||||
loaderThread = _loaderThread;
|
||||
} catch (SongLoaderException e) {
|
||||
|
@ -71,7 +75,7 @@ public class SongPlayer extends SessionAdapter {
|
|||
|
||||
try {
|
||||
final SongLoaderThread _loaderThread = new SongLoaderThread(location);
|
||||
client.chat().tellraw(Component.translatable("Loading %s", Component.text(location.toString(), NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||
client.chat().tellraw(Component.translatable("Loading %s", Component.text(location.toString(), TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())));
|
||||
_loaderThread.start();
|
||||
loaderThread = _loaderThread;
|
||||
} catch (SongLoaderException e) {
|
||||
|
@ -92,7 +96,7 @@ public class SongPlayer extends SessionAdapter {
|
|||
client.chat().tellraw(Component.translatable("Failed to load song: %s", loaderThread.exception.message()).color(NamedTextColor.RED));
|
||||
} else {
|
||||
songQueue.add(loaderThread.song);
|
||||
client.chat().tellraw(Component.translatable("Added %s to the song queue", Component.empty().append(loaderThread.song.name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||
client.chat().tellraw(Component.translatable("Added %s to the song queue", Component.empty().append(loaderThread.song.name).color(TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())));
|
||||
}
|
||||
loaderThread = null;
|
||||
}
|
||||
|
@ -101,7 +105,7 @@ public class SongPlayer extends SessionAdapter {
|
|||
if (songQueue.size() == 0) return;
|
||||
|
||||
currentSong = songQueue.poll();
|
||||
client.chat().tellraw(Component.translatable("Now playing %s", Component.empty().append(currentSong.name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||
client.chat().tellraw(Component.translatable("Now playing %s", Component.empty().append(currentSong.name).color(TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())));
|
||||
currentSong.play();
|
||||
}
|
||||
|
||||
|
@ -115,35 +119,35 @@ public class SongPlayer extends SessionAdapter {
|
|||
handlePlaying();
|
||||
|
||||
if (currentSong.finished()) {
|
||||
client.chat().tellraw(Component.translatable("Finished playing %s", Component.empty().append(currentSong.name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||
client.chat().tellraw(Component.translatable("Finished playing %s", Component.empty().append(currentSong.name).color(TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())));
|
||||
currentSong = null;
|
||||
}
|
||||
}
|
||||
|
||||
public Component generateActionbar () {
|
||||
Component component = Component.empty()
|
||||
.append(Component.translatable("Now playing %s", Component.empty().append(currentSong.name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN))
|
||||
.append(Component.translatable("Now playing %s", Component.empty().append(currentSong.name).color(TextColor.fromHexString(client.config().color().secondary()))).color(TextColor.fromHexString(client.config().color().primary())))
|
||||
.append(Component.translatable(" | ", NamedTextColor.DARK_GRAY))
|
||||
.append(Component.translatable("%s / %s", formatTime(currentSong.time).color(NamedTextColor.GREEN), formatTime(currentSong.length).color(NamedTextColor.GREEN)).color(NamedTextColor.GRAY))
|
||||
.append(Component.translatable("%s / %s", formatTime(currentSong.time).color(TextColor.fromHexString(client.config().color().primary())), formatTime(currentSong.length).color(TextColor.fromHexString(client.config().color().primary()))).color(NamedTextColor.GRAY))
|
||||
.append(Component.translatable(" | ", NamedTextColor.DARK_GRAY))
|
||||
.append(Component.translatable("%s / %s", Component.text(currentSong.position, NamedTextColor.GREEN), Component.text(currentSong.size(), NamedTextColor.GREEN)).color(NamedTextColor.GRAY));
|
||||
.append(Component.translatable("%s / %s", Component.text(currentSong.position, TextColor.fromHexString(client.config().color().primary())), Component.text(currentSong.size(), TextColor.fromHexString(client.config().color().primary()))).color(NamedTextColor.GRAY));
|
||||
|
||||
if (currentSong.paused) {
|
||||
return component
|
||||
.append(Component.translatable(" | ", NamedTextColor.DARK_GRAY))
|
||||
.append(Component.translatable("Paused", NamedTextColor.DARK_GREEN));
|
||||
.append(Component.translatable("Paused", TextColor.fromHexString(client.config().color().secondary())));
|
||||
}
|
||||
|
||||
if (currentSong.looping) {
|
||||
if (currentSong.loopCount > 0) {
|
||||
return component
|
||||
.append(Component.translatable(" | ", NamedTextColor.DARK_GRAY))
|
||||
.append(Component.translatable("Looping (%s/%s)", Component.text(currentSong.currentLoop), Component.text(currentSong.loopCount)).color(NamedTextColor.DARK_GREEN));
|
||||
.append(Component.translatable("Looping (%s/%s)", Component.text(currentSong.currentLoop), Component.text(currentSong.loopCount)).color(TextColor.fromHexString(client.config().color().secondary())));
|
||||
}
|
||||
|
||||
return component
|
||||
.append(Component.translatable(" | ", NamedTextColor.DARK_GRAY))
|
||||
.append(Component.translatable("Looping", NamedTextColor.DARK_GREEN));
|
||||
.append(Component.translatable("Looping", TextColor.fromHexString(client.config().color().secondary())));
|
||||
}
|
||||
|
||||
return component;
|
||||
|
@ -176,7 +180,7 @@ public class SongPlayer extends SessionAdapter {
|
|||
while (currentSong.reachedNextNote()) {
|
||||
final Note note = currentSong.getNextNote();
|
||||
|
||||
final double floatingPitch = Math.pow(2, (note.pitch - 12) / 12.0);
|
||||
final double floatingPitch = MathUtilities.clamp(0.5 * (Math.pow(2, ((note.pitch + (pitch / 10)) / 12))), 0, 2);
|
||||
|
||||
client.core().run("execute as " + SELECTOR + " at @s run playsound " + note.instrument.sound + " record @s ~ ~ ~ " + note.volume + " " + floatingPitch);
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@ package land.chipmunk.chipmunkbot.plugins;
|
|||
|
||||
import land.chipmunk.chipmunkbot.Client;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import com.github.steveice10.packetlib.packet.Packet;
|
||||
import com.github.steveice10.packetlib.Session;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCommandSuggestionPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCommandSuggestionsPacket;
|
||||
import org.geysermc.mcprotocollib.network.packet.Packet;
|
||||
import org.geysermc.mcprotocollib.network.Session;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundCommandSuggestionPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundCommandSuggestionsPacket;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package land.chipmunk.chipmunkbot.plugins;
|
||||
|
||||
import land.chipmunk.chipmunkbot.Client;
|
||||
import com.github.steveice10.packetlib.event.session.SessionListener;
|
||||
import com.github.steveice10.packetlib.event.session.SessionAdapter;
|
||||
import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
|
||||
import com.github.steveice10.mc.protocol.MinecraftProtocol;
|
||||
import com.github.steveice10.mc.protocol.data.ProtocolState;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionListener;
|
||||
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
|
||||
import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent;
|
||||
import org.geysermc.mcprotocollib.protocol.MinecraftProtocol;
|
||||
import org.geysermc.mcprotocollib.protocol.data.ProtocolState;
|
||||
import lombok.Getter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -26,7 +26,7 @@ public class TickLoop extends SessionAdapter {
|
|||
public void run () {
|
||||
for (Listener listener : listeners) {
|
||||
listener.onTick(tick);
|
||||
if (((MinecraftProtocol) client.session().getPacketProtocol()).getState() == ProtocolState.GAME) listener.onGameTick(tick);
|
||||
if (((MinecraftProtocol) client.session().getPacketProtocol()).getOutboundState() == ProtocolState.GAME) listener.onGameTick(tick);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -167,9 +167,9 @@ public class NBSConverter {
|
|||
key += customInstrument.pitch;
|
||||
}
|
||||
|
||||
if (key < 33 || key > 57) {
|
||||
/* if (key < 33 || key > 57) {
|
||||
continue;
|
||||
}
|
||||
} */
|
||||
|
||||
byte layerVolume = 100;
|
||||
if (nbsLayers.size() > note.layer) {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package land.chipmunk.chipmunkbot.systemChat;
|
||||
|
||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
import land.chipmunk.chipmunkbot.data.chat.PlayerMessage;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package land.chipmunk.chipmunkbot.systemChat;
|
||||
|
||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||
import org.geysermc.mcprotocollib.auth.GameProfile;
|
||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
import land.chipmunk.chipmunkbot.data.chat.PlayerMessage;
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
package land.chipmunk.chipmunkbot.systemChat;
|
||||
|
||||
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||
import land.chipmunk.chipmunkbot.data.MutablePlayerListEntry;
|
||||
import land.chipmunk.chipmunkbot.data.chat.PlayerMessage;
|
||||
import land.chipmunk.chipmunkbot.data.chat.SystemChatParser;
|
||||
import land.chipmunk.chipmunkbot.util.ComponentUtilities;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TranslatableComponent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
// ported from chomens sex bot
|
||||
public class U203aChatParser implements SystemChatParser {
|
||||
private final ChipmunkBot client;
|
||||
|
||||
public U203aChatParser(ChipmunkBot client) {
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PlayerMessage parse (Component message) {
|
||||
if (message instanceof TranslatableComponent) return parse((TranslatableComponent) message);
|
||||
return null;
|
||||
}
|
||||
|
||||
// very similar to MinecraftChatParser
|
||||
public PlayerMessage parse (TranslatableComponent message) {
|
||||
final List<Component> args = message.args();
|
||||
if (args.size() < 3 || (!message.key().equals("[%s] %s › %s") && !message.key().equals("%s %s › %s"))) return null;
|
||||
|
||||
final Component senderComponent = args.get(1);
|
||||
final Component contents = args.get(2);
|
||||
|
||||
MutablePlayerListEntry sender;
|
||||
final HoverEvent<?> hoverEvent = senderComponent.hoverEvent();
|
||||
if (hoverEvent != null && hoverEvent.action().equals(HoverEvent.Action.SHOW_ENTITY)) {
|
||||
HoverEvent.ShowEntity entityInfo = (HoverEvent.ShowEntity) hoverEvent.value();
|
||||
final UUID senderUUID = entityInfo.id();
|
||||
sender = client.playerList().getEntry(senderUUID);
|
||||
} else {
|
||||
final String stringUsername = ComponentUtilities.stringify(senderComponent);
|
||||
sender = client.playerList().getEntry(stringUsername);
|
||||
}
|
||||
|
||||
if (sender == null) return null;
|
||||
|
||||
return new PlayerMessage(sender, contents, "minecraft:chat", senderComponent);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package land.chipmunk.chipmunkbot.util;
|
||||
|
||||
public class MathUtilities {
|
||||
public static double clamp (double value, double min, double max) {
|
||||
return Math.max(Math.min(value, max), min);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
package land.chipmunk.chipmunkbot.util;
|
||||
|
||||
import com.github.steveice10.opennbt.tag.builtin.IntArrayTag;
|
||||
import java.util.UUID;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
|
@ -19,9 +18,9 @@ public class UUIDUtilities {
|
|||
return intArray;
|
||||
}
|
||||
|
||||
public static IntArrayTag tag (UUID uuid) {
|
||||
return new IntArrayTag("", intArray(uuid));
|
||||
}
|
||||
// public static IntArrayTag tag (UUID uuid) {
|
||||
// return new IntArrayTag("", intArray(uuid));
|
||||
// }
|
||||
|
||||
public static String snbt (UUID uuid) {
|
||||
int[] array = intArray(uuid);
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"color": {
|
||||
"primary": "#ffc0cb",
|
||||
"secondary": "#c95367"
|
||||
},
|
||||
"bots": [
|
||||
{
|
||||
"host": "localhost",
|
||||
|
@ -11,6 +15,14 @@
|
|||
"cspyPrefix": "default."
|
||||
},
|
||||
|
||||
"selfCares": {
|
||||
"cspy": true,
|
||||
"prefix": {
|
||||
"enabled": true,
|
||||
"prefix": "&x&c&9&5&3&6&7[&x&f&f&c&0&c&bPrefix: s'&x&c&9&5&3&6&7]"
|
||||
}
|
||||
},
|
||||
|
||||
"core": {
|
||||
"enabled": true
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue