mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-23 07:40:14 +00:00
Fix classic combat desync and separate attack intent from confirmed combat
Combat state/UI: - Split attack intent from server-confirmed auto attack in GameHandler. - Add explicit combat state helpers (intent, confirmed, combat-with-target). - Update player/target frame and renderer in-combat indicators to use confirmed combat. - Add intent-only visual state in UI to avoid false combat feedback. Animation correctness: - Correct combat-ready animation IDs to canonical ready stances (22/23/24/25). - Remove hit/wound-like stance behavior caused by incorrect ready IDs. Classic/TBC/Turtle melee reliability: - Tighten melee sync while attack intent is active: faster swing resend, tighter facing threshold, and faster facing cadence for classic-like expansions. - Send immediate movement heartbeat after facing corrections and during stationary melee sync windows. - Handle melee error opcodes explicitly (NOTINRANGE/BADFACING/NOTSTANDING/CANT_ATTACK) and immediately resync facing/swing where appropriate. - On ATTACKSTOP with persistent intent, immediately reassert ATTACKSWING. - Increase movement heartbeat cadence during active classic-like melee intent. Server compatibility/anti-cheat stability: - Restrict legacy force-movement/speed/teleport ACK behavior for classic-like flows to avoid unsolicited order acknowledgements. - Preserve local movement state updates while preventing bad-order ACK noise.
This commit is contained in:
parent
cb044e3985
commit
eaba378b5b
4 changed files with 129 additions and 48 deletions
|
|
@ -397,7 +397,7 @@ void GameScreen::render(game::GameHandler& gameHandler) {
|
|||
// Update renderer face-target position and selection circle
|
||||
auto* renderer = core::Application::getInstance().getRenderer();
|
||||
if (renderer) {
|
||||
renderer->setInCombat(gameHandler.isAutoAttacking());
|
||||
renderer->setInCombat(gameHandler.isInCombat());
|
||||
static glm::vec3 targetGLPos;
|
||||
if (gameHandler.hasTarget()) {
|
||||
auto target = gameHandler.getTarget();
|
||||
|
|
@ -1535,11 +1535,15 @@ void GameScreen::renderPlayerFrame(game::GameHandler& gameHandler) {
|
|||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f);
|
||||
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.1f, 0.1f, 0.1f, 0.85f));
|
||||
const bool inCombatConfirmed = gameHandler.isInCombat();
|
||||
const bool attackIntentOnly = gameHandler.hasAutoAttackIntent() && !inCombatConfirmed;
|
||||
ImVec4 playerBorder = isDead
|
||||
? ImVec4(0.5f, 0.5f, 0.5f, 1.0f)
|
||||
: (gameHandler.isAutoAttacking()
|
||||
: (inCombatConfirmed
|
||||
? ImVec4(1.0f, 0.2f, 0.2f, 1.0f)
|
||||
: ImVec4(0.4f, 0.4f, 0.4f, 1.0f));
|
||||
: (attackIntentOnly
|
||||
? ImVec4(1.0f, 0.7f, 0.2f, 1.0f)
|
||||
: ImVec4(0.4f, 0.4f, 0.4f, 1.0f)));
|
||||
ImGui::PushStyleColor(ImGuiCol_Border, playerBorder);
|
||||
|
||||
if (ImGui::Begin("##PlayerFrame", nullptr, flags)) {
|
||||
|
|
@ -1678,18 +1682,19 @@ void GameScreen::renderTargetFrame(game::GameHandler& gameHandler) {
|
|||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f);
|
||||
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.1f, 0.1f, 0.1f, 0.85f));
|
||||
bool isHostileTarget = gameHandler.isHostileAttacker(target->getGuid());
|
||||
if (!isHostileTarget && target->getType() == game::ObjectType::UNIT) {
|
||||
auto u = std::static_pointer_cast<game::Unit>(target);
|
||||
isHostileTarget = u->isHostile();
|
||||
}
|
||||
const uint64_t targetGuid = target->getGuid();
|
||||
const bool confirmedCombatWithTarget = gameHandler.isInCombatWith(targetGuid);
|
||||
const bool intentTowardTarget =
|
||||
gameHandler.hasAutoAttackIntent() &&
|
||||
gameHandler.getAutoAttackTargetGuid() == targetGuid &&
|
||||
!confirmedCombatWithTarget;
|
||||
ImVec4 borderColor = ImVec4(hostileColor.x * 0.8f, hostileColor.y * 0.8f, hostileColor.z * 0.8f, 1.0f);
|
||||
if (isHostileTarget) {
|
||||
if (confirmedCombatWithTarget) {
|
||||
float t = ImGui::GetTime();
|
||||
float pulse = (std::fmod(t, 0.6f) < 0.3f) ? 1.0f : 0.0f;
|
||||
borderColor = ImVec4(1.0f, 0.1f, 0.1f, pulse);
|
||||
} else if (gameHandler.isAutoAttacking()) {
|
||||
borderColor = ImVec4(1.0f, 0.2f, 0.2f, 1.0f);
|
||||
} else if (intentTowardTarget) {
|
||||
borderColor = ImVec4(1.0f, 0.7f, 0.2f, 1.0f);
|
||||
}
|
||||
ImGui::PushStyleColor(ImGuiCol_Border, borderColor);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue