Jump to content

Rivarly

Members
  • Posts

    2
  • Joined

  • Last visited

Profile Information

  • Gender
    Not Telling
  • Location
    CR
  • Server
    OWN

Recent Profile Visitors

396 profile views

Rivarly's Achievements

Poring

Poring (1/15)

0

Reputation

  1. 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
×
×
  • Create New...