Jump to content
  • 0

[SRC] Changing chat color clif.c


Rivarly

Question


  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  2
  • Reputation:   0
  • Joined:  05/26/14
  • Last Seen:  

Hello guys,

 

I have a modification on my clif.c which lets me change the chat color depending on the GM lvl, at this moment I'm using it on eathena and it works perfect, but when i try to make the modification on rAthena it shows me the following error while compiling

 

Error
1> .. \ src \ map \ clif.c (10104): warning C4013: 'pc_isGM' undefined; assumes that returns result extern int 
1> .. \ src \ map \ clif.c (10174): error C2440: 'function': can not convert from 'char [2]' to 'e_log_chat_type' 
1> .. \ src \ map \ clif.c (10174): warning C4024: 'log_chat': different types for formal and actual parameter Parameter 1

 

Modification code:

/*==========================================
 * Validates and processes global messages
 * S 008c/00f3 <packet len>.w <text>.?B (<name> : <message>) 00
 *------------------------------------------*/
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;
        int namelen, messagelen;
        unsigned long player = strtoul("0x55AE3A",NULL,0); //normal player color leaf
    unsigned long GM20 = strtoul("0xFFA500",NULL,0); //GM level 20 to 39 color orange
    unsigned long GM40 = strtoul("0xCD00CD",NULL,0); //GM level 40 to 59 color magenta3
    unsigned long GM60 = strtoul("0x006400",NULL,0); //GM level 60 to 79 color dark green
    unsigned long GM80 = strtoul("0x00008B",NULL,0); //GM level 80 to 98 color dark blue
    unsigned long admin = strtoul("0xFF0000",NULL,0); //Admin color red

        // 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;
        }

        // 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 == 99){
                WFIFOL(fd,8) = (admin & 0x0000FF) << 16 | (admin & 0x00FF00) | (admin & 0xFF0000) >> 16;
        }
        else if (gm_lvl==0){
                WFIFOL(fd,8) = (player & 0x0000FF) << 16 | (player & 0x00FF00) | (player & 0xFF0000) >> 16;
        }
    else if (gm_lvl >=20 && gm_lvl<=39)
    {
                WFIFOL(fd,8) = (GM20 & 0x0000FF) << 16 | (GM20 & 0x00FF00) | (GM20 & 0xFF0000) >> 16;
    }
    else if (gm_lvl >=40 && gm_lvl <= 59)
    {
        WFIFOL(fd,8) = (GM40 & 0x0000FF) << 16 | (GM40 & 0x00FF00) | (GM40 & 0xFF0000) >> 16;
    }
    else if (gm_lvl >=60 && 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), 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
        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
        if( log_config.chat&1 || (log_config.chat&2 && !((agit_flag || agit2_flag) && log_config.chat&64)) )
                log_chat("O", 0, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, message);

        return;
}

rAthena code:


/// Validates and processes global messages
/// 008c <packet len>.W <text>.?B (<name> : <message>) 00 (CZ_REQUEST_CHAT)
/// There are various variants of this packet.
void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
{

struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)];
int textlen = RFIFOW(fd,info->pos[0]) - 4;
const char* text = (char*)RFIFOP(fd,info->pos[1]);

char *name, *message, *fakename = NULL;
int namelen, messagelen;

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.cant.chat)
return; //no "chatting" while muted.

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;
}

if( sd->gcbind ) {
channel_send(sd->gcbind,sd,message);
return;
}

/**
* Fake Name Design by FatalEror (bug report #9)
**/
if( ( is_fake = ( sd->fakename[0] ) ) ) {
fakename = (char*) aMalloc(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)
clif_GlobalMessage(&sd->bl,is_fake ? fakename : text,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);
aFree(fakename);
} else {
memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,info->pos[0]));
WFIFOW(fd,0) = 0x8e;
}
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

// Reset idle time when using normal chat.
sd->idletime = last_tick;

// 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);
}
If we can find the solution i will make a patch and share it with the community 

/no1

Edited by Rivarly
Link to comment
Share on other sites

2 answers to this question

Recommended Posts


  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  2
  • Reputation:   0
  • Joined:  05/26/14
  • Last Seen:  

Bump!

Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  74
  • Topics Per Day:  0.02
  • Content Count:  420
  • Reputation:   89
  • Joined:  01/30/12
  • Last Seen:  

Spot the difference:

Your:

 log_chat("O", 0, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, message);

rA:

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);

You are using a string as the first parameter instead of a type.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...