From eb10f355f7e228b59011326a7f84da2e593affea Mon Sep 17 00:00:00 2001 From: Haru Date: Wed, 11 Sep 2013 01:28:31 +0200 Subject: Fixed announce script command support for bc_blue and bc_woe - Fixes an issue where it wasn't possible to use bc_blue or bc_woe at the same time as bc_map, bc_area or bc_self. (this partly works around bugreport:7693 - http://hercules.ws/board/tracker/issue-7693-character-with-name ) - Replaced bc_* related values from various places through the sources with constants. Signed-off-by: Haru --- src/map/atcommand.c | 8 ++++---- src/map/clif.c | 10 +++++----- src/map/clif.h | 35 +++++++++++++++++++++++++++-------- src/map/duel.c | 2 +- src/map/intif.c | 8 ++++---- src/map/mob.c | 4 ++-- src/map/pc.c | 6 +++--- src/map/script.c | 35 +++++++++++++++++------------------ 8 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 4a4487c3b..df97740e1 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -1046,9 +1046,9 @@ ACMD(kami) sscanf(message, "%199[^\n]", atcmd_output); if (strstr(command, "l") != NULL) - clif->broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, 0, ALL_SAMEMAP); + clif->broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT, ALL_SAMEMAP); else - intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, (*(command + 5) == 'b' || *(command + 5) == 'B') ? 0x10 : 0); + intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, (*(command + 5) == 'b' || *(command + 5) == 'B') ? BC_BLUE : BC_YELLOW); } else { if(!message || !*message || (sscanf(message, "%lx %199[^\n]", &color, atcmd_output) < 2)) { clif->message(fd, msg_txt(981)); // Please enter color and message (usage: @kamic ). @@ -4960,7 +4960,7 @@ ACMD(broadcast) } sprintf(atcmd_output, "%s: %s", sd->status.name, message); - intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); + intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT); return true; } @@ -4981,7 +4981,7 @@ ACMD(localbroadcast) sprintf(atcmd_output, "%s: %s", sd->status.name, message); - clif->broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, 0, ALL_SAMEMAP); + clif->broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT, ALL_SAMEMAP); return true; } diff --git a/src/map/clif.c b/src/map/clif.c index 081260ddb..8f82141b2 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -5718,14 +5718,14 @@ void clif_displaymessage2(const int fd, const char* mes) { /// 009a .W .?B void clif_broadcast(struct block_list* bl, const char* mes, int len, int type, enum send_target target) { - int lp = type ? 4 : 0; + int lp = (type&BC_COLOR_MASK) ? 4 : 0; unsigned char *buf = (unsigned char*)aMalloc((4 + lp + len)*sizeof(unsigned char)); WBUFW(buf,0) = 0x9a; WBUFW(buf,2) = 4 + lp + len; - if (type == 0x10) // bc_blue + if( type&BC_BLUE ) WBUFL(buf,4) = 0x65756c62; //If there's "blue" at the beginning of the message, game client will display it in blue instead of yellow. - else if (type == 0x20) // bc_woe + else if( type&BC_WOE ) WBUFL(buf,4) = 0x73737373; //If there's "ssss", game client will recognize message as 'WoE broadcast'. memcpy(WBUFP(buf, 4 + lp), mes, len); clif->send(buf, WBUFW(buf,2), bl, target); @@ -9580,8 +9580,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { if( map[sd->bl.m].flag.allowks && !map_flag_ks(sd->bl.m) ) { char output[128]; - sprintf(output, "[ Kill Steal Protection Disable. KS is allowed in this map ]"); - clif->broadcast(&sd->bl, output, strlen(output) + 1, 0x10, SELF); + sprintf(output, "[ Kill Steal Protection Disabled. KS is allowed in this map ]"); + clif->broadcast(&sd->bl, output, strlen(output) + 1, BC_BLUE, SELF); } iMap->iwall_get(sd); // Updates Walls Info on this Map to Client diff --git a/src/map/clif.h b/src/map/clif.h index f414ecebb..73d3611a2 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -60,13 +60,13 @@ enum {// packet DB typedef enum send_target { ALL_CLIENT, ALL_SAMEMAP, - AREA, // area - AREA_WOS, // area, without self - AREA_WOC, // area, without chatrooms - AREA_WOSC, // area, without own chatroom - AREA_CHAT_WOC, // hearable area, without chatrooms - CHAT, // current chatroom - CHAT_WOS, // current chatroom, without self + AREA, // area + AREA_WOS, // area, without self + AREA_WOC, // area, without chatrooms + AREA_WOSC, // area, without own chatroom + AREA_CHAT_WOC, // hearable area, without chatrooms + CHAT, // current chatroom + CHAT_WOS, // current chatroom, without self PARTY, PARTY_WOS, PARTY_SAMEMAP, @@ -84,7 +84,7 @@ typedef enum send_target { DUEL_WOS, SELF, - BG, // BattleGround System + BG, // BattleGround System BG_WOS, BG_SAMEMAP, BG_SAMEMAP_WOS, @@ -94,6 +94,25 @@ typedef enum send_target { BG_QUEUE, } send_target; +typedef enum broadcast_flags { + BC_ALL = 0, + BC_MAP = 1, + BC_AREA = 2, + BC_SELF = 3, + BC_TARGET_MASK = 0x07, + + BC_PC = 0x00, + BC_NPC = 0x08, + BC_SOURCE_MASK = 0x08, // BC_PC|BC_NPC + + BC_YELLOW = 0x00, + BC_BLUE = 0x10, + BC_WOE = 0x20, + BC_COLOR_MASK = 0x30, // BC_YELLOW|BC_BLUE|BC_WOE + + BC_DEFAULT = BC_ALL|BC_PC|BC_YELLOW +} broadcast_flags; + typedef enum emotion_type { E_GASP = 0, // /! E_WHAT, // /? diff --git a/src/map/duel.c b/src/map/duel.c index 7a4e61fa0..a04ed855b 100644 --- a/src/map/duel.c +++ b/src/map/duel.c @@ -110,7 +110,7 @@ void duel_invite(const unsigned int did, struct map_session_data* sd, struct map // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" sprintf(output, msg_txt(374), sd->status.name); - clif->broadcast((struct block_list *)target_sd, output, strlen(output)+1, 0x10, SELF); + clif->broadcast((struct block_list *)target_sd, output, strlen(output)+1, BC_BLUE, SELF); } static int duel_leave_sub(struct map_session_data* sd, va_list va) diff --git a/src/map/intif.c b/src/map/intif.c index 6461dce8e..1713cb38e 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -139,7 +139,7 @@ int intif_rename(struct map_session_data *sd, int type, char *name) // GM Send a message int intif_broadcast(const char* mes, int len, int type) { - int lp = type ? 4 : 0; + int lp = (type|BC_COLOR_MASK) ? 4 : 0; // Send to the local players clif->broadcast(NULL, mes, len, type, ALL_CLIENT); @@ -158,9 +158,9 @@ int intif_broadcast(const char* mes, int len, int type) WFIFOW(inter_fd,10) = 0; // fontSize not used with standard broadcast WFIFOW(inter_fd,12) = 0; // fontAlign not used with standard broadcast WFIFOW(inter_fd,14) = 0; // fontY not used with standard broadcast - if (type == 0x10) // bc_blue + if( type|BC_BLUE ) WFIFOL(inter_fd,16) = 0x65756c62; //If there's "blue" at the beginning of the message, game client will display it in blue instead of yellow. - else if (type == 0x20) // bc_woe + else if( type|BC_WOE ) WFIFOL(inter_fd,16) = 0x73737373; //If there's "ssss", game client will recognize message as 'WoE broadcast'. memcpy(WFIFOP(inter_fd,16 + lp), mes, len); WFIFOSET(inter_fd, WFIFOW(inter_fd,2)); @@ -2176,7 +2176,7 @@ int intif_parse(int fd) switch(cmd){ case 0x3800: if (RFIFOL(fd,4) == 0xFF000000) //Normal announce. - clif->broadcast(NULL, (char *) RFIFOP(fd,16), packet_len-16, 0, ALL_CLIENT); + clif->broadcast(NULL, (char *) RFIFOP(fd,16), packet_len-16, BC_DEFAULT, ALL_CLIENT); else //Color announce. clif->broadcast2(NULL, (char *) RFIFOP(fd,16), packet_len-16, RFIFOL(fd,4), RFIFOW(fd,8), RFIFOW(fd,10), RFIFOW(fd,12), RFIFOW(fd,14), ALL_CLIENT); break; diff --git a/src/map/mob.c b/src/map/mob.c index 291f04267..b16c57ef8 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2393,7 +2393,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) char message[128]; sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, it->jname, (float)drop_rate/100); //MSG: "'%s' won %s's %s (chance: %0.02f%%)" - intif->broadcast(message,strlen(message)+1,0); + intif->broadcast(message, strlen(message)+1, BC_DEFAULT); } // Announce first, or else ditem will be freed. [Lance] // By popular demand, use base drop rate for autoloot code. [Skotlex] @@ -2534,7 +2534,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) char message[128]; sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, data->jname, temp/100.); //MSG: "'%s' won %s's %s (chance: %0.02f%%)" - intif->broadcast(message,strlen(message)+1,0); + intif->broadcast(message, strlen(message)+1, BC_DEFAULT); } if((temp = pc->additem(mvp_sd,&item,1,LOG_TYPE_PICKDROP_PLAYER)) != 0) { diff --git a/src/map/pc.c b/src/map/pc.c index d40f747a3..421099ce1 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4753,7 +4753,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil char message[128]; sprintf (message, msg_txt(542), (sd->status.name != NULL)?sd->status.name :"GM", md->db->jname, data->jname, (float)md->db->dropitem[i].p/100); //MSG: "'%s' stole %s's %s (chance: %0.02f%%)" - intif->broadcast(message,strlen(message)+1,0); + intif->broadcast(message, strlen(message)+1, BC_DEFAULT); } return 1; } @@ -9368,7 +9368,7 @@ int map_day_timer(int tid, unsigned int tick, int id, intptr_t data) iMap->night_flag = 0; // 0=day, 1=night [Yor] iMap->map_foreachpc(pc_daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(502) : msg_txt(60)); // The day has arrived! - intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0); + intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, BC_DEFAULT); return 0; } @@ -9389,7 +9389,7 @@ int map_night_timer(int tid, unsigned int tick, int id, intptr_t data) iMap->night_flag = 1; // 0=day, 1=night [Yor] iMap->map_foreachpc(pc_daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(503) : msg_txt(59)); // The night has fallen... - intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0); + intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, BC_DEFAULT); return 0; } diff --git a/src/map/script.c b/src/map/script.c index 1c67abd4a..3e2347123 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -9138,8 +9138,7 @@ BUILDIN(playerattached) /*========================================== *------------------------------------------*/ -BUILDIN(announce) -{ +BUILDIN(announce) { const char *mes = script_getstr(st,2); int flag = script_getnum(st,3); const char *fontColor = script_hasdata(st,4) ? script_getstr(st,4) : NULL; @@ -9148,29 +9147,29 @@ BUILDIN(announce) int fontAlign = script_hasdata(st,7) ? script_getnum(st,7) : 0; // default fontAlign int fontY = script_hasdata(st,8) ? script_getnum(st,8) : 0; // default fontY - if (flag&0x0f) // Broadcast source or broadcast region defined - { + if( flag&(BC_TARGET_MASK|BC_SOURCE_MASK) ) { + // Broadcast source or broadcast region defined send_target target; - struct block_list *bl = (flag&0x08) ? iMap->id2bl(st->oid) : (struct block_list *)script_rid2sd(st); // If bc_npc flag is set, use NPC as broadcast source + struct block_list *bl = (flag&BC_NPC) ? iMap->id2bl(st->oid) : (struct block_list *)script_rid2sd(st); // If bc_npc flag is set, use NPC as broadcast source if (bl == NULL) return true; - flag &= 0x07; - target = (flag == 1) ? ALL_SAMEMAP : - (flag == 2) ? AREA : - (flag == 3) ? SELF : - ALL_CLIENT; + switch( flag&BC_TARGET_MASK ) { + case BC_MAP: target = ALL_SAMEMAP; break; + case BC_AREA: target = AREA; break; + case BC_SELF: target = SELF; break; + default: target = ALL_CLIENT; break; // BC_ALL + } + if (fontColor) clif->broadcast2(bl, mes, (int)strlen(mes)+1, strtol(fontColor, (char **)NULL, 0), fontType, fontSize, fontAlign, fontY, target); else - clif->broadcast(bl, mes, (int)strlen(mes)+1, flag&0xf0, target); - } - else - { + clif->broadcast(bl, mes, (int)strlen(mes)+1, flag&BC_COLOR_MASK, target); + } else { if (fontColor) intif->broadcast2(mes, (int)strlen(mes)+1, strtol(fontColor, (char **)NULL, 0), fontType, fontSize, fontAlign, fontY); else - intif->broadcast(mes, (int)strlen(mes)+1, flag&0xf0); + intif->broadcast(mes, (int)strlen(mes)+1, flag&(BC_SOURCE_MASK|BC_TARGET_MASK)); } return true; } @@ -9247,7 +9246,7 @@ BUILDIN(mapannounce) return true; iMap->foreachinmap(buildin_announce_sub, m, BL_PC, - mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); + mes, strlen(mes)+1, flag&(BC_SOURCE_MASK|BC_TARGET_MASK), fontColor, fontType, fontSize, fontAlign, fontY); return true; } /*========================================== @@ -9272,7 +9271,7 @@ BUILDIN(areaannounce) return true; iMap->foreachinarea(buildin_announce_sub, m, x0, y0, x1, y1, BL_PC, - mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); + mes, strlen(mes)+1, flag&(BC_SOURCE_MASK|BC_TARGET_MASK), fontColor, fontType, fontSize, fontAlign, fontY); return true; } @@ -16139,7 +16138,7 @@ BUILDIN(instance_announce) { for( i = 0; i < instances[instance_id].num_map; i++ ) iMap->foreachinmap(buildin_announce_sub, instances[instance_id].map[i], BL_PC, - mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); + mes, strlen(mes)+1, flag&(BC_SOURCE_MASK|BC_TARGET_MASK), fontColor, fontType, fontSize, fontAlign, fontY); return true; } -- cgit v1.2.3-60-g2f50