Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 59 additions & 27 deletions src/autoclef/java/adris/altoclef/AltoClefController.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
import adris.altoclef.player2api.EventQueueManager;
import adris.altoclef.player2api.AIPersistantData;
import adris.altoclef.player2api.Player2APIService;

import adris.altoclef.player2api.pseudocommands.PseudoCommandExecutor;
import adris.altoclef.player2api.pseudocommands.PseudoCommands.PseudoCommand;
import adris.altoclef.player2api.Character;
import adris.altoclef.tasksystem.Task;
import adris.altoclef.tasksystem.TaskRunner;
Expand Down Expand Up @@ -49,7 +50,6 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;


public class AltoClefController {
private final IBaritone baritone;
private AIPersistantData aiPersistantData;
Expand Down Expand Up @@ -80,6 +80,9 @@ public class AltoClefController {
private Task storedTask;
public boolean isStopping = false;
private Player owner;
private Optional<String> currentPseudoCommandInfoAsString = Optional.empty();
public boolean shouldCancelPseudoCommand = false;
private PseudoCommandExecutor pseudoCommandExecutor;

public AltoClefController(IBaritone baritone, Character character, String player2GameId) {
this.baritone = baritone;
Expand All @@ -96,7 +99,8 @@ public AltoClefController(IBaritone baritone, Character character, String player
new WorldSurvivalChain(this.taskRunner);
this.foodChain = new FoodChain(this.taskRunner);
new PlayerDefenseChain(this.taskRunner);
this.storageTracker = new ItemStorageTracker(this, this.trackerManager, container -> this.containerSubTracker = container);
this.storageTracker = new ItemStorageTracker(this, this.trackerManager,
container -> this.containerSubTracker = container);
this.entityTracker = new EntityTracker(this.trackerManager);
this.blockScanner = new BlockScanner(this);
this.chunkTracker = new SimpleChunkTracker(this);
Expand All @@ -111,26 +115,28 @@ public AltoClefController(IBaritone baritone, Character character, String player
this.botBehaviour = new BotBehaviour(this);
this.initializeCommands();
Settings.load(
newSettings -> {
this.settings = newSettings;
List<Item> baritoneCanPlace = Arrays.stream(this.settings.getThrowawayItems(this, true)).toList();
this.getBaritoneSettings().acceptableThrowawayItems.get().addAll(baritoneCanPlace);
if ((!this.getUserTaskChain().isActive() || this.getUserTaskChain().isRunningIdleTask())
&& this.getModSettings().shouldRunIdleCommandWhenNotActive()) {
this.getUserTaskChain().signalNextTaskToBeIdleTask();
this.getCommandExecutor().executeWithPrefix(this.getModSettings().getIdleCommand());
}

this.getExtraBaritoneSettings().avoidBlockBreak(this.userBlockRangeTracker::isNearUserTrackedBlock);
this.getExtraBaritoneSettings().avoidBlockPlace(this.entityStuckTracker::isBlockedByEntity);
}
);
newSettings -> {
this.settings = newSettings;
List<Item> baritoneCanPlace = Arrays.stream(this.settings.getThrowawayItems(this, true)).toList();
this.getBaritoneSettings().acceptableThrowawayItems.get().addAll(baritoneCanPlace);
if ((!this.getUserTaskChain().isActive() || this.getUserTaskChain().isRunningIdleTask())
&& this.getModSettings().shouldRunIdleCommandWhenNotActive()) {
this.getUserTaskChain().signalNextTaskToBeIdleTask();
this.getCommandExecutor().executeWithPrefix(this.getModSettings().getIdleCommand());
}

this.getExtraBaritoneSettings().avoidBlockBreak(this.userBlockRangeTracker::isNearUserTrackedBlock);
this.getExtraBaritoneSettings().avoidBlockPlace(this.entityStuckTracker::isBlockedByEntity);
});
Playground.IDLE_TEST_INIT_FUNCTION(this);

// AI setup: (should be at end to ensure as many things are not null as possible)
// AI setup: (should be at end to ensure as many things are not null as
// possible)
this.player2apiService = new Player2APIService(player2GameId);
this.pseudoCommandExecutor = new PseudoCommandExecutor(this, player2apiService);

EventQueueManager.getOrCreateEventQueueData(this);
this.aiPersistantData = new AIPersistantData(this, character);
this.player2apiService = new Player2APIService(player2GameId);
}

public void serverTick() {
Expand All @@ -143,6 +149,7 @@ public void serverTick() {
this.inputControls.onTickPost();
this.baritone.serverTick();
}

public static void staticServerTick(MinecraftServer server) {
EventQueueManager.injectOnTick(server);
}
Expand Down Expand Up @@ -195,7 +202,8 @@ public void runUserTask(Task task, Runnable onFinish) {
}

public void runUserTask(Task task) {
this.runUserTask(task, () -> {});
this.runUserTask(task, () -> {
});
}

public void cancelUserTask() {
Expand Down Expand Up @@ -227,7 +235,7 @@ public baritone.api.Settings getBaritoneSettings() {
}

public AltoClefSettings getExtraBaritoneSettings() {
return ((Baritone)this.baritone).getExtraBaritoneSettings();
return ((Baritone) this.baritone).getExtraBaritoneSettings();
}

public TaskRunner getTaskRunner() {
Expand Down Expand Up @@ -362,29 +370,53 @@ public void setOwner(Player owner) {
this.owner = owner;
aiPersistantData.updateSystemPrompt();
}

public boolean isOwner(UUID playerToCheck) {
return playerToCheck.equals(owner.getUUID());
}

public adris.altoclef.player2api.AIPersistantData getAIPersistantData() {
return this.aiPersistantData;
}

public adris.altoclef.player2api.Player2APIService getPlayer2APIService(){
public adris.altoclef.player2api.Player2APIService getPlayer2APIService() {
return this.player2apiService;
}

public String getOwnerUsername(){
if(getOwner() == null){
public String getOwnerUsername() {
if (getOwner() == null) {
return "UNKNOWN OWNER";
}
return getOwner().getName().getString();
}

public Optional<ServerPlayer> getClosestPlayer(){
return this.getWorld().players().stream().sorted((a,b)-> {
public Optional<ServerPlayer> getClosestPlayer() {
return this.getWorld().players().stream().sorted((a, b) -> {
float adist = a.distanceTo(this.getEntity());
float bdist = b.distanceTo(this.getEntity());
return Float.compare(adist, bdist);
} ).findFirst();
}).findFirst();
}

public void setPseudoCommandInfo(Optional<String> ma) {
currentPseudoCommandInfoAsString = ma;
}

public Optional<String> getCurrentlyRunningPseudoCmd() {
return currentPseudoCommandInfoAsString;
}

public PseudoCommandExecutor getPseudoCommandExecutor() {
return this.pseudoCommandExecutor;
}

public void resetStop() {
isStopping = false;
shouldCancelPseudoCommand = false;
}

public void callOnStop() {
isStopping = true;
shouldCancelPseudoCommand = true;
}
}
63 changes: 51 additions & 12 deletions src/autoclef/java/adris/altoclef/player2api/AgentSideEffects.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@

package adris.altoclef.player2api;

import java.util.Optional;
import java.util.function.Consumer;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import adris.altoclef.AltoClefController;
import adris.altoclef.commandsystem.CommandExecutor;
import adris.altoclef.player2api.pseudocommands.PseudoCommandExecutor;
import adris.altoclef.player2api.pseudocommands.PseudoCommands;
import adris.altoclef.player2api.pseudocommands.PseudoCommands.PseudoCommand;
import net.minecraft.network.chat.Component;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;

public class AgentSideEffects {
private static final Logger LOGGER = LogManager.getLogger();


public sealed interface CommandExecutionStopReason
permits CommandExecutionStopReason.Cancelled,
CommandExecutionStopReason.Finished,
Expand All @@ -31,25 +35,28 @@ record Error(String commandName, String errMsg) implements CommandExecutionStopR
}
}

public static void onEntityMessage(MinecraftServer server, Event.CharacterMessage characterMessage) {
public static void onEntityMessage(MinecraftServer server, Event.CharacterMessage characterMessage,
LLMCompleter completer, Player2APIService service) {
// message part:
if (characterMessage.message() != null && !characterMessage.message().isBlank()) {
EventQueueData sendingCharacterData = characterMessage.sendingCharacterData();
String message = String.format("<%s> %s", sendingCharacterData.getName(), characterMessage.message());
for(ServerPlayer player : server.getPlayerList().getPlayers()){
String message = String.format("<%s> %s", sendingCharacterData.getName(), characterMessage.message());
for (ServerPlayer player : server.getPlayerList().getPlayers()) {
// if you are an owner, or close, send to player.
// if(sendingCharacterData.isOwner(player.getUUID()) || isClose(sendingCharacterData, player) ){
broadcastChatToPlayer(server, message, player);
// if(sendingCharacterData.isOwner(player.getUUID()) ||
// isClose(sendingCharacterData, player) ){
broadcastChatToPlayer(server, message, player);
// }
}
TTSManager.TTS(characterMessage.message(), sendingCharacterData.getCharacter(), sendingCharacterData.getPlayer2apiService());
TTSManager.TTS(characterMessage.message(), sendingCharacterData.getCharacter(),
sendingCharacterData.getPlayer2apiService());
EventQueueManager.onAICharacterMessage(characterMessage, characterMessage.sendingCharacterData().getUUID());
}

// command part:
if (characterMessage.command() != null && !characterMessage.command().isBlank()) {
onCommandListGenerated(characterMessage.sendingCharacterData().getMod(), characterMessage.command(),
characterMessage.sendingCharacterData()::onCommandFinish);
characterMessage.sendingCharacterData()::onCommandFinish, completer, service);
}
}

Expand All @@ -58,15 +65,47 @@ public static void onError(MinecraftServer server, String errMsg) {
}

public static void onCommandListGenerated(AltoClefController mod, String command,
Consumer<CommandExecutionStopReason> onStop) {
Consumer<CommandExecutionStopReason> onStop, LLMCompleter completer, Player2APIService service) {
CommandExecutor cmdExecutor = mod.getCommandExecutor();
String commandWithPrefix = cmdExecutor.isClientCommand(command) ? command
: (cmdExecutor.getCommandPrefix() + command);
if (commandWithPrefix.equals("@stop")) {
mod.isStopping = true;
mod.callOnStop();
} else {
mod.isStopping = false;
mod.resetStop();
}
Optional<PseudoCommands.PseudoCommand> ma = PseudoCommands
.getPseudocommandOption(commandWithPrefix.substring(1));
ma.ifPresentOrElse(
(pcmd) -> executePseudoCommand(mod, pcmd, commandWithPrefix, onStop),
() -> executeAltoclefCommand(mod, commandWithPrefix, onStop));
}

private static void executePseudoCommand(AltoClefController mod, PseudoCommand pcmd, String commandWithPrefix,
Consumer<CommandExecutionStopReason> onStop) {
PseudoCommandExecutor executor = mod.getPseudoCommandExecutor();
mod.shouldCancelPseudoCommand = false;
mod.setPseudoCommandInfo(Optional.of("running" + commandWithPrefix.substring(1)));
executor.execute(pcmd,
commandWithPrefix,
() -> {
if (mod.shouldCancelPseudoCommand) {
mod.setPseudoCommandInfo(
Optional.of(String.format("Running psuedocommand %s", pcmd.getName())));
LOGGER.info("{} was cancelled. Not adding finish event to queue.",
commandWithPrefix);
onStop.accept(new CommandExecutionStopReason.Cancelled(commandWithPrefix));
} else {
onStop.accept(new CommandExecutionStopReason.Finished(commandWithPrefix));
}
}, (errMsg) -> {
onStop.accept(new CommandExecutionStopReason.Error(commandWithPrefix, errMsg));
});
}

private static void executeAltoclefCommand(AltoClefController mod, String commandWithPrefix,
Consumer<CommandExecutionStopReason> onStop) {
CommandExecutor cmdExecutor = mod.getCommandExecutor();
cmdExecutor.execute(commandWithPrefix, () -> {
if (mod.isStopping) {
System.out.printf(
Expand All @@ -82,7 +121,7 @@ public static void onCommandListGenerated(AltoClefController mod, String command
});
}

private static void broadcastChatToPlayer(MinecraftServer server, String message, ServerPlayer player){
private static void broadcastChatToPlayer(MinecraftServer server, String message, ServerPlayer player) {
player.displayClientMessage(Component.literal(message), false);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public ConversationHistory(String initialSystemPrompt, String characterName, Str
}
}

private ConversationHistory(String initialSystemPrompt) {
public ConversationHistory(String initialSystemPrompt) {
this.historyFile = null;
this.setBaseSystemPrompt(initialSystemPrompt);
this.loadedFromFile = false;
Expand Down
Loading