/** * Send map-servers fames ranking lists * Defaut fame list are 32B, (id+point+names) * S <len>.W <len bs + alchi>.W <len bs>.W <smith_rank>?B <alchi_rank>?B <taek_rank>?B * @param fd: fd to send packet too (map-serv) if -1 send to all * @return : 0 success */ int chmapif_send_fame_list(int fd){ int i, len = 8; unsigned char buf[32000]; WBUFW(buf,0) = 0x2b1b; for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) { memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list)); len += sizeof(struct fame_list); } // add blacksmith's block length WBUFW(buf, 6) = len; for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) { memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list)); len += sizeof(struct fame_list); } // add alchemist's block length WBUFW(buf, 4) = len; for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) { memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list)); len += sizeof(struct fame_list); } // add total packet length WBUFW(buf, 2) = len; if (fd != -1) chmapif_send(fd, buf, len); else chmapif_sendall(buf, len); return 0; }
// Wis sending result int mapif_wis_end(struct WisData *wd, int flag) { unsigned char buf[27]; WBUFW(buf, 0)=0x3802; memcpy(WBUFP(buf, 2),wd->src,24); WBUFB(buf,26)=flag; chmapif_send(wd->fd,buf,27); return 0; }
//Digest party information static void mapif_party_info(int fd, struct party* p, uint32 char_id) { unsigned char buf[8 + sizeof(struct party)]; WBUFW(buf,0) = 0x3821; WBUFW(buf,2) = 8 + sizeof(struct party); WBUFL(buf,4) = char_id; memcpy(WBUFP(buf,8), p, sizeof(struct party)); if(fd<0) chmapif_sendall(buf,WBUFW(buf,2)); else chmapif_send(fd,buf,WBUFW(buf,2)); }
// Party setting change notification int mapif_party_optionchanged(int fd,struct party *p,uint32 account_id,int flag) { unsigned char buf[16]; WBUFW(buf,0)=0x3823; WBUFL(buf,2)=p->party_id; WBUFL(buf,6)=account_id; WBUFW(buf,10)=p->exp; WBUFW(buf,12)=p->item; WBUFB(buf,14)=flag; if(flag==0) chmapif_sendall(buf,15); else chmapif_send(fd,buf,15); return 0; }
/** * Send some misc info to new map-server. * - Server name for whisper name * - Default map * HZ 0x2afb <size>.W <status>.B <name>.24B <mapname>.11B <map_x>.W <map_y>.W * @param fd **/ static void chmapif_send_misc(int fd) { uint16 offs = 5; unsigned char buf[45]; memset(buf, '\0', sizeof(buf)); WBUFW(buf, 0) = 0x2afb; // 0 succes, 1:failure WBUFB(buf, 4) = 0; // Send name for wisp to player memcpy(WBUFP(buf, 5), charserv_config.wisp_server_name, NAME_LENGTH); // Default map memcpy(WBUFP(buf, (offs+=NAME_LENGTH)), charserv_config.default_map, MAP_NAME_LENGTH); // 29 WBUFW(buf, (offs+=MAP_NAME_LENGTH)) = charserv_config.default_map_x; // 41 WBUFW(buf, (offs+=2)) = charserv_config.default_map_y; // 43 offs+=2; // Length WBUFW(buf, 2) = offs; chmapif_send(fd, buf, offs); }
// Wisp/page request to send int mapif_parse_WisRequest(int fd) { struct WisData* wd; char name[NAME_LENGTH]; char esc_name[NAME_LENGTH*2+1];// escaped name char* data; size_t len; if ( fd <= 0 ) {return 0;} // check if we have a valid fd if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) { ShowWarning("inter: Wis message size too long.\n"); return 0; } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows... ShowError("inter: Wis message doesn't exist.\n"); return 0; } safestrncpy(name, RFIFOCP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex] Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH)); if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `name` FROM `%s` WHERE `name`='%s'", schema_config.char_db, esc_name) ) Sql_ShowDebug(sql_handle); // search if character exists before to ask all map-servers if( SQL_SUCCESS != Sql_NextRow(sql_handle) ) { unsigned char buf[27]; WBUFW(buf, 0) = 0x3802; memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH); WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target chmapif_send(fd, buf, 27); } else {// Character exists. So, ask all map-servers // to be sure of the correct name, rewrite it Sql_GetData(sql_handle, 0, &data, &len); memset(name, 0, NAME_LENGTH); memcpy(name, data, zmin(len, NAME_LENGTH)); // if source is destination, don't ask other servers. if( strncmp(RFIFOCP(fd,4), name, NAME_LENGTH) == 0 ) { uint8 buf[27]; WBUFW(buf, 0) = 0x3802; memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH); WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target chmapif_send(fd, buf, 27); } else { static int wisid = 0; CREATE(wd, struct WisData, 1); // Whether the failure of previous wisp/page transmission (timeout) check_ttl_wisdata(); wd->id = ++wisid; wd->fd = fd; wd->len= RFIFOW(fd,2)-52; memcpy(wd->src, RFIFOP(fd, 4), NAME_LENGTH); memcpy(wd->dst, RFIFOP(fd,28), NAME_LENGTH); memcpy(wd->msg, RFIFOP(fd,52), wd->len); wd->tick = gettick(); idb_put(wis_db, wd->id, wd); mapif_wis_message(wd); } } Sql_FreeResult(sql_handle); return 0; }