DDraceNetwork Documentation
Loading...
Searching...
No Matches
skins.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef GAME_CLIENT_COMPONENTS_SKINS_H
4#define GAME_CLIENT_COMPONENTS_SKINS_H
5
6#include <base/lock.h>
7
10
12#include <game/client/skin.h>
13
14#include <chrono>
15#include <list>
16#include <optional>
17#include <set>
18#include <string_view>
19#include <unordered_map>
20#include <utility>
21
22class CHttpRequest;
23
24class CSkins : public CComponent
25{
26private:
30 static constexpr size_t NORMALIZED_SKIN_NAME_LENGTH = 2 * MAX_SKIN_LENGTH;
31
43
48 {
49 public:
51 virtual ~CAbstractSkinLoadJob();
52
54 bool m_NotFound = false;
55
56 protected:
59 };
60
61public:
66 {
67 friend class CSkins;
68
69 public:
70 enum class EType
71 {
75 LOCAL,
80 };
81
82 enum class EState
83 {
92 PENDING,
96 LOADING,
100 LOADED,
104 ERROR,
108 NOT_FOUND,
109 };
110
112 CSkinContainer(CSkins *pSkins, const char *pName, const char *pNormalizedName, EType Type, int StorageType);
114
115 bool operator<(const CSkinContainer &Other) const;
117
118 const char *Name() const { return m_aName; }
119 const char *NormalizedName() const { return m_aNormalizedName; }
120 EType Type() const { return m_Type; }
121 int StorageType() const { return m_StorageType; }
122 bool IsVanilla() const { return m_Vanilla; }
123 bool IsSpecial() const { return m_Special; }
124 bool IsAlwaysLoaded() const { return m_AlwaysLoaded; }
125 EState State() const { return m_State; }
126 const std::unique_ptr<CSkin> &Skin() const { return m_pSkin; }
127
131 void RequestLoad();
132
133 private:
142
144 std::unique_ptr<CSkin> m_pSkin = nullptr;
145 std::shared_ptr<CAbstractSkinLoadJob> m_pLoadJob = nullptr;
146
150 std::optional<std::chrono::nanoseconds> m_FirstLoadRequest;
154 std::optional<std::chrono::nanoseconds> m_LastLoadRequest;
158 std::optional<std::list<std::string_view>::iterator> m_UsageEntryIterator;
159
161 void SetState(EState State);
162 };
163
168 {
169 public:
179
180 bool operator<(const CSkinListEntry &Other) const;
181
183 bool IsFavorite() const { return m_Favorite; }
184 bool IsSelectedMain() const { return m_SelectedMain; }
185 bool IsSelectedDummy() const { return m_SelectedDummy; }
186 const std::optional<std::pair<int, int>> &NameMatch() const { return m_NameMatch; }
187
188 const void *ListItemId() const { return &m_ListItemId; }
189 const void *FavoriteButtonId() const { return &m_FavoriteButtonId; }
190 const void *ErrorTooltipId() const { return &m_ErrorTooltipId; }
191
195 void RequestLoad();
196
197 private:
202 std::optional<std::pair<int, int>> m_NameMatch;
206 };
207
209 {
210 friend class CSkins;
211
212 public:
213 std::vector<CSkinListEntry> &Skins() { return m_vSkins; }
214 int UnfilteredCount() const { return m_UnfilteredCount; }
215 void ForceRefresh() { m_NeedsUpdate = true; }
216
217 private:
218 std::vector<CSkinListEntry> m_vSkins;
220 bool m_NeedsUpdate = true;
221 };
222
224 {
225 public:
226 size_t m_NumUnloaded = 0;
227 size_t m_NumPending = 0;
228 size_t m_NumLoading = 0;
229 size_t m_NumLoaded = 0;
230 size_t m_NumError = 0;
231 size_t m_NumNotFound = 0;
232 };
233
234 CSkins();
235
236 typedef std::function<void()> TSkinLoadedCallback;
237
238 int Sizeof() const override { return sizeof(*this); }
239 void OnConsoleInit() override;
240 void OnInit() override;
241 void OnShutdown() override;
242 void OnUpdate() override;
243
245 CSkinLoadingStats LoadingStats() const;
246 CSkinList &SkinList();
247
248 const CSkinContainer *FindContainerOrNullptr(const char *pName);
249 const CSkin *FindOrNullptr(const char *pName);
250 const CSkin *Find(const char *pName);
251
252 void AddFavorite(const char *pName);
253 void RemoveFavorite(const char *pName);
254 bool IsFavorite(const char *pName) const;
255
256 void RandomizeSkin(int Dummy);
257
258 const char *SkinPrefix() const;
259
260 static bool IsSpecialSkin(const char *pName);
261
262private:
263 static bool IsVanillaSkinNormalized(const char *pNormalizedName);
264 static bool IsSpecialSkinNormalized(const char *pNormalizedName);
265
271 constexpr static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear",
272 "cammo", "cammostripes", "coala", "default", "limekitty",
273 "pinky", "redbopp", "redstripe", "saddo", "toptri",
274 "twinbop", "twintri", "warpaint", "x_ninja", "x_spec"};
275
277 {
278 public:
279 CSkinLoadJob(CSkins *pSkins, const char *pName, int StorageType);
280
281 protected:
282 void Run() override;
283
284 private:
286 };
287
289 {
290 public:
291 CSkinDownloadJob(CSkins *pSkins, const char *pName);
292
293 bool Abort() override REQUIRES(!m_Lock);
294
295 protected:
296 void Run() override REQUIRES(!m_Lock);
297
298 private:
300 std::shared_ptr<CHttpRequest> m_pGetRequest GUARDED_BY(m_Lock);
301 };
302
303 std::unordered_map<std::string_view, std::unique_ptr<CSkinContainer>> m_Skins;
304 std::optional<std::chrono::nanoseconds> m_ContainerUpdateTime;
309 std::list<std::string_view> m_SkinsUsageList;
310
312 std::set<std::string> m_Favorites;
313
316
317 bool LoadSkinData(const char *pName, CSkinLoadData &Data) const;
319 void LoadSkinDirect(const char *pName);
320 const CSkinContainer *FindContainerImpl(const char *pName);
321 static int SkinScan(const char *pName, int IsDir, int StorageType, void *pUser);
322
325 void UpdateFinishLoading(CSkinLoadingStats &Stats, std::chrono::nanoseconds StartTime, std::chrono::nanoseconds MaxTime);
326
332};
333#endif
Definition component.h:165
Definition http.h:55
Definition image.h:12
Definition lock.h:90
Definition skin.h:79
Definition skin.h:11
Definition skins.h:48
char m_aName[MAX_SKIN_LENGTH]
Definition skins.h:58
bool m_NotFound
Definition skins.h:54
CSkins * m_pSkins
Definition skins.h:57
CSkinLoadData m_Data
Definition skins.h:53
virtual ~CAbstractSkinLoadJob()
Definition skins.cpp:31
Definition skins.h:66
EState State() const
Definition skins.h:125
EType m_Type
Definition skins.h:137
bool m_AlwaysLoaded
Definition skins.h:141
std::shared_ptr< CAbstractSkinLoadJob > m_pLoadJob
Definition skins.h:145
CSkins * m_pSkins
Definition skins.h:134
EState m_State
Definition skins.h:143
bool IsVanilla() const
Definition skins.h:122
EType Type() const
Definition skins.h:120
~CSkinContainer()
Definition skins.cpp:55
bool operator<(const CSkinContainer &Other) const
Definition skins.cpp:63
bool m_Special
Definition skins.h:140
char m_aName[MAX_SKIN_LENGTH]
Definition skins.h:135
int StorageType() const
Definition skins.h:121
EState
Definition skins.h:83
bool IsSpecial() const
Definition skins.h:123
bool m_Vanilla
Definition skins.h:139
const char * NormalizedName() const
Definition skins.h:119
void SetState(EState State)
Definition skins.cpp:137
void RequestLoad()
Definition skins.cpp:75
EState DetermineInitialState() const
Definition skins.cpp:118
std::optional< std::chrono::nanoseconds > m_FirstLoadRequest
Definition skins.h:150
const char * Name() const
Definition skins.h:118
EType
Definition skins.h:71
std::unique_ptr< CSkin > m_pSkin
Definition skins.h:144
std::optional< std::chrono::nanoseconds > m_LastLoadRequest
Definition skins.h:154
CSkinContainer & operator=(CSkinContainer &&Other)=default
bool IsAlwaysLoaded() const
Definition skins.h:124
std::optional< std::list< std::string_view >::iterator > m_UsageEntryIterator
Definition skins.h:158
CSkinContainer(CSkinContainer &&Other)=default
char m_aNormalizedName[NORMALIZED_SKIN_NAME_LENGTH]
Definition skins.h:136
const std::unique_ptr< CSkin > & Skin() const
Definition skins.h:126
int m_StorageType
Definition skins.h:138
Definition skins.h:289
std::shared_ptr< CHttpRequest > m_pGetRequest GUARDED_BY(m_Lock)
void Run() override REQUIRES(!m_Lock)
Definition skins.cpp:1012
bool Abort() override REQUIRES(!m_Lock)
Definition skins.cpp:996
CLock m_Lock
Definition skins.h:299
Definition skins.h:168
const std::optional< std::pair< int, int > > & NameMatch() const
Definition skins.h:186
CSkinContainer * m_pSkinContainer
Definition skins.h:198
bool operator<(const CSkinListEntry &Other) const
Definition skins.cpp:164
char m_ListItemId
Definition skins.h:203
const void * ErrorTooltipId() const
Definition skins.h:190
bool m_SelectedMain
Definition skins.h:200
CSkinListEntry()
Definition skins.h:170
bool IsFavorite() const
Definition skins.h:183
bool m_SelectedDummy
Definition skins.h:201
std::optional< std::pair< int, int > > m_NameMatch
Definition skins.h:202
CSkinListEntry(CSkinContainer *pSkinContainer, bool Favorite, bool SelectedMain, bool SelectedDummy, std::optional< std::pair< int, int > > NameMatch)
Definition skins.h:173
bool IsSelectedMain() const
Definition skins.h:184
bool IsSelectedDummy() const
Definition skins.h:185
const CSkinContainer * SkinContainer() const
Definition skins.h:182
const void * ListItemId() const
Definition skins.h:188
char m_FavoriteButtonId
Definition skins.h:204
char m_ErrorTooltipId
Definition skins.h:205
const void * FavoriteButtonId() const
Definition skins.h:189
bool m_Favorite
Definition skins.h:199
void RequestLoad()
Definition skins.cpp:177
Definition skins.h:209
void ForceRefresh()
Definition skins.h:215
int m_UnfilteredCount
Definition skins.h:219
std::vector< CSkinListEntry > & Skins()
Definition skins.h:213
std::vector< CSkinListEntry > m_vSkins
Definition skins.h:218
int UnfilteredCount() const
Definition skins.h:214
bool m_NeedsUpdate
Definition skins.h:220
Definition skins.h:36
CSkin::CSkinMetrics m_Metrics
Definition skins.h:40
CImageInfo m_Info
Definition skins.h:38
CImageInfo m_InfoGrayscale
Definition skins.h:39
ColorRGBA m_BloodColor
Definition skins.h:41
Definition skins.h:277
void Run() override
Definition skins.cpp:973
int m_StorageType
Definition skins.h:285
Definition skins.h:224
size_t m_NumUnloaded
Definition skins.h:226
size_t m_NumLoading
Definition skins.h:228
size_t m_NumError
Definition skins.h:230
size_t m_NumNotFound
Definition skins.h:231
size_t m_NumPending
Definition skins.h:227
size_t m_NumLoaded
Definition skins.h:229
Definition skins.h:25
std::set< std::string > m_Favorites
Definition skins.h:312
bool IsFavorite(const char *pName) const
Definition skins.cpp:900
void UpdateStartLoading(CSkinLoadingStats &Stats)
Definition skins.cpp:613
static void ConchainRefreshSkinList(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
Definition skins.cpp:1152
char m_aEventSkinPrefix[MAX_SKIN_LENGTH]
Definition skins.h:315
const CSkin * FindOrNullptr(const char *pName)
Definition skins.cpp:860
static bool IsVanillaSkinNormalized(const char *pNormalizedName)
Definition skins.cpp:209
void OnUpdate() override
Definition skins.cpp:540
std::unordered_map< std::string_view, std::unique_ptr< CSkinContainer > > m_Skins
Definition skins.h:303
static bool IsSpecialSkinNormalized(const char *pNormalizedName)
Definition skins.cpp:216
std::optional< std::chrono::nanoseconds > m_ContainerUpdateTime
Definition skins.h:304
void UpdateUnloadSkins(CSkinLoadingStats &Stats)
Definition skins.cpp:566
CSkin m_PlaceholderSkin
Definition skins.h:314
void OnShutdown() override
Definition skins.cpp:528
const CSkinContainer * FindContainerOrNullptr(const char *pName)
Definition skins.cpp:822
CSkins()
Definition skins.cpp:182
void RemoveFavorite(const char *pName)
Definition skins.cpp:888
static constexpr size_t NORMALIZED_SKIN_NAME_LENGTH
Definition skins.h:30
CSkinList & SkinList()
Definition skins.cpp:747
int Sizeof() const override
Definition skins.h:238
void OnInit() override
Definition skins.cpp:510
static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData)
Definition skins.cpp:1136
std::function< void()> TSkinLoadedCallback
Definition skins.h:236
CSkinLoadingStats LoadingStats() const
Definition skins.cpp:717
void RandomizeSkin(int Dummy)
Definition skins.cpp:907
void UpdateFinishLoading(CSkinLoadingStats &Stats, std::chrono::nanoseconds StartTime, std::chrono::nanoseconds MaxTime)
Definition skins.cpp:644
void LoadSkinFinish(CSkinContainer *pSkinContainer, const CSkinLoadData &Data)
Definition skins.cpp:426
static void ConRemFavoriteSkin(IConsole::IResult *pResult, void *pUserData)
Definition skins.cpp:1130
static bool IsSpecialSkin(const char *pName)
Definition skins.cpp:202
static void ConAddFavoriteSkin(IConsole::IResult *pResult, void *pUserData)
Definition skins.cpp:1124
static constexpr const char * VANILLA_SKINS[]
Definition skins.h:271
CSkinList m_SkinList
Definition skins.h:311
bool LoadSkinData(const char *pName, CSkinLoadData &Data) const
Definition skins.cpp:302
const CSkin * Find(const char *pName)
Definition skins.cpp:808
void OnConsoleInit() override
Definition skins.cpp:500
const char * SkinPrefix() const
Definition skins.cpp:960
void OnConfigSave(IConfigManager *pConfigManager)
Definition skins.cpp:1142
std::list< std::string_view > m_SkinsUsageList
Definition skins.h:309
void AddFavorite(const char *pName)
Definition skins.cpp:870
void Refresh(TSkinLoadedCallback &&SkinLoadedCallback)
Definition skins.cpp:691
void LoadSkinDirect(const char *pName)
Definition skins.cpp:466
static int SkinScan(const char *pName, int IsDir, int StorageType, void *pUser)
Definition skins.cpp:228
const CSkinContainer * FindContainerImpl(const char *pName)
Definition skins.cpp:839
Definition color.h:198
Definition config.h:9
Definition console.h:47
void(* FCommandCallback)(IResult *pResult, void *pUserData)
Definition console.h:91
Definition jobs.h:20
Definition vmath.h:15
@ MAX_SKIN_LENGTH
Definition protocol.h:100
#define REQUIRES(...)
Definition lock.h:34