feat: add macro conditional support to /cleartarget and /startattack

/cleartarget [dead] now clears target only when it meets conditions;
/startattack [harm,nodead] respects conditionals including target=mouseover.
This commit is contained in:
Kelsi 2026-03-18 03:25:34 -07:00
parent 6cd3c613ef
commit 11c07f19cb

View file

@ -6353,14 +6353,29 @@ void GameScreen::sendChatMessage(game::GameHandler& gameHandler) {
} }
if (cmdLower == "startattack") { if (cmdLower == "startattack") {
if (gameHandler.hasTarget()) { // Support macro conditionals: /startattack [harm,nodead]
gameHandler.startAutoAttack(gameHandler.getTargetGuid()); bool condPass = true;
} else { uint64_t saOverride = static_cast<uint64_t>(-1);
game::MessageChatData msg; if (spacePos != std::string::npos) {
msg.type = game::ChatType::SYSTEM; std::string saArg = command.substr(spacePos + 1);
msg.language = game::ChatLanguage::UNIVERSAL; while (!saArg.empty() && saArg.front() == ' ') saArg.erase(saArg.begin());
msg.message = "You have no target."; if (!saArg.empty() && saArg.front() == '[') {
gameHandler.addLocalChatMessage(msg); std::string result = evaluateMacroConditionals(saArg, gameHandler, saOverride);
condPass = !(result.empty() && saOverride == static_cast<uint64_t>(-1));
}
}
if (condPass) {
uint64_t atkTarget = (saOverride != static_cast<uint64_t>(-1) && saOverride != 0)
? saOverride : (gameHandler.hasTarget() ? gameHandler.getTargetGuid() : 0);
if (atkTarget != 0) {
gameHandler.startAutoAttack(atkTarget);
} else {
game::MessageChatData msg;
msg.type = game::ChatType::SYSTEM;
msg.language = game::ChatLanguage::UNIVERSAL;
msg.message = "You have no target.";
gameHandler.addLocalChatMessage(msg);
}
} }
chatInputBuffer[0] = '\0'; chatInputBuffer[0] = '\0';
return; return;
@ -6643,7 +6658,18 @@ void GameScreen::sendChatMessage(game::GameHandler& gameHandler) {
// Targeting commands // Targeting commands
if (cmdLower == "cleartarget") { if (cmdLower == "cleartarget") {
gameHandler.clearTarget(); // Support macro conditionals: /cleartarget [dead] clears only if target is dead
bool ctCondPass = true;
if (spacePos != std::string::npos) {
std::string ctArg = command.substr(spacePos + 1);
while (!ctArg.empty() && ctArg.front() == ' ') ctArg.erase(ctArg.begin());
if (!ctArg.empty() && ctArg.front() == '[') {
uint64_t ctOver = static_cast<uint64_t>(-1);
std::string res = evaluateMacroConditionals(ctArg, gameHandler, ctOver);
ctCondPass = !(res.empty() && ctOver == static_cast<uint64_t>(-1));
}
}
if (ctCondPass) gameHandler.clearTarget();
chatInputBuffer[0] = '\0'; chatInputBuffer[0] = '\0';
return; return;
} }