Skip to content

Commit 2971ea0

Browse files
authored
Merge pull request #395 from TrinityCore/master
Update 12.28.24
2 parents 8566097 + 28d3c1b commit 2971ea0

File tree

9 files changed

+86
-73
lines changed

9 files changed

+86
-73
lines changed

src/server/game/Entities/Unit/Unit.cpp

+30-13
Original file line numberDiff line numberDiff line change
@@ -896,15 +896,6 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons
896896
}
897897
}
898898

899-
// Rage from Damage made (only from direct weapon damage)
900-
if (attacker && cleanDamage && (cleanDamage->attackType == BASE_ATTACK || cleanDamage->attackType == OFF_ATTACK) && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->GetPowerType() == POWER_RAGE)
901-
{
902-
uint32 rage = uint32(attacker->GetBaseAttackTime(cleanDamage->attackType) / 1000.f * 1.75f);
903-
if (cleanDamage->attackType == OFF_ATTACK)
904-
rage /= 2;
905-
attacker->RewardRage(rage);
906-
}
907-
908899
if (!damageDone)
909900
return 0;
910901

@@ -1328,6 +1319,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon
13281319
damageInfo->Blocked = 0;
13291320
damageInfo->HitInfo = 0;
13301321
damageInfo->TargetState = 0;
1322+
damageInfo->RageGained = 0;
13311323

13321324
damageInfo->AttackType = attackType;
13331325
damageInfo->ProcAttacker = PROC_FLAG_NONE;
@@ -2217,6 +2209,19 @@ void Unit::DoMeleeAttackIfReady()
22172209
}
22182210
}
22192211

2212+
// Calculates the normalized rage amount per weapon swing
2213+
static uint32 CalcMeleeAttackRageGain(Unit const* attacker, WeaponAttackType attType)
2214+
{
2215+
if (!attacker || (attType != BASE_ATTACK && attType != OFF_ATTACK))
2216+
return 0;
2217+
2218+
uint32 rage = uint32(attacker->GetBaseAttackTime(attType) / 1000.f * 1.75f);
2219+
if (attType == OFF_ATTACK)
2220+
rage /= 2;
2221+
2222+
return rage;
2223+
}
2224+
22202225
void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extra)
22212226
{
22222227
if (HasUnitFlag(UNIT_FLAG_PACIFIED))
@@ -2282,6 +2287,16 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
22822287
damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
22832288
}
22842289

2290+
// Rage reward
2291+
if (this != victim && damageInfo.HitOutCome != MELEE_HIT_MISS && GetPowerType() == POWER_RAGE)
2292+
{
2293+
if (uint32 rageReward = CalcMeleeAttackRageGain(this, attType))
2294+
{
2295+
damageInfo.HitInfo |= HITINFO_RAGE_GAIN;
2296+
damageInfo.RageGained = RewardRage(rageReward);
2297+
}
2298+
}
2299+
22852300
SendAttackStateUpdate(&damageInfo);
22862301

22872302
_lastDamagedTargetGuid = victim->GetGUID();
@@ -2302,7 +2317,7 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
23022317
if (attType == OFF_ATTACK)
23032318
hitInfo |= HITINFO_OFFHAND;
23042319

2305-
SendAttackStateUpdate(hitInfo, victim, 0, GetMeleeDamageSchoolMask(), 0, 0, 0, VICTIMSTATE_HIT, 0);
2320+
SendAttackStateUpdate(hitInfo, victim, 0, GetMeleeDamageSchoolMask(), 0, 0, 0, VICTIMSTATE_HIT, 0, 0);
23062321
}
23072322
}
23082323
}
@@ -5685,6 +5700,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
56855700

56865701
packet.VictimState = damageInfo->TargetState;
56875702
packet.BlockAmount = damageInfo->Blocked;
5703+
packet.RageGained = damageInfo->RageGained;
56885704

56895705
packet.LogData.Initialize(damageInfo->Attacker);
56905706

@@ -5695,7 +5711,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
56955711
SendCombatLogMessage(&packet);
56965712
}
56975713

5698-
void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
5714+
void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount, uint32 RageGained)
56995715
{
57005716
CalcDamageInfo dmgInfo;
57015717
dmgInfo.HitInfo = HitInfo;
@@ -5708,6 +5724,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType
57085724
dmgInfo.Resist = Resist;
57095725
dmgInfo.TargetState = TargetState;
57105726
dmgInfo.Blocked = BlockedAmount;
5727+
dmgInfo.RageGained = RageGained;
57115728
SendAttackStateUpdate(&dmgInfo);
57125729
}
57135730

@@ -12932,7 +12949,7 @@ void Unit::UpdateHeight(float newZ)
1293212949
}
1293312950

1293412951
// baseRage means damage taken when attacker = false
12935-
void Unit::RewardRage(uint32 baseRage)
12952+
int32 Unit::RewardRage(uint32 baseRage)
1293612953
{
1293712954
float addRage = baseRage;
1293812955

@@ -12941,7 +12958,7 @@ void Unit::RewardRage(uint32 baseRage)
1294112958

1294212959
addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
1294312960

12944-
ModifyPower(POWER_RAGE, uint32(addRage * 10));
12961+
return ModifyPower(POWER_RAGE, uint32(addRage * 10), false);
1294512962
}
1294612963

1294712964
void Unit::StopAttackFaction(uint32 faction_id)

src/server/game/Entities/Unit/Unit.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ struct CalcDamageInfo
538538
uint32 Blocked;
539539
uint32 HitInfo;
540540
uint32 TargetState;
541+
uint32 RageGained;
541542

542543
// Helpers
543544
WeaponAttackType AttackType; //
@@ -1115,7 +1116,7 @@ class TC_GAME_API Unit : public WorldObject
11151116
void DeMorph();
11161117

11171118
void SendAttackStateUpdate(CalcDamageInfo* damageInfo);
1118-
void SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
1119+
void SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount, uint32 RageGained);
11191120
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log);
11201121
void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo);
11211122
void SendSpellDamageResist(Unit* target, uint32 spellId);
@@ -1798,7 +1799,7 @@ class TC_GAME_API Unit : public WorldObject
17981799

17991800
float GetHoverOffset() const { return HasUnitMovementFlag(MOVEMENTFLAG_HOVER) ? *m_unitData->HoverHeight : 0.0f; }
18001801

1801-
void RewardRage(uint32 baseRage);
1802+
int32 RewardRage(uint32 baseRage);
18021803

18031804
virtual float GetFollowAngle() const { return static_cast<float>(M_PI/2); }
18041805

src/server/game/Loot/Loot.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player co
11131113
{
11141114
WorldPackets::Loot::LootItemData& lootItem = packet.Items.emplace_back();
11151115
lootItem.LootListID = item.LootListId;
1116+
lootItem.Type = item.type;
11161117
lootItem.UIType = *uiType;
11171118
lootItem.Quantity = item.count;
11181119
lootItem.Loot.Initialize(item);

src/server/game/Server/Packets/LootPackets.cpp

+46-39
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717

1818
#include "LootPackets.h"
1919

20-
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Loot::LootItemData const& lootItem)
20+
namespace WorldPackets::Loot
2121
{
22-
data.WriteBits(lootItem.Type, 2);
23-
data.WriteBits(lootItem.UIType, 3);
24-
data.WriteBit(lootItem.CanTradeToTapList);
22+
static ByteBuffer& operator<<(ByteBuffer& data, LootItemData const& lootItem)
23+
{
24+
data << Bits<2>(lootItem.Type);
25+
data << Bits<3>(lootItem.UIType);
26+
data << Bits<1>(lootItem.CanTradeToTapList);
2527
data.FlushBits();
2628
data << lootItem.Loot; // WorldPackets::Item::ItemInstance
2729
data << uint32(lootItem.Quantity);
@@ -30,12 +32,22 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Loot::LootItemData const&
3032
return data;
3133
}
3234

33-
void WorldPackets::Loot::LootUnit::Read()
35+
static ByteBuffer& operator<<(ByteBuffer& data, LootCurrency const& lootCurrency)
36+
{
37+
data << uint32(lootCurrency.CurrencyID);
38+
data << uint32(lootCurrency.Quantity);
39+
data << uint8(lootCurrency.LootListID);
40+
data << Bits<3>(lootCurrency.UIType);
41+
data.FlushBits();
42+
return data;
43+
}
44+
45+
void LootUnit::Read()
3446
{
3547
_worldPacket >> Unit;
3648
}
3749

38-
WorldPacket const* WorldPackets::Loot::LootResponse::Write()
50+
WorldPacket const* LootResponse::Write()
3951
{
4052
_worldPacket << Owner;
4153
_worldPacket << LootObj;
@@ -55,18 +67,12 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write()
5567
_worldPacket << item;
5668

5769
for (LootCurrency const& currency : Currencies)
58-
{
59-
_worldPacket << uint32(currency.CurrencyID);
60-
_worldPacket << uint32(currency.Quantity);
61-
_worldPacket << uint8(currency.LootListID);
62-
_worldPacket.WriteBits(currency.UIType, 3);
63-
_worldPacket.FlushBits();
64-
}
70+
_worldPacket << currency;
6571

6672
return &_worldPacket;
6773
}
6874

69-
void WorldPackets::Loot::LootItem::Read()
75+
void LootItem::Read()
7076
{
7177
uint32 Count;
7278
_worldPacket >> Count;
@@ -78,10 +84,10 @@ void WorldPackets::Loot::LootItem::Read()
7884
_worldPacket >> Loot[i].LootListID;
7985
}
8086

81-
IsSoftInteract = _worldPacket.ReadBit();
87+
_worldPacket >> Bits<1>(IsSoftInteract);
8288
}
8389

84-
void WorldPackets::Loot::MasterLootItem::Read()
90+
void MasterLootItem::Read()
8591
{
8692
uint32 Count;
8793
_worldPacket >> Count;
@@ -95,7 +101,7 @@ void WorldPackets::Loot::MasterLootItem::Read()
95101
}
96102
}
97103

98-
WorldPacket const* WorldPackets::Loot::LootRemoved::Write()
104+
WorldPacket const* LootRemoved::Write()
99105
{
100106
_worldPacket << Owner;
101107
_worldPacket << LootObj;
@@ -104,55 +110,55 @@ WorldPacket const* WorldPackets::Loot::LootRemoved::Write()
104110
return &_worldPacket;
105111
}
106112

107-
void WorldPackets::Loot::LootRelease::Read()
113+
void LootRelease::Read()
108114
{
109115
_worldPacket >> Unit;
110116
}
111117

112-
void WorldPackets::Loot::LootMoney::Read()
118+
void LootMoney::Read()
113119
{
114-
IsSoftInteract = _worldPacket.ReadBit();
120+
_worldPacket >> Bits<1>(IsSoftInteract);
115121
}
116122

117-
WorldPacket const* WorldPackets::Loot::LootMoneyNotify::Write()
123+
WorldPacket const* LootMoneyNotify::Write()
118124
{
119125
_worldPacket << uint64(Money);
120126
_worldPacket << uint64(MoneyMod);
121-
_worldPacket.WriteBit(SoleLooter);
127+
_worldPacket << Bits<1>(SoleLooter);
122128
_worldPacket.FlushBits();
123129

124130
return &_worldPacket;
125131
}
126132

127-
WorldPacket const* WorldPackets::Loot::CoinRemoved::Write()
133+
WorldPacket const* CoinRemoved::Write()
128134
{
129135
_worldPacket << LootObj;
130136

131137
return &_worldPacket;
132138
}
133139

134-
void WorldPackets::Loot::LootRoll::Read()
140+
void LootRoll::Read()
135141
{
136142
_worldPacket >> LootObj;
137143
_worldPacket >> LootListID;
138144
_worldPacket >> RollType;
139145
}
140146

141-
WorldPacket const* WorldPackets::Loot::LootReleaseResponse::Write()
147+
WorldPacket const* LootReleaseResponse::Write()
142148
{
143149
_worldPacket << LootObj;
144150
_worldPacket << Owner;
145151

146152
return &_worldPacket;
147153
}
148154

149-
WorldPacket const* WorldPackets::Loot::LootList::Write()
155+
WorldPacket const* LootList::Write()
150156
{
151157
_worldPacket << Owner;
152158
_worldPacket << LootObj;
153159

154-
_worldPacket.WriteBit(Master.has_value());
155-
_worldPacket.WriteBit(RoundRobinWinner.has_value());
160+
_worldPacket << OptionalInit(Master);
161+
_worldPacket << OptionalInit(RoundRobinWinner);
156162

157163
_worldPacket.FlushBits();
158164

@@ -165,12 +171,12 @@ WorldPacket const* WorldPackets::Loot::LootList::Write()
165171
return &_worldPacket;
166172
}
167173

168-
void WorldPackets::Loot::SetLootSpecialization::Read()
174+
void SetLootSpecialization::Read()
169175
{
170176
_worldPacket >> SpecID;
171177
}
172178

173-
WorldPacket const* WorldPackets::Loot::StartLootRoll::Write()
179+
WorldPacket const* StartLootRoll::Write()
174180
{
175181
_worldPacket << LootObj;
176182
_worldPacket << int32(MapID);
@@ -184,36 +190,36 @@ WorldPacket const* WorldPackets::Loot::StartLootRoll::Write()
184190
return &_worldPacket;
185191
}
186192

187-
WorldPacket const* WorldPackets::Loot::LootRollBroadcast::Write()
193+
WorldPacket const* LootRollBroadcast::Write()
188194
{
189195
_worldPacket << LootObj;
190196
_worldPacket << Player;
191197
_worldPacket << int32(Roll);
192198
_worldPacket << uint8(RollType);
193199
_worldPacket << int32(DungeonEncounterID);
194200
_worldPacket << Item;
195-
_worldPacket.WriteBit(Autopassed);
196-
_worldPacket.WriteBit(OffSpec);
201+
_worldPacket << Bits<1>(Autopassed);
202+
_worldPacket << Bits<1>(OffSpec);
197203
_worldPacket.FlushBits();
198204

199205
return &_worldPacket;
200206
}
201207

202-
WorldPacket const* WorldPackets::Loot::LootRollWon::Write()
208+
WorldPacket const* LootRollWon::Write()
203209
{
204210
_worldPacket << LootObj;
205211
_worldPacket << Winner;
206212
_worldPacket << int32(Roll);
207213
_worldPacket << uint8(RollType);
208214
_worldPacket << int32(DungeonEncounterID);
209215
_worldPacket << Item;
210-
_worldPacket.WriteBit(MainSpec);
216+
_worldPacket << Bits<1>(MainSpec);
211217
_worldPacket.FlushBits();
212218

213219
return &_worldPacket;
214220
}
215221

216-
WorldPacket const* WorldPackets::Loot::LootAllPassed::Write()
222+
WorldPacket const* LootAllPassed::Write()
217223
{
218224
_worldPacket << LootObj;
219225
_worldPacket << int32(DungeonEncounterID);
@@ -222,7 +228,7 @@ WorldPacket const* WorldPackets::Loot::LootAllPassed::Write()
222228
return &_worldPacket;
223229
}
224230

225-
WorldPacket const* WorldPackets::Loot::LootRollsComplete::Write()
231+
WorldPacket const* LootRollsComplete::Write()
226232
{
227233
_worldPacket << LootObj;
228234
_worldPacket << uint8(LootListID);
@@ -231,7 +237,7 @@ WorldPacket const* WorldPackets::Loot::LootRollsComplete::Write()
231237
return &_worldPacket;
232238
}
233239

234-
WorldPacket const* WorldPackets::Loot::MasterLootCandidateList::Write()
240+
WorldPacket const* MasterLootCandidateList::Write()
235241
{
236242
_worldPacket << LootObj;
237243
_worldPacket << uint32(Players.size());
@@ -241,9 +247,10 @@ WorldPacket const* WorldPackets::Loot::MasterLootCandidateList::Write()
241247
return &_worldPacket;
242248
}
243249

244-
WorldPacket const* WorldPackets::Loot::AELootTargets::Write()
250+
WorldPacket const* AELootTargets::Write()
245251
{
246252
_worldPacket << uint32(Count);
247253

248254
return &_worldPacket;
249255
}
256+
}

0 commit comments

Comments
 (0)