Clean up console commands

Improve functionality of network console commands and make displaying of who is who clearer.
This commit is contained in:
Boondorl 2025-07-03 15:16:22 -04:00 committed by Ricardo Luís Vaz Silva
commit a1a3be1046
2 changed files with 226 additions and 154 deletions

View file

@ -1016,50 +1016,75 @@ void ReadUserInfo(FSerializer &arc, userinfo_t &info, FString &skin)
}
}
CCMD (playerinfo)
CCMD(playerinfo)
{
if (argv.argc() < 2)
TArray<int> inGame = {};
for (int i = 0; i < MAXPLAYERS; ++i)
{
int i;
if (playeringame[i])
inGame.Push(i);
}
for (i = 0; i < MAXPLAYERS; i++)
const bool isMulti = inGame.Size() > 1;
if (isMulti && argv.argc() < 2)
{
for (auto i : inGame)
{
if (playeringame[i])
Printf("%d. %s", i, players[i].userinfo.GetName());
if (i == consoleplayer || i == Net_Arbitrator || players[i].Bot != nullptr || players[i].settings_controller)
{
Printf("%d. %s\n", i, players[i].userinfo.GetName());
Printf(" [");
if (i == consoleplayer)
Printf("*");
if (i == Net_Arbitrator)
Printf("H");
if (players[i].Bot != nullptr)
Printf("B");
else if (players[i].settings_controller && i != Net_Arbitrator)
Printf("C");
Printf("]");
}
Printf("\n");
}
Printf("Pass a player number for more info\n");
}
else
{
int i = atoi(argv[1]);
if (i < 0 || i >= MAXPLAYERS)
int i = -1;
if (!isMulti)
{
Printf("Bad player number\n");
i = consoleplayer;
}
else if (!C_IsValidInt(argv[1], i) || i < 0 || i >= MAXPLAYERS)
{
Printf("Bad player number %s\n", argv[1]);
return;
}
userinfo_t *ui = &players[i].userinfo;
if (!playeringame[i])
{
Printf(TEXTCOLOR_ORANGE "Player %d is not in the game\n", i);
Printf("Player %d is not in game\n", i);
return;
}
const userinfo_t& info = players[i].userinfo;
// Print special info
Printf("%20s: %s\n", "Name", ui->GetName());
Printf("%20s: %s (%d)\n", "Team", ui->GetTeam() == TEAM_NONE ? "None" : Teams[ui->GetTeam()].GetName(), ui->GetTeam());
Printf("%20s: %s (%d)\n", "Skin", Skins[ui->GetSkin()].Name.GetChars(), ui->GetSkin());
Printf("%20s: %s (%d)\n", "Gender", GenderNames[ui->GetGender()], ui->GetGender());
Printf("%20s: %s\n", "Host", i == Net_Arbitrator ? "Yes" : "No");
Printf("%20s: %s\n", "Console Player", i == consoleplayer ? "Yes" : "No");
Printf("%20s: %s\n", "Bot", players[i].Bot != nullptr ? "Yes" : "No");
Printf("%20s: %s\n", "Settings Controller", players[i].settings_controller && players[i].Bot == nullptr ? "Yes" : "No");
Printf("%20s: %s\n", "Name", info.GetName());
Printf("%20s: %s (%d)\n", "Team", info.GetTeam() == TEAM_NONE ? "None" : Teams[info.GetTeam()].GetName(), info.GetTeam());
Printf("%20s: %s (%d)\n", "Skin", Skins[info.GetSkin()].Name.GetChars(), info.GetSkin());
Printf("%20s: %s (%d)\n", "Gender", GenderNames[info.GetGender()], info.GetGender());
Printf("%20s: %s (%d)\n", "PlayerClass",
ui->GetPlayerClassNum() == -1 ? "Random" : ui->GetPlayerClassType()->GetDisplayName().GetChars(),
ui->GetPlayerClassNum());
info.GetPlayerClassNum() == -1 ? "Random" : info.GetPlayerClassType()->GetDisplayName().GetChars(),
info.GetPlayerClassNum());
// Print generic info
TMapIterator<FName, FBaseCVar *> it(*ui);
TMap<FName, FBaseCVar *>::Pair *pair;
TMap<FName, FBaseCVar*>::ConstIterator it = { info };
TMap<FName, FBaseCVar*>::ConstPair* pair = nullptr;
while (it.NextPair(pair))
{
if (pair->Key != NAME_Name && pair->Key != NAME_Team && pair->Key != NAME_Skin &&
@ -1068,10 +1093,9 @@ CCMD (playerinfo)
Printf("%20s: %s\n", pair->Key.GetChars(), pair->Value->GetHumanString());
}
}
if (argv.argc() > 2)
{
if (argv.argc() > 2 || (!isMulti && argv.argc() > 1))
PrintMiscActorInfo(players[i].mo);
}
}
}