コード例 #1
0
// received after a character has been "final saved" on the char-server
static void chrif_save_ack(int fd)
{
	chrif_auth_delete(RFIFOL(fd,2), RFIFOL(fd,6), ST_LOGOUT);
	chrif_check_shutdown();
}
コード例 #2
0
/*==========================================
 * Auth confirmation ack
 *------------------------------------------*/
void chrif_authok(int fd)
{
	int account_id;
	uint32 login_id1;
	uint32 login_id2;
	time_t expiration_time;
	int gmlevel;
	struct mmo_charstatus* status;
	int char_id;
	struct auth_node *node;
	TBL_PC* sd;

	//Check if both servers agree on the struct's size
	if( RFIFOW(fd,2) - 24 != sizeof(struct mmo_charstatus) )
	{
		ShowError("chrif_authok: Data size mismatch! %d != %d\n", RFIFOW(fd,2) - 24, sizeof(struct mmo_charstatus));
		return;
	}

	account_id = RFIFOL(fd,4);
	login_id1 = RFIFOL(fd,8);
	login_id2 = RFIFOL(fd,12);
	expiration_time = (time_t)(int32)RFIFOL(fd,16);
	gmlevel = RFIFOL(fd,20);
	status = (struct mmo_charstatus*)RFIFOP(fd,24);

	char_id = status->char_id;

	//Check if we don't already have player data in our server
	//Causes problems if the currently connected player tries to quit or this data belongs to an already connected player which is trying to re-auth.
	if ((sd = map_id2sd(account_id)) != NULL)
		return;
	
	if ((node = chrif_search(account_id)) == NULL)
		return; // should not happen

	if (node->state != ST_LOGIN)
		return; //character in logout phase, do not touch that data.

	if (node->sd == NULL)
	{
		/*
		//When we receive double login info and the client has not connected yet,
		//discard the older one and keep the new one.
		chrif_auth_delete(node->account_id, node->char_id, ST_LOGIN);
		*/
		return; // should not happen
	}

	sd = node->sd;
	if( runflag == SERVER_STATE_RUN &&
		node->char_dat == NULL &&
		node->account_id == account_id &&
		node->char_id == char_id &&
		node->login_id1 == login_id1 )
	{ //Auth Ok
		if (pc_authok(sd, login_id2, expiration_time, gmlevel, status))
			return;
	} else { //Auth Failed
		pc_authfail(sd);
	}
	chrif_char_offline(sd); //Set him offline, the char server likely has it set as online already.
	chrif_auth_delete(account_id, char_id, ST_LOGIN);
}
コード例 #3
0
ファイル: chrif.c プロジェクト: bimsland/eathena
// received after a character has been "final saved" on the char-server
static void chrif_save_ack(int fd)
{
	chrif_auth_delete(RFIFOL(fd,2), RFIFOL(fd,6), ST_LOGOUT);
}