mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
Add HUD Sprites, LoadHudSkin() and HUD Assets Tab
This commit is contained in:
parent
f60ae47be1
commit
755c260401
|
@ -1188,6 +1188,7 @@ set(EXPECTED_DATA
|
|||
gui_cursor.png
|
||||
gui_icons.png
|
||||
gui_logo.png
|
||||
hud.png
|
||||
languages/arabic.txt
|
||||
languages/belarusian.txt
|
||||
languages/bosnian.txt
|
||||
|
|
BIN
data/hud.png
Normal file
BIN
data/hud.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
|
@ -238,6 +238,7 @@ image_arrow = Image("arrow", "arrow.png")
|
|||
image_demobuttons2 = Image("demobuttons2", "demo_buttons2.png")
|
||||
image_audio_source = Image("audio_source", "editor/audio_source.png")
|
||||
image_strongweak = Image("strongweak", "strong_weak.png")
|
||||
image_hud = Image("hud", "hud.png")
|
||||
|
||||
container.images.Add(image_null)
|
||||
container.images.Add(image_game)
|
||||
|
@ -256,6 +257,7 @@ container.images.Add(image_arrow)
|
|||
container.images.Add(image_demobuttons2)
|
||||
container.images.Add(image_audio_source)
|
||||
container.images.Add(image_strongweak)
|
||||
container.images.Add(image_hud)
|
||||
|
||||
container.pickups.Add(Pickup("health"))
|
||||
container.pickups.Add(Pickup("armor"))
|
||||
|
@ -274,6 +276,7 @@ set_guiicons = SpriteSet("guiicons", image_guiicons, 12, 2)
|
|||
set_demobuttons2 = SpriteSet("demobuttons2", image_demobuttons2, 4, 1)
|
||||
set_audio_source = SpriteSet("audio_source", image_audio_source, 1, 1)
|
||||
set_strongweak = SpriteSet("strongweak", image_strongweak, 2, 1)
|
||||
set_hud = SpriteSet("hud", image_hud, 14, 6)
|
||||
|
||||
container.spritesets.Add(set_particles)
|
||||
container.spritesets.Add(set_game)
|
||||
|
@ -287,6 +290,7 @@ container.spritesets.Add(set_guiicons)
|
|||
container.spritesets.Add(set_demobuttons2)
|
||||
container.spritesets.Add(set_audio_source)
|
||||
container.spritesets.Add(set_strongweak)
|
||||
container.spritesets.Add(set_hud)
|
||||
|
||||
container.sprites.Add(Sprite("part_slice", set_particles, 0,0,1,1))
|
||||
container.sprites.Add(Sprite("part_ball", set_particles, 1,0,1,1))
|
||||
|
@ -426,6 +430,28 @@ container.sprites.Add(Sprite("audio_source", set_audio_source, 0,0,1,1))
|
|||
container.sprites.Add(Sprite("hook_strong", set_strongweak, 0,0,1,1))
|
||||
container.sprites.Add(Sprite("hook_weak", set_strongweak, 1,0,1,1))
|
||||
|
||||
container.sprites.Add(Sprite("hud_airjump", set_hud, 0,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_airjump_empty", set_hud, 2,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_solo", set_hud, 4,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_no_collision", set_hud, 6,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_endless_jump", set_hud, 8,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_endless_hook", set_hud, 10,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_jetpack", set_hud, 12,0,2,2))
|
||||
container.sprites.Add(Sprite("hud_freeze_bar_full_left", set_game, 0,2,1,2))
|
||||
container.sprites.Add(Sprite("hud_freeze_bar_full", set_game, 1,2,1,2))
|
||||
container.sprites.Add(Sprite("hud_freeze_bar_empty", set_game, 2,2,1,2))
|
||||
container.sprites.Add(Sprite("hud_freeze_bar_empty_right", set_game, 3,2,1,2))
|
||||
container.sprites.Add(Sprite("hud_no_hook_hit", set_game, 4,2,2,2))
|
||||
container.sprites.Add(Sprite("hud_no_hammer_hit", set_game, 6,2,2,2))
|
||||
container.sprites.Add(Sprite("hud_no_shotgun_hit", set_game, 8,2,2,2))
|
||||
container.sprites.Add(Sprite("hud_no_grenade_hit", set_game, 10,2,2,2))
|
||||
container.sprites.Add(Sprite("hud_no_laser_hit", set_game, 12,2,2,2))
|
||||
container.sprites.Add(Sprite("hud_teleport_grenade", set_game, 4,4,2,2))
|
||||
container.sprites.Add(Sprite("hud_teleport_gun", set_game, 6,4,2,2))
|
||||
container.sprites.Add(Sprite("hud_teleport_laser", set_game, 8,4,2,2))
|
||||
container.sprites.Add(Sprite("hud_dummy_hammer", set_game, 10,4,2,2))
|
||||
container.sprites.Add(Sprite("hud_dummy_copy", set_game, 12,4,2,2))
|
||||
|
||||
anim = Animation("base")
|
||||
anim.body.frames.Add(AnimKeyframe(0, 0, -4, 0))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0, 0, 10, 0))
|
||||
|
|
|
@ -41,6 +41,7 @@ MACRO_CONFIG_STR(ClAssetsEntites, cl_assets_entities, 50, "default", CFGFLAG_SAV
|
|||
MACRO_CONFIG_STR(ClAssetGame, cl_asset_game, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for game")
|
||||
MACRO_CONFIG_STR(ClAssetEmoticons, cl_asset_emoticons, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for emoticons")
|
||||
MACRO_CONFIG_STR(ClAssetParticles, cl_asset_particles, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for particles")
|
||||
MACRO_CONFIG_STR(ClAssetHud, cl_asset_hud, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for HUD")
|
||||
|
||||
MACRO_CONFIG_STR(BrFilterString, br_filter_string, 25, "Novice", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Server browser filtering string")
|
||||
MACRO_CONFIG_STR(BrExcludeString, br_exclude_string, 25, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Server browser exclusion string")
|
||||
|
|
|
@ -1039,6 +1039,7 @@ void CMenus::OnInit()
|
|||
Console()->Chain("cl_asset_game", ConchainAssetGame, this);
|
||||
Console()->Chain("cl_asset_emoticons", ConchainAssetEmoticons, this);
|
||||
Console()->Chain("cl_asset_particles", ConchainAssetParticles, this);
|
||||
Console()->Chain("cl_asset_hud", ConchainAssetHud, this);
|
||||
|
||||
m_TextureBlob = Graphics()->LoadTexture("blob.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);
|
||||
|
||||
|
|
|
@ -246,11 +246,16 @@ public:
|
|||
{
|
||||
};
|
||||
|
||||
struct SCustomHud : public SCustomItem
|
||||
{
|
||||
};
|
||||
|
||||
protected:
|
||||
sorted_array<SCustomEntities> m_EntitiesList;
|
||||
sorted_array<SCustomGame> m_GameList;
|
||||
sorted_array<SCustomEmoticon> m_EmoticonList;
|
||||
sorted_array<SCustomParticle> m_ParticlesList;
|
||||
sorted_array<SCustomHud> m_HudList;
|
||||
|
||||
bool m_IsInit = false;
|
||||
|
||||
|
@ -260,11 +265,13 @@ protected:
|
|||
static int GameScan(const char *pName, int IsDir, int DirType, void *pUser);
|
||||
static int EmoticonsScan(const char *pName, int IsDir, int DirType, void *pUser);
|
||||
static int ParticlesScan(const char *pName, int IsDir, int DirType, void *pUser);
|
||||
static int HudScan(const char *pName, int IsDir, int DirType, void *pUser);
|
||||
|
||||
static void ConchainAssetsEntities(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainAssetGame(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainAssetParticles(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainAssetEmoticons(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainAssetHud(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
|
||||
void ClearCustomItems(int CurTab);
|
||||
|
||||
|
|
|
@ -15,6 +15,16 @@ struct SMenuAssetScanUser
|
|||
TMenuAssetScanLoadedFunc m_LoadedFunc;
|
||||
};
|
||||
|
||||
// IDs of the tabs in the Assets menu
|
||||
enum
|
||||
{
|
||||
ASSETS_TAB_ENTITIES = 0,
|
||||
ASSETS_TAB_GAME = 1,
|
||||
ASSETS_TAB_EMOTICONS = 2,
|
||||
ASSETS_TAB_PARTICLES = 3,
|
||||
ASSETS_TAB_HUD = 4
|
||||
};
|
||||
|
||||
void CMenus::LoadEntities(SCustomEntities *pEntitiesItem, void *pUser)
|
||||
{
|
||||
auto *pRealUser = (SMenuAssetScanUser *)pUser;
|
||||
|
@ -208,33 +218,44 @@ int CMenus::ParticlesScan(const char *pName, int IsDir, int DirType, void *pUser
|
|||
return AssetScan(pName, IsDir, DirType, pThis->m_ParticlesList, "particles", pGraphics, pUser);
|
||||
}
|
||||
|
||||
int CMenus::HudScan(const char *pName, int IsDir, int DirType, void *pUser)
|
||||
{
|
||||
CMenus *pMenus = (CMenus *)pUser;
|
||||
IGraphics *pGraphics = pMenus->Graphics();
|
||||
return AssetScan(pName, IsDir, DirType, pMenus->m_HudList, "hud", pGraphics, pUser);
|
||||
}
|
||||
|
||||
static sorted_array<const CMenus::SCustomEntities *> s_SearchEntitiesList;
|
||||
static sorted_array<const CMenus::SCustomGame *> s_SearchGamesList;
|
||||
static sorted_array<const CMenus::SCustomEmoticon *> s_SearchEmoticonsList;
|
||||
static sorted_array<const CMenus::SCustomParticle *> s_SearchParticlesList;
|
||||
static sorted_array<const CMenus::SCustomHud *> s_SearchHudList;
|
||||
|
||||
static bool s_InitCustomList[4] = {
|
||||
static const int NumberOfAssetsTabs = 5;
|
||||
static bool s_InitCustomList[NumberOfAssetsTabs] = {
|
||||
true,
|
||||
};
|
||||
|
||||
static int s_CustomListSize[4] = {
|
||||
static int s_CustomListSize[NumberOfAssetsTabs] = {
|
||||
0,
|
||||
};
|
||||
|
||||
static char s_aFilterString[4][50];
|
||||
static char s_aFilterString[NumberOfAssetsTabs][50];
|
||||
|
||||
static int s_CurCustomTab = 0;
|
||||
static int s_CurCustomTab = ASSETS_TAB_ENTITIES;
|
||||
|
||||
static const CMenus::SCustomItem *GetCustomItem(int CurTab, int Index)
|
||||
{
|
||||
if(CurTab == 0)
|
||||
if(CurTab == ASSETS_TAB_ENTITIES)
|
||||
return s_SearchEntitiesList[Index];
|
||||
else if(CurTab == 1)
|
||||
else if(CurTab == ASSETS_TAB_GAME)
|
||||
return s_SearchGamesList[Index];
|
||||
else if(CurTab == 2)
|
||||
else if(CurTab == ASSETS_TAB_EMOTICONS)
|
||||
return s_SearchEmoticonsList[Index];
|
||||
else if(CurTab == 3)
|
||||
else if(CurTab == ASSETS_TAB_PARTICLES)
|
||||
return s_SearchParticlesList[Index];
|
||||
else if(CurTab == ASSETS_TAB_HUD)
|
||||
return s_SearchHudList[Index];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -253,7 +274,7 @@ void ClearAssetList(sorted_array<TName> &List, IGraphics *pGraphics)
|
|||
|
||||
void CMenus::ClearCustomItems(int CurTab)
|
||||
{
|
||||
if(CurTab == 0)
|
||||
if(CurTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
for(int i = 0; i < m_EntitiesList.size(); ++i)
|
||||
{
|
||||
|
@ -269,27 +290,34 @@ void CMenus::ClearCustomItems(int CurTab)
|
|||
// reload current entities
|
||||
m_pClient->m_MapImages.ChangeEntitiesPath(g_Config.m_ClAssetsEntites);
|
||||
}
|
||||
else if(CurTab == 1)
|
||||
else if(CurTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
ClearAssetList(m_GameList, Graphics());
|
||||
|
||||
// reload current game skin
|
||||
GameClient()->LoadGameSkin(g_Config.m_ClAssetGame);
|
||||
}
|
||||
else if(CurTab == 2)
|
||||
else if(CurTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
ClearAssetList(m_EmoticonList, Graphics());
|
||||
|
||||
// reload current emoticons skin
|
||||
GameClient()->LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons);
|
||||
}
|
||||
else if(CurTab == 3)
|
||||
else if(CurTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
ClearAssetList(m_ParticlesList, Graphics());
|
||||
|
||||
// reload current particles skin
|
||||
GameClient()->LoadParticlesSkin(g_Config.m_ClAssetParticles);
|
||||
}
|
||||
else if(CurTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
ClearAssetList(m_HudList, Graphics());
|
||||
|
||||
// reload current hud skin
|
||||
GameClient()->LoadHudSkin(g_Config.m_ClAssetHud);
|
||||
}
|
||||
s_InitCustomList[CurTab] = true;
|
||||
}
|
||||
|
||||
|
@ -330,24 +358,27 @@ int InitSearchList(sorted_array<const TName *> &SearchList, sorted_array<TName>
|
|||
|
||||
void CMenus::RenderSettingsCustom(CUIRect MainView)
|
||||
{
|
||||
CUIRect Label, CustomList, QuickSearch, QuickSearchClearButton, DirectoryButton, Page1Tab, Page2Tab, Page3Tab, Page4Tab, ReloadButton;
|
||||
CUIRect Label, CustomList, QuickSearch, QuickSearchClearButton, DirectoryButton, Page1Tab, Page2Tab, Page3Tab, Page4Tab, Page5Tab, ReloadButton;
|
||||
|
||||
MainView.HSplitTop(20, &Label, &MainView);
|
||||
float TabsW = Label.w;
|
||||
Label.VSplitLeft(TabsW / 4, &Page1Tab, &Page2Tab);
|
||||
Page2Tab.VSplitLeft(TabsW / 4, &Page2Tab, &Page3Tab);
|
||||
Page3Tab.VSplitLeft(TabsW / 4, &Page3Tab, &Page4Tab);
|
||||
Label.VSplitLeft(TabsW / NumberOfAssetsTabs, &Page1Tab, &Page2Tab);
|
||||
Page2Tab.VSplitLeft(TabsW / NumberOfAssetsTabs, &Page2Tab, &Page3Tab);
|
||||
Page3Tab.VSplitLeft(TabsW / NumberOfAssetsTabs, &Page3Tab, &Page4Tab);
|
||||
Page4Tab.VSplitLeft(TabsW / NumberOfAssetsTabs, &Page4Tab, &Page5Tab);
|
||||
|
||||
static int s_aPageTabs[4] = {};
|
||||
static int s_aPageTabs[NumberOfAssetsTabs] = {};
|
||||
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[0], Localize("Entities"), s_CurCustomTab == 0, &Page1Tab, 5, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = 0;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[1], Localize("Game"), s_CurCustomTab == 1, &Page2Tab, 0, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = 1;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[2], Localize("Emoticons"), s_CurCustomTab == 2, &Page3Tab, 0, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = 2;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[3], Localize("Particles"), s_CurCustomTab == 3, &Page4Tab, 10, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = 3;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[0], Localize("Entities"), s_CurCustomTab == ASSETS_TAB_ENTITIES, &Page1Tab, 5, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = ASSETS_TAB_ENTITIES;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[1], Localize("Game"), s_CurCustomTab == ASSETS_TAB_GAME, &Page2Tab, 0, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = ASSETS_TAB_GAME;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[2], Localize("Emoticons"), s_CurCustomTab == ASSETS_TAB_EMOTICONS, &Page3Tab, 0, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = ASSETS_TAB_EMOTICONS;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[3], Localize("Particles"), s_CurCustomTab == ASSETS_TAB_PARTICLES, &Page4Tab, 0, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = ASSETS_TAB_PARTICLES;
|
||||
if(DoButton_MenuTab((void *)&s_aPageTabs[4], Localize("HUD"), s_CurCustomTab == ASSETS_TAB_HUD, &Page5Tab, 10, NULL, NULL, NULL, NULL, 4))
|
||||
s_CurCustomTab = ASSETS_TAB_HUD;
|
||||
|
||||
int64_t LoadStartTime = time_get_microseconds();
|
||||
SMenuAssetScanUser User;
|
||||
|
@ -356,7 +387,7 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
if(time_get_microseconds() - LoadStartTime > 500000)
|
||||
RenderLoading(false, false);
|
||||
};
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
if(m_EntitiesList.size() == 0)
|
||||
{
|
||||
|
@ -371,18 +402,22 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
if(m_EntitiesList.size() != s_CustomListSize[s_CurCustomTab])
|
||||
s_InitCustomList[s_CurCustomTab] = true;
|
||||
}
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
InitAssetList(m_GameList, "assets/game", "game", GameScan, Graphics(), Storage(), &User);
|
||||
}
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
InitAssetList(m_EmoticonList, "assets/emoticons", "emoticons", EmoticonsScan, Graphics(), Storage(), &User);
|
||||
}
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
InitAssetList(m_ParticlesList, "assets/particles", "particles", ParticlesScan, Graphics(), Storage(), &User);
|
||||
}
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
InitAssetList(m_HudList, "assets/hud", "hud", HudScan, Graphics(), Storage(), this);
|
||||
}
|
||||
|
||||
MainView.HSplitTop(10.0f, 0, &MainView);
|
||||
|
||||
|
@ -392,7 +427,7 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
if(s_InitCustomList[s_CurCustomTab])
|
||||
{
|
||||
int ListSize = 0;
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
s_SearchEntitiesList.clear();
|
||||
ListSize = m_EntitiesList.size();
|
||||
|
@ -407,18 +442,22 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
s_SearchEntitiesList.add_unsorted(s);
|
||||
}
|
||||
}
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
ListSize = InitSearchList(s_SearchGamesList, m_GameList);
|
||||
}
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
ListSize = InitSearchList(s_SearchEmoticonsList, m_EmoticonList);
|
||||
}
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
ListSize = InitSearchList(s_SearchParticlesList, m_ParticlesList);
|
||||
}
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
ListSize = InitSearchList(s_SearchHudList, m_HudList);
|
||||
}
|
||||
s_InitCustomList[s_CurCustomTab] = false;
|
||||
s_CustomListSize[s_CurCustomTab] = ListSize;
|
||||
}
|
||||
|
@ -430,23 +469,28 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
|
||||
int SearchListSize = 0;
|
||||
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
SearchListSize = s_SearchEntitiesList.size();
|
||||
}
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
SearchListSize = s_SearchGamesList.size();
|
||||
TextureHeight = 75;
|
||||
}
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
SearchListSize = s_SearchEmoticonsList.size();
|
||||
}
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
SearchListSize = s_SearchParticlesList.size();
|
||||
}
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
SearchListSize = s_SearchHudList.size();
|
||||
TextureHeight = 64;
|
||||
}
|
||||
|
||||
UiDoListboxStart(&s_InitCustomList[s_CurCustomTab], &CustomList, TextureHeight + 15.0f + 10.0f + Margin, "", "", SearchListSize, CustomList.w / (Margin + TextureWidth), OldSelected, s_ScrollValue, true);
|
||||
for(int i = 0; i < SearchListSize; ++i)
|
||||
|
@ -455,26 +499,31 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
if(s == NULL)
|
||||
continue;
|
||||
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
if(str_comp(s->m_aName, g_Config.m_ClAssetsEntites) == 0)
|
||||
OldSelected = i;
|
||||
}
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
if(str_comp(s->m_aName, g_Config.m_ClAssetGame) == 0)
|
||||
OldSelected = i;
|
||||
}
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
if(str_comp(s->m_aName, g_Config.m_ClAssetEmoticons) == 0)
|
||||
OldSelected = i;
|
||||
}
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
if(str_comp(s->m_aName, g_Config.m_ClAssetParticles) == 0)
|
||||
OldSelected = i;
|
||||
}
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
if(str_comp(s->m_aName, g_Config.m_ClAssetHud) == 0)
|
||||
OldSelected = i;
|
||||
}
|
||||
|
||||
CListboxItem Item = UiDoListboxNextItem(s, OldSelected == i);
|
||||
CUIRect ItemRect = Item.m_Rect;
|
||||
|
@ -504,26 +553,31 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
{
|
||||
if(GetCustomItem(s_CurCustomTab, NewSelected)->m_aName[0] != '\0')
|
||||
{
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
{
|
||||
str_copy(g_Config.m_ClAssetsEntites, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName, sizeof(g_Config.m_ClAssetsEntites));
|
||||
m_pClient->m_MapImages.ChangeEntitiesPath(GetCustomItem(s_CurCustomTab, NewSelected)->m_aName);
|
||||
}
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
{
|
||||
str_copy(g_Config.m_ClAssetGame, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName, sizeof(g_Config.m_ClAssetGame));
|
||||
GameClient()->LoadGameSkin(g_Config.m_ClAssetGame);
|
||||
}
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
{
|
||||
str_copy(g_Config.m_ClAssetEmoticons, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName, sizeof(g_Config.m_ClAssetEmoticons));
|
||||
GameClient()->LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons);
|
||||
}
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
{
|
||||
str_copy(g_Config.m_ClAssetParticles, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName, sizeof(g_Config.m_ClAssetParticles));
|
||||
GameClient()->LoadParticlesSkin(g_Config.m_ClAssetParticles);
|
||||
}
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
{
|
||||
str_copy(g_Config.m_ClAssetParticles, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName, sizeof(g_Config.m_ClAssetHud));
|
||||
GameClient()->LoadHudSkin(g_Config.m_ClAssetHud);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -567,14 +621,16 @@ void CMenus::RenderSettingsCustom(CUIRect MainView)
|
|||
{
|
||||
char aBuf[IO_MAX_PATH_LENGTH];
|
||||
char aBufFull[IO_MAX_PATH_LENGTH + 7];
|
||||
if(s_CurCustomTab == 0)
|
||||
if(s_CurCustomTab == ASSETS_TAB_ENTITIES)
|
||||
str_copy(aBufFull, "assets/entities", sizeof(aBufFull));
|
||||
else if(s_CurCustomTab == 1)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_GAME)
|
||||
str_copy(aBufFull, "assets/game", sizeof(aBufFull));
|
||||
else if(s_CurCustomTab == 2)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS)
|
||||
str_copy(aBufFull, "assets/emoticons", sizeof(aBufFull));
|
||||
else if(s_CurCustomTab == 3)
|
||||
else if(s_CurCustomTab == ASSETS_TAB_PARTICLES)
|
||||
str_copy(aBufFull, "assets/particles", sizeof(aBufFull));
|
||||
else if(s_CurCustomTab == ASSETS_TAB_HUD)
|
||||
str_copy(aBufFull, "assets/hud", sizeof(aBufFull));
|
||||
Storage()->GetCompletePath(IStorage::TYPE_SAVE, aBufFull, aBuf, sizeof(aBuf));
|
||||
Storage()->CreateFolder("assets", IStorage::TYPE_SAVE);
|
||||
Storage()->CreateFolder(aBufFull, IStorage::TYPE_SAVE);
|
||||
|
@ -654,3 +710,18 @@ void CMenus::ConchainAssetEmoticons(IConsole::IResult *pResult, void *pUserData,
|
|||
|
||||
pfnCallback(pResult, pCallbackUserData);
|
||||
}
|
||||
|
||||
void CMenus::ConchainAssetHud(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
|
||||
{
|
||||
CMenus *pThis = (CMenus *)pUserData;
|
||||
if(pResult->NumArguments() == 1)
|
||||
{
|
||||
const char *pArg = pResult->GetString(0);
|
||||
if(str_comp(pArg, g_Config.m_ClAssetHud) != 0)
|
||||
{
|
||||
pThis->GameClient()->LoadHudSkin(pArg);
|
||||
}
|
||||
}
|
||||
|
||||
pfnCallback(pResult, pCallbackUserData);
|
||||
}
|
||||
|
|
|
@ -262,6 +262,7 @@ void CGameClient::OnInit()
|
|||
m_GameSkinLoaded = false;
|
||||
m_ParticlesSkinLoaded = false;
|
||||
m_EmoticonsSkinLoaded = false;
|
||||
m_HudSkinLoaded = false;
|
||||
|
||||
// setup load amount// load textures
|
||||
for(int i = 0; i < g_pData->m_NumImages; i++)
|
||||
|
@ -272,6 +273,8 @@ void CGameClient::OnInit()
|
|||
LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons);
|
||||
else if(i == IMAGE_PARTICLES)
|
||||
LoadParticlesSkin(g_Config.m_ClAssetParticles);
|
||||
else if(i == IMAGE_HUD)
|
||||
LoadHudSkin(g_Config.m_ClAssetHud);
|
||||
else
|
||||
g_pData->m_aImages[i].m_Id = Graphics()->LoadTexture(g_pData->m_aImages[i].m_pFilename, IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);
|
||||
m_Menus.RenderLoading(false);
|
||||
|
@ -2999,6 +3002,88 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir)
|
|||
}
|
||||
}
|
||||
|
||||
void CGameClient::LoadHudSkin(const char *pPath, bool AsDir)
|
||||
{
|
||||
if(m_HudSkinLoaded)
|
||||
{
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudAirjump);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudAirjumpEmpty);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudSolo);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoCollision);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudEndlessJump);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudEndlessHook);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudJetpack);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarFullLeft);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarFull);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarEmpty);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarEmptyRight);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoHookHit);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoHammerHit);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoShotgunHit);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoGrenadeHit);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNoLaserHit);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportGrenade);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportGun);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportLaser);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudDummyHammer);
|
||||
Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudDummyCopy);
|
||||
|
||||
m_HudSkinLoaded = false;
|
||||
}
|
||||
|
||||
char aPath[IO_MAX_PATH_LENGTH];
|
||||
bool IsDefault = false;
|
||||
if(str_comp(pPath, "default") == 0)
|
||||
{
|
||||
str_format(aPath, sizeof(aPath), "%s", g_pData->m_aImages[IMAGE_HUD].m_pFilename);
|
||||
IsDefault = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(AsDir)
|
||||
str_format(aPath, sizeof(aPath), "assets/hud/%s/%s", pPath, g_pData->m_aImages[IMAGE_HUD].m_pFilename);
|
||||
else
|
||||
str_format(aPath, sizeof(aPath), "assets/hud/%s.png", pPath);
|
||||
}
|
||||
|
||||
CImageInfo ImgInfo;
|
||||
bool PngLoaded = Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL);
|
||||
if(!PngLoaded && !IsDefault)
|
||||
{
|
||||
if(AsDir)
|
||||
LoadHudSkin("default");
|
||||
else
|
||||
LoadHudSkin(pPath, true);
|
||||
}
|
||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
||||
{
|
||||
m_HudSkin.m_SpriteHudAirjump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP]);
|
||||
m_HudSkin.m_SpriteHudAirjumpEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP_EMPTY]);
|
||||
m_HudSkin.m_SpriteHudSolo = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_SOLO]);
|
||||
m_HudSkin.m_SpriteHudNoCollision = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_COLLISION]);
|
||||
m_HudSkin.m_SpriteHudEndlessJump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_ENDLESS_JUMP]);
|
||||
m_HudSkin.m_SpriteHudEndlessHook = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_ENDLESS_HOOK]);
|
||||
m_HudSkin.m_SpriteHudJetpack = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_JETPACK]);
|
||||
m_HudSkin.m_SpriteHudFreezeBarFullLeft = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_FULL_LEFT]);
|
||||
m_HudSkin.m_SpriteHudFreezeBarFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_FULL]);
|
||||
m_HudSkin.m_SpriteHudFreezeBarEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_EMPTY]);
|
||||
m_HudSkin.m_SpriteHudFreezeBarEmptyRight = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_EMPTY_RIGHT]);
|
||||
m_HudSkin.m_SpriteHudNoHookHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_HOOK_HIT]);
|
||||
m_HudSkin.m_SpriteHudNoHammerHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_HAMMER_HIT]);
|
||||
m_HudSkin.m_SpriteHudNoShotgunHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_SHOTGUN_HIT]);
|
||||
m_HudSkin.m_SpriteHudNoGrenadeHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_GRENADE_HIT]);
|
||||
m_HudSkin.m_SpriteHudNoLaserHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NO_LASER_HIT]);
|
||||
m_HudSkin.m_SpriteHudTeleportGrenade = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_GRENADE]);
|
||||
m_HudSkin.m_SpriteHudTeleportGun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_GUN]);
|
||||
m_HudSkin.m_SpriteHudTeleportLaser = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_LASER]);
|
||||
m_HudSkin.m_SpriteHudDummyHammer = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_DUMMY_HAMMER]);
|
||||
m_HudSkin.m_SpriteHudDummyCopy = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_DUMMY_COPY]);
|
||||
|
||||
m_HudSkinLoaded = true;
|
||||
free(ImgInfo.m_pData);
|
||||
}
|
||||
}
|
||||
|
||||
void CGameClient::RefindSkins()
|
||||
{
|
||||
for(auto &Client : m_aClients)
|
||||
|
|
|
@ -530,6 +530,7 @@ public:
|
|||
void LoadGameSkin(const char *pPath, bool AsDir = false);
|
||||
void LoadEmoticonsSkin(const char *pPath, bool AsDir = false);
|
||||
void LoadParticlesSkin(const char *pPath, bool AsDir = false);
|
||||
void LoadHudSkin(const char *pPath, bool AsDir = false);
|
||||
|
||||
void RefindSkins();
|
||||
|
||||
|
@ -641,6 +642,34 @@ public:
|
|||
SClientEmoticonsSkin m_EmoticonsSkin;
|
||||
bool m_EmoticonsSkinLoaded;
|
||||
|
||||
struct SClientHudSkin
|
||||
{
|
||||
IGraphics::CTextureHandle m_SpriteHudAirjump;
|
||||
IGraphics::CTextureHandle m_SpriteHudAirjumpEmpty;
|
||||
IGraphics::CTextureHandle m_SpriteHudSolo;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoCollision;
|
||||
IGraphics::CTextureHandle m_SpriteHudEndlessJump;
|
||||
IGraphics::CTextureHandle m_SpriteHudEndlessHook;
|
||||
IGraphics::CTextureHandle m_SpriteHudJetpack;
|
||||
IGraphics::CTextureHandle m_SpriteHudFreezeBarFullLeft;
|
||||
IGraphics::CTextureHandle m_SpriteHudFreezeBarFull;
|
||||
IGraphics::CTextureHandle m_SpriteHudFreezeBarEmpty;
|
||||
IGraphics::CTextureHandle m_SpriteHudFreezeBarEmptyRight;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoHookHit;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoHammerHit;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoShotgunHit;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoGrenadeHit;
|
||||
IGraphics::CTextureHandle m_SpriteHudNoLaserHit;
|
||||
IGraphics::CTextureHandle m_SpriteHudTeleportGrenade;
|
||||
IGraphics::CTextureHandle m_SpriteHudTeleportGun;
|
||||
IGraphics::CTextureHandle m_SpriteHudTeleportLaser;
|
||||
IGraphics::CTextureHandle m_SpriteHudDummyHammer;
|
||||
IGraphics::CTextureHandle m_SpriteHudDummyCopy;
|
||||
};
|
||||
|
||||
SClientHudSkin m_HudSkin;
|
||||
bool m_HudSkinLoaded;
|
||||
|
||||
const std::vector<CSnapEntities> &SnapEntities() { return m_aSnapEntities; }
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue