1#include "background.h"
2
3#include <base/system.h>
4
5#include <engine/map.h>
6#include <engine/shared/config.h>
7
8#include <game/client/components/mapimages.h>
9#include <game/client/components/maplayers.h>
10#include <game/client/gameclient.h>
11#include <game/layers.h>
12#include <game/localization.h>
13
14CBackground::CBackground(ERenderType MapType, bool OnlineOnly) :
15 CMapLayers(MapType, OnlineOnly)
16{
17 m_pLayers = new CLayers;
18 m_pBackgroundLayers = m_pLayers;
19 m_pImages = new CMapImages;
20 m_pBackgroundImages = m_pImages;
21 m_Loaded = false;
22 m_aMapName[0] = '\0';
23}
24
25CBackground::~CBackground()
26{
27 delete m_pBackgroundLayers;
28 delete m_pBackgroundImages;
29}
30
31void CBackground::OnInit()
32{
33 m_pBackgroundMap = CreateMap();
34 m_pMap = m_pBackgroundMap.get();
35
36 m_pImages->OnInterfacesInit(pClient: GameClient());
37 if(g_Config.m_ClBackgroundEntities[0] != '\0' && str_comp(a: g_Config.m_ClBackgroundEntities, CURRENT_MAP))
38 LoadBackground();
39}
40
41void CBackground::LoadBackground()
42{
43 if(m_Loaded && m_pMap == m_pBackgroundMap.get())
44 m_pMap->Unload();
45
46 m_Loaded = false;
47 m_pMap = m_pBackgroundMap.get();
48 m_pLayers = m_pBackgroundLayers;
49 m_pImages = m_pBackgroundImages;
50
51 str_copy(dst&: m_aMapName, src: g_Config.m_ClBackgroundEntities);
52 if(g_Config.m_ClBackgroundEntities[0] != '\0')
53 {
54 bool NeedImageLoading = false;
55
56 char aBuf[IO_MAX_PATH_LENGTH];
57 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: "maps/%s%s", g_Config.m_ClBackgroundEntities, str_endswith(str: g_Config.m_ClBackgroundEntities, suffix: ".map") ? "" : ".map");
58 if(str_comp(a: g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0)
59 {
60 m_pMap = GameClient()->Map();
61 if(m_pMap->IsLoaded())
62 {
63 m_pLayers = GameClient()->Layers();
64 m_pImages = &GameClient()->m_MapImages;
65 m_Loaded = true;
66 }
67 }
68 else if(m_pMap->Load(pFullName: g_Config.m_ClBackgroundEntities, pStorage: Storage(), pPath: aBuf, StorageType: IStorage::TYPE_ALL))
69 {
70 m_pLayers->Init(pMap: m_pMap, GameOnly: true);
71 NeedImageLoading = true;
72 m_Loaded = true;
73 }
74
75 if(m_Loaded)
76 {
77 if(NeedImageLoading)
78 {
79 m_pImages->LoadBackground(pLayers: m_pLayers, pMap: m_pMap);
80 }
81 CMapLayers::OnMapLoad();
82 }
83 }
84}
85
86void CBackground::OnMapLoad()
87{
88 if(str_comp(a: g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0 || str_comp(a: g_Config.m_ClBackgroundEntities, b: m_aMapName))
89 {
90 LoadBackground();
91 }
92}
93
94void CBackground::OnRender()
95{
96 if(!m_Loaded)
97 return;
98
99 if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
100 return;
101
102 if(g_Config.m_ClOverlayEntities != 100)
103 return;
104
105 CMapLayers::OnRender();
106}
107