Example #1
0
// 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;
}
Example #2
0
//--------------------------------------------------------
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;
}
Example #3
0
File: inter.cpp Project: mrktj/tmwa
// 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;
}