[mod menu] new: option to hide server in debug menu

- Client.hpp: add bool variable and methods
- hooks.cpp: save/load value from common.bin
- main.cpp: change
- StageSceneStateServerConfig: add button to the mod menu to toggle it
This commit is contained in:
Robin C. Ladiges 2024-05-29 09:12:45 +02:00
parent e1bd6d8785
commit 65582aafea
No known key found for this signature in database
GPG key ID: B494D3DF92661B99
5 changed files with 64 additions and 25 deletions

View file

@ -30,7 +30,8 @@ class StageSceneStateServerConfig : public al::HostStateBase<al::Scene>, public
GAMEMODECONFIG,
GAMEMODESWITCH,
SETIP,
SETPORT
SETPORT,
HIDESERVER
};
virtual al::MessageSystem* getMessageSystem(void) const override;
@ -41,6 +42,7 @@ class StageSceneStateServerConfig : public al::HostStateBase<al::Scene>, public
void exeMainMenu();
void exeOpenKeyboardIP();
void exeOpenKeyboardPort();
void exeHideServer();
void exeGamemodeConfig();
void exeGamemodeSelect();
void exeSaveData();
@ -79,6 +81,11 @@ class StageSceneStateServerConfig : public al::HostStateBase<al::Scene>, public
inline void activateInput();
inline void deactivateInput();
// Main Menu Options
static constexpr int mMainMenuOptionsCount = 5;
sead::SafeArray<sead::WFixedSafeString<0x200>, mMainMenuOptionsCount>* mMainMenuOptions = nullptr;
const sead::WFixedSafeString<0x200>* getMainMenuOptions();
bool mIsDecideConfig = false;
};
@ -86,6 +93,7 @@ namespace {
NERVE_HEADER(StageSceneStateServerConfig, MainMenu)
NERVE_HEADER(StageSceneStateServerConfig, OpenKeyboardIP)
NERVE_HEADER(StageSceneStateServerConfig, OpenKeyboardPort)
NERVE_HEADER(StageSceneStateServerConfig, HideServer)
NERVE_HEADER(StageSceneStateServerConfig, GamemodeConfig)
NERVE_HEADER(StageSceneStateServerConfig, GamemodeSelect)
NERVE_HEADER(StageSceneStateServerConfig, SaveData)

View file

@ -131,7 +131,7 @@ class Client {
static sead::Heap *getClientHeap() { return sInstance ? sInstance->mHeap : nullptr; }
static int getMaxPlayerCount() { return sInstance ? sInstance->maxPuppets + 1 : 10;}
static int getMaxPlayerCount() { return sInstance ? sInstance->maxPuppets + 1 : 10; }
static const int getCurrentPort();
@ -151,6 +151,10 @@ class Client {
static const char* getCurrentIP();
static bool isServerHidden() { return sInstance ? sInstance->mServerHidden : true; }
static void setServerHidden(bool hide) { if (sInstance) { sInstance->mServerHidden = hide; } }
static void toggleServerHidden() { if (sInstance) { sInstance->mServerHidden = !sInstance->mServerHidden; } }
static nn::account::Uid getClientId() { return sInstance ? sInstance->mUserID : nn::account::Uid::EmptyId;}
static sead::FixedSafeString<0x20> getUsername() { return sInstance ? sInstance->mUsername : sead::FixedSafeString<0x20>::cEmptyString;}
@ -239,8 +243,8 @@ class Client {
Keyboard* mKeyboard = nullptr; // keyboard for setting server IP
hostname mServerIP;
int mServerPort = 0;
bool mServerHidden = false;
bool waitForGameInit = true;
bool mIsFirstConnect = true;

View file

@ -35,8 +35,9 @@ bool comboBtnHook(int port) {
void saveWriteHook(al::ByamlWriter* saveByml) {
const char *serverIP = Client::getCurrentIP();
const int serverPort = Client::getCurrentPort();
const char *serverIP = Client::getCurrentIP();
const int serverPort = Client::getCurrentPort();
const bool serverHidden = Client::isServerHidden();
if (serverIP) {
saveByml->addString("ServerIP", serverIP);
@ -50,13 +51,16 @@ void saveWriteHook(al::ByamlWriter* saveByml) {
saveByml->addInt("ServerPort", 0);
}
saveByml->addBool("ServerHidden", serverHidden);
saveByml->pop();
}
bool saveReadHook(int* padRumbleInt, al::ByamlIter const& saveByml, char const* padRumbleKey) {
const char *serverIP = "";
int serverPort = 0;
const char *serverIP = "";
int serverPort = 0;
bool serverHidden = false;
if (al::tryGetByamlString(&serverIP, saveByml, "ServerIP")) {
Client::setLastUsedIP(serverIP);
@ -65,7 +69,11 @@ bool saveReadHook(int* padRumbleInt, al::ByamlIter const& saveByml, char const*
if (al::tryGetByamlS32(&serverPort, saveByml, "ServerPort")) {
Client::setLastUsedPort(serverPort);
}
if (al::tryGetByamlBool(&serverHidden, saveByml, "ServerHidden")) {
Client::setServerHidden(serverHidden);
}
return al::tryGetByamlS32(padRumbleInt, saveByml, padRumbleKey);
}

View file

@ -113,19 +113,19 @@ void drawMainHook(HakoniwaSequence *curSequence, sead::Viewport *viewport, sead:
gTextWriter->setCursorFromTopLeft(sead::Vector2f(10.f, (dispHeight / 3) + 30.f));
gTextWriter->setScaleFromFontHeight(20.f);
if (isConnected) {
if (Client::isServerHidden()) {
gTextWriter->printf(
"Server: %s:%d | %d/%d Players\n",
socket->getIP(),
socket->getPort(),
Client::getConnectCount() + 1,
Client::getMaxPlayerCount()
isConnected ? "Server: <hidden> | %d/%d Players\n" : "Server: <hidden>\n",
isConnected ? Client::getConnectCount() + 1 : 0,
isConnected ? Client::getMaxPlayerCount() : 0
);
} else {
gTextWriter->printf(
"Server: %s:%d\n",
isConnected ? "Server: %s:%d | %d/%d Players\n" : "Server: %s:%d\n",
socket->getIP(),
socket->getPort()
socket->getPort(),
isConnected ? Client::getConnectCount() + 1 : 0,
isConnected ? Client::getMaxPlayerCount() : 0
);
}
gTextWriter->printf("Your TCP status: %s\n", socket->getStateChar());

View file

@ -41,17 +41,16 @@ StageSceneStateServerConfig::StageSceneStateServerConfig(const char *name, al::S
mMainOptionsList->unkInt1 = 1;
mMainOptionsList->initDataNoResetSelected(4);
mMainOptionsList->initDataNoResetSelected(mMainMenuOptionsCount);
sead::SafeArray<sead::WFixedSafeString<0x200>, 4>* mainMenuOptions =
new sead::SafeArray<sead::WFixedSafeString<0x200>, 4>();
mMainMenuOptions = new sead::SafeArray<sead::WFixedSafeString<0x200>, mMainMenuOptionsCount>();
mMainMenuOptions->mBuffer[ServerConfigOption::GAMEMODECONFIG].copy(u"Gamemode Config");
mMainMenuOptions->mBuffer[ServerConfigOption::GAMEMODESWITCH].copy(u"Change Gamemode");
mMainMenuOptions->mBuffer[ServerConfigOption::SETIP].copy(u"Change Server IP");
mMainMenuOptions->mBuffer[ServerConfigOption::SETPORT].copy(u"Change Server Port");
mMainMenuOptions->mBuffer[ServerConfigOption::HIDESERVER].copy(u"Hide Server in Debug (OFF)"); // TBD
mainMenuOptions->mBuffer[ServerConfigOption::GAMEMODECONFIG].copy(u"Gamemode Config");
mainMenuOptions->mBuffer[ServerConfigOption::GAMEMODESWITCH].copy(u"Change Gamemode");
mainMenuOptions->mBuffer[ServerConfigOption::SETIP].copy(u"Change Server IP");
mainMenuOptions->mBuffer[ServerConfigOption::SETPORT].copy(u"Change Server Port");
mMainOptionsList->addStringData(mainMenuOptions->mBuffer, "TxtContent");
mMainOptionsList->addStringData(getMainMenuOptions(), "TxtContent");
// WIP work on RollPartsData, not exactly working out atm
// RollPartsData* testArr = new RollPartsData[2]();
@ -176,6 +175,10 @@ void StageSceneStateServerConfig::exeMainMenu() {
al::setNerve(this, &nrvStageSceneStateServerConfigOpenKeyboardPort);
break;
}
case ServerConfigOption::HIDESERVER: {
al::setNerve(this, &nrvStageSceneStateServerConfigHideServer);
break;
}
default:
kill();
break;
@ -221,6 +224,16 @@ void StageSceneStateServerConfig::exeOpenKeyboardPort() {
}
}
void StageSceneStateServerConfig::exeHideServer() {
if (al::isFirstStep(this)) {
Client::toggleServerHidden();
mMainOptionsList->initDataNoResetSelected(mMainMenuOptionsCount);
mMainOptionsList->addStringData(getMainMenuOptions(), "TxtContent");
mMainOptionsList->updateParts();
al::setNerve(this, &nrvStageSceneStateServerConfigSaveData);
}
}
void StageSceneStateServerConfig::exeGamemodeConfig() {
if (al::isFirstStep(this)) {
mGamemodeConfigMenu = &mGamemodeConfigMenus[GameModeManager::instance()->getGameMode()];
@ -347,10 +360,16 @@ void StageSceneStateServerConfig::deactivateInput() {
mIsDecideConfig = true;
}
const sead::WFixedSafeString<0x200>* StageSceneStateServerConfig::getMainMenuOptions() {
mMainMenuOptions->mBuffer[ServerConfigOption::HIDESERVER].copy(Client::isServerHidden() ? u"Hide Server in Debug (ON) " : u"Hide Server in Debug (OFF)");
return mMainMenuOptions->mBuffer;
}
namespace {
NERVE_IMPL(StageSceneStateServerConfig, MainMenu)
NERVE_IMPL(StageSceneStateServerConfig, OpenKeyboardIP)
NERVE_IMPL(StageSceneStateServerConfig, OpenKeyboardPort)
NERVE_IMPL(StageSceneStateServerConfig, HideServer)
NERVE_IMPL(StageSceneStateServerConfig, GamemodeConfig)
NERVE_IMPL(StageSceneStateServerConfig, GamemodeSelect)
NERVE_IMPL(StageSceneStateServerConfig, SaveData)