diff options
author | j-tkay <joseph.tk.ea@gmail.com> | 2013-07-04 05:17:17 +0800 |
---|---|---|
committer | j-tkay <joseph.tk.ea@gmail.com> | 2013-07-04 05:17:17 +0800 |
commit | ca0205134beb9ba26e989c9fc3820c086d4d22a7 (patch) | |
tree | 6790ece04272e548a46ee2255364b026def3fd6e /src/map/clif.c | |
parent | 28a9fec0916db3d92629ae6e6cd62b5777b09e73 (diff) | |
parent | d88be27960c4508c2f61a729fb5e4c89965b7e0b (diff) | |
download | hercules-ca0205134beb9ba26e989c9fc3820c086d4d22a7.tar.gz hercules-ca0205134beb9ba26e989c9fc3820c086d4d22a7.tar.bz2 hercules-ca0205134beb9ba26e989c9fc3820c086d4d22a7.tar.xz hercules-ca0205134beb9ba26e989c9fc3820c086d4d22a7.zip |
Merge branch 'master' of https://github.com/HerculesWS/Hercules
Diffstat (limited to 'src/map/clif.c')
-rw-r--r-- | src/map/clif.c | 67 |
1 files changed, 60 insertions, 7 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index e5132a938..f925fcf55 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -53,6 +53,8 @@ #include <stdarg.h> #include <time.h> +struct clif_interface clif_s; + //#define DUMP_UNKNOWN_PACKET //#define DUMP_INVALID_PACKET @@ -545,8 +547,24 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target } break; + case BG_QUEUE: + if( sd && sd->bg_queue.arena ) { + struct hQueue *queue = &script->hq[sd->bg_queue.arena->queue_id]; + + for( i = 0; i < queue->items; i++ ) { + struct map_session_data * sd = NULL; + + if( ( sd = iMap->id2sd(queue->item[i]) ) ) { + WFIFOHEAD(sd->fd,len); + memcpy(WFIFOP(sd->fd,0), buf, len); + WFIFOSET(sd->fd,len); + } + } + } + break; + default: - ShowError("clif->send: Unrecognized type %d\n",type); + ShowError("clif_send: Unrecognized type %d\n",type); return -1; } @@ -17317,7 +17335,6 @@ void clif_status_change_end(struct block_list *bl, int tid, enum send_target tar } void clif_bgqueue_ack(struct map_session_data *sd, enum BATTLEGROUNDS_QUEUE_ACK response, unsigned char arena_id) { - switch (response) { case BGQA_FAIL_COOLDOWN: case BGQA_FAIL_DESERTER: @@ -17348,15 +17365,16 @@ void clif_bgqueue_notice_delete(struct map_session_data *sd, enum BATTLEGROUNDS_ } void clif_parse_bgqueue_register(int fd, struct map_session_data *sd) { - struct packet_bgqueue_register *p = P2PTR(fd, bgqueue_registerType); + struct packet_bgqueue_register *p = P2PTR(fd); struct bg_arena *arena = NULL; - if( !bg->queue_on ) return; /* temp, until feature is complete */ if( !(arena = bg->name2arena(p->bg_name)) ) { clif->bgqueue_ack(sd,BGQA_FAIL_BGNAME_INVALID,0); return; } + //debug + safestrncpy(arena->name, p->bg_name, sizeof(arena->name)); switch( (enum bg_queue_types)p->type ) { case BGQT_INDIVIDUAL: @@ -17387,7 +17405,6 @@ void clif_parse_bgqueue_checkstate(int fd, struct map_session_data *sd) { //struct packet_bgqueue_checkstate *p = P2PTR(fd, bgqueue_checkstateType); /* TODO: bgqueue_notice_delete should use this p->bg_name */ if( !bg->queue_on ) return; /* temp, until feature is complete */ if ( sd->bg_queue.arena && sd->bg_queue.type ) { - sd->bg_queue.client_has_bg_data = true; clif->bgqueue_update_info(sd,sd->bg_queue.arena->id,bg->id2pos(sd->bg_queue.arena->queue_id,sd->status.account_id)); } else clif->bgqueue_notice_delete(sd, BGQND_FAIL_NOT_QUEUING,0);/* TODO: wrong response, should respond with p->bg_name not id 0 */ @@ -17400,10 +17417,10 @@ void clif_parse_bgqueue_revoke_req(int fd, struct map_session_data *sd) { } void clif_parse_bgqueue_battlebegin_ack(int fd, struct map_session_data *sd) { - struct packet_bgqueue_battlebegin_ack *p = P2PTR(fd, bgqueue_checkstateType); + struct packet_bgqueue_battlebegin_ack *p = P2PTR(fd); struct bg_arena *arena; if( !bg->queue_on ) return; /* temp, until feature is complete */ - if( ( arena = bg->name2arena(p->bg_name) ) ) { + if( ( arena = bg->name2arena(p->bg_name) ) ) { bg->queue_ready_ack(arena,sd, ( p->result == 1 ) ? true : false); } else { clif->bgqueue_ack(sd,BGQA_FAIL_BGNAME_INVALID, 0); @@ -17463,6 +17480,41 @@ void clif_package_item_announce(struct map_session_data *sd, unsigned short name clif->send(&p,sizeof(p), &sd->bl, ALL_CLIENT); } +/* [Ind/Hercules] special thanks to Yommy~! */ +void clif_skill_cooldown_list(int fd, struct skill_cd* cd) { +#if PACKETVER >= 20120604 + const int offset = 10; +#else + const int offset = 6; +#endif + int i, count = 0; + + WFIFOHEAD(fd,4+(offset*cd->cursor)); + +#if PACKETVER >= 20120604 + WFIFOW(fd,0) = 0x985; +#else + WFIFOW(fd,0) = 0x43e; +#endif + + for( i = 0; i < cd->cursor; i++ ) { + if( cd->duration[i] < 1 ) continue; +#if PACKETVER >= 20120604 + WFIFOW(fd, 4 + (i*10)) = cd->nameid[i]; + WFIFOL(fd, 6 + (i*10)) = cd->total[i]; + WFIFOL(fd, 10 + (i*10)) = cd->duration[i]; +#else + WFIFOW(fd, 4 + (i*6)) = cd->nameid[i]; + WFIFOL(fd, 6 + (i*6)) = cd->duration[i]; +#endif + count++; + } + + WFIFOW(fd,2) = 4+(offset*count); + + WFIFOSET(fd,4+(offset*count)); +} + /* */ unsigned short clif_decrypt_cmd( int cmd, struct map_session_data *sd ) { if( sd ) { @@ -17929,6 +17981,7 @@ void clif_defaults(void) { clif->sc_load = clif_status_change2; clif->sc_end = clif_status_change_end; clif->initialstatus = clif_initialstatus; + clif->cooldown_list = clif_skill_cooldown_list; /* player-unit-specific-related */ clif->updatestatus = clif_updatestatus; clif->changestatus = clif_changestatus; |