void D_UserInfoChanged (FBaseCVar *cvar) { UCVarValue val; FString escaped_val; char foo[256]; if (cvar == &autoaim) { if (autoaim < 0.0f) { autoaim = 0.0f; return; } else if (autoaim > 5000.0f) { autoaim = 5000.f; return; } } val = cvar->GetGenericRep (CVAR_String); escaped_val = D_EscapeUserInfo(val.String); if (4 + strlen(cvar->GetName()) + escaped_val.Len() > 256) I_Error ("User info descriptor too big"); mysnprintf (foo, countof(foo), "\\%s\\%s", cvar->GetName(), escaped_val.GetChars()); Net_WriteByte (DEM_UINFCHANGED); Net_WriteString (foo); }
void D_WriteUserInfoStrings (int pnum, BYTE **stream, bool compact) { if (pnum >= MAXPLAYERS) { WriteByte (0, stream); return; } userinfo_t *info = &players[pnum].userinfo; TArray<TMap<FName, FBaseCVar *>::Pair *> userinfo_pairs(info->CountUsed()); TMap<FName, FBaseCVar *>::Iterator it(*info); TMap<FName, FBaseCVar *>::Pair *pair; UCVarValue cval; // Create a simple array of all userinfo cvars while (it.NextPair(pair)) { userinfo_pairs.Push(pair); } // For compact mode, these need to be sorted. Verbose mode doesn't matter. if (compact) { qsort(&userinfo_pairs[0], userinfo_pairs.Size(), sizeof(pair), userinfosortfunc); // Compact mode is signified by starting the string with two backslash characters. // We output one now. The second will be output as part of the first value. *(*stream)++ = '\\'; } for (unsigned int i = 0; i < userinfo_pairs.Size(); ++i) { pair = userinfo_pairs[i]; if (!compact) { // In verbose mode, prepend the cvar's name *stream += sprintf(*((char **)stream), "\\%s", pair->Key.GetChars()); } // A few of these need special handling for compatibility reasons. switch (pair->Key.GetIndex()) { case NAME_Gender: *stream += sprintf(*((char **)stream), "\\%s", *static_cast<FIntCVar *>(pair->Value) == GENDER_FEMALE ? "female" : *static_cast<FIntCVar *>(pair->Value) == GENDER_NEUTER ? "other" : "male"); break; case NAME_PlayerClass: *stream += sprintf(*((char **)stream), "\\%s", info->GetPlayerClassNum() == -1 ? "Random" : D_EscapeUserInfo(info->GetPlayerClassType()->Meta.GetMetaString(APMETA_DisplayName)).GetChars()); break; case NAME_Skin: *stream += sprintf(*((char **)stream), "\\%s", D_EscapeUserInfo(skins[info->GetSkin()].name).GetChars()); break; default: cval = pair->Value->GetGenericRep(CVAR_String); *stream += sprintf(*((char **)stream), "\\%s", cval.String); break; } } *(*stream)++ = '\0'; }
void D_WriteUserInfoStrings (int i, BYTE **stream, bool compact) { if (i >= MAXPLAYERS) { WriteByte (0, stream); } else { userinfo_t *info = &players[i].userinfo; const PClass *type = PlayerClasses[info->PlayerClass].Type; if (!compact) { sprintf (*((char **)stream), "\\name\\%s" "\\autoaim\\%g" "\\color\\%x %x %x" "\\skin\\%s" "\\team\\%d" "\\gender\\%s" "\\neverswitchonpickup\\%d" "\\movebob\\%g" "\\stillbob\\%g" "\\playerclass\\%s" , D_EscapeUserInfo(info->netname).GetChars(), (double)info->aimdist / (float)ANGLE_1, RPART(info->color), GPART(info->color), BPART(info->color), D_EscapeUserInfo(skins[info->skin].name).GetChars(), info->team, info->gender == GENDER_FEMALE ? "female" : info->gender == GENDER_NEUTER ? "other" : "male", info->neverswitch, (float)(info->MoveBob) / 65536.f, (float)(info->StillBob) / 65536.f, info->PlayerClass == -1 ? "Random" : D_EscapeUserInfo(type->Meta.GetMetaString (APMETA_DisplayName)).GetChars() ); } else { sprintf (*((char **)stream), "\\" "\\%s" // name "\\%g" // autoaim "\\%x %x %x" // color "\\%s" // skin "\\%d" // team "\\%s" // gender "\\%d" // neverswitchonpickup "\\%g" // movebob "\\%g" // stillbob "\\%s" // playerclass , D_EscapeUserInfo(info->netname).GetChars(), (double)info->aimdist / (float)ANGLE_1, RPART(info->color), GPART(info->color), BPART(info->color), D_EscapeUserInfo(skins[info->skin].name).GetChars(), info->team, info->gender == GENDER_FEMALE ? "female" : info->gender == GENDER_NEUTER ? "other" : "male", info->neverswitch, (float)(info->MoveBob) / 65536.f, (float)(info->StillBob) / 65536.f, info->PlayerClass == -1 ? "Random" : D_EscapeUserInfo(type->Meta.GetMetaString (APMETA_DisplayName)).GetChars() ); } } *stream += strlen (*((char **)stream)) + 1; }