1. Wieso funktioniert du Funktion, du gibst keine String-Größe an?
2. Es ist klar definiert, dass nur ein Unterstrich im Namen vorkommen darf, oder?
Dann könntest du die Funktion einfach so schreiben:
stock RemoveUnderscore(const text[MAX_PLAYER_NAME+1])
{
new i = strfind(text,"_");
if(i == -1) return text;
new string[MAX_PLAYER_NAME+1];
strcat(string,text),string[i] = ' ';
return string;
}
Mit der Funktion ist auch sichergestellt, dass du nicht zu große Arrays verwendest oder zu kleine 
Und bei deinem Callback kommst du durcheinander (der Fehler liegt bei den String-Variablen), weil du alles darein packst.
Aber das ist doch eine eigene Funktion, die du an anderer Stelle eventuell wieder verwenden kannst, lager sie doch einfach aus.
Schreib es so:
public OnPlayerText(playerid, text[])
{
new string[128];
format(string, sizeof(string), "%s sagt: {FFFFFF}%s", RemoveUnderscore(SpielerDaten[playerid][player_RPName]), text);
SendRangeColorMessage(playerid, string);
return 0;
}
stock SendRangeColorMessage(playerid,const string[])
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
for(new i=GetPlayerPoolSize(),chat_color,Float:distance; i!=-1; i--)
{
if(!SpielerDaten[i][player_Eingeloggt] || !IsPlayerInRangeOfPoint(i, CHAT_RADIUS, x, y, z)) continue;
distance = GetPlayerDistanceFromPoint(i, x, y, z);
if(distance < CHAT_RADIUS / CHAT_FADES)
{
chat_color = COLOR_CHAT;
}
else if(distance < CHAT_RADIUS / CHAT_FADES * 2)
{
chat_color = COLOR_FADE1;
}
else if(distance < CHAT_RADIUS / CHAT_FADES * 3)
{
chat_color = COLOR_FADE2;
}
else if(distance < CHAT_RADIUS / CHAT_FADES * 4)
{
chat_color = COLOR_FADE3;
}
else if(distance <= CHAT_RADIUS / CHAT_FADES * 5)
{
chat_color = COLOR_FADE4;
}
SendClientMessage(i, chat_color, string);
}
return 1;
}
Alles anzeigen
PS: Falls du die Funktion oben verwendest und einen Fehler erhälst wegen der Array Size, im Enum muss die Größe von player_RPName exakt MAX_PLAYER_NAME+1 sein.