//----------------------------------------------------------------------------------- // Packet parser from of map-server // You will found here only packet analyser // Packet length check is done before (inter.c) a,d inter.c includes RFIFOSKIP too. // Result is: 0 (invalid packet), 1�(right packet) //----------------------------------------------------------------------------------- int inter_party_parse_frommap(int fd) { switch(RFIFOW(fd,0)) { case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70), RFIFOB(fd,72), RFIFOB(fd,73)); return 1; case 0x3021: // 0x3021 <party_id>.L - ask for party mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); return 1; case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); return 1; case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); return 1; case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6)); return 1; case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); return 1; case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); return 1; case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); return 1; case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10)); return 1; default: return 0; } return 0; }
// map server からの通信 // ・1パケットのみ解析すること // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない int inter_party_parse_frommap (int fd) { RFIFOHEAD (fd); switch (RFIFOW (fd, 0)) { case 0x3020: mapif_parse_CreateParty (fd, (char *) RFIFOP (fd, 4), RFIFOB (fd, 28), RFIFOB (fd, 29), (struct party_member *) RFIFOP (fd, 30)); break; case 0x3021: mapif_parse_PartyInfo (fd, RFIFOL (fd, 2), RFIFOL (fd, 6)); break; case 0x3022: mapif_parse_PartyAddMember (fd, RFIFOL (fd, 4), (struct party_member *) RFIFOP (fd, 8)); break; case 0x3023: mapif_parse_PartyChangeOption (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOW (fd, 10), RFIFOW (fd, 12)); break; case 0x3024: mapif_parse_PartyLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10)); break; case 0x3025: mapif_parse_PartyChangeMap (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), RFIFOW (fd, 14), RFIFOB (fd, 16), RFIFOW (fd, 17)); break; case 0x3026: mapif_parse_BreakParty (fd, RFIFOL (fd, 2)); break; case 0x3027: mapif_parse_PartyMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), (char *) RFIFOP (fd, 12), RFIFOW (fd, 2) - 12); break; case 0x3029: mapif_parse_PartyLeaderChange (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10)); break; default: return 0; } return 1; }
// Create Party int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader) { struct party_data *p; int i; if( (p=search_partyname(name))!=NULL){ mapif_party_created(fd,leader->account_id,leader->char_id,NULL); return 0; } // Check Authorised letters/symbols in the name of the character if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised for (i = 0; i < NAME_LENGTH && name[i]; i++) if (strchr(char_name_letters, name[i]) == NULL) { if( name[i] == '"' ) { /* client-special-char */ normalize_name(name,"\""); mapif_parse_CreateParty(fd,name,item,item2,leader); return 0; } mapif_party_created(fd,leader->account_id,leader->char_id,NULL); return 0; } } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden for (i = 0; i < NAME_LENGTH && name[i]; i++) if (strchr(char_name_letters, name[i]) != NULL) { mapif_party_created(fd,leader->account_id,leader->char_id,NULL); return 0; } } p = (struct party_data*)aCalloc(1, sizeof(struct party_data)); memcpy(p->party.name,name,NAME_LENGTH); p->party.exp=0; p->party.item=(item?1:0)|(item2?2:0); memcpy(&p->party.member[0], leader, sizeof(struct party_member)); p->party.member[0].leader=1; p->party.member[0].online=1; p->party.party_id=-1;//New party. if (inter_party_tosql(&p->party,PS_CREATE|PS_ADDMEMBER,0)) { //Add party to db int_party_calc_state(p); idb_put(party_db_, p->party.party_id, p); mapif_party_info(fd, &p->party, 0); mapif_party_created(fd,leader->account_id,leader->char_id,&p->party); } else { //Failed to create party. aFree(p); mapif_party_created(fd,leader->account_id,leader->char_id,NULL); } return 0; }
// map server からの通信 // ・1パケットのみ解析すること // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない int inter_party_parse_frommap(int fd) { switch(RFIFOW(fd,0)){ case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,34),RFIFOB(fd,35),RFIFOP(fd,36),RFIFOP(fd,60),RFIFOW(fd,76)); break; case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break; case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14),RFIFOP(fd,38),RFIFOW(fd,54)); break; case 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOB(fd,15)); break; case 0x3024: mapif_parse_PartyLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14),RFIFOB(fd,30),RFIFOW(fd,31)); break; case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break; case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break; case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; case 0x3029: mapif_parse_PartyLeaderChange(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break; default: return 0; } return 1; }
// map server からの通信 // ・1パケットのみ解析すること // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない int inter_party_parse_frommap(int fd) { switch (RFIFOW(fd, 0)) { case 0x3020: { int account = RFIFOL(fd, 2); PartyName name = stringish<PartyName>(RFIFO_STRING<24>(fd, 6)); CharName nick = stringish<CharName>(RFIFO_STRING<24>(fd, 30)); MapName map = RFIFO_STRING<16>(fd, 54); uint16_t lv = RFIFOW(fd, 70); mapif_parse_CreateParty(fd, account, name, nick, map, lv); } break; case 0x3021: { int party_id = RFIFOL(fd, 2); mapif_parse_PartyInfo(fd, party_id); } break; case 0x3022: { int party_id = RFIFOL(fd, 2); int account_id = RFIFOL(fd, 6); CharName nick = stringish<CharName>(RFIFO_STRING<24>(fd, 10)); MapName map = RFIFO_STRING<16>(fd, 34); uint16_t lv = RFIFOW(fd, 50); mapif_parse_PartyAddMember(fd, party_id, account_id, nick, map, lv); } break; case 0x3023: { int party_id = RFIFOL(fd, 2); int account_id = RFIFOL(fd, 6); uint16_t exp = RFIFOW(fd, 10); uint16_t item = RFIFOW(fd, 12); mapif_parse_PartyChangeOption(fd, party_id, account_id, exp, item); } break; case 0x3024: { int party_id = RFIFOL(fd, 2); int account_id = RFIFOL(fd, 6); mapif_parse_PartyLeave(fd, party_id, account_id); } break; case 0x3025: { int party_id = RFIFOL(fd, 2); int account_id = RFIFOL(fd, 6); MapName map = RFIFO_STRING<16>(fd, 10); uint8_t online = RFIFOB(fd, 26); uint16_t lv = RFIFOW(fd, 27); mapif_parse_PartyChangeMap(fd, party_id, account_id, map, online, lv); } break; case 0x3026: { int party_id = RFIFOL(fd, 2); mapif_parse_BreakParty(fd, party_id); } break; case 0x3027: { size_t len = RFIFOW(fd, 2) - 12; int party_id = RFIFOL(fd, 4); int account_id = RFIFOL(fd, 8); FString mes = RFIFO_STRING(fd, 12, len); mapif_parse_PartyMessage(fd, party_id, account_id, mes); } break; case 0x3028: { int party_id = RFIFOL(fd, 2); int account_id = RFIFOL(fd, 6); CharName nick = stringish<CharName>(RFIFO_STRING<24>(fd, 10)); mapif_parse_PartyCheck(fd, party_id, account_id, nick); } break; default: return 0; } return 1; }