diff options
author | Gepard <Gepard@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2009-11-03 15:56:54 +0000 |
---|---|---|
committer | Gepard <Gepard@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2009-11-03 15:56:54 +0000 |
commit | 7adb4c8eab8ba0c4c71eb112bac9cb3df2284c3c (patch) | |
tree | 9fbdc34b79577bff7972c1c931964246eaeed387 /src/map | |
parent | a9763770c28c1e79cc43a0a43b46745ea3090940 (diff) | |
download | hercules-7adb4c8eab8ba0c4c71eb112bac9cb3df2284c3c.tar.gz hercules-7adb4c8eab8ba0c4c71eb112bac9cb3df2284c3c.tar.bz2 hercules-7adb4c8eab8ba0c4c71eb112bac9cb3df2284c3c.tar.xz hercules-7adb4c8eab8ba0c4c71eb112bac9cb3df2284c3c.zip |
Extended broadcast implementation:
- support for font formatting, like font-size
- `bc_woe` flag to allow client-side filtering of WoE announcements
- new broadcast packet 0x40C
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14120 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/atcommand.c | 12 | ||||
-rw-r--r-- | src/map/clif.c | 89 | ||||
-rw-r--r-- | src/map/clif.h | 5 | ||||
-rw-r--r-- | src/map/intif.c | 51 | ||||
-rw-r--r-- | src/map/intif.h | 4 | ||||
-rw-r--r-- | src/map/mob.c | 4 | ||||
-rw-r--r-- | src/map/pc.c | 8 | ||||
-rw-r--r-- | src/map/script.c | 147 |
8 files changed, 171 insertions, 149 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index d9b66a2a3..f46c67c33 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -1489,7 +1489,7 @@ int atcommand_kami(const int fd, struct map_session_data* sd, const char* comman } sscanf(message, "%199[^\n]", atcmd_output); - intif_GMmessage(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') ? 0x10 : 0); } else { @@ -1503,7 +1503,7 @@ int atcommand_kami(const int fd, struct map_session_data* sd, const char* comman return -1; } - intif_announce(atcmd_output, strlen(atcmd_output) + 1, color, 0); + intif_broadcast2(atcmd_output, strlen(atcmd_output) + 1, color, 0x190, 12, 0, 0); } return 0; } @@ -5294,7 +5294,7 @@ int atcommand_broadcast(const int fd, struct map_session_data* sd, const char* c } sprintf(atcmd_output, "%s: %s", sd->status.name, message); - intif_GMmessage(atcmd_output, strlen(atcmd_output) + 1, 0); + intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); return 0; } @@ -5315,7 +5315,7 @@ int atcommand_localbroadcast(const int fd, struct map_session_data* sd, const ch sprintf(atcmd_output, "%s: %s", sd->status.name, message); - clif_GMmessage(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, 1); // 1: ALL_SAMEMAP + clif_broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, 0, ALL_SAMEMAP); return 0; } @@ -6855,7 +6855,7 @@ int atcommand_gmotd(const int fd, struct map_session_data* sd, const char* comma break; } } - intif_GMmessage(buf,strlen(buf)+1,8); + intif_broadcast(buf, strlen(buf)+1, 0); } fclose(fp); } @@ -8087,7 +8087,7 @@ int atcommand_main(const int fd, struct map_session_data* sd, const char* comman // I use 0xFE000000 color for signalizing that this message is // main chat message. 0xFE000000 is invalid color, same using // 0xFF000000 for simple (not colored) GM messages. [LuzZza] - intif_announce(atcmd_output, strlen(atcmd_output) + 1, 0xFE000000, 0); + intif_broadcast2(atcmd_output, strlen(atcmd_output) + 1, 0xFE000000, 0, 0, 0, 0); // Chat logging type 'M' / Main Chat if( log_config.chat&1 || (log_config.chat&32 && !((agit_flag || agit2_flag) && log_config.chat&64)) ) diff --git a/src/map/clif.c b/src/map/clif.c index ddda47612..ed9f12c72 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4739,27 +4739,25 @@ int clif_displaymessage(const int fd, const char* mes) /*========================================== * 天の声を送信する + * Send broadcast message in yellow or blue (without font formatting). + * S 009A <len>.W <message>.?B *------------------------------------------*/ -int clif_GMmessage(struct block_list* bl, const char* mes, int len, int flag) +int clif_broadcast(struct block_list* bl, const char* mes, int len, int type, enum send_target target) { - unsigned char *buf; - int lp; - - lp = (flag & 0x10) ? 8 : 4; - buf = (unsigned char*)aMallocA((len + lp + 8)*sizeof(unsigned char)); + int lp = type ? 4 : 0; + unsigned char *buf = (unsigned char*)aMallocA((4 + lp + len)*sizeof(unsigned char)); WBUFW(buf,0) = 0x9a; - WBUFW(buf,2) = len + lp; - WBUFL(buf,4) = 0x65756c62; //"blue": - memcpy(WBUFP(buf,lp), mes, len); - flag &= 0x07; - clif_send(buf, WBUFW(buf,2), bl, - (flag == 1) ? ALL_SAMEMAP : - (flag == 2) ? AREA : - (flag == 3) ? SELF : - ALL_CLIENT); - if(buf) aFree(buf); - + WBUFW(buf,2) = 4 + lp + len; + if (type == 0x10) // 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 + 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); + + if (buf) + aFree(buf); return 0; } @@ -4809,33 +4807,30 @@ void clif_MainChatMessage(const char* message) } /*========================================== - * Does an announce message in the given color. + * Send broadcast message with font formatting. + * S 01C3 <len>.W <fontColor>.L <fontType>.W <fontSize>.W <fontAlign>.W <fontY>.W <message>.?B + * S 040C <len>.W <fontColor>.L <fontType>.W <fontSize>.W <fontAlign>.W <fontY>.W <message>.?B *------------------------------------------*/ -int clif_announce(struct block_list* bl, const char* mes, int len, unsigned long color, int flag) +int clif_broadcast2(struct block_list* bl, const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target) { - return clif_announce_ex(bl, mes, len, color, flag, 12); -} + unsigned char *buf = (unsigned char*)aMallocA((16 + len)*sizeof(unsigned char)); -int clif_announce_ex(struct block_list* bl, const char* mes, int len, unsigned long color, int flag, int size) -{ - unsigned char *buf; - buf = (unsigned char*)aMallocA((len + 16)*sizeof(unsigned char)); - WBUFW(buf,0) = 0x1c3; - WBUFW(buf,2) = len + 16; - WBUFL(buf,4) = color; - WBUFW(buf,8) = 0x190; //Font style? Type? - WBUFW(buf,10) = size; // Font size - WBUFL(buf,12) = 0; //Unknown! +#if PACKETVER < 20080820 + WBUFW(buf,0) = 0x1c3; +#else + WBUFW(buf,0) = 0x40c; +#endif + WBUFW(buf,2) = len + 16; + WBUFL(buf,4) = fontColor; + WBUFW(buf,8) = fontType; + WBUFW(buf,10) = fontSize; + WBUFW(buf,12) = fontAlign; + WBUFW(buf,14) = fontY; memcpy(WBUFP(buf,16), mes, len); - - flag &= 0x07; - clif_send(buf, WBUFW(buf,2), bl, - (flag == 1) ? ALL_SAMEMAP : - (flag == 2) ? AREA : - (flag == 3) ? SELF : - ALL_CLIENT); + clif_send(buf, WBUFW(buf,2), bl, target); - if(buf) aFree(buf); + if (buf) + aFree(buf); return 0; } /*========================================== @@ -8273,7 +8268,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { char output[128]; sprintf(output, "[ Kill Steal Protection Disable. KS is allowed in this map ]"); - clif_announce(&sd->bl, output, strlen(output) + 1, 0x00CC66, 3); + clif_broadcast(&sd->bl, output, strlen(output) + 1, 0x10, SELF); } map_iwall_get(sd); // Updates Walls Info on this Map to Client @@ -8879,7 +8874,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd) else { char output[256]; snprintf(output, ARRAYLENGTH(output), msg_txt(386), sd->status.name, message); - intif_announce(output, strlen(output) + 1, 0xFE000000, 0); + intif_broadcast2(output, strlen(output) + 1, 0xFE000000, 0, 0, 0, 0); } // Chat logging type 'M' / Main Chat @@ -8954,7 +8949,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd) * /b /nb * S 0099 <packet len>.w <text>.?B 00 *------------------------------------------*/ -void clif_parse_GMmessage(int fd, struct map_session_data* sd) +void clif_parse_Broadcast(int fd, struct map_session_data* sd) { char* msg = (char*)RFIFOP(fd,4); unsigned int len = RFIFOW(fd,2)-4; @@ -8968,7 +8963,7 @@ void clif_parse_GMmessage(int fd, struct map_session_data* sd) // as the length varies depending on the command used, just block unreasonably long strings mes_len_check(msg, len, CHAT_SIZE_MAX); - intif_GMmessage(msg, len, 0); + intif_broadcast(msg, len, 0); if(log_config.gm && lv >= log_config.gm) { char logmsg[CHAT_SIZE_MAX+4]; @@ -10036,7 +10031,7 @@ void clif_parse_ResetChar(int fd, struct map_session_data *sd) * /lb /nlb * S 019c <packet len>.w <text>.?B 00 *------------------------------------------*/ -void clif_parse_LGMmessage(int fd, struct map_session_data* sd) +void clif_parse_LocalBroadcast(int fd, struct map_session_data* sd) { char* msg = (char*)RFIFOP(fd,4); unsigned int len = RFIFOW(fd,2)-4; @@ -10051,7 +10046,7 @@ void clif_parse_LGMmessage(int fd, struct map_session_data* sd) // as the length varies depending on the command used, just block unreasonably long strings mes_len_check(msg, len, CHAT_SIZE_MAX); - clif_GMmessage(&sd->bl, msg, len, 1); + clif_broadcast(&sd->bl, msg, len, 0, ALL_SAMEMAP); if( log_config.gm && lv >= log_config.gm ) { char logmsg[CHAT_SIZE_MAX+5]; @@ -13641,7 +13636,7 @@ static int packetdb_readdb(void) {clif_parse_ActionRequest,"actionrequest"}, {clif_parse_Restart,"restart"}, {clif_parse_WisMessage,"wis"}, - {clif_parse_GMmessage,"gmmessage"}, + {clif_parse_Broadcast,"broadcast"}, {clif_parse_TakeItem,"takeitem"}, {clif_parse_DropItem,"dropitem"}, {clif_parse_UseItem,"useitem"}, @@ -13691,7 +13686,7 @@ static int packetdb_readdb(void) {clif_parse_WeaponRefine,"weaponrefine"}, {clif_parse_SolveCharName,"solvecharname"}, {clif_parse_ResetChar,"resetchar"}, - {clif_parse_LGMmessage,"lgmmessage"}, + {clif_parse_LocalBroadcast,"localbroadcast"}, {clif_parse_MoveToKafra,"movetokafra"}, {clif_parse_MoveFromKafra,"movefromkafra"}, {clif_parse_MoveToKafraFromCart,"movetokafrafromcart"}, diff --git a/src/map/clif.h b/src/map/clif.h index 6ee0c4d51..43fd8b1f7 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -363,10 +363,9 @@ int clif_font_single(int fd, struct map_session_data *sd); int clif_displaymessage(const int fd,const char* mes); int clif_disp_onlyself(struct map_session_data *sd,const char *mes,int len); void clif_disp_message(struct block_list* src, const char* mes, int len, enum send_target target); -int clif_GMmessage(struct block_list* bl, const char* mes, int len, int flag); +int clif_broadcast(struct block_list *bl, const char* mes, int len, int type, enum send_target target); void clif_MainChatMessage(const char* message); //luzza -int clif_announce(struct block_list *bl, const char* mes, int len, unsigned long color, int flag); -int clif_announce_ex(struct block_list *bl, const char* mes, int len, unsigned long color, int flag, int size); +int clif_broadcast2(struct block_list *bl, const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target); int clif_heal(int fd,int type,int val); int clif_resurrection(struct block_list *bl,int type); void clif_set0199(struct map_session_data* sd, int mode); diff --git a/src/map/intif.c b/src/map/intif.c index ff7c9f608..49330073e 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -135,12 +135,12 @@ int intif_rename(struct map_session_data *sd, int type, char *name) } // GMメッセージを送信 -int intif_GMmessage(const char* mes,int len,int flag) +int intif_broadcast(const char* mes, int len, int type) { - int lp = (flag&0x10) ? 8 : 4; + int lp = type ? 4 : 0; // Send to the local players - clif_GMmessage(NULL, mes, len, flag); + clif_broadcast(NULL, mes, len, type, ALL_CLIENT); if (CheckForCharServer()) return 0; @@ -148,23 +148,30 @@ int intif_GMmessage(const char* mes,int len,int flag) if (other_mapserver_count < 1) return 0; //No need to send. - WFIFOHEAD(inter_fd,lp + len + 4); - WFIFOW(inter_fd,0) = 0x3000; - WFIFOW(inter_fd,2) = lp + len + 4; - WFIFOL(inter_fd,4) = 0xFF000000; //"invalid" color signals standard broadcast. - WFIFOL(inter_fd,8) = 0x65756c62; - memcpy(WFIFOP(inter_fd,4+lp), mes, len); + WFIFOHEAD(inter_fd, 16 + lp + len); + WFIFOW(inter_fd,0) = 0x3000; + WFIFOW(inter_fd,2) = 16 + lp + len; + WFIFOL(inter_fd,4) = 0xFF000000; // 0xFF000000 color signals standard broadcast + WFIFOW(inter_fd,8) = 0; // fontType not used with standard broadcast + 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 + 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 + 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)); return 0; } -int intif_announce(const char* mes,int len, unsigned long color, int flag) +int intif_broadcast2(const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY) { // Send to the local players - if(color == 0xFE000000) // This is main chat message [LuzZza] + if (fontColor == 0xFE000000) // This is main chat message [LuzZza] clif_MainChatMessage(mes); else - clif_announce(NULL, mes, len, color, flag); + clif_broadcast2(NULL, mes, len, fontColor, fontType, fontSize, fontAlign, fontY, ALL_CLIENT); if (CheckForCharServer()) return 0; @@ -172,11 +179,15 @@ int intif_announce(const char* mes,int len, unsigned long color, int flag) if (other_mapserver_count < 1) return 0; //No need to send. - WFIFOHEAD(inter_fd, 8 + len); - WFIFOW(inter_fd,0) = 0x3000; - WFIFOW(inter_fd,2) = 8 + len; - WFIFOL(inter_fd,4) = color; - memcpy(WFIFOP(inter_fd,8), mes, len); + WFIFOHEAD(inter_fd, 16 + len); + WFIFOW(inter_fd,0) = 0x3000; + WFIFOW(inter_fd,2) = 16 + len; + WFIFOL(inter_fd,4) = fontColor; + WFIFOW(inter_fd,8) = fontType; + WFIFOW(inter_fd,10) = fontSize; + WFIFOW(inter_fd,12) = fontAlign; + WFIFOW(inter_fd,14) = fontY; + memcpy(WFIFOP(inter_fd,16), mes, len); WFIFOSET(inter_fd, WFIFOW(inter_fd,2)); return 0; } @@ -2001,11 +2012,11 @@ int intif_parse(int fd) switch(cmd){ case 0x3800: if (RFIFOL(fd,4) == 0xFF000000) //Normal announce. - clif_GMmessage(NULL,(char *) RFIFOP(fd,8),packet_len-8,0); + clif_broadcast(NULL, (char *) RFIFOP(fd,16), packet_len-16, 0, ALL_CLIENT); else if (RFIFOL(fd,4) == 0xFE000000) //Main chat message [LuzZza] - clif_MainChatMessage((char *)RFIFOP(fd,8)); + clif_MainChatMessage((char *)RFIFOP(fd,16)); else //Color announce. - clif_announce(NULL,(char *) RFIFOP(fd,8),packet_len-8,RFIFOL(fd,4),0); + 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; case 0x3801: intif_parse_WisMessage(fd); break; case 0x3802: intif_parse_WisEnd(fd); break; diff --git a/src/map/intif.h b/src/map/intif.h index 25bda1765..73dc5b863 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -16,8 +16,8 @@ struct auction_data; int intif_parse(int fd); -int intif_GMmessage(const char* mes,int len,int flag); -int intif_announce(const char* mes,int len, unsigned long color, int flag); +int intif_broadcast(const char* mes, int len, int type); +int intif_broadcast2(const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY); int intif_wis_message(struct map_session_data *sd,char *nick,char *mes,int mes_len); int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes); diff --git a/src/map/mob.c b/src/map/mob.c index 95f6964a7..9c74665a7 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2220,7 +2220,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) i_data = itemdb_search(ditem->item_data.nameid); sprintf (message, msg_txt(541), (mvp_sd?mvp_sd->status.name:"???"), md->name, i_data->jname, (float)drop_rate/100); //MSG: "'%s' won %s's %s (chance: %0.02f%%)" - intif_GMmessage(message,strlen(message)+1,0); + intif_broadcast(message,strlen(message)+1,0); } // Announce first, or else ditem will be freed. [Lance] // By popular demand, use base drop rate for autoloot code. [Skotlex] @@ -2346,7 +2346,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) i_data = itemdb_exists(item.nameid); sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, i_data->jname, temp/100.); //MSG: "'%s' won %s's %s (chance: %0.02f%%)" - intif_GMmessage(message,strlen(message)+1,0); + intif_broadcast(message,strlen(message)+1,0); } if((temp = pc_additem(mvp_sd,&item,1)) != 0) { diff --git a/src/map/pc.c b/src/map/pc.c index 4a1ecafbe..48a17907d 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3878,7 +3878,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int lv) i_data = itemdb_search(itemid); sprintf (message, msg_txt(542), (sd->status.name != NULL)?sd->status.name :"GM", md->db->jname, i_data->jname, (float)md->db->dropitem[i].p/100); //MSG: "'%s' stole %s's %s (chance: %0.02f%%)" - intif_GMmessage(message,strlen(message)+1,0); + intif_broadcast(message,strlen(message)+1,0); } return 1; } @@ -7496,7 +7496,7 @@ int map_day_timer(int tid, unsigned int tick, int id, intptr data) night_flag = 0; // 0=day, 1=night [Yor] map_foreachpc(pc_daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(502) : msg_txt(60)); // The day has arrived! - intif_GMmessage(tmp_soutput, strlen(tmp_soutput) + 1, 0); + intif_broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0); return 0; } @@ -7517,7 +7517,7 @@ int map_night_timer(int tid, unsigned int tick, int id, intptr data) night_flag = 1; // 0=day, 1=night [Yor] map_foreachpc(pc_daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(503) : msg_txt(59)); // The night has fallen... - intif_GMmessage(tmp_soutput, strlen(tmp_soutput) + 1, 0); + intif_broadcast(tmp_soutput, strlen(tmp_soutput) + 1, 0); return 0; } @@ -7630,7 +7630,7 @@ int 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_GMmessage((struct block_list *)target_sd, output, strlen(output)+1, 3); + clif_broadcast((struct block_list *)target_sd, output, strlen(output)+1, 0x10, SELF); return 0; } diff --git a/src/map/script.c b/src/map/script.c index db8add252..7a3e2ee95 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -8091,63 +8091,77 @@ BUILDIN_FUNC(playerattached) *------------------------------------------*/ BUILDIN_FUNC(announce) { - const char *str, *color=NULL; - int flag; - str=script_getstr(st,2); - flag=script_getnum(st,3); - if (script_hasdata(st,4)) - color=script_getstr(st,4); - - if(flag&0x0f){ - struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) : - (struct block_list *)script_rid2sd(st); - if( bl == NULL ) + 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; + int fontType = script_hasdata(st,5) ? script_getnum(st,5) : 0x190; // default fontType (FW_NORMAL) + int fontSize = script_hasdata(st,6) ? script_getnum(st,6) : 12; // default fontSize + 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 + { + send_target target; + struct block_list *bl = (flag&0x08) ? map_id2bl(st->oid) : (struct block_list *)script_rid2sd(st); // If bc_npc flag is set, use NPC as broadcast source + if (bl == NULL) return 0; - if (color) - clif_announce(bl,str,(int)strlen(str)+1, strtol(color, (char **)NULL, 0),flag); + + flag &= 0x07; + target = (flag == 1) ? ALL_SAMEMAP : + (flag == 2) ? AREA : + (flag == 3) ? SELF : + ALL_CLIENT; + if (fontColor) + clif_broadcast2(bl, mes, (int)strlen(mes)+1, strtol(fontColor, (char **)NULL, 0), fontType, fontSize, fontAlign, fontY, target); else - clif_GMmessage(bl,str,(int)strlen(str)+1,flag); - }else { - if (color) - intif_announce(str,(int)strlen(str)+1, strtol(color, (char **)NULL, 0), flag); + clif_broadcast(bl, mes, (int)strlen(mes)+1, flag&0xf0, target); + } + else + { + if (fontColor) + intif_broadcast2(mes, (int)strlen(mes)+1, strtol(fontColor, (char **)NULL, 0), fontType, fontSize, fontAlign, fontY); else - intif_GMmessage(str,(int)strlen(str)+1,flag); + intif_broadcast(mes, (int)strlen(mes)+1, flag&0xf0); } return 0; } /*========================================== * 天の声アナウンス(特定マップ) *------------------------------------------*/ -static int buildin_mapannounce_sub(struct block_list *bl,va_list ap) -{ - char *str, *color; - int len,flag; - str=va_arg(ap,char *); - len=va_arg(ap,int); - flag=va_arg(ap,int); - color=va_arg(ap,char *); - if (color) - clif_announce(bl,str,len, strtol(color, (char **)NULL, 0), flag|3); +static int buildin_announce_sub(struct block_list *bl, va_list ap) +{ + char *mes = va_arg(ap, char *); + int len = va_arg(ap, int); + int type = va_arg(ap, int); + char *fontColor = va_arg(ap, char *); + short fontType = va_arg(ap, short); + short fontSize = va_arg(ap, short); + short fontAlign = va_arg(ap, short); + short fontY = va_arg(ap, short); + if (fontColor) + clif_broadcast2(bl, mes, len, strtol(fontColor, (char **)NULL, 0), fontType, fontSize, fontAlign, fontY, SELF); else - clif_GMmessage(bl,str,len,flag|3); + clif_broadcast(bl, mes, len, type, SELF); return 0; } + BUILDIN_FUNC(mapannounce) { - const char *mapname,*str, *color=NULL; - int flag,m; - - mapname=script_getstr(st,2); - str=script_getstr(st,3); - flag=script_getnum(st,4); - if (script_hasdata(st,5)) - color=script_getstr(st,5); + const char *mapname = script_getstr(st,2); + const char *mes = script_getstr(st,3); + int flag = script_getnum(st,4); + const char *fontColor = script_hasdata(st,5) ? script_getstr(st,5) : NULL; + int fontType = script_hasdata(st,6) ? script_getnum(st,6) : 0x190; // default fontType (FW_NORMAL) + int fontSize = script_hasdata(st,7) ? script_getnum(st,7) : 12; // default fontSize + int fontAlign = script_hasdata(st,8) ? script_getnum(st,8) : 0; // default fontAlign + int fontY = script_hasdata(st,9) ? script_getnum(st,9) : 0; // default fontY + int m; - if( (m=map_mapname2mapid(mapname))<0 ) + if ((m = map_mapname2mapid(mapname)) < 0) return 0; - map_foreachinmap(buildin_mapannounce_sub, - m, BL_PC, str,strlen(str)+1,flag&0x10, color); + map_foreachinmap(buildin_announce_sub, m, BL_PC, + mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); return 0; } /*========================================== @@ -8155,25 +8169,25 @@ BUILDIN_FUNC(mapannounce) *------------------------------------------*/ BUILDIN_FUNC(areaannounce) { - const char *map,*str,*color=NULL; - int flag,m; - int x0,y0,x1,y1; - - map=script_getstr(st,2); - x0=script_getnum(st,3); - y0=script_getnum(st,4); - x1=script_getnum(st,5); - y1=script_getnum(st,6); - str=script_getstr(st,7); - flag=script_getnum(st,8); - if (script_hasdata(st,9)) - color=script_getstr(st,9); + const char *mapname = script_getstr(st,2); + int x0 = script_getnum(st,3); + int y0 = script_getnum(st,4); + int x1 = script_getnum(st,5); + int y1 = script_getnum(st,6); + const char *mes = script_getstr(st,7); + int flag = script_getnum(st,8); + const char *fontColor = script_hasdata(st,9) ? script_getstr(st,9) : NULL; + int fontType = script_hasdata(st,10) ? script_getnum(st,10) : 0x190; // default fontType (FW_NORMAL) + int fontSize = script_hasdata(st,11) ? script_getnum(st,11) : 12; // default fontSize + int fontAlign = script_hasdata(st,12) ? script_getnum(st,12) : 0; // default fontAlign + int fontY = script_hasdata(st,13) ? script_getnum(st,13) : 0; // default fontY + int m; - if( (m=map_mapname2mapid(map))<0 ) + if ((m = map_mapname2mapid(mapname)) < 0) return 0; - map_foreachinarea(buildin_mapannounce_sub, - m,x0,y0,x1,y1,BL_PC, str,strlen(str)+1,flag&0x10, color); + map_foreachinarea(buildin_announce_sub, m, x0, y0, x1, y1, BL_PC, + mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); return 0; } @@ -13894,16 +13908,18 @@ BUILDIN_FUNC(instance_init) BUILDIN_FUNC(instance_announce) { - const char *str, *color=NULL; - int flag,instance_id,i; + int instance_id = script_getnum(st,2); + const char *mes = script_getstr(st,3); + int flag = script_getnum(st,4); + const char *fontColor = script_hasdata(st,5) ? script_getstr(st,5) : NULL; + int fontType = script_hasdata(st,6) ? script_getnum(st,6) : 0x190; // default fontType (FW_NORMAL) + int fontSize = script_hasdata(st,7) ? script_getnum(st,7) : 12; // default fontSize + int fontAlign = script_hasdata(st,8) ? script_getnum(st,8) : 0; // default fontAlign + int fontY = script_hasdata(st,9) ? script_getnum(st,9) : 0; // default fontY + + int i; struct map_session_data *sd; struct party_data *p; - - instance_id = script_getnum(st,2); - str = script_getstr(st,3); - flag = script_getnum(st,4); - if( script_hasdata(st,5) ) - color = script_getstr(st,5); if( instance_id == 0 ) { @@ -13918,7 +13934,8 @@ BUILDIN_FUNC(instance_announce) return 0; for( i = 0; i < instance[instance_id].num_map; i++ ) - map_foreachinmap(buildin_mapannounce_sub, instance[instance_id].map[i], BL_PC, str, strlen(str) + 1, flag&0x10, color); + map_foreachinmap(buildin_announce_sub, instance[instance_id].map[i], BL_PC, + mes, strlen(mes)+1, flag&0xf0, fontColor, fontType, fontSize, fontAlign, fontY); return 0; } |