// map server からの通信(1パケットのみ解析すること) // エラーなら0(false)、処理できたなら1、 // パケット長が足りなければ2をかえさなければならない int inter_parse_frommap(int fd) { int cmd = RFIFOW(fd, 0); int len = 0; // inter鯖管轄かを調べる if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0]))) return 0; // パケット長を調べる if ((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0) return 2; switch (cmd) { case 0x3000: mapif_parse_GMmessage(fd); break; case 0x3001: mapif_parse_WisRequest(fd); break; case 0x3002: mapif_parse_WisReply(fd); break; case 0x3003: mapif_parse_WisToGM(fd); break; case 0x3004: mapif_parse_AccReg(fd); break; case 0x3005: mapif_parse_AccRegRequest(fd); break; default: if (inter_party_parse_frommap(fd)) break; if (inter_storage_parse_frommap(fd)) break; return 0; } RFIFOSKIP(fd, len); return 1; }
//-------------------------------------------------------- int inter_parse_frommap(int fd) { int cmd=RFIFOW(fd,0); int len=0; // inter鯖管轄かを調べる if(cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length)/ sizeof(inter_recv_packet_length[0]) ) ) return 0; if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex] return 0; // パケット長を調べる if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0) return 2; switch(cmd){ case 0x3000: mapif_parse_GMmessage(fd); break; case 0x3001: mapif_parse_WisRequest(fd); break; case 0x3002: mapif_parse_WisReply(fd); break; case 0x3003: mapif_parse_WisToGM(fd); break; case 0x3004: mapif_parse_AccReg(fd); break; case 0x3005: mapif_parse_AccRegRequest(fd); break; default: if(inter_party_parse_frommap(fd)) break; if(inter_guild_parse_frommap(fd)) break; if(inter_storage_parse_frommap(fd)) break; if(inter_pet_parse_frommap(fd)) break; return 0; } RFIFOSKIP(fd, len); return 1; }
// map server からの通信(1パケットのみ解析すること) // エラーなら0(false)、処理できたなら1、 // パケット長が足りなければ2をかえさなければならない RecvResult inter_parse_frommap(Session *ms, uint16_t packet_id) { int cmd = packet_id; RecvResult rv; switch (cmd) { case 0x3000: rv = mapif_parse_GMmessage(ms); break; case 0x3001: rv = mapif_parse_WisRequest(ms); break; case 0x3002: rv = mapif_parse_WisReply(ms); break; case 0x3003: rv = mapif_parse_WisToGM(ms); break; case 0x3004: rv = mapif_parse_AccReg(ms); break; case 0x3005: rv = mapif_parse_AccRegRequest(ms); break; default: rv = inter_party_parse_frommap(ms, packet_id); if (rv != RecvResult::Error) return rv; rv = inter_storage_parse_frommap(ms, packet_id); if (rv != RecvResult::Error) return rv; return RecvResult::Error; } return rv; }