TrinityCore
Loading...
Searching...
No Matches
Corpse.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITYCORE_CORPSE_H
19#define TRINITYCORE_CORPSE_H
20
21#include "Object.h"
22#include "GridObject.h"
23#include "DatabaseEnvFwd.h"
24#include "GridDefines.h"
25#include "IteratorPair.h"
26
27struct Loot;
28
35#define MAX_CORPSE_TYPE 3
36
37// Value equal client resurrection dialog show radius.
38#define CORPSE_RECLAIM_RADIUS 39
39
51
53
54class TC_GAME_API Corpse final : public WorldObject, public GridObject<Corpse>
55{
56 public:
57 explicit Corpse(CorpseType type = CORPSE_BONES);
58 ~Corpse();
59
60 protected:
61 void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
62 void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
63 void ClearValuesChangesMask() override;
64
65 public:
66 void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
67 UF::CorpseData::Mask const& requestedCorpseMask, Player const* target, bool ignoreNestedChangesMask) const;
68
69 struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
70 {
71 explicit ValuesUpdateForPlayerWithMaskSender(Corpse const* owner) : Owner(owner), IgnoreNestedChangesMask(false) { }
72
73 Corpse const* Owner;
77
78 void operator()(Player const* player) const;
79 };
80
81 void AddToWorld() override;
82 void RemoveFromWorld() override;
83
84 bool Create(ObjectGuid::LowType guidlow, Map* map);
85 bool Create(ObjectGuid::LowType guidlow, Player* owner);
86
87 void Update(uint32 diff) override;
88
89 void SaveToDB();
90 bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields);
91
92 void DeleteFromDB(CharacterDatabaseTransaction trans);
93 static void DeleteFromDB(ObjectGuid const& ownerGuid, CharacterDatabaseTransaction trans);
94
95 CorpseFlags GetCorpseFlags() const { return CorpseFlags(*m_corpseData->Flags); }
96 bool HasCorpseFlag(CorpseFlags flags) const { return (*m_corpseData->Flags & flags) != 0; }
100
101 CorpseDynFlags GetCorpseDynamicFlags() const { return CorpseDynFlags(*m_corpseData->DynamicFlags); }
102 bool HasCorpseDynamicFlag(CorpseDynFlags flags) const { return (*m_corpseData->DynamicFlags & flags) != 0; }
103 void SetCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DynamicFlags), dynamicFlags); }
104 void RemoveCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DynamicFlags), dynamicFlags); }
105 void ReplaceAllCorpseDynamicFlags(CorpseDynFlags dynamicFlags) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DynamicFlags), dynamicFlags); }
106
107 ObjectGuid GetCreatorGUID() const override { return m_corpseData->Owner; }
108 ObjectGuid GetOwnerGUID() const override { return m_corpseData->Owner; }
109 void SetOwnerGUID(ObjectGuid owner) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Owner), owner); }
110 ObjectGuid GetPartyGUID() const { return m_corpseData->PartyGUID; }
111 void SetPartyGUID(ObjectGuid partyGuid) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::PartyGUID), partyGuid); }
112 ObjectGuid GetGuildGUID() const { return m_corpseData->GuildGUID; }
113 void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::GuildGUID), guildGuid); }
114 uint32 GetDisplayId() const { return m_corpseData->DisplayID; }
115 void SetDisplayId(uint32 displayId) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DisplayID), displayId); }
116 uint8 GetRace() const { return m_corpseData->RaceID; }
117 void SetRace(uint8 race) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::RaceID), race); }
118 uint8 GetClass() const { return m_corpseData->Class; }
119 void SetClass(uint8 playerClass) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Class), playerClass); }
120 uint8 GetSex() const { return m_corpseData->Sex; }
121 void SetSex(uint8 sex) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Sex), sex); }
122 uint32 GetFactionTemplate() const { return m_corpseData->FactionTemplate; }
123 void SetFactionTemplate(int32 factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::FactionTemplate), factionTemplate); }
124 uint32 GetFaction() const override { return m_corpseData->FactionTemplate; }
125 void SetFaction(uint32 faction) override { SetFactionTemplate(faction); }
126 uint32 GetItem(uint32 slot) const { return m_corpseData->Items[slot]; }
127 void SetItem(uint32 slot, uint32 item) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Items, slot), item); }
128
129 std::span<UF::ChrCustomizationChoice const> GetCustomizations() const { return { m_corpseData->Customizations.begin(), m_corpseData->Customizations.end() }; }
130 void SetCustomizations(std::span<UF::ChrCustomizationChoice const> customizations)
131 {
133 for (UF::ChrCustomizationChoice const& customization : customizations)
134 AddDynamicUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Customizations)) = customization;
135 }
136
137 time_t const& GetGhostTime() const { return m_time; }
138 void ResetGhostTime();
139 CorpseType GetType() const { return m_type; }
140
141 std::unique_ptr<Loot> m_loot;
142 Loot* GetLootForPlayer(Player const* /*player*/) const override { return m_loot.get(); }
143
145
146 bool IsExpired(time_t t) const;
147
149
150 private:
152 time_t m_time;
153};
154#endif
CorpseType
Definition Corpse.h:30
@ CORPSE_RESURRECTABLE_PVE
Definition Corpse.h:32
@ CORPSE_RESURRECTABLE_PVP
Definition Corpse.h:33
@ CORPSE_BONES
Definition Corpse.h:31
CorpseFlags
Definition Corpse.h:41
@ CORPSE_FLAG_UNK1
Definition Corpse.h:44
@ CORPSE_FLAG_FFA_PVP
Definition Corpse.h:49
@ CORPSE_FLAG_HIDE_CLOAK
Definition Corpse.h:47
@ CORPSE_FLAG_NONE
Definition Corpse.h:42
@ CORPSE_FLAG_BONES
Definition Corpse.h:43
@ CORPSE_FLAG_SKINNABLE
Definition Corpse.h:48
@ CORPSE_FLAG_HIDE_HELM
Definition Corpse.h:46
@ CORPSE_FLAG_PVP
Definition Corpse.h:45
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
#define TC_GAME_API
Definition Define.h:129
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
uint16 flags
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
@ TYPEID_CORPSE
Definition ObjectGuid.h:48
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
CorpseDynFlags
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
Definition BaseEntity.h:221
void SetUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
Definition BaseEntity.h:228
void ClearDynamicUpdateFieldValues(UF::DynamicUpdateFieldSetter< T > setter)
Definition BaseEntity.h:263
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
Definition BaseEntity.h:242
void RemoveUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
Definition BaseEntity.h:235
uint32 GetDisplayId() const
Definition Corpse.h:114
void SetFaction(uint32 faction) override
Definition Corpse.h:125
void SetRace(uint8 race)
Definition Corpse.h:117
ObjectGuid GetPartyGUID() const
Definition Corpse.h:110
void SetClass(uint8 playerClass)
Definition Corpse.h:119
uint8 GetRace() const
Definition Corpse.h:116
bool HasCorpseDynamicFlag(CorpseDynFlags flags) const
Definition Corpse.h:102
Loot * GetLootForPlayer(Player const *) const override
Definition Corpse.h:142
uint8 GetClass() const
Definition Corpse.h:118
void SetSex(uint8 sex)
Definition Corpse.h:121
bool HasCorpseFlag(CorpseFlags flags) const
Definition Corpse.h:96
ObjectGuid GetGuildGUID() const
Definition Corpse.h:112
void SetGuildGUID(ObjectGuid guildGuid)
Definition Corpse.h:113
void SetDisplayId(uint32 displayId)
Definition Corpse.h:115
void SetCorpseFlag(CorpseFlags flags)
Definition Corpse.h:97
Player * lootRecipient
Definition Corpse.h:144
void RemoveCorpseDynamicFlag(CorpseDynFlags dynamicFlags)
Definition Corpse.h:104
CorpseType m_type
Definition Corpse.h:151
CorpseDynFlags GetCorpseDynamicFlags() const
Definition Corpse.h:101
void ReplaceAllCorpseFlags(CorpseFlags flags)
Definition Corpse.h:99
void SetFactionTemplate(int32 factionTemplate)
Definition Corpse.h:123
void SetOwnerGUID(ObjectGuid owner)
Definition Corpse.h:109
void SetCorpseDynamicFlag(CorpseDynFlags dynamicFlags)
Definition Corpse.h:103
void SetPartyGUID(ObjectGuid partyGuid)
Definition Corpse.h:111
UF::UpdateField< UF::CorpseData, int32(WowCS::EntityFragment::CGObject), TYPEID_CORPSE > m_corpseData
Definition Corpse.h:148
uint32 GetFaction() const override
Definition Corpse.h:124
std::unique_ptr< Loot > m_loot
Definition Corpse.h:141
ObjectGuid GetCreatorGUID() const override
Definition Corpse.h:107
time_t const & GetGhostTime() const
Definition Corpse.h:137
time_t m_time
Definition Corpse.h:152
void ReplaceAllCorpseDynamicFlags(CorpseDynFlags dynamicFlags)
Definition Corpse.h:105
uint32 GetItem(uint32 slot) const
Definition Corpse.h:126
CorpseFlags GetCorpseFlags() const
Definition Corpse.h:95
ObjectGuid GetOwnerGUID() const override
Definition Corpse.h:108
void RemoveCorpseFlag(CorpseFlags flags)
Definition Corpse.h:98
std::span< UF::ChrCustomizationChoice const > GetCustomizations() const
Definition Corpse.h:129
uint8 GetSex() const
Definition Corpse.h:120
void SetCustomizations(std::span< UF::ChrCustomizationChoice const > customizations)
Definition Corpse.h:130
uint32 GetFactionTemplate() const
Definition Corpse.h:122
CorpseType GetType() const
Definition Corpse.h:139
void SetItem(uint32 slot, uint32 item)
Definition Corpse.h:127
Class used to access individual fields of database query result.
Definition Field.h:94
Definition Map.h:227
uint64 LowType
Definition ObjectGuid.h:321
virtual void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void ClearValuesChangesMask()
Definition Object.cpp:130
void AddToWorld() override
Definition Object.cpp:363
void RemoveFromWorld() override
Definition Object.cpp:369
virtual void Update(uint32 diff)
Definition Object.cpp:243
UpdateFieldFlag
Definition UpdateField.h:37
ValuesUpdateForPlayerWithMaskSender(Corpse const *owner)
Definition Corpse.h:71
Definition Loot.h:286
UpdateFieldArray< uint32, 19, 13, 14 > Items
UpdateField< uint32, 0, 6 > DisplayID
UpdateField< uint8, 0, 7 > RaceID
UpdateField< uint8, 0, 9 > Class
DynamicUpdateField< UF::ChrCustomizationChoice, 0, 1 > Customizations
UpdateField< uint32, 0, 10 > Flags
UpdateField< ObjectGuid, 0, 4 > PartyGUID
UpdateField< ObjectGuid, 0, 3 > Owner
UpdateField< uint8, 0, 8 > Sex
UpdateField< int32, 0, 11 > FactionTemplate
UpdateField< uint32, 0, 2 > DynamicFlags
UpdateField< ObjectGuid, 0, 5 > GuildGUID