예제 #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;
	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;
}
예제 #2
0
파일: inter.c 프로젝트: Celso1415/Fusion
int inter_parse_frommap (int fd)
{
	int cmd;
	int len = 0;
	cmd = RFIFOW (fd, 0);

	// Determine inter's jurisdiction mackerel
	if (cmd < 0x3000 || cmd >= 0x3000 + ARRAYLENGTH (inter_recv_packet_length) || inter_recv_packet_length[cmd - 0x3000] == 0)
		return 0;

	// Examinize the length of the packet
	if ( (len = inter_check_length (fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
		return 2;

	switch (cmd) {
		case 0x3000: mapif_parse_broadcast (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_Registry (fd); break;

		case 0x3005: mapif_parse_RegistryRequest (fd); break;

		case 0x3006: mapif_parse_NameChangeRequest (fd); break;

		case 0x3007: mapif_parse_accinfo (fd); break;

		default:
			if (inter_party_parse_frommap (fd)
					|| inter_guild_parse_frommap (fd)
					|| inter_storage_parse_frommap (fd)
					|| inter_pet_parse_frommap (fd)
					|| inter_homunculus_parse_frommap (fd)
					|| inter_mercenary_parse_frommap (fd)
					|| inter_elemental_parse_frommap (fd)
					|| inter_mail_parse_frommap (fd)
					|| inter_auction_parse_frommap (fd)
					|| inter_quest_parse_frommap (fd)
			   )
				break;
			else
				return 0;
	}

	RFIFOSKIP (fd, len);
	return 1;
}
예제 #3
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_Registry(fd);
        break;
    case 0x3005:
        mapif_parse_RegistryRequest(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;
}
예제 #4
0
int inter_parse_frommap(int fd)
{
	int cmd;
	int len = 0;
	cmd = RFIFOW(fd,0);
	// Check is valid packet entry
	if(cmd < 0x3000 || cmd >= 0x3000 + ARRAYLENGTH(inter_recv_packet_length) || inter_recv_packet_length[cmd - 0x3000] == 0)
		return 0;

	// Check packet length
	if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
		return 2;

	switch(cmd) {
	case 0x3000: mapif_parse_broadcast(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_Registry(fd); break;
	case 0x3005: mapif_parse_RegistryRequest(fd); break;
	case 0x3006: mapif_parse_NameChangeRequest(fd); break;
	case 0x3007: mapif_parse_accinfo(fd); break;
	/* 0x3008 unused */
	case 0x3009: mapif_parse_broadcast_item(fd); break;
	default:
		if(  inter_party_parse_frommap(fd)
		  || inter_guild_parse_frommap(fd)
		  || inter_storage_parse_frommap(fd)
		  || inter_pet_parse_frommap(fd)
		  || inter_homunculus_parse_frommap(fd)
		  || inter_mercenary_parse_frommap(fd)
		  || inter_elemental_parse_frommap(fd)
		  || inter_mail_parse_frommap(fd)
		  || inter_auction_parse_frommap(fd)
		  || inter_quest_parse_frommap(fd)
		  || inter_clan_parse_frommap(fd)
		  || inter_achievement_parse_frommap(fd)
		   )
			break;
		else
			return 0;
	}

	RFIFOSKIP(fd, len);
	return 1;
}
예제 #5
0
파일: inter.cpp 프로젝트: 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;
}