diff options
-rw-r--r-- | src/game/Creature.cpp | 8 | ||||
-rw-r--r-- | src/game/Player.cpp | 5 | ||||
-rw-r--r-- | src/game/Unit.cpp | 17 | ||||
-rw-r--r-- | src/game/Unit.h | 2 |
4 files changed, 15 insertions, 17 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 4e6891ba5b9..4b31668db62 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1484,14 +1484,6 @@ void Creature::setDeathState(DeathState s) if(m_formation && m_formation->getLeader() == this) m_formation->FormationReset(true); - SetHealth(0); - SetPower(getPowerType(),0); - - // For some reason movement packet is always to be issued on death - // send if not going to fall down - if (!canFly() && !IsFlying()) - SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0); - if ((canFly() || IsFlying()) && FallGround()) return; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5c12feccbe0..ccab083f599 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1448,11 +1448,6 @@ void Player::setDeathState(DeathState s) GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1); - - // For some reason movement packet is always to be issued on death - // send if not going to fall down - if (!IsFlying() || GetTransport()) - SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0); } Unit::setDeathState(s); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 392cb3ec3f9..99d01f983d8 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -311,14 +311,25 @@ void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTim SendMonsterMove(x, y, z, transitTime, player); } -void Unit::SendMonsterStop() +void Unit::SendMonsterStop(bool on_death) { WorldPacket data(SMSG_MONSTER_MOVE, (17 + GetPackGUID().size())); data.append(GetPackGUID()); data << uint8(0); // new in 3.1 data << GetPositionX() << GetPositionY() << GetPositionZ(); data << getMSTime(); - data << uint8(1); + + if (on_death == true) + { + data << uint8(1); + data << uint32((GetUnitMovementFlags() & MOVEMENTFLAG_LEVITATING) ? MOVEFLAG_FLY : MOVEFLAG_WALK); + data << uint32(0); // Time in between points + data << uint32(1); // 1 single waypoint + data << GetPositionX() << GetPositionY() << GetPositionZ(); + } + else + data << uint8(0); + SendMessageToSet(&data, true); clearUnitState(UNIT_STAT_MOVE); @@ -12002,7 +12013,7 @@ void Unit::setDeathState(DeathState s) GetMotionMaster()->MoveIdle(); if (m_vehicleKit) m_vehicleKit->Die(); - StopMoving(); + SendMonsterStop(true); //without this when removing IncreaseMaxHealth aura player may stuck with 1 hp //do not why since in IncreaseMaxHealth currenthealth is checked SetHealth(0); diff --git a/src/game/Unit.h b/src/game/Unit.h index acb7c0fd68d..a35657890fa 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1432,7 +1432,7 @@ class Unit : public WorldObject void JumpTo(float speedXY, float speedZ, bool forward = true); void JumpTo(WorldObject *obj, float speedZ); - void SendMonsterStop(); + void SendMonsterStop(bool on_death = false); void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player = NULL); void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 MoveFlags, uint32 time, float speedZ, Player *player = NULL); //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); |