/*
* 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_LOG_PACKETS_COMMON_H
#define TRINITYCORE_COMBAT_LOG_PACKETS_COMMON_H
#include "ObjectGuid.h"
#include "Packet.h"
class Spell;
class Unit;
namespace WorldPackets
{
namespace Spells
{
struct SpellLogPowerData
{
SpellLogPowerData(int8 powerType, int32 amount, int32 cost) : PowerType(powerType), Amount(amount), Cost(cost) { }
int8 PowerType = 0;
int32 Amount = 0;
int32 Cost = 0;
};
struct SpellCastLogData
{
int64 Health = 0;
int32 AttackPower = 0;
int32 SpellPower = 0;
int32 Armor = 0;
int32 Unknown_1105_1 = 0;
int32 Unknown_1105_2 = 0;
std::vector PowerData;
void Initialize(Unit const* unit);
void Initialize(Spell const* spell);
};
struct ContentTuningParams
{
enum ContentTuningType : uint32
{
TYPE_CREATURE_TO_PLAYER_DAMAGE = 1,
TYPE_PLAYER_TO_CREATURE_DAMAGE = 2,
TYPE_CREATURE_TO_PLAYER_HEALING = 3,
TYPE_PLAYER_TO_CREATURE_HEALING = 4,
TYPE_CREATURE_TO_CREATURE_DAMAGE = 5,
TYPE_CREATURE_TO_CREATURE_HEALING = 6,
TYPE_PLAYER_TO_PLAYER_DAMAGE = 7, // NYI
TYPE_PLAYER_TO_PLAYER_HEALING = 8,
};
enum ContentTuningFlags : uint32
{
NO_LEVEL_SCALING = 0x1,
NO_ITEM_LEVEL_SCALING = 0x2
};
uint32 Type = 0;
int16 PlayerLevelDelta = 0;
float PlayerItemLevel = 0;
float TargetItemLevel = 0;
int32 ScalingHealthItemLevelCurveID = 0;
int32 Unused1117 = 0;
int32 ScalingHealthPrimaryStatCurveID = 0;
uint8 TargetLevel = 0;
uint8 Expansion = 0;
int8 TargetScalingLevelDelta = 0;
uint32 Flags = NO_LEVEL_SCALING | NO_ITEM_LEVEL_SCALING;
int32 PlayerContentTuningID = 0;
int32 TargetContentTuningID = 0;
int32 TargetHealingContentTuningID = 0; // direct heal only, not periodic
float PlayerPrimaryStatToExpectedRatio = 1.0f;
template
bool GenerateDataForUnits(T* attacker, U* target);
};
struct SpellCastVisual
{
int32 SpellXSpellVisualID = 0;
int32 ScriptVisualID = 0;
};
struct SpellSupportInfo
{
ObjectGuid Supporter;
int32 SupportSpellID = 0;
int32 AmountRaw = 0;
float AmountPortion = 0.0f;
};
ByteBuffer& operator<<(ByteBuffer& data, SpellCastLogData const& spellCastLogData);
ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTuningParams);
ByteBuffer& operator>>(ByteBuffer& data, SpellCastVisual& visual);
ByteBuffer& operator<<(ByteBuffer& data, SpellCastVisual const& visual);
ByteBuffer& operator<<(ByteBuffer& data, SpellSupportInfo const& supportInfo);
}
namespace CombatLog
{
class CombatLogServerPacket : public ServerPacket
{
public:
CombatLogServerPacket(OpcodeServer opcode, size_t initialSize = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT)
: ServerPacket(opcode, initialSize, connection), _fullLogPacket(opcode, initialSize, connection) { }
WorldPacket const* GetFullLogPacket() const { return &_fullLogPacket; }
WorldPacket const* GetBasicLogPacket() const { return &_worldPacket; }
Spells::SpellCastLogData LogData;
protected:
template
void operator<<(T val)
{
_worldPacket << val;
_fullLogPacket << val;
}
template requires (!ByteBufferNumeric)
void operator<<(T const& val)
{
_worldPacket << val;
_fullLogPacket << val;
}
void WriteLogDataBit()
{
_worldPacket.WriteBit(false);
_fullLogPacket.WriteBit(true);
}
void FlushBits()
{
_worldPacket.FlushBits();
_fullLogPacket.FlushBits();
}
ByteBuffer& WriteLogData();
WorldPacket _fullLogPacket;
};
}
}
#endif // TRINITYCORE_COMBAT_LOG_PACKETS_COMMON_H