ddnet/src/game/client/components/background.cpp

112 lines
2.5 KiB
C++
Raw Normal View History

2015-08-27 14:28:25 +00:00
#include <base/system.h>
#include <engine/shared/config.h>
#include <engine/map.h>
#include <engine/graphics.h>
#include <game/client/components/camera.h>
#include <game/client/components/maplayers.h>
#include <game/client/components/mapimages.h>
#include "background.h"
CBackground::CBackground() : CMapLayers(CMapLayers::TYPE_BACKGROUND_FORCE)
2015-08-27 14:28:25 +00:00
{
m_pLayers = new CLayers;
m_pBackgroundLayers = m_pLayers;
2015-08-27 14:28:25 +00:00
m_pImages = new CMapImages;
m_pBackgroundImages = m_pImages;
m_pMap = CreateEngineMap();
m_pBackgroundMap = m_pMap;
m_Loaded = false;
m_aMapName[0] = '\0';
m_LastLoad = 0;
2015-08-27 14:28:25 +00:00
}
CBackground::~CBackground()
{
delete m_pBackgroundLayers;
delete m_pBackgroundImages;
2015-08-27 14:28:25 +00:00
}
void CBackground::OnInit()
{
m_pImages->m_pClient = GameClient();
Kernel()->ReregisterInterface(m_pMap);
if(g_Config.m_ClBackgroundEntities[0] != '\0' && str_comp(g_Config.m_ClBackgroundEntities, CURRENT))
2015-08-27 14:28:25 +00:00
LoadBackground();
}
void CBackground::LoadBackground()
{
if(time_get()-m_LastLoad < 10*time_freq())
return;
if(m_Loaded && m_pMap == m_pBackgroundMap)
m_pMap->Unload();
m_Loaded = false;
m_pMap = m_pBackgroundMap;
m_pLayers = m_pBackgroundLayers;
2015-08-27 14:28:25 +00:00
m_pImages = m_pBackgroundImages;
2020-08-26 13:06:51 +00:00
bool NeedImageLoading = false;
str_copy(m_aMapName, g_Config.m_ClBackgroundEntities, sizeof(m_aMapName));
2015-08-27 14:28:25 +00:00
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "maps/%s", g_Config.m_ClBackgroundEntities);
if(m_pMap->Load(aBuf))
{
m_pLayers->InitBackground(m_pMap);
RenderTools()->RenderTilemapGenerateSkip(m_pLayers);
2020-08-26 13:06:51 +00:00
NeedImageLoading = true;
2015-08-27 14:28:25 +00:00
m_Loaded = true;
}
2015-08-27 14:32:45 +00:00
else if(str_comp(g_Config.m_ClBackgroundEntities, CURRENT) == 0)
2015-08-27 14:28:25 +00:00
{
2015-08-27 14:32:45 +00:00
m_pMap = Kernel()->RequestInterface<IEngineMap>();
2017-12-03 10:50:43 +00:00
if(m_pMap->IsLoaded())
{
m_pLayers = GameClient()->Layers();
m_pImages = GameClient()->m_pMapimages;
m_Loaded = true;
}
2015-08-27 14:28:25 +00:00
}
2020-08-26 13:06:51 +00:00
if(m_Loaded)
{
CMapLayers::OnMapLoad();
2020-08-26 13:06:51 +00:00
if(NeedImageLoading)
m_pImages->LoadBackground(m_pLayers, m_pMap);
}
2015-08-27 14:28:25 +00:00
m_LastLoad = time_get();
}
void CBackground::OnMapLoad()
{
2017-12-03 10:50:43 +00:00
if(str_comp(g_Config.m_ClBackgroundEntities, CURRENT) == 0 || str_comp(g_Config.m_ClBackgroundEntities, m_aMapName))
{
m_LastLoad = 0;
2015-08-27 14:28:25 +00:00
LoadBackground();
}
2015-08-27 14:28:25 +00:00
}
void CBackground::OnRender()
{
//probably not the best place for this
if(g_Config.m_ClBackgroundEntities[0] != '\0' && str_comp(g_Config.m_ClBackgroundEntities, m_aMapName))
2015-08-27 14:28:25 +00:00
LoadBackground();
if(!m_Loaded)
return;
if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
return;
if(g_Config.m_ClOverlayEntities != 100)
return;
CMapLayers::OnRender();
2015-08-27 14:28:25 +00:00
}