mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
Add "Add Server" functionally to "Join Game" Menu + relocate servers.txt to servers.db
This commit is contained in:
parent
a865cea026
commit
8ceba26534
|
|
@ -777,52 +777,55 @@ void CPlatformNetworkManagerStub::SearchForGames()
|
||||||
friendsSessions[0].push_back(info);
|
friendsSessions[0].push_back(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::FILE* file = std::fopen("servers.txt", "r");
|
std::FILE* file = std::fopen("servers.db", "rb");
|
||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
wstring wline;
|
char magic[4] = {};
|
||||||
int phase = 0;
|
if (std::fread(magic, 1, 4, file) == 4 && memcmp(magic, "MCSV", 4) == 0)
|
||||||
|
{
|
||||||
|
uint32_t version = 0, count = 0;
|
||||||
|
std::fread(&version, sizeof(uint32_t), 1, file);
|
||||||
|
std::fread(&count, sizeof(uint32_t), 1, file);
|
||||||
|
|
||||||
string ip;
|
if (version == 1)
|
||||||
wstring port;
|
{
|
||||||
wstring name;
|
for (uint32_t s = 0; s < count; s++)
|
||||||
|
{
|
||||||
|
uint16_t ipLen = 0, port = 0, nameLen = 0;
|
||||||
|
if (std::fread(&ipLen, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
|
if (ipLen == 0 || ipLen > 256) break;
|
||||||
|
|
||||||
char buffer[512];
|
char ipBuf[257] = {};
|
||||||
while (std::fgets(buffer, sizeof(buffer), file)) {
|
if (std::fread(ipBuf, 1, ipLen, file) != ipLen) break;
|
||||||
if (phase == 0) {
|
|
||||||
ip = buffer;
|
|
||||||
if (!ip.empty() && (ip.back() == '\n' || ip.back() == '\r'))
|
|
||||||
ip.pop_back();
|
|
||||||
phase = 1;
|
|
||||||
}
|
|
||||||
else if (phase == 1) {
|
|
||||||
wline = convStringToWstring(buffer);
|
|
||||||
port = wline;
|
|
||||||
phase = 2;
|
|
||||||
}
|
|
||||||
else if (phase == 2) {
|
|
||||||
wline = convStringToWstring(buffer);
|
|
||||||
name = wline;
|
|
||||||
phase = 0;
|
|
||||||
|
|
||||||
//THEY GET DELETED AFTER USE LIKE 30 LINES UP!!
|
if (std::fread(&port, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
FriendSessionInfo* info = new FriendSessionInfo();
|
|
||||||
wchar_t label[128];
|
if (std::fread(&nameLen, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
wcsncpy_s(label, sizeof(label)/sizeof(wchar_t), name.c_str(), _TRUNCATE);
|
if (nameLen > 256) break;
|
||||||
size_t nameLen = wcslen(label);
|
|
||||||
info->displayLabel = new wchar_t[nameLen+1];
|
char nameBuf[257] = {};
|
||||||
wcscpy_s(info->displayLabel, nameLen + 1, label);
|
if (nameLen > 0)
|
||||||
info->displayLabelLength = (unsigned char)nameLen;
|
{
|
||||||
info->displayLabelViewableStartIndex = 0;
|
if (std::fread(nameBuf, 1, nameLen, file) != nameLen) break;
|
||||||
info->data.isReadyToJoin = true;
|
}
|
||||||
info->data.isJoinable = true;
|
|
||||||
strncpy_s(info->data.hostIP, sizeof(info->data.hostIP), ip.c_str(), _TRUNCATE);
|
wstring wName = convStringToWstring(nameBuf);
|
||||||
info->data.hostPort = stoi(port);
|
|
||||||
info->sessionId = (SessionID)(static_cast<uint64_t>(inet_addr(ip.c_str())) | (static_cast<uint64_t>(stoi(port)) << 32));
|
FriendSessionInfo* info = new FriendSessionInfo();
|
||||||
friendsSessions[0].push_back(info);
|
size_t nLen = wName.length();
|
||||||
|
info->displayLabel = new wchar_t[nLen + 1];
|
||||||
|
wcscpy_s(info->displayLabel, nLen + 1, wName.c_str());
|
||||||
|
info->displayLabelLength = (unsigned char)nLen;
|
||||||
|
info->displayLabelViewableStartIndex = 0;
|
||||||
|
info->data.isReadyToJoin = true;
|
||||||
|
info->data.isJoinable = true;
|
||||||
|
strncpy_s(info->data.hostIP, sizeof(info->data.hostIP), ipBuf, _TRUNCATE);
|
||||||
|
info->data.hostPort = port;
|
||||||
|
info->sessionId = (SessionID)(static_cast<uint64_t>(inet_addr(ipBuf)) | (static_cast<uint64_t>(port) << 32));
|
||||||
|
friendsSessions[0].push_back(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::fclose(file);
|
std::fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -269,6 +269,15 @@ void UIScene_Keyboard::handleInput(int iPad, int key, bool repeat, bool pressed,
|
||||||
switch(key)
|
switch(key)
|
||||||
{
|
{
|
||||||
case ACTION_MENU_OK:
|
case ACTION_MENU_OK:
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
if (m_bPCMode)
|
||||||
|
{
|
||||||
|
// pressing enter sometimes causes a "y" to be entered.
|
||||||
|
handled = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// fall through for controller mode
|
||||||
case ACTION_MENU_LEFT:
|
case ACTION_MENU_LEFT:
|
||||||
case ACTION_MENU_RIGHT:
|
case ACTION_MENU_RIGHT:
|
||||||
case ACTION_MENU_UP:
|
case ACTION_MENU_UP:
|
||||||
|
|
|
||||||
|
|
@ -520,6 +520,9 @@ void UIScene_LoadOrJoinMenu::Initialise()
|
||||||
{
|
{
|
||||||
m_iSaveListIndex = 0;
|
m_iSaveListIndex = 0;
|
||||||
m_iGameListIndex = 0;
|
m_iGameListIndex = 0;
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
m_addServerPhase = eAddServer_Idle;
|
||||||
|
#endif
|
||||||
|
|
||||||
m_iDefaultButtonsC = 0;
|
m_iDefaultButtonsC = 0;
|
||||||
m_iMashUpButtonsC=0;
|
m_iMashUpButtonsC=0;
|
||||||
|
|
@ -1051,8 +1054,7 @@ void UIScene_LoadOrJoinMenu::GetSaveInfo()
|
||||||
m_pSaveDetails=StorageManager.ReturnSavesInfo();
|
m_pSaveDetails=StorageManager.ReturnSavesInfo();
|
||||||
if(m_pSaveDetails==NULL)
|
if(m_pSaveDetails==NULL)
|
||||||
{
|
{
|
||||||
char savename[] = "save";
|
C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save");
|
||||||
C4JStorage::ESaveGameState eSGIStatus = StorageManager.GetSavesInfo(m_iPad, NULL, this, savename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TO_BE_IMPLEMENTED
|
#if TO_BE_IMPLEMENTED
|
||||||
|
|
@ -1471,6 +1473,10 @@ void UIScene_LoadOrJoinMenu::handleFocusChange(F64 controlId, F64 childId)
|
||||||
{
|
{
|
||||||
case eControl_GamesList:
|
case eControl_GamesList:
|
||||||
m_iGameListIndex = childId;
|
m_iGameListIndex = childId;
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// Offset past the "Add Server" button so m_iGameListIndex is a session index
|
||||||
|
m_iGameListIndex -= 1;
|
||||||
|
#endif
|
||||||
m_buttonListGames.updateChildFocus( (int) childId );
|
m_buttonListGames.updateChildFocus( (int) childId );
|
||||||
break;
|
break;
|
||||||
case eControl_SavesList:
|
case eControl_SavesList:
|
||||||
|
|
@ -1598,6 +1604,14 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId)
|
||||||
break;
|
break;
|
||||||
case eControl_GamesList:
|
case eControl_GamesList:
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
if ((int)childId == ADD_SERVER_BUTTON_INDEX)
|
||||||
|
{
|
||||||
|
ui.PlayUISFX(eSFX_Press);
|
||||||
|
BeginAddServer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
m_bIgnoreInput=true;
|
m_bIgnoreInput=true;
|
||||||
|
|
||||||
m_eAction = eAction_JoinGame;
|
m_eAction = eAction_JoinGame;
|
||||||
|
|
@ -1607,6 +1621,10 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId)
|
||||||
|
|
||||||
{
|
{
|
||||||
int nIndex = (int)childId;
|
int nIndex = (int)childId;
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// Offset by 1 because the "Add Server" button is at index 0
|
||||||
|
nIndex -= 1;
|
||||||
|
#endif
|
||||||
m_iGameListIndex = nIndex;
|
m_iGameListIndex = nIndex;
|
||||||
CheckAndJoinGame(nIndex);
|
CheckAndJoinGame(nIndex);
|
||||||
}
|
}
|
||||||
|
|
@ -1896,7 +1914,13 @@ void UIScene_LoadOrJoinMenu::UpdateGamesList()
|
||||||
if(DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0)
|
if(DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0)
|
||||||
{
|
{
|
||||||
unsigned int nIndex = m_buttonListGames.getCurrentSelection();
|
unsigned int nIndex = m_buttonListGames.getCurrentSelection();
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// Offset past the "Add Server" button
|
||||||
|
if (nIndex > 0)
|
||||||
|
pSelectedSession = m_currentSessions->at( nIndex - 1 );
|
||||||
|
#else
|
||||||
pSelectedSession = m_currentSessions->at( nIndex );
|
pSelectedSession = m_currentSessions->at( nIndex );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
SessionID selectedSessionId;
|
SessionID selectedSessionId;
|
||||||
|
|
@ -1949,6 +1973,11 @@ void UIScene_LoadOrJoinMenu::UpdateGamesList()
|
||||||
// clear out the games list and re-fill
|
// clear out the games list and re-fill
|
||||||
m_buttonListGames.clearList();
|
m_buttonListGames.clearList();
|
||||||
|
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// Always add the "Add Server" button as the first entry in the games list
|
||||||
|
m_buttonListGames.addItem(wstring(L"Add Server"));
|
||||||
|
#endif
|
||||||
|
|
||||||
if( filteredListSize > 0 )
|
if( filteredListSize > 0 )
|
||||||
{
|
{
|
||||||
// Reset the focus to the selected session if it still exists
|
// Reset the focus to the selected session if it still exists
|
||||||
|
|
@ -2014,7 +2043,12 @@ void UIScene_LoadOrJoinMenu::UpdateGamesList()
|
||||||
|
|
||||||
if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0)
|
if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0)
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// Offset past the "Add Server" button
|
||||||
|
m_buttonListGames.setCurrentSelection(sessionIndex + 1);
|
||||||
|
#else
|
||||||
m_buttonListGames.setCurrentSelection(sessionIndex);
|
m_buttonListGames.setCurrentSelection(sessionIndex);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++sessionIndex;
|
++sessionIndex;
|
||||||
|
|
@ -4051,3 +4085,168 @@ int UIScene_LoadOrJoinMenu::CopySaveErrorDialogFinishedCallback(void *pParam,int
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _XBOX_ONE
|
#endif // _XBOX_ONE
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
// adding servers bellow
|
||||||
|
|
||||||
|
void UIScene_LoadOrJoinMenu::BeginAddServer()
|
||||||
|
{
|
||||||
|
m_addServerPhase = eAddServer_IP;
|
||||||
|
m_addServerIP.clear();
|
||||||
|
m_addServerPort.clear();
|
||||||
|
|
||||||
|
UIKeyboardInitData kbData;
|
||||||
|
kbData.title = L"Server Address";
|
||||||
|
kbData.defaultText = L"";
|
||||||
|
kbData.maxChars = 128;
|
||||||
|
kbData.callback = &UIScene_LoadOrJoinMenu::AddServerKeyboardCallback;
|
||||||
|
kbData.lpParam = this;
|
||||||
|
kbData.pcMode = g_KBMInput.IsKBMActive();
|
||||||
|
ui.NavigateToScene(m_iPad, eUIScene_Keyboard, &kbData);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UIScene_LoadOrJoinMenu::AddServerKeyboardCallback(LPVOID lpParam, bool bRes)
|
||||||
|
{
|
||||||
|
UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)lpParam;
|
||||||
|
|
||||||
|
if (!bRes)
|
||||||
|
{
|
||||||
|
pClass->m_addServerPhase = eAddServer_Idle;
|
||||||
|
pClass->m_bIgnoreInput = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t ui16Text[256];
|
||||||
|
ZeroMemory(ui16Text, sizeof(ui16Text));
|
||||||
|
Win64_GetKeyboardText(ui16Text, 256);
|
||||||
|
|
||||||
|
wchar_t wBuf[256] = {};
|
||||||
|
for (int k = 0; k < 255 && ui16Text[k]; k++)
|
||||||
|
wBuf[k] = (wchar_t)ui16Text[k];
|
||||||
|
|
||||||
|
if (wBuf[0] == 0)
|
||||||
|
{
|
||||||
|
pClass->m_addServerPhase = eAddServer_Idle;
|
||||||
|
pClass->m_bIgnoreInput = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (pClass->m_addServerPhase)
|
||||||
|
{
|
||||||
|
case eAddServer_IP:
|
||||||
|
{
|
||||||
|
pClass->m_addServerIP = wBuf;
|
||||||
|
pClass->m_addServerPhase = eAddServer_Port;
|
||||||
|
|
||||||
|
UIKeyboardInitData kbData;
|
||||||
|
kbData.title = L"Server Port";
|
||||||
|
kbData.defaultText = L"25565";
|
||||||
|
kbData.maxChars = 6;
|
||||||
|
kbData.callback = &UIScene_LoadOrJoinMenu::AddServerKeyboardCallback;
|
||||||
|
kbData.lpParam = pClass;
|
||||||
|
kbData.pcMode = g_KBMInput.IsKBMActive();
|
||||||
|
ui.NavigateToScene(pClass->m_iPad, eUIScene_Keyboard, &kbData);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eAddServer_Port:
|
||||||
|
{
|
||||||
|
pClass->m_addServerPort = wBuf;
|
||||||
|
pClass->m_addServerPhase = eAddServer_Name;
|
||||||
|
|
||||||
|
UIKeyboardInitData kbData;
|
||||||
|
kbData.title = L"Server Name";
|
||||||
|
kbData.defaultText = L"Minecraft Server";
|
||||||
|
kbData.maxChars = 64;
|
||||||
|
kbData.callback = &UIScene_LoadOrJoinMenu::AddServerKeyboardCallback;
|
||||||
|
kbData.lpParam = pClass;
|
||||||
|
kbData.pcMode = g_KBMInput.IsKBMActive();
|
||||||
|
ui.NavigateToScene(pClass->m_iPad, eUIScene_Keyboard, &kbData);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eAddServer_Name:
|
||||||
|
{
|
||||||
|
wstring name = wBuf;
|
||||||
|
pClass->AppendServerToFile(pClass->m_addServerIP, pClass->m_addServerPort, name);
|
||||||
|
pClass->m_addServerPhase = eAddServer_Idle;
|
||||||
|
pClass->m_bIgnoreInput = false;
|
||||||
|
|
||||||
|
g_NetworkManager.ForceFriendsSessionRefresh();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
pClass->m_addServerPhase = eAddServer_Idle;
|
||||||
|
pClass->m_bIgnoreInput = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIScene_LoadOrJoinMenu::AppendServerToFile(const wstring& ip, const wstring& port, const wstring& name)
|
||||||
|
{
|
||||||
|
char narrowIP[256] = {};
|
||||||
|
char narrowPort[16] = {};
|
||||||
|
char narrowName[256] = {};
|
||||||
|
wcstombs(narrowIP, ip.c_str(), sizeof(narrowIP) - 1);
|
||||||
|
wcstombs(narrowPort, port.c_str(), sizeof(narrowPort) - 1);
|
||||||
|
wcstombs(narrowName, name.c_str(), sizeof(narrowName) - 1);
|
||||||
|
|
||||||
|
uint16_t portNum = (uint16_t)atoi(narrowPort);
|
||||||
|
|
||||||
|
struct ServerEntry { std::string ip; uint16_t port; std::string name; };
|
||||||
|
std::vector<ServerEntry> entries;
|
||||||
|
|
||||||
|
FILE* file = fopen("servers.db", "rb");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
char magic[4] = {};
|
||||||
|
if (fread(magic, 1, 4, file) == 4 && memcmp(magic, "MCSV", 4) == 0)
|
||||||
|
{
|
||||||
|
uint32_t version = 0, count = 0;
|
||||||
|
fread(&version, sizeof(uint32_t), 1, file);
|
||||||
|
fread(&count, sizeof(uint32_t), 1, file);
|
||||||
|
if (version == 1)
|
||||||
|
{
|
||||||
|
for (uint32_t s = 0; s < count; s++)
|
||||||
|
{
|
||||||
|
uint16_t ipLen = 0, p = 0, nameLen = 0;
|
||||||
|
if (fread(&ipLen, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
|
if (ipLen == 0 || ipLen > 256) break;
|
||||||
|
char ipBuf[257] = {};
|
||||||
|
if (fread(ipBuf, 1, ipLen, file) != ipLen) break;
|
||||||
|
if (fread(&p, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
|
if (fread(&nameLen, sizeof(uint16_t), 1, file) != 1) break;
|
||||||
|
if (nameLen > 256) break;
|
||||||
|
char nameBuf[257] = {};
|
||||||
|
if (nameLen > 0 && fread(nameBuf, 1, nameLen, file) != nameLen) break;
|
||||||
|
entries.push_back({std::string(ipBuf), p, std::string(nameBuf)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
entries.push_back({std::string(narrowIP), portNum, std::string(narrowName)});
|
||||||
|
|
||||||
|
file = fopen("servers.db", "wb");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fwrite("MCSV", 1, 4, file);
|
||||||
|
uint32_t version = 1;
|
||||||
|
uint32_t count = (uint32_t)entries.size();
|
||||||
|
fwrite(&version, sizeof(uint32_t), 1, file);
|
||||||
|
fwrite(&count, sizeof(uint32_t), 1, file);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < entries.size(); i++)
|
||||||
|
{
|
||||||
|
uint16_t ipLen = (uint16_t)entries[i].ip.length();
|
||||||
|
fwrite(&ipLen, sizeof(uint16_t), 1, file);
|
||||||
|
fwrite(entries[i].ip.c_str(), 1, ipLen, file);
|
||||||
|
fwrite(&entries[i].port, sizeof(uint16_t), 1, file);
|
||||||
|
uint16_t nameLen = (uint16_t)entries[i].name.length();
|
||||||
|
fwrite(&nameLen, sizeof(uint16_t), 1, file);
|
||||||
|
fwrite(entries[i].name.c_str(), 1, nameLen, file);
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // _WINDOWS64
|
||||||
|
|
@ -175,6 +175,18 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CheckAndJoinGame(int gameIndex);
|
void CheckAndJoinGame(int gameIndex);
|
||||||
|
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
static const int ADD_SERVER_BUTTON_INDEX = 0;
|
||||||
|
enum eAddServerPhase { eAddServer_Idle, eAddServer_IP, eAddServer_Port, eAddServer_Name };
|
||||||
|
eAddServerPhase m_addServerPhase;
|
||||||
|
wstring m_addServerIP;
|
||||||
|
wstring m_addServerPort;
|
||||||
|
void BeginAddServer();
|
||||||
|
void AppendServerToFile(const wstring& ip, const wstring& port, const wstring& name);
|
||||||
|
static int AddServerKeyboardCallback(LPVOID lpParam, bool bRes);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__)
|
#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__)
|
||||||
static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result);
|
static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result);
|
||||||
static int PSN_SignInReturned(void *pParam,bool bContinue, int iPad);
|
static int PSN_SignInReturned(void *pParam,bool bContinue, int iPad);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue