Hello there.
I am not sure how to update this code.
This is from eathena but I could not find the topic where I took it (for the roll back, I think...)
clic.c
void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
{
const char* text = (char*)RFIFOP(fd,4);
int textlen = RFIFOW(fd,2) - 4;
int gm_lvl = pc_isGM(sd);
char *name, *message, *fakename = NULL;
int namelen, messagelen;
unsigned long player = strtoul("0x",NULL,0); //Usuario Blanco
unsigned long GM20 = strtoul("0x",NULL,0); //GM level 1 azul
unsigned long GM40 = strtoul("0xFC96E5",NULL,0); //GM level 2 rosado
unsigned long GM60 = strtoul("0xFFA500",NULL,0); //GM level 3 to 79 color orange
unsigned long GM80 = strtoul("0x00008B",NULL,0); //GM level 80 to 98 color dark blue
unsigned long admin = strtoul("0xFFF200",NULL,0); //amarillo
unsigned long girl = strtoul("0xFC96E5",NULL,0); //rosado suave
unsigned long boy = strtoul("0x",NULL,0); //azul suave
unsigned long god = strtoul("0xFF0000",NULL,0); //rojo
bool is_fake;
// validate packet and retrieve name and message
if( !clif_process_message(sd, 0, &name, &namelen, &message, &messagelen) )
return;
if( is_atcommand(fd, sd, message, 1) )
return;
if( sd->sc.data[sC_BERSERK] || (sd->sc.data[sC_NOCHAT] && sd->sc.data[sC_NOCHAT]->val1&MANNER_NOCHAT) )
return;
if( battle_config.min_chat_delay )
{ //[skotlex]
if (DIFF_TICK(sd->cantalk_tick, gettick()) > 0)
return;
sd->cantalk_tick = gettick() + battle_config.min_chat_delay;
}
/**
* Fake Name Design by FatalEror (bug report #9)
**/
if( ( is_fake = ( sd->fakename[0] ) ) ) {
fakename = (char*) malloc(strlen(sd->fakename)+messagelen+3);
strcpy(fakename, sd->fakename);
strcat(fakename, " : ");
strcat(fakename, message);
textlen = strlen(fakename) + 1;
}
// send message to others (using the send buffer for temp. storage)
WFIFOHEAD(fd, 12 + textlen);
WFIFOW(fd,0) = 0x2C1;
WFIFOW(fd,2) = 12 + textlen;
WFIFOL(fd,4) = sd->bl.id;
if(gm_lvl == 100){
WFIFOL(fd,8) = (god & 0x0000FF) << 16 | (god & 0x00FF00) | (god & 0xFF0000) >> 16;
}
else if(gm_lvl == 99){
WFIFOL(fd,8) = (admin & 0x0000FF) << 16 | (admin & 0x00FF00) | (admin & 0xFF0000) >> 16;
}
else if (gm_lvl==0 && sd->status.sex==0) {
WFIFOL(fd,8) = (girl & 0x0000FF) << 16 | (girl & 0x00FF00) | (girl & 0xFF0000) >> 16;
}
else if (gm_lvl==0 && sd->status.sex==1) {
WFIFOL(fd,8) = (boy & 0x0000FF) << 16 | (boy & 0x00FF00) | (boy & 0xFF0000) >> 16;
}
else if (gm_lvl==1 && sd->status.sex==1) {
WFIFOL(fd,8) = (GM20 & 0x0000FF) << 16 | (GM20 & 0x00FF00) | (GM20 & 0xFF0000) >> 16;
}
else if (gm_lvl==2 && sd->status.sex==0) {
WFIFOL(fd,8) = (GM40 & 0x0000FF) << 16 | (GM40 & 0x00FF00) | (GM40 & 0xFF0000) >> 16;
}
else if (gm_lvl >=3 && gm_lvl <= 79) {
WFIFOL(fd,8) = (GM60 & 0x0000FF) << 16 | (GM60 & 0x00FF00) | (GM60 & 0xFF0000) >> 16;
}
else if (gm_lvl >=80 && gm_lvl <= 98) {
WFIFOL(fd,8) = (GM80 & 0x0000FF) << 16 | (GM80 & 0x00FF00) | (GM80 & 0xFF0000) >> 16;
}
safestrncpy((char*)WFIFOP(fd,12), is_fake ? fakename : text, textlen);
//FIXME: chat has range of 9 only
clif_send(WFIFOP(fd,0), WFIFOW(fd,2), &sd->bl, sd->chatID ? CHAT_WOS : AREA_CHAT_WOC);
// send back message to the speaker
if( is_fake ) {
WFIFOW(fd,0) = 0x8e;
WFIFOW(fd,2) = textlen + 4;
safestrncpy((char*)WFIFOP(fd,4), fakename, textlen);
} else {
memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
WFIFOW(fd,0) = 0x8e;
//WFIFOW(fd,0) = 0x2C1;
}
WFIFOSET(fd, WFIFOW(fd,2));
#ifdef PCRE_SUPPORT
// trigger listening npcs
map_foreachinrange(npc_chat_sub, &sd->bl, AREA_SIZE, BL_NPC, text, textlen, &sd->bl);
#endif
// Chat logging type 'O' / Global Chat
log_chat(LOG_CHAT_GLOBAL, 0, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, message);
return;
}
thanks