/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef TRINITYCORE_COMBAT_PACKETS_H
#define TRINITYCORE_COMBAT_PACKETS_H
#include "Packet.h"
#include "ObjectGuid.h"
#include "UnitDefines.h"
class Unit;
enum Powers : int8;
namespace WorldPackets
{
namespace Combat
{
class AttackSwing final : public ClientPacket
{
public:
explicit AttackSwing(WorldPacket&& packet) : ClientPacket(CMSG_ATTACK_SWING, std::move(packet)) { }
void Read() override;
ObjectGuid Victim;
};
class AttackSwingError final : public ServerPacket
{
public:
explicit AttackSwingError() : ServerPacket(SMSG_ATTACK_SWING_ERROR, 4) { }
explicit AttackSwingError(AttackSwingErr reason) : ServerPacket(SMSG_ATTACK_SWING_ERROR, 4), Reason(reason) { }
WorldPacket const* Write() override;
AttackSwingErr Reason = AttackSwingErr::CantAttack;
};
class AttackStop final : public ClientPacket
{
public:
explicit AttackStop(WorldPacket&& packet) : ClientPacket(CMSG_ATTACK_STOP, std::move(packet)) { }
void Read() override { }
};
class AttackStart final : public ServerPacket
{
public:
explicit AttackStart() : ServerPacket(SMSG_ATTACK_START, 16) { }
WorldPacket const* Write() override;
ObjectGuid Attacker;
ObjectGuid Victim;
};
class SAttackStop final : public ServerPacket
{
public:
explicit SAttackStop() : ServerPacket(SMSG_ATTACK_STOP, 16 + 16 + 1) { }
WorldPacket const* Write() override;
ObjectGuid Attacker;
ObjectGuid Victim;
bool NowDead = false;
};
struct ThreatInfo
{
ObjectGuid UnitGUID;
int64 Threat = 0;
};
class ThreatUpdate final : public ServerPacket
{
public:
explicit ThreatUpdate() : ServerPacket(SMSG_THREAT_UPDATE, 24) { }
WorldPacket const* Write() override;
ObjectGuid UnitGUID;
std::vector ThreatList;
};
class HighestThreatUpdate final : public ServerPacket
{
public:
explicit HighestThreatUpdate() : ServerPacket(SMSG_HIGHEST_THREAT_UPDATE, 44) { }
WorldPacket const* Write() override;
ObjectGuid UnitGUID;
std::vector ThreatList;
ObjectGuid HighestThreatGUID;
};
class ThreatRemove final : public ServerPacket
{
public:
explicit ThreatRemove() : ServerPacket(SMSG_THREAT_REMOVE, 16) { }
WorldPacket const* Write() override;
ObjectGuid AboutGUID; // Unit to remove threat from (e.g. player, pet, guardian)
ObjectGuid UnitGUID; // Unit being attacked (e.g. creature, boss)
};
class AIReaction final : public ServerPacket
{
public:
explicit AIReaction() : ServerPacket(SMSG_AI_REACTION, 12) { }
WorldPacket const* Write() override;
ObjectGuid UnitGUID;
uint32 Reaction = 0;
};
class CancelCombat final : public ServerPacket
{
public:
explicit CancelCombat() : ServerPacket(SMSG_CANCEL_COMBAT, 0) { }
WorldPacket const* Write() override { return &_worldPacket; }
};
struct PowerUpdatePower
{
PowerUpdatePower(int32 power, uint8 powerType) : Power(power), PowerType(powerType) { }
int32 Power = 0;
uint8 PowerType = 0;
};
class PowerUpdate final : public ServerPacket
{
public:
explicit PowerUpdate() : ServerPacket(SMSG_POWER_UPDATE, 16 + 4 + 1) { }
WorldPacket const* Write() override;
ObjectGuid Guid;
std::vector Powers;
};
class InterruptPowerRegen final : public ServerPacket
{
public:
explicit InterruptPowerRegen(Powers powerType) : ServerPacket(SMSG_INTERRUPT_POWER_REGEN, 1), PowerType(powerType) { }
WorldPacket const* Write() override;
Powers PowerType;
};
class SetSheathed final : public ClientPacket
{
public:
explicit SetSheathed(WorldPacket&& packet) : ClientPacket(CMSG_SET_SHEATHED, std::move(packet)) { }
void Read() override;
int32 CurrentSheathState = 0;
bool Animate = true;
};
class CancelAutoRepeat final : public ServerPacket
{
public:
explicit CancelAutoRepeat() : ServerPacket(SMSG_CANCEL_AUTO_REPEAT, 16) { }
WorldPacket const* Write() override;
ObjectGuid Guid;
};
class HealthUpdate final : public ServerPacket
{
public:
explicit HealthUpdate() : ServerPacket(SMSG_HEALTH_UPDATE, 16 + 4) { }
WorldPacket const* Write() override;
ObjectGuid Guid;
int64 Health = 0;
};
class ThreatClear final : public ServerPacket
{
public:
explicit ThreatClear() : ServerPacket(SMSG_THREAT_CLEAR, 16) { }
WorldPacket const* Write() override;
ObjectGuid UnitGUID;
};
class PvPCredit final : public ServerPacket
{
public:
explicit PvPCredit() : ServerPacket(SMSG_PVP_CREDIT, 4 + 16 + 4) { }
WorldPacket const* Write() override;
int32 OriginalHonor = 0;
int32 Honor = 0;
ObjectGuid Target;
int8 Rank = 0;
};
class BreakTarget final : public ServerPacket
{
public:
explicit BreakTarget() : ServerPacket(SMSG_BREAK_TARGET, 16) { }
WorldPacket const* Write() override;
ObjectGuid UnitGUID;
};
}
}
#endif // TRINITYCORE_COMBAT_PACKETS_H