From 59806fc7f2dcc6709d31790ab9b311d791e3ae37 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+wintersolstice8@users.noreply.github.com> Date: Thu, 2 May 2024 18:49:43 -0600 Subject: [PATCH] [core] Don't rotate mobs that shouldn't always rotate during TP moves --- src/map/ai/states/ability_state.cpp | 7 ++----- src/map/ai/states/mobskill_state.cpp | 10 ++++------ src/map/utils/battleutils.cpp | 23 +++++++++++++++++++++++ src/map/utils/battleutils.h | 2 ++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/map/ai/states/ability_state.cpp b/src/map/ai/states/ability_state.cpp index 85ffb9acc0b..ed4eab9c784 100644 --- a/src/map/ai/states/ability_state.cpp +++ b/src/map/ai/states/ability_state.cpp @@ -69,9 +69,7 @@ CAbilityState::CAbilityState(CBattleEntity* PEntity, uint16 targid, uint16 abili m_PEntity->PAI->EventHandler.triggerListener("ABILITY_START", CLuaBaseEntity(m_PEntity), CLuaAbility(PAbility)); // face toward target - m_PEntity->loc.p.rotation = worldAngle(m_PEntity->loc.p, PTarget->loc.p); - m_PEntity->updatemask |= UPDATE_POS; - m_PEntity->loc.zone->UpdateEntityPacket(m_PEntity, ENTITY_UPDATE, UPDATE_POS); + battleutils::turnTowardsTarget(m_PEntity, PTarget); } else { @@ -118,8 +116,7 @@ bool CAbilityState::Update(time_point tick) CBaseEntity* PTarget = GetTarget(); if (PTarget) { - m_PEntity->loc.p.rotation = worldAngle(m_PEntity->loc.p, PTarget->loc.p); - m_PEntity->loc.zone->UpdateEntityPacket(m_PEntity, ENTITY_UPDATE, UPDATE_POS); + battleutils::turnTowardsTarget(m_PEntity, PTarget); } } diff --git a/src/map/ai/states/mobskill_state.cpp b/src/map/ai/states/mobskill_state.cpp index 9fb47190307..9379560ba1b 100644 --- a/src/map/ai/states/mobskill_state.cpp +++ b/src/map/ai/states/mobskill_state.cpp @@ -74,9 +74,8 @@ CMobSkillState::CMobSkillState(CBattleEntity* PEntity, uint16 targid, uint16 wsi actionTarget.messageID = 43; m_PEntity->loc.zone->PushPacket(m_PEntity, CHAR_INRANGE_SELF, new CActionPacket(action)); - // face toward target - m_PEntity->loc.p.rotation = worldAngle(m_PEntity->loc.p, PTarget->loc.p); - m_PEntity->loc.zone->UpdateEntityPacket(m_PEntity, ENTITY_UPDATE, UPDATE_POS); + // face toward target // TODO : add force param to turnTowardsTarget on certain TP moves like Petro Eyes + battleutils::turnTowardsTarget(m_PEntity, PTarget); } m_PEntity->PAI->EventHandler.triggerListener("WEAPONSKILL_STATE_ENTER", CLuaBaseEntity(m_PEntity), m_PSkill->getID()); SpendCost(); @@ -113,14 +112,13 @@ void CMobSkillState::SpendCost() bool CMobSkillState::Update(time_point tick) { - // Rotate towards target during ability + // Rotate towards target during ability // TODO : add force param to turnTowardsTarget on certain TP moves like Petro Eyes if (m_castTime > 0s && tick < GetEntryTime() + m_castTime) { CBaseEntity* PTarget = GetTarget(); if (PTarget) { - m_PEntity->loc.p.rotation = worldAngle(m_PEntity->loc.p, PTarget->loc.p); - m_PEntity->loc.zone->UpdateEntityPacket(m_PEntity, ENTITY_UPDATE, UPDATE_POS); + battleutils::turnTowardsTarget(m_PEntity, PTarget); } } diff --git a/src/map/utils/battleutils.cpp b/src/map/utils/battleutils.cpp index cc3ed77c24b..592c80d033e 100644 --- a/src/map/utils/battleutils.cpp +++ b/src/map/utils/battleutils.cpp @@ -5984,6 +5984,29 @@ namespace battleutils } } + // turn towards target unless mob behavior ignores this (but can be forced to anyway) + void turnTowardsTarget(CBaseEntity* PEntity, CBaseEntity* PTarget, bool force) + { + // Quick rejects + if (!PEntity || !PTarget) + { + return; + } + + CMobEntity* PMob = dynamic_cast(PEntity); + + // Big mobs typically should ignore this -- Such as dragons/wyrms or other big things. + // Some TP moves like Petro Eyes from normal dragons _also_ ignore their standard behavior, so we must allow it sometimes. + if (PMob && (PMob->m_Behaviour & BEHAVIOUR_NO_TURN) && !force) + { + return; + } + + PEntity->loc.p.rotation = worldAngle(PEntity->loc.p, PTarget->loc.p); + PEntity->updatemask |= UPDATE_POS; + PEntity->loc.zone->UpdateEntityPacket(PTarget, ENTITY_UPDATE, UPDATE_POS); + } + /************************************************************************ * * * Get the Snapshot shot time reduction * diff --git a/src/map/utils/battleutils.h b/src/map/utils/battleutils.h index 0f71fd1eed2..d6bf6a2b7d3 100644 --- a/src/map/utils/battleutils.h +++ b/src/map/utils/battleutils.h @@ -250,6 +250,8 @@ namespace battleutils void DoWildCardToEntity(CCharEntity* PCaster, CCharEntity* PTarget, uint8 roll); bool DoRandomDealToEntity(CCharEntity* PChar, CCharEntity* PTarget); + void turnTowardsTarget(CBaseEntity* PEntity, CBaseEntity* PTarget, bool force = false); + void AddTraits(CBattleEntity* PEntity, TraitList_t* TraitList, uint8 level); bool HasClaim(CBattleEntity* PEntity, CBattleEntity* PTarget);