aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Chat/Commands/Level3.cpp4
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp31
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp74
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h22
4 files changed, 71 insertions, 60 deletions
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index 561c5059bad..d5dd233b43e 100755
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -1890,7 +1890,7 @@ bool ChatHandler::HandleDamageCommand(const char * args)
{
m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
if (target != m_session->GetPlayer())
- m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_NORMALSWING2, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0);
+ m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0);
return true;
}
@@ -1920,7 +1920,7 @@ bool ChatHandler::HandleDamageCommand(const char * args)
m_session->GetPlayer()->DealDamageMods(target, damage, &absorb);
m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
- m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_NORMALSWING2, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
+ m_session->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
return true;
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 38296c8ee2a..44547873754 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7424,17 +7424,15 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
}
// group update
- if (GetGroup())
+ if (Group* group = GetGroup())
{
SetGroupUpdateFlag(GROUP_UPDATE_FULL);
- Group* grp = GetGroup();
- if (GetSession() && grp->isLFGGroup() && sLFGMgr->IsTeleported(GetGUID()))
+ if (GetSession() && group->isLFGGroup() && sLFGMgr->IsTeleported(GetGUID()))
{
- for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
- Player* tempplr = itr->getSource();
- if (tempplr)
- GetSession()->SendNameQueryOpcode(tempplr->GetGUID());
+ if (Player* member = itr->getSource())
+ GetSession()->SendNameQueryOpcode(member->GetGUID());
}
}
}
@@ -7451,9 +7449,8 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
if (sWorld->getBoolConfig(CONFIG_WEATHER))
{
- Weather* wth = WeatherMgr::FindWeather(zone->ID);
- if (wth)
- wth->SendWeatherUpdateToPlayer(this);
+ if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
+ weather->SendWeatherUpdateToPlayer(this);
else
{
if (!WeatherMgr::AddWeather(zone->ID))
@@ -7485,7 +7482,7 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
break;
}
- if (zone->flags & AREA_FLAG_CAPITAL) // in capital city
+ if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
{
if (!pvpInfo.inHostileArea || zone->IsSanctuary())
{
@@ -7495,19 +7492,21 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
}
pvpInfo.inNoPvPArea = true;
}
- else // anywhere else
+ else
{
- if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) // but resting (walk from city or maybe in tavern or leave tavern recently)
+ if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING))
{
- if (GetRestType() == REST_TYPE_IN_TAVERN) // has been in tavern. Is still in?
+ if (GetRestType() == REST_TYPE_IN_TAVERN) // Still inside a tavern or has recently left
{
- if (GetMapId() != GetInnPosMapId() || sqrt((GetPositionX()-GetInnPosX())*(GetPositionX()-GetInnPosX())+(GetPositionY()-GetInnPosY())*(GetPositionY()-GetInnPosY())+(GetPositionZ()-GetInnPosZ())*(GetPositionZ()-GetInnPosZ()))>40)
+ // Remove rest state if we have recently left a tavern.
+ // Why is 40 yd hardcoded?
+ if (GetMapId() != GetInnPosMapId() || GetExactDist(GetInnPosX(), GetInnPosY(), GetInnPosZ()) > 40.0f)
{
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
SetRestType(REST_TYPE_NO);
}
}
- else // not in tavern (leave city then)
+ else // Recently left a capital city
{
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
SetRestType(REST_TYPE_NO);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index f17b564e57f..e4967e8633d 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -110,23 +110,27 @@ m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType)
m_resist = 0;
m_block = 0;
}
+
void DamageInfo::ModifyDamage(int32 amount)
{
amount = std::min(amount, int32(GetDamage()));
m_damage += amount;
}
+
void DamageInfo::AbsorbDamage(uint32 amount)
{
amount = std::min(amount, GetDamage());
m_absorb += amount;
m_damage -= amount;
}
+
void DamageInfo::ResistDamage(uint32 amount)
{
amount = std::min(amount, GetDamage());
m_resist += amount;
m_damage -= amount;
}
+
void DamageInfo::BlockDamage(uint32 amount)
{
amount = std::min(amount, GetDamage());
@@ -1096,6 +1100,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
if (!victim)
return;
+
if (!isAlive() || !victim->isAlive())
return;
@@ -1105,12 +1110,11 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
case BASE_ATTACK:
damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_MAINHAND_ATTACK;
damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK;
- damageInfo->HitInfo = HITINFO_NORMALSWING2;
break;
case OFF_ATTACK:
damageInfo->procAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK;
damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK;
- damageInfo->HitInfo = HITINFO_LEFTSWING;
+ damageInfo->HitInfo = HITINFO_OFFHAND;
break;
default:
return;
@@ -1146,29 +1150,29 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
switch (damageInfo->hitOutCome)
{
case MELEE_HIT_EVADE:
- damageInfo->HitInfo |= HITINFO_MISS|HITINFO_SWINGNOHITSOUND;
- damageInfo->TargetState = VICTIMSTATE_EVADES;
- damageInfo->procEx|=PROC_EX_EVADE;
+ damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND;
+ damageInfo->TargetState = VICTIMSTATE_EVADES;
+ damageInfo->procEx |= PROC_EX_EVADE;
damageInfo->damage = 0;
damageInfo->cleanDamage = 0;
return;
case MELEE_HIT_MISS:
- damageInfo->HitInfo |= HITINFO_MISS;
- damageInfo->TargetState = VICTIMSTATE_INTACT;
- damageInfo->procEx |= PROC_EX_MISS;
- damageInfo->damage = 0;
- damageInfo->cleanDamage = 0;
+ damageInfo->HitInfo |= HITINFO_MISS;
+ damageInfo->TargetState = VICTIMSTATE_INTACT;
+ damageInfo->procEx |= PROC_EX_MISS;
+ damageInfo->damage = 0;
+ damageInfo->cleanDamage = 0;
break;
case MELEE_HIT_NORMAL:
- damageInfo->TargetState = VICTIMSTATE_HIT;
- damageInfo->procEx|=PROC_EX_NORMAL_HIT;
+ damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->procEx |= PROC_EX_NORMAL_HIT;
break;
case MELEE_HIT_CRIT:
{
- damageInfo->HitInfo |= HITINFO_CRITICALHIT;
- damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->HitInfo |= HITINFO_CRITICALHIT;
+ damageInfo->TargetState = VICTIMSTATE_HIT;
- damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
+ damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
// Crit bonus calc
damageInfo->damage += damageInfo->damage;
float mod = 0.0f;
@@ -1229,8 +1233,8 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
if (leveldif > 3)
leveldif = 3;
float reducePercent = 1 - leveldif * 0.1f;
- damageInfo->cleanDamage += damageInfo->damage-uint32(reducePercent * damageInfo->damage);
- damageInfo->damage = uint32(reducePercent * damageInfo->damage);
+ damageInfo->cleanDamage += damageInfo->damage - uint32(reducePercent * damageInfo->damage);
+ damageInfo->damage = uint32(reducePercent * damageInfo->damage);
break;
}
case MELEE_HIT_CRUSHING:
@@ -1244,6 +1248,10 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
break;
}
+ // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
+ if (!(damageInfo->HitInfo & HITINFO_MISS))
+ damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
+
int32 resilienceReduction = damageInfo->damage;
if (attackType != RANGED_ATTACK)
ApplyResilience(victim, NULL, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
@@ -1259,14 +1267,17 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
// Calculate absorb & resists
CalcAbsorbResist(damageInfo->target, SpellSchoolMask(damageInfo->damageSchoolMask), DIRECT_DAMAGE, damageInfo->damage, &damageInfo->absorb, &damageInfo->resist);
- damageInfo->damage -= damageInfo->absorb + damageInfo->resist;
+
if (damageInfo->absorb)
{
- damageInfo->HitInfo |= HITINFO_ABSORB;
+ damageInfo->HitInfo |= (damageInfo->damage - damageInfo->absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
damageInfo->procEx |= PROC_EX_ABSORB;
}
+
if (damageInfo->resist)
- damageInfo->HitInfo |= HITINFO_RESIST;
+ damageInfo->HitInfo |= (damageInfo->damage - damageInfo->resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
+
+ damageInfo->damage -= damageInfo->absorb + damageInfo->resist;
}
else // Impossible get negative result but....
damageInfo->damage = 0;
@@ -2157,8 +2168,8 @@ void Unit::SendMeleeAttackStop(Unit* victim)
{
WorldPacket data(SMSG_ATTACKSTOP, (8+8+4));
data.append(GetPackGUID());
- data.append(victim ? victim->GetPackGUID() : 0); // can be 0x00...
- data << uint32(0); // can be 0x1
+ data.append(victim ? victim->GetPackGUID() : 0);
+ data << uint32(0); //! Can also take the value 0x01, which seems related to updating rotation
SendMessageToSet(&data, true);
sLog->outStaticDebug("WORLD: Sent SMSG_ATTACKSTOP");
@@ -2988,20 +2999,20 @@ bool Unit::IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled, bool skip
(withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
{
if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
- return(true);
+ return true;
}
// channeled spells may be delayed, but they are still considered casted
else if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
(m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED))
{
if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
- return(true);
+ return true;
}
// autorepeat spells may be finished or delayed, but they are still considered casted
else if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
- return(true);
+ return true;
- return(false);
+ return false;
}
void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id, bool withInstant)
@@ -4846,28 +4857,29 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
data << uint32(damageInfo->damage); // Sub Damage
}
- if (damageInfo->HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2))
+ if (damageInfo->HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB))
{
for (uint32 i = 0; i < count; ++i)
data << uint32(damageInfo->absorb); // Absorb
}
- if (damageInfo->HitInfo & (HITINFO_RESIST | HITINFO_RESIST2))
+ if (damageInfo->HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST))
{
for (uint32 i = 0; i < count; ++i)
data << uint32(damageInfo->resist); // Resist
}
data << uint8(damageInfo->TargetState);
- data << uint32(0);
- data << uint32(0);
+ data << uint32(0); // Unknown attackerstate
+ data << uint32(0); // Melee spellid
if (damageInfo->HitInfo & HITINFO_BLOCK)
data << uint32(damageInfo->blocked_amount);
- if (damageInfo->HitInfo & HITINFO_UNK3)
+ if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
data << uint32(0);
+ //! Probably used for debugging purposes, as it is not known to appear on retail servers
if (damageInfo->HitInfo & HITINFO_UNK1)
{
data << uint32(0);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e1717dc5858..d85b7dd15bf 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -286,29 +286,29 @@ enum HitInfo
{
HITINFO_NORMALSWING = 0x00000000,
HITINFO_UNK1 = 0x00000001, // req correct packet structure
- HITINFO_NORMALSWING2 = 0x00000002,
- HITINFO_LEFTSWING = 0x00000004,
+ HITINFO_AFFECTS_VICTIM = 0x00000002,
+ HITINFO_OFFHAND = 0x00000004,
HITINFO_UNK2 = 0x00000008,
HITINFO_MISS = 0x00000010,
- HITINFO_ABSORB = 0x00000020, // absorbed damage
- HITINFO_ABSORB2 = 0x00000040, // absorbed damage
- HITINFO_RESIST = 0x00000080, // resisted atleast some damage
- HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage
+ HITINFO_FULL_ABSORB = 0x00000020,
+ HITINFO_PARTIAL_ABSORB = 0x00000040,
+ HITINFO_FULL_RESIST = 0x00000080,
+ HITINFO_PARTIAL_RESIST = 0x00000100,
HITINFO_CRITICALHIT = 0x00000200, // critical hit
// 0x00000400
// 0x00000800
// 0x00001000
HITINFO_BLOCK = 0x00002000, // blocked damage
- // 0x00004000
- // 0x00008000
+ // 0x00004000 // Hides worldtext for 0 damage
+ // 0x00008000 // Related to blood visual
HITINFO_GLANCING = 0x00010000,
HITINFO_CRUSHING = 0x00020000,
- HITINFO_NOACTION = 0x00040000, // guessed
+ HITINFO_NO_ANIMATION = 0x00040000,
// 0x00080000
// 0x00100000
- HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed
+ HITINFO_SWINGNOHITSOUND = 0x00200000, // unused?
// 0x00400000
- HITINFO_UNK3 = 0x00800000
+ HITINFO_RAGE_GAIN = 0x00800000
};
//i would like to remove this: (it is defined in item.h