From c676d99fc26a99b39da55d876f50329ca0cc0f61 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 18 Mar 2026 02:32:49 -0700 Subject: [PATCH] feat: add /petattack, /petfollow, /petstay, /petpassive, /petaggressive macro commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the standard WoW pet control slash commands used in macros: - /petattack — attack current target - /petfollow — follow player - /petstay / /pethalt — stop and hold position - /petpassive — set passive react mode - /petdefensive — set defensive react mode - /petaggressive — set aggressive react mode - /petdismiss — dismiss the pet All commands also appear in Tab-autocomplete. --- src/ui/game_screen.cpp | 43 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 55dd1a49..5af139af 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -2602,7 +2602,9 @@ void GameScreen::renderChatWindow(game::GameHandler& gameHandler) { "/gmticket", "/grouploot", "/i", "/instance", "/invite", "/j", "/join", "/kick", "/l", "/leave", "/local", "/me", - "/p", "/party", "/r", "/raid", + "/p", "/party", "/petaggressive", "/petattack", "/petdefensive", + "/petdismiss", "/petfollow", "/pethalt", "/petpassive", "/petstay", + "/r", "/raid", "/raidwarning", "/random", "/reply", "/roll", "/s", "/say", "/setloot", "/shout", "/sit", "/stand", "/startattack", "/stopattack", "/stopfollow", "/stopcasting", @@ -5622,6 +5624,45 @@ void GameScreen::sendChatMessage(game::GameHandler& gameHandler) { return; } + // Pet control commands (common macro use) + // Action IDs: 1=passive, 2=follow, 3=stay, 4=defensive, 5=attack, 6=aggressive + if (cmdLower == "petattack") { + uint64_t target = gameHandler.hasTarget() ? gameHandler.getTargetGuid() : 0; + gameHandler.sendPetAction(5, target); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petfollow") { + gameHandler.sendPetAction(2, 0); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petstay" || cmdLower == "pethalt") { + gameHandler.sendPetAction(3, 0); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petpassive") { + gameHandler.sendPetAction(1, 0); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petdefensive") { + gameHandler.sendPetAction(4, 0); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petaggressive") { + gameHandler.sendPetAction(6, 0); + chatInputBuffer[0] = '\0'; + return; + } + if (cmdLower == "petdismiss") { + gameHandler.dismissPet(); + chatInputBuffer[0] = '\0'; + return; + } + // /cancelform / /cancelshapeshift — leave current shapeshift/stance if (cmdLower == "cancelform" || cmdLower == "cancelshapeshift") { // Cancel the first permanent shapeshift aura the player has