More attempts at fixing connect stuff.

This commit is contained in:
momo5502 2016-01-15 00:20:37 +01:00
parent bce64b0b90
commit 96f61750ba
2 changed files with 68 additions and 2 deletions

View File

@ -495,6 +495,8 @@ namespace Components
void Menus::AddMenuListHook(Game::UiContext *dc, Game::MenuList *menuList, int close) void Menus::AddMenuListHook(Game::UiContext *dc, Game::MenuList *menuList, int close)
{ {
Menus::ReloadStack(dc);
Game::MenuList* menus = Game::UI_LoadMenus("ui_mp/menus.txt", 3); Game::MenuList* menus = Game::UI_LoadMenus("ui_mp/menus.txt", 3);
Game::UI_AddMenuList(dc, menus, close); Game::UI_AddMenuList(dc, menus, close);
@ -581,6 +583,67 @@ namespace Components
} }
} }
bool Menus::ReloadMenu(Game::UiContext *dc, Game::menuDef_t *menu)
{
// Find the name of our destroyed menu
std::string name;
auto i = Menus::MenuList.begin();
for (; i != Menus::MenuList.end(); i++)
{
if (i->second == menu)
{
name = i->first;
break;
}
}
// We have found it, so we can remove and reload it
if (i != Menus::MenuList.end())
{
Menus::FreeMenu(menu);
Menus::MenuList.erase(i);
// Load original menu, in case we can't reload a custom one
Game::menuDef_t* newMenu = AssetHandler::FindOriginalAsset(Game::XAssetType::ASSET_TYPE_MENU, name.data()).menu;
// Try reloading our custom menu
auto newMenus = Menus::LoadMenu(name);
if (newMenus.size()) newMenu = newMenus[0];
OutputDebugString(Utils::VA("Reloaded: %s", name.data()));
// Now replace the destroyed menu with the new one in the stack
for (int i = 0; i < dc->menuCount; i++)
{
if (dc->Menus[i] == menu)
{
OutputDebugString(Utils::VA("Replaced: %s", name.data()));
dc->Menus[i] = newMenu;
}
}
return true;
}
else
{
Menus::RemoveFromStack(dc, menu);
}
return false;
}
void Menus::ReloadStack(Game::UiContext *dc)
{
for (int i = 0; i < dc->menuCount; i++)
{
Game::menuDef_t* menu = dc->Menus[i];
if (menu && menu->window.name && IsBadReadPtr(menu->window.name, 1)) // Sanity checks
{
Menus::ReloadMenu(dc, menu);
}
}
}
Game::menuDef_t* Menus::FindMenuByName(Game::UiContext* dc, const char* name) Game::menuDef_t* Menus::FindMenuByName(Game::UiContext* dc, const char* name)
{ {
for (int i = 0; i < dc->menuCount; i++) for (int i = 0; i < dc->menuCount; i++)
@ -595,7 +658,7 @@ namespace Components
} }
else else
{ {
// TODO: Remove menu from stack and free if custom menu Menus::ReloadMenu(dc, menu);
} }
} }
@ -623,7 +686,7 @@ namespace Components
return true; return true;
} }
Menus::RemoveFromStack(dc, menu); Menus::ReloadMenu(dc, menu);
return false; return false;
} }

View File

@ -55,6 +55,9 @@ namespace Components
static void OpenMenuStub(); static void OpenMenuStub();
static void CloseMenuStub(); static void CloseMenuStub();
static void ReloadStack(Game::UiContext *dc);
static bool ReloadMenu(Game::UiContext *dc, Game::menuDef_t *menu);
// Ugly! // Ugly!
static int KeywordHash(char* key); static int KeywordHash(char* key);
}; };