Fixes for JSON

Co-authored-by: Edo <edoardo.sanguineti222@gmail.com>
Co-authored-by: rackover <roxanne@thegamebakers.com>
This commit is contained in:
Diavolo 2022-08-04 11:24:32 +02:00
parent 8ac33260a4
commit 323021af5d
7 changed files with 81 additions and 89 deletions

View File

@ -187,7 +187,7 @@ The format is based on [Keep a Changelog v0.3.0](http://keepachangelog.com/en/0.
- Fixed slow motion during final killcams (#111 - #107)
- Fixed sound issue that causes the game to freeze (#106)
- Fixed issue where materials strings found in hostnames, player names, chat etc. caused the game to crash (#113)
- Fixed issue with servers displaying an invalid player count (#144)
- Fixed issue with servers displaying an invalid player count (#113)
### Known issues

View File

@ -5,10 +5,10 @@ namespace Assets
{
void Isnd_alias_list_t::load(Game::XAssetHeader* header, const std::string& name, Components::ZoneBuilder::Zone* builder)
{
Components::FileSystem::File aliasFile(Utils::String::VA("sounds/%s", name.c_str()));
Components::FileSystem::File aliasFile(Utils::String::VA("sounds/%s.json", name.data()));
if (!aliasFile.exists())
{
header->sound = Components::AssetHandler::FindOriginalAsset(this->getType(), name.c_str()).sound;
header->sound = Components::AssetHandler::FindOriginalAsset(this->getType(), name.data()).sound;
return;
}
@ -19,7 +19,6 @@ namespace Assets
return;
}
std::string errors;
nlohmann::json infoData = nlohmann::json::parse(aliasFile.getBuffer());
nlohmann::json aliasesContainer = infoData["head"];

View File

@ -151,7 +151,8 @@ namespace Components
if (idEntry.is_string())
{
SteamID id;
id.bits = strtoull(idEntry.get<std::string>().data(), nullptr, 16);
auto guid = idEntry.get<std::string>();
id.bits = std::strtoull(guid.data(), nullptr, 16);
list->idList.push_back(id);
}

View File

@ -20,13 +20,10 @@ namespace Components
{
case 0:
return Utils::String::VA("%d", index);
case 1:
return ServerInfo::PlayerContainer.playerList[index].name.data();
case 2:
return Utils::String::VA("%d", ServerInfo::PlayerContainer.playerList[index].score);
case 3:
return Utils::String::VA("%d", ServerInfo::PlayerContainer.playerList[index].ping);
default:
@ -130,17 +127,16 @@ namespace Components
Utils::InfoString ServerInfo::GetInfo()
{
int maxclientCount = *Game::svs_clientCount;
auto maxClientCount = *Game::svs_clientCount;
if (!maxclientCount)
if (!maxClientCount)
{
maxclientCount = Dvar::Var("party_maxplayers").get<int>();
//maxclientCount = Game::Party_GetMaxPlayers(*Game::partyIngame);
maxClientCount = Dvar::Var("party_maxplayers").get<int>();
}
Utils::InfoString info(Game::Dvar_InfoString_Big(1024));
Utils::InfoString info(Game::Dvar_InfoString_Big(Game::DVAR_SERVERINFO));
info.set("gamename", "IW4");
info.set("sv_maxclients", Utils::String::VA("%i", maxclientCount));
info.set("sv_maxclients", Utils::String::VA("%i", maxClientCount));
info.set("protocol", Utils::String::VA("%i", PROTOCOL));
info.set("shortversion", SHORTVERSION);
info.set("mapname", Dvar::Var("mapname").get<const char*>());
@ -231,84 +227,83 @@ namespace Components
Network::OnPacket("statusResponse", [](const Network::Address& address, [[maybe_unused]] const std::string& data)
{
if (ServerInfo::PlayerContainer.target == address)
if (ServerInfo::PlayerContainer.target != address)
{
Utils::InfoString info(data.substr(0, data.find_first_of("\n")));
return;
}
Dvar::Var("uiSi_ServerName").set(info.get("sv_hostname"));
Dvar::Var("uiSi_MaxClients").set(info.get("sv_maxclients"));
Dvar::Var("uiSi_Version").set(info.get("shortversion"));
Dvar::Var("uiSi_SecurityLevel").set(info.get("sv_securityLevel"));
Dvar::Var("uiSi_isPrivate").set(info.get("isPrivate") == "0" ? "@MENU_NO" : "@MENU_YES");
Dvar::Var("uiSi_Hardcore").set(info.get("g_hardcore") == "0" ? "@MENU_DISABLED" : "@MENU_ENABLED");
Dvar::Var("uiSi_KillCam").set(info.get("scr_game_allowkillcam") == "0" ? "@MENU_NO" : "@MENU_YES");
Dvar::Var("uiSi_MapName").set(info.get("mapname"));
Dvar::Var("uiSi_MapNameLoc").set(Game::UI_LocalizeMapName(info.get("mapname").data()));
Dvar::Var("uiSi_GameType").set(Game::UI_LocalizeGameType(info.get("g_gametype").data()));
Dvar::Var("uiSi_ModName").set("");
const Utils::InfoString info(data.substr(0, data.find_first_of("\n")));
switch (atoi(info.get("scr_team_fftype").data()))
Dvar::Var("uiSi_ServerName").set(info.get("sv_hostname"));
Dvar::Var("uiSi_MaxClients").set(info.get("sv_maxclients"));
Dvar::Var("uiSi_Version").set(info.get("shortversion"));
Dvar::Var("uiSi_SecurityLevel").set(info.get("sv_securityLevel"));
Dvar::Var("uiSi_isPrivate").set(info.get("isPrivate") == "0" ? "@MENU_NO" : "@MENU_YES");
Dvar::Var("uiSi_Hardcore").set(info.get("g_hardcore") == "0" ? "@MENU_DISABLED" : "@MENU_ENABLED");
Dvar::Var("uiSi_KillCam").set(info.get("scr_game_allowkillcam") == "0" ? "@MENU_NO" : "@MENU_YES");
Dvar::Var("uiSi_MapName").set(info.get("mapname"));
Dvar::Var("uiSi_MapNameLoc").set(Game::UI_LocalizeMapName(info.get("mapname").data()));
Dvar::Var("uiSi_GameType").set(Game::UI_LocalizeGameType(info.get("g_gametype").data()));
Dvar::Var("uiSi_ModName").set("");
switch (atoi(info.get("scr_team_fftype").data()))
{
default:
Dvar::Var("uiSi_ffType").set("@MENU_DISABLED");
break;
case 1:
Dvar::Var("uiSi_ffType").set("@MENU_ENABLED");
break;
case 2:
Dvar::Var("uiSi_ffType").set("@MPUI_RULES_REFLECT");
break;
case 3:
Dvar::Var("uiSi_ffType").set("@MPUI_RULES_SHARED");
break;
}
if (info.get("fs_game").size() > 5)
{
Dvar::Var("uiSi_ModName").set(info.get("fs_game").data() + 5);
}
auto lines = Utils::String::Split(data, '\n');
if (lines.size() <= 1) return;
for (std::size_t i = 1; i < lines.size(); ++i)
{
ServerInfo::Container::Player player;
std::string currentData = lines[i];
if (currentData.size() < 3) continue;
// Insert score
player.score = atoi(currentData.substr(0, currentData.find_first_of(" ")).data());
// Remove score
currentData = currentData.substr(currentData.find_first_of(" ") + 1);
// Insert ping
player.ping = atoi(currentData.substr(0, currentData.find_first_of(" ")).data());
// Remove ping
currentData = currentData.substr(currentData.find_first_of(" ") + 1);
if (currentData[0] == '\"')
{
default:
Dvar::Var("uiSi_ffType").set("@MENU_DISABLED");
break;
case 1:
Dvar::Var("uiSi_ffType").set("@MENU_ENABLED");
break;
case 2:
Dvar::Var("uiSi_ffType").set("@MPUI_RULES_REFLECT");
break;
case 3:
Dvar::Var("uiSi_ffType").set("@MPUI_RULES_SHARED");
break;
currentData = currentData.substr(1);
}
if (info.get("fs_game").size() > 5)
if (currentData.back() == '\"')
{
Dvar::Var("uiSi_ModName").set(info.get("fs_game").data() + 5);
currentData.pop_back();
}
auto lines = Utils::String::Split(data, '\n');
player.name = currentData;
if (lines.size() <= 1) return;
for (unsigned int i = 1; i < lines.size(); ++i)
{
ServerInfo::Container::Player player;
std::string currentData = lines[i];
if (currentData.size() < 3) continue;
// Insert score
player.score = atoi(currentData.substr(0, currentData.find_first_of(" ")).data());
// Remove score
currentData = currentData.substr(currentData.find_first_of(" ") + 1);
// Insert ping
player.ping = atoi(currentData.substr(0, currentData.find_first_of(" ")).data());
// Remove ping
currentData = currentData.substr(currentData.find_first_of(" ") + 1);
if (currentData[0] == '\"')
{
currentData = currentData.substr(1);
}
if (currentData.back() == '\"')
{
currentData.pop_back();
}
player.name = currentData;
ServerInfo::PlayerContainer.playerList.push_back(player);
}
ServerInfo::PlayerContainer.playerList.push_back(player);
}
});
}

View File

@ -312,7 +312,6 @@ namespace Components
void ServerList::StoreFavourite(const std::string& server)
{
//json11::Json::parse()
std::vector<std::string> servers;
if (Utils::IO::FileExists("players/favourites.json"))
@ -327,7 +326,7 @@ namespace Components
return;
}
nlohmann::json::array_t storedServers = object;
nlohmann::json::array_t storedServers = object;
for (unsigned int i = 0; i < storedServers.size(); ++i)
{
@ -540,15 +539,12 @@ namespace Components
)
{
auto lList = ServerList::GetList();
if (lList)
{
lList->push_back(server);
ServerList::RefreshVisibleListInternal(UIScript::Token());
}
}
break;
}
else
{

View File

@ -206,7 +206,8 @@ namespace Components
info.gametype = metaObject["gametype"].get<std::string>();
info.mapname = metaObject["mapname"].get<std::string>();
info.length = metaObject["length"].get<int>();
info.timeStamp = _atoi64(metaObject["timestamp"].get<std::string>().data());
auto timestamp = metaObject["timestamp"].get<std::string>();
info.timeStamp = _atoi64(timestamp.data());
Theatre::Demos.push_back(info);
}

View File

@ -76,6 +76,6 @@ namespace Utils
nlohmann::json InfoString::to_json() const
{
return {this->keyValuePairs};
return this->keyValuePairs;
}
}