aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp24
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Miscellaneous/Formulas.h3
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h15
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
6 files changed, 48 insertions, 18 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bd5d0a7c2f0..fe35fe82108 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2826,23 +2826,17 @@ void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method
group->RemoveMember(guid, method, kicker, reason);
}
-void Player::SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend, float /*group_rate*/)
+void Player::SendLogXPGain(uint32 givenXP, Unit* victim, uint32 bonusXP, bool recruitAFriend, float groupBonus)
{
- WorldPacket data(SMSG_LOG_XP_GAIN, 21); // guess size?
- data << (victim ? victim->GetGUID() : ObjectGuid::Empty);
- data << uint32(GivenXP + BonusXP); // given experience
- data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
+ WorldPackets::Character::LogXPGain packet;
+ packet.Victim = victim ? victim->GetGUID() : ObjectGuid::Empty;
+ packet.Original = givenXP + bonusXP;
+ packet.Reason = victim ? LOG_XP_REASON_KILL: LOG_XP_REASON_NO_KILL;
+ packet.Amount = givenXP;
+ packet.GroupBonus = groupBonus;
+ packet.ReferAFriend = recruitAFriend;
- if (victim)
- {
- data << uint32(GivenXP); // experience without bonus
-
- // should use group_rate here but can't figure out how
- data << float(1); // 1 - none 0 - 100% group bonus output
- }
-
- data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
- GetSession()->SendPacket(&data);
+ GetSession()->SendPacket(packet.Write());
}
void Player::GiveXP(uint32 xp, Unit* victim, float group_rate)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index c6da897617e..104531d84e2 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1068,6 +1068,12 @@ enum PlayerCommandStates
CHEAT_WATERWALK = 0x10
};
+enum PlayerLogXPReason
+{
+ LOG_XP_REASON_KILL = 0,
+ LOG_XP_REASON_NO_KILL = 1
+};
+
class PlayerTaxi
{
public:
@@ -2110,7 +2116,7 @@ class Player : public Unit, public GridObject<Player>
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
void DestroyForPlayer(Player* target) const override;
- void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate=1.0f);
+ void SendLogXPGain(uint32 givenXP, Unit* victim, uint32 bonusXP, bool recruitAFriend = false, float groupBonus = 1.0f);
// notifiers
void SendAttackSwingCantAttack();
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index ca1f22b3faa..75615e18bd4 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -195,7 +195,8 @@ namespace Trinity
if (isRaid)
{
// FIXME: Must apply decrease modifiers depending on raid size.
- rate = 1.0f;
+ // set to < 1 to, so client will display raid related strings
+ rate = 0.99f;
}
else
{
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index ac55f01d657..257c8065fa2 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -443,3 +443,17 @@ WorldPacket const* WorldPackets::Character::BarberShopResultServer::Write()
_worldPacket << int32(Result);
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Character::LogXPGain::Write()
+{
+ _worldPacket << Victim;
+ _worldPacket << int32(Original);
+ _worldPacket << uint8(Reason);
+ _worldPacket << int32(Amount);
+ _worldPacket << float(GroupBonus);
+ _worldPacket.WriteBit(ReferAFriend);
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index d6a7f06b796..8541f00a402 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -610,6 +610,21 @@ namespace WorldPackets
BarberShopResult Result;
};
+
+ class LogXPGain final : public ServerPacket
+ {
+ public:
+ LogXPGain() : ServerPacket(SMSG_LOG_XP_GAIN, 30) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Victim;
+ int32 Original = 0;
+ uint8 Reason = 0;
+ int32 Amount = 0;
+ float GroupBonus = 0;
+ bool ReferAFriend = false;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index d1f68da912c..dc255d3ac1c 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1304,7 +1304,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);