DDraceNetwork Docs
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
9
11#include <game/client/skin.h>
12
13#include <chrono>
14#include <string_view>
15#include <unordered_map>
16
17class CHttpRequest;
18
19class CSkins : public CComponent
20{
21public:
22 CSkins();
23
24 typedef std::function<void()> TSkinLoadedCallback;
25
26 int Sizeof() const override { return sizeof(*this); }
27 void OnInit() override;
28 void OnShutdown() override;
29 void OnRender() override;
30
31 void Refresh(TSkinLoadedCallback &&SkinLoadedCallback);
32 std::chrono::nanoseconds LastRefreshTime() const { return m_LastRefreshTime; }
33
34 const std::unordered_map<std::string_view, std::unique_ptr<CSkin>> &GetSkinsUnsafe() const { return m_Skins; }
35 const CSkin *FindOrNullptr(const char *pName, bool IgnorePrefix = false);
36 const CSkin *Find(const char *pName);
37
38 void RandomizeSkin(int Dummy);
39
40 static bool IsVanillaSkin(const char *pName);
41 static bool IsSpecialSkin(const char *pName);
42
43private:
44 constexpr static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear",
45 "cammo", "cammostripes", "coala", "default", "limekitty",
46 "pinky", "redbopp", "redstripe", "saddo", "toptri",
47 "twinbop", "twintri", "warpaint", "x_ninja", "x_spec"};
48
49 class CSkinDownloadJob : public IJob
50 {
51 public:
52 CSkinDownloadJob(CSkins *pSkins, const char *pName);
54
55 bool Abort() override REQUIRES(!m_Lock);
56
58
59 protected:
60 void Run() override REQUIRES(!m_Lock);
61
62 private:
66 std::shared_ptr<CHttpRequest> m_pGetRequest;
68 };
69
71 {
72 private:
74
75 public:
76 std::shared_ptr<CSkinDownloadJob> m_pDownloadJob = nullptr;
77
78 CLoadingSkin(CLoadingSkin &&Other) = default;
79 CLoadingSkin(const char *pName);
81
82 bool operator<(const CLoadingSkin &Other) const;
83 bool operator<(const char *pOther) const;
84 bool operator==(const char *pOther) const;
85
86 CLoadingSkin &operator=(CLoadingSkin &&Other) = default;
87
88 const char *Name() const { return m_aName; }
89 };
90
91 std::unordered_map<std::string_view, std::unique_ptr<CSkin>> m_Skins;
92
93 std::unordered_map<std::string_view, std::unique_ptr<CLoadingSkin>> m_LoadingSkins;
94 std::chrono::nanoseconds m_LastRefreshTime;
95
98
99 const CSkin *LoadSkin(const char *pName, const char *pPath, int DirType);
100 const CSkin *LoadSkin(const char *pName, CImageInfo &Info);
101 const CSkin *FindImpl(const char *pName);
102 static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser);
103};
104#endif
Definition: component.h:20
Definition: http.h:53
Definition: image.h:12
Definition: lock.h:88
Definition: skins.h:71
const char * Name() const
Definition: skins.h:88
CLoadingSkin & operator=(CLoadingSkin &&Other)=default
CLoadingSkin(CLoadingSkin &&Other)=default
Definition: skins.h:50
void Run() override REQUIRES(!m_Lock)
Definition: skins.cpp:525
CImageInfo & ImageInfo()
Definition: skins.h:57
CImageInfo m_ImageInfo
Definition: skins.h:67
CSkinDownloadJob(CSkins *pSkins, const char *pName)
Definition: skins.cpp:497
bool Abort() override REQUIRES(!m_Lock)
Definition: skins.cpp:509
CSkins * m_pSkins
Definition: skins.h:63
~CSkinDownloadJob()
Definition: skins.cpp:504
char m_aName[MAX_SKIN_LENGTH]
Definition: skins.h:64
std::shared_ptr< CHttpRequest > m_pGetRequest
Definition: skins.h:66
CLock m_Lock
Definition: skins.h:65
Definition: skins.h:20
void OnRender() override
Definition: skins.cpp:329
const CSkin * LoadSkin(const char *pName, const char *pPath, int DirType)
Definition: skins.cpp:128
const std::unordered_map< std::string_view, std::unique_ptr< CSkin > > & GetSkinsUnsafe() const
Definition: skins.h:34
char m_aEventSkinPrefix[MAX_SKIN_LENGTH]
Definition: skins.h:97
static bool IsVanillaSkin(const char *pName)
Definition: skins.cpp:45
CSkin m_PlaceholderSkin
Definition: skins.h:96
const CSkin * FindOrNullptr(const char *pName, bool IgnorePrefix=false)
Definition: skins.cpp:390
void OnShutdown() override
Definition: skins.cpp:324
std::unordered_map< std::string_view, std::unique_ptr< CSkin > > m_Skins
Definition: skins.h:91
CSkins()
Definition: skins.cpp:25
const CSkin * FindImpl(const char *pName)
Definition: skins.cpp:413
int Sizeof() const override
Definition: skins.h:26
void OnInit() override
Definition: skins.cpp:306
std::function< void()> TSkinLoadedCallback
Definition: skins.h:24
void RandomizeSkin(int Dummy)
Definition: skins.cpp:449
static bool IsSpecialSkin(const char *pName)
Definition: skins.cpp:50
static constexpr const char * VANILLA_SKINS[]
Definition: skins.h:44
const CSkin * Find(const char *pName)
Definition: skins.cpp:376
std::unordered_map< std::string_view, std::unique_ptr< CLoadingSkin > > m_LoadingSkins
Definition: skins.h:93
static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser)
Definition: skins.cpp:62
void Refresh(TSkinLoadedCallback &&SkinLoadedCallback)
Definition: skins.cpp:357
std::chrono::nanoseconds m_LastRefreshTime
Definition: skins.h:94
std::chrono::nanoseconds LastRefreshTime() const
Definition: skins.h:32
Definition: jobs.h:20
@ MAX_SKIN_LENGTH
Definition: protocol.h:100
bool operator==(const SHA256_DIGEST &that, const SHA256_DIGEST &other)
Definition: hash.h:36
#define REQUIRES(...)
Definition: lock.h:32
Definition: skin.h:15
bool operator<(const ColorRGBA &Left, const ColorRGBA &Right)
Definition: tileart.cpp:8