diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
7 files changed, 63 insertions, 7 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a5c11f6e736..2441d972f79 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24586,6 +24586,12 @@ void Player::SendInitialPacketsAfterAddToMap() if (HasAura(SPELL_DH_DOUBLE_JUMP)) setCompoundState.StateChanges.emplace_back(SMSG_MOVE_ENABLE_DOUBLE_JUMP, m_movementCounter++); + if (HasAuraType(SPELL_AURA_IGNORE_MOVEMENT_FORCES)) + setCompoundState.StateChanges.emplace_back(SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES, m_movementCounter++); + + if (HasAuraType(SPELL_AURA_DISABLE_INERTIA)) + setCompoundState.StateChanges.emplace_back(SMSG_MOVE_DISABLE_INERTIA, m_movementCounter++); + if (!setCompoundState.StateChanges.empty()) { setCompoundState.MoverGUID = GetGUID(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1301968399b..d5e112bed43 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12873,6 +12873,37 @@ bool Unit::SetCanDoubleJump(bool enable) return true; } +bool Unit::SetDisableInertia(bool disable) +{ + if (disable == HasExtraUnitMovementFlag2(MOVEMENTFLAG3_DISABLE_INERTIA)) + return false; + + if (disable) + AddExtraUnitMovementFlag2(MOVEMENTFLAG3_DISABLE_INERTIA); + else + RemoveExtraUnitMovementFlag2(MOVEMENTFLAG3_DISABLE_INERTIA); + + static OpcodeServer const disableInertiaOpcodeTable[2] = + { + SMSG_MOVE_DISABLE_INERTIA, + SMSG_MOVE_ENABLE_INERTIA + }; + + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) + { + WorldPackets::Movement::MoveSetFlag packet(disableInertiaOpcodeTable[disable]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.Status = &m_movementInfo; + SendMessageToSet(moveUpdate.Write(), playerMover); + } + + return true; +} + void Unit::SendSetVehicleRecId(uint32 vehicleId) { if (Player* player = ToPlayer()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 11f5b856aee..d6df772d50e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1220,6 +1220,7 @@ class TC_GAME_API Unit : public WorldObject bool SetCanTransitionBetweenSwimAndFly(bool enable); bool SetCanTurnWhileFalling(bool enable); bool SetCanDoubleJump(bool enable); + bool SetDisableInertia(bool disable); void SendSetVehicleRecId(uint32 vehicleId); MovementForces const* GetMovementForces() const { return _movementForces.get(); } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 928aa56fd54..b4ba0e48e93 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -585,8 +585,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveGuildBankItem); DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); - DEFINE_HANDLER(CMSG_MOVE_INERTIA_DISABLE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_MOVE_INERTIA_ENABLE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_MOVE_INERTIA_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); + DEFINE_HANDLER(CMSG_MOVE_INERTIA_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck); @@ -1557,12 +1557,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_DOUBLE_JUMP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_INERTIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_INERTIA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_DOUBLE_JUMP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_INERTIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_INERTIA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 23d76d06cd0..a584ab6c243 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -550,7 +550,7 @@ enum AuraType : uint32 SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE = 456, SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE_REGEN = 457, SPELL_AURA_IGNORE_DUAL_WIELD_HIT_PENALTY = 458, - SPELL_AURA_IGNORE_MOVEMENT_FORCES = 459, // NYI + SPELL_AURA_IGNORE_MOVEMENT_FORCES = 459, SPELL_AURA_RESET_COOLDOWNS_ON_DUEL_START = 460, // NYI SPELL_AURA_461 = 461, SPELL_AURA_MOD_HEALING_AND_ABSORB_FROM_CASTER = 462, // NYI @@ -597,7 +597,7 @@ enum AuraType : uint32 SPELL_AURA_MOD_VERSATILITY_HEALING_DONE_BENEFIT = 503, // NYI SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER = 504, SPELL_AURA_MOD_PLAYER_CHOICE_REROLLS = 505, // NYI - SPELL_AURA_DISABLE_INERTIA = 506, // NYI + SPELL_AURA_DISABLE_INERTIA = 506, TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index d44979988f1..75f7535dcec 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -572,7 +572,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //503 SPELL_AURA_MOD_VERSATILITY_HEALING_DONE_BENEFIT &AuraEffect::HandleNoImmediateEffect, //504 SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER implemented in Unit::SpellHealingBonusTaken &AuraEffect::HandleNULL, //505 SPELL_AURA_MOD_PLAYER_CHOICE_REROLLS - &AuraEffect::HandleNULL, //506 SPELL_AURA_DISABLE_INERTIA + &AuraEffect::HandleDisableInertia, //506 SPELL_AURA_DISABLE_INERTIA }; AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) : @@ -2717,6 +2717,23 @@ void AuraEffect::HandleIgnoreMovementForces(AuraApplication const* aurApp, uint8 target->SetIgnoreMovementForces(apply); } +void AuraEffect::HandleDisableInertia(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK)) + return; + + Unit* target = aurApp->GetTarget(); + + if (!apply) + { + // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit + if (target->HasAuraType(GetAuraType())) + return; + } + + target->SetDisableInertia(apply); +} + /****************************/ /*** THREAT ***/ /****************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index d2b05ea29ec..c9f04b647ec 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -183,6 +183,7 @@ class TC_GAME_API AuraEffect void HandleForceMoveForward(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraCanTurnWhileFalling(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleIgnoreMovementForces(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleDisableInertia(AuraApplication const* aurApp, uint8 mode, bool apply) const; // threat void HandleModThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const; |