TrinityCore
Loading...
Searching...
No Matches
UpdateFieldImpl.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_UPDATE_FIELD_IMPL_H
19#define TRINITYCORE_UPDATE_FIELD_IMPL_H
20
21#include "UpdateField.h"
22#include "ByteBuffer.h"
23
24class Player;
25
26namespace UF
27{
28inline void WriteDynamicFieldUpdateMask(std::size_t size, std::vector<uint32> const& updateMask, ByteBuffer& data, int32 bitsForSize /*= 32*/)
29{
30 data.WriteBits(size, bitsForSize);
31 if (size > 32)
32 {
33 if (data.HasUnfinishedBitPack())
34 for (std::size_t block = 0; block < size / 32; ++block)
35 data.WriteBits(updateMask[block], 32);
36 else
37 for (std::size_t block = 0; block < size / 32; ++block)
38 data << uint32(updateMask[block]);
39 }
40 else if (size == 32)
41 {
42 data.WriteBits(updateMask.back(), 32);
43 return;
44 }
45
46 if (size % 32)
47 data.WriteBits(updateMask.back(), size % 32);
48}
49
50inline void WriteCompleteDynamicFieldUpdateMask(std::size_t size, ByteBuffer& data, int32 bitsForSize = 32)
51{
52 data.WriteBits(size, bitsForSize);
53 if (size > 32)
54 {
55 if (data.HasUnfinishedBitPack())
56 for (std::size_t block = 0; block < size / 32; ++block)
57 data.WriteBits(0xFFFFFFFFu, 32);
58 else
59 for (std::size_t block = 0; block < size / 32; ++block)
60 data << uint32(0xFFFFFFFFu);
61 }
62 else if (size == 32)
63 {
64 data.WriteBits(0xFFFFFFFFu, 32);
65 return;
66 }
67
68 if (size % 32)
69 data.WriteBits(0xFFFFFFFFu, size % 32);
70}
71
72template <typename K, typename V, typename T>
73inline void WriteMapFieldCreate(MapUpdateFieldBase<K, V> const& map, ByteBuffer& data, Player const* receiver, T const* owner)
74{
75 data << uint32(map.size());
76 for (auto const& [k, v] : map)
77 {
78 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, K>)
79 k.WriteCreate(data, receiver, owner);
80 else
81 data << k;
82
83 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, V>)
84 v.value.WriteCreate(data, receiver, owner);
85 else
86 data << v.value;
87 }
88}
89
90template <typename K, typename V, typename T>
91inline void WriteMapFieldUpdate(MapUpdateFieldBase<K, V> const& map, bool ignoreChangesMask, ByteBuffer& data, Player const* receiver, T const* owner)
92{
93 data << uint8(ignoreChangesMask ? 1 : 0);
94 if (ignoreChangesMask)
95 UF::WriteMapFieldCreate(map, data, receiver, owner);
96 else
97 {
98 uint16 changesCount = 0;
99 size_t changesCountPos = data.wpos();
100 data << uint16(changesCount);
101
102 for (auto const& [k, v] : map)
103 {
104 if (v.state == MapUpdateFieldState::Unchanged)
105 continue;
106
107 ++changesCount;
108
109 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, K>)
110 k.WriteUpdate(false, data, receiver, owner);
111 else
112 data << k;
113
114 data << uint8(v.state);
115 if (v.state == MapUpdateFieldState::Deleted)
116 continue;
117
118 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, V>)
119 v.value.WriteUpdate(false, data, receiver, owner);
120 else
121 data << v.value;
122 }
123
124 data.put<uint16>(changesCountPos, changesCount);
125 }
126}
127
128template <typename T, typename O>
129inline void WriteSetFieldCreate(SetUpdateFieldBase<T> const& set, ByteBuffer& data, Player const* receiver, O const* owner)
130{
131 data << uint32(set.size());
132 for (auto const& [k, _] : set)
133 {
134 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, T>)
135 k.WriteCreate(data, receiver, owner);
136 else
137 data << k;
138 }
139}
140
141template <typename T, typename O>
142inline void WriteSetFieldUpdate(SetUpdateFieldBase<T> const& set, bool ignoreChangesMask, ByteBuffer& data, Player const* receiver, O const* owner)
143{
144 data << uint8(ignoreChangesMask ? 1 : 0);
145 if (ignoreChangesMask)
146 UF::WriteSetFieldCreate(set, data, receiver, owner);
147 else
148 {
149 uint16 changesCount = 0;
150 size_t changesCountPos = data.wpos();
151 data << uint16(changesCount);
152
153 for (auto const& [k, state] : set)
154 {
156 continue;
157
158 ++changesCount;
159
160 if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, T>)
161 k.WriteUpdate(false, data, receiver, owner);
162 else
163 data << k;
164
165 data << uint8(state);
166 }
167
168 data.put<uint16>(changesCountPos, changesCount);
169 }
170}
171}
172
173#endif // TRINITYCORE_UPDATE_FIELD_IMPL_H
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
size_t wpos() const
Definition ByteBuffer.h:461
void put(std::size_t pos, T value)
Definition ByteBuffer.h:260
bool HasUnfinishedBitPack() const
Definition ByteBuffer.h:136
void WriteBits(uint64 value, int32 bits)
Definition ByteBuffer.h:185
std::size_t size() const
std::size_t size() const
constexpr std::size_t size()
void WriteMapFieldCreate(MapUpdateFieldBase< K, V > const &map, ByteBuffer &data, Player const *receiver, T const *owner)
void WriteSetFieldUpdate(SetUpdateFieldBase< T > const &set, bool ignoreChangesMask, ByteBuffer &data, Player const *receiver, O const *owner)
void WriteCompleteDynamicFieldUpdateMask(std::size_t size, ByteBuffer &data, int32 bitsForSize=32)
void WriteDynamicFieldUpdateMask(std::size_t size, std::vector< uint32 > const &updateMask, ByteBuffer &data, int32 bitsForSize=32)
void WriteMapFieldUpdate(MapUpdateFieldBase< K, V > const &map, bool ignoreChangesMask, ByteBuffer &data, Player const *receiver, T const *owner)
void WriteSetFieldCreate(SetUpdateFieldBase< T > const &set, ByteBuffer &data, Player const *receiver, O const *owner)