Sfoglia il codice sorgente

Added proper checks to adoption processing (followup to r12428).
Cleaned up some code / fixed some typos.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12432 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage 17 anni fa
parent
commit
9c07918456

+ 1 - 1
Changelog-Trunk.txt

@@ -42,7 +42,7 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 	  flags so that they closely match jA's (for easier comparisons).
 	  flags so that they closely match jA's (for easier comparisons).
 	- Fixed code that allowed placing of skill unit cells on 'gaps'.
 	- Fixed code that allowed placing of skill unit cells on 'gaps'.
 	- Fixed code that prevented successful casting of land skills on 'gaps'
 	- Fixed code that prevented successful casting of land skills on 'gaps'
-	  (officially it's possbile, even though they will not deploy entirely).
+	  (officially it's possible, even though they will not deploy entirely).
 2008/03/07
 2008/03/07
 	* Script induced status changes can now be reduced by stats/cards (but
 	* Script induced status changes can now be reduced by stats/cards (but
 	  only trigger rate is reduced, not duration).
 	  only trigger rate is reduced, not duration).

+ 2 - 2
doc/script_commands.txt

@@ -2967,7 +2967,7 @@ capacity, and 0 otherwise. It is important to see if a player can carry the
 items you expect to give them, failing to do that may open your script up to 
 items you expect to give them, failing to do that may open your script up to 
 abuse or create some very unfair errors.
 abuse or create some very unfair errors.
 
 
-This fucntion, in addition to checking to see if the player is capable of
+This function, in addition to checking to see if the player is capable of
 holding a set amount of items, also ensures the player has room in their
 holding a set amount of items, also ensures the player has room in their
 inventory for the item(s) they will be receciving.
 inventory for the item(s) they will be receciving.
 
 
@@ -6130,7 +6130,7 @@ invoking character.
 
 
 ---------------------------------------
 ---------------------------------------
 
 
-*homshuffle
+*homshuffle;
 
 
 This will recalculate the homunculus stats acording to its level, of the 
 This will recalculate the homunculus stats acording to its level, of the 
 current invoking character.
 current invoking character.

+ 1 - 1
npc/Changelog.txt

@@ -525,7 +525,7 @@ Date		Added
 	* Changed name from "Pharacon" to "Phracon" in refine.txt. [Samuray22]
 	* Changed name from "Pharacon" to "Phracon" in refine.txt. [Samuray22]
 	- Thanks to Barron-Monster.
 	- Thanks to Barron-Monster.
 2007/07/26
 2007/07/26
-	* Rev 10917 Added Cash Shop item fucntions. (/other/CashShop_Functions.txt) [L0ne_W0lf]
+	* Rev 10917 Added Cash Shop item functions. (/other/CashShop_Functions.txt) [L0ne_W0lf]
 2007/07/24
 2007/07/24
 	* Changed name from "Emvertacon" to "Emveretarcon" in refine.txt. [Samuray22]
 	* Changed name from "Emvertacon" to "Emveretarcon" in refine.txt. [Samuray22]
 	- Thanks to Barron-Monster.
 	- Thanks to Barron-Monster.

+ 1 - 1
npc/events/StPatrick_2008.txt

@@ -27,7 +27,7 @@
 //= 1.1 Fixed checkitems for ale, fixed ale prize(gives the correct one now). [Kisuka]
 //= 1.1 Fixed checkitems for ale, fixed ale prize(gives the correct one now). [Kisuka]
 //= 1.2 Optimized. Uses only one variable now. [L0ne_W0lf]
 //= 1.2 Optimized. Uses only one variable now. [L0ne_W0lf]
 //=	Corrected EXP rewards, and some typos.
 //=	Corrected EXP rewards, and some typos.
-//= 1.3 Corrected random in item fuction. [L0ne_W0lf]
+//= 1.3 Corrected random in item function. [L0ne_W0lf]
 //============================================================
 //============================================================
 
 
 prt_fild05,170,286,4	script	Anxious Leprechaun#8pday	954,{
 prt_fild05,170,286,4	script	Anxious Leprechaun#8pday	954,{

+ 1 - 1
npc/jobs/1-1/swordman.txt

@@ -317,7 +317,7 @@ job_sword1,223,167,2	script	Mae#swd_1_success	92,{
 	end;
 	end;
 }
 }
 
 
-// Examination Course Fucntions
+// Examination Course Functions
 //============================================================ 
 //============================================================ 
 function	script	F_JobSwdMedic	{
 function	script	F_JobSwdMedic	{
 	percentheal 100,0;
 	percentheal 100,0;

+ 1 - 1
npc/other/Global_Functions.txt

@@ -32,7 +32,7 @@
 //= 2.07 Added TK_Q variable clear. 2.08 Added NINJ_Q variable clear [Lupus]
 //= 2.07 Added TK_Q variable clear. 2.08 Added NINJ_Q variable clear [Lupus]
 //= 2.09 Cleared F_ClearGarbage [Lupus]
 //= 2.09 Cleared F_ClearGarbage [Lupus]
 //= 2.10 Added F_CheckMaxCount to check count of carrid items. [L0ne_w0lf]
 //= 2.10 Added F_CheckMaxCount to check count of carrid items. [L0ne_w0lf]
-//= 2.10a Removed fuction F_CheckMaxCount. Not needed. [L0ne_W0lf]
+//= 2.10a Removed function F_CheckMaxCount. Not needed. [L0ne_W0lf]
 //= 2.11 Updated function Job_Change to jobchange based on Upper value. [Paradox924X]
 //= 2.11 Updated function Job_Change to jobchange based on Upper value. [Paradox924X]
 //============================================================ 
 //============================================================ 
 
 

+ 16 - 10
src/char/char.c

@@ -2345,7 +2345,7 @@ int parse_fromlogin(int fd)
 						{
 						{
 							WFIFOHEAD(i,3);
 							WFIFOHEAD(i,3);
 							WFIFOW(i,0) = 0x81;
 							WFIFOW(i,0) = 0x81;
-							WFIFOB(i,2) = 2;
+							WFIFOB(i,2) = 2; // "Someone has already logged in with this id"
 							WFIFOSET(i,3);
 							WFIFOSET(i,3);
 							break;
 							break;
 						}
 						}
@@ -3257,12 +3257,18 @@ int parse_char(int fd)
 		{
 		{
 
 
 		// request to connect
 		// request to connect
+		// 0065 <account id>.L <login id1>.L <login id2>.L <???>.W <sex>.B
 		case 0x65:
 		case 0x65:
 			if (RFIFOREST(fd) < 17)
 			if (RFIFOREST(fd) < 17)
 				return 0;
 				return 0;
 		{
 		{
+			int account_id = RFIFOL(fd,2);
+			int login_id1 = RFIFOL(fd,6);
+			int login_id2 = RFIFOL(fd,10);
+			int sex = RFIFOB(fd,16);
+
 			int GM_value;
 			int GM_value;
-			ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+			ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", account_id, login_id1, login_id2);
 
 
 			if (sd) {
 			if (sd) {
 				//Received again auth packet for already authentified account?? Discard it.
 				//Received again auth packet for already authentified account?? Discard it.
@@ -3271,24 +3277,24 @@ int parse_char(int fd)
 				RFIFOSKIP(fd,17);
 				RFIFOSKIP(fd,17);
 				break;
 				break;
 			}
 			}
-			if ((GM_value = isGM(RFIFOL(fd,2))))
-				ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
+			if( (GM_value = isGM(account_id)) != 0 )
+				ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", account_id, GM_value);
 			else
 			else
-				ShowInfo("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
+				ShowInfo("Account Logged On; Account ID: %d.\n", account_id);
 			
 			
 			CREATE(session[fd]->session_data, struct char_session_data, 1);
 			CREATE(session[fd]->session_data, struct char_session_data, 1);
 			sd = (struct char_session_data*)session[fd]->session_data;
 			sd = (struct char_session_data*)session[fd]->session_data;
 			strncpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
 			strncpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
 			sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
 			sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
-			sd->account_id = RFIFOL(fd,2);
-			sd->login_id1 = RFIFOL(fd,6);
-			sd->login_id2 = RFIFOL(fd,10);
-			sd->sex = RFIFOB(fd,16);
+			sd->account_id = account_id;
+			sd->login_id1 = login_id1;
+			sd->login_id2 = login_id2;
+			sd->sex = sex;
 			sd->auth = false; // not authed yet
 			sd->auth = false; // not authed yet
 
 
 			// send back account_id
 			// send back account_id
 			WFIFOHEAD(fd,4);
 			WFIFOHEAD(fd,4);
-			WFIFOL(fd,0) = RFIFOL(fd,2);
+			WFIFOL(fd,0) = account_id;
 			WFIFOSET(fd,4);
 			WFIFOSET(fd,4);
 
 
 			// search authentification
 			// search authentification

+ 13 - 7
src/char_sql/char.c

@@ -1943,7 +1943,7 @@ int parse_fromlogin(int fd)
 					{
 					{
 						WFIFOHEAD(i,3);
 						WFIFOHEAD(i,3);
 						WFIFOW(i,0) = 0x81;
 						WFIFOW(i,0) = 0x81;
-						WFIFOB(i,2) = 2;
+						WFIFOB(i,2) = 2; // "Someone has already logged in with this id"
 						WFIFOSET(i,3);
 						WFIFOSET(i,3);
 					}
 					}
 					else //Shouldn't happen, but just in case.
 					else //Shouldn't happen, but just in case.
@@ -2871,11 +2871,17 @@ int parse_char(int fd)
 		{
 		{
 
 
 		// request to connect
 		// request to connect
+		// 0065 <account id>.L <login id1>.L <login id2>.L <???>.W <sex>.B
 		case 0x65:
 		case 0x65:
 			if (RFIFOREST(fd) < 17)
 			if (RFIFOREST(fd) < 17)
 				return 0;
 				return 0;
 		{
 		{
-			ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+			int account_id = RFIFOL(fd,2);
+			int login_id1 = RFIFOL(fd,6);
+			int login_id2 = RFIFOL(fd,10);
+			int sex = RFIFOB(fd,16);
+
+			ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", account_id, login_id1, login_id2);
 			if (sd) {
 			if (sd) {
 				//Received again auth packet for already authentified account?? Discard it.
 				//Received again auth packet for already authentified account?? Discard it.
 				//TODO: Perhaps log this as a hack attempt?
 				//TODO: Perhaps log this as a hack attempt?
@@ -2887,15 +2893,15 @@ int parse_char(int fd)
 			CREATE(session[fd]->session_data, struct char_session_data, 1);
 			CREATE(session[fd]->session_data, struct char_session_data, 1);
 			sd = (struct char_session_data*)session[fd]->session_data;
 			sd = (struct char_session_data*)session[fd]->session_data;
 			sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
 			sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
-			sd->account_id = RFIFOL(fd,2);
-			sd->login_id1 = RFIFOL(fd,6);
-			sd->login_id2 = RFIFOL(fd,10);
-			sd->sex = RFIFOB(fd,16);
+			sd->account_id = account_id;
+			sd->login_id1 = login_id1;
+			sd->login_id2 = login_id2;
+			sd->sex = sex;
 			sd->auth = false; // not authed yet
 			sd->auth = false; // not authed yet
 
 
 			// send back account_id
 			// send back account_id
 			WFIFOHEAD(fd,4);
 			WFIFOHEAD(fd,4);
-			WFIFOL(fd,0) = RFIFOL(fd,2);
+			WFIFOL(fd,0) = account_id;
 			WFIFOSET(fd,4);
 			WFIFOSET(fd,4);
 
 
 			// search authentification
 			// search authentification

+ 17 - 12
src/login/login.c

@@ -1151,17 +1151,22 @@ int mmo_auth(struct mmo_account* account, int fd)
 	if( login_config.online_check )
 	if( login_config.online_check )
 	{
 	{
 		struct online_login_data* data = idb_get(online_db,auth_dat[i].account_id);
 		struct online_login_data* data = idb_get(online_db,auth_dat[i].account_id);
-		if( data && data->char_server > -1 )
-		{
-			//Request char servers to kick this account out. [Skotlex]
-			uint8 buf[8];
-			ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid);
-			WBUFW(buf,0) = 0x2734;
-			WBUFL(buf,2) = auth_dat[i].account_id;
-			charif_sendallwos(-1, buf, 6);
-			if( data->waiting_disconnect == -1 )
-				data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, auth_dat[i].account_id, 0);
-			return 3; // Rejected
+		if( data )
+		{// account is already marked as online!
+			if( data->char_server > -1 )
+			{
+				//Request char servers to kick this account out. [Skotlex]
+				uint8 buf[8];
+				ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid);
+				WBUFW(buf,0) = 0x2734;
+				WBUFL(buf,2) = auth_dat[i].account_id;
+				charif_sendallwos(-1, buf, 6);
+				if( data->waiting_disconnect == -1 )
+					data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, auth_dat[i].account_id, 0);
+				return 3; // Rejected
+			}
+			else
+				; // the client disconnects after doing auth, so can't really kick it... need some form of expiration timer
 		}
 		}
 	}
 	}
 
 
@@ -1274,7 +1279,7 @@ int parse_fromchar(int fd)
 				auth_fifo[i].login_id2  == login_id2 &&
 				auth_fifo[i].login_id2  == login_id2 &&
 				auth_fifo[i].sex        == sex &&
 				auth_fifo[i].sex        == sex &&
 				auth_fifo[i].ip         == ip_ &&
 				auth_fifo[i].ip         == ip_ &&
-				!auth_fifo[i].delflag );
+				auth_fifo[i].delflag    == 0 );
 
 
 			if( i == AUTH_FIFO_SIZE || account_id <= 0 )
 			if( i == AUTH_FIFO_SIZE || account_id <= 0 )
 			{// authentication not found
 			{// authentication not found

+ 17 - 12
src/login_sql/login.c

@@ -553,17 +553,22 @@ int mmo_auth(struct mmo_account* account, int fd)
 	if( login_config.online_check )
 	if( login_config.online_check )
 	{
 	{
 		struct online_login_data* data = idb_get(online_db, account->account_id);
 		struct online_login_data* data = idb_get(online_db, account->account_id);
-		if( data && data->char_server > -1 )
-		{
-			//Request char servers to kick this account out. [Skotlex]
-			uint8 buf[8];
-			ShowNotice("User '%s' is already online - Rejected.\n", account->userid);
-			WBUFW(buf,0) = 0x2734;
-			WBUFL(buf,2) = account->account_id;
-			charif_sendallwos(-1, buf, 6);
-			if( data->waiting_disconnect == -1 )
-				data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, account->account_id, 0);
-			return 3; // Rejected
+		if( data )
+		{// account is already marked as online!
+			if( data->char_server > -1 )
+			{// Request char servers to kick this account out. [Skotlex]
+				uint8 buf[8];
+				ShowNotice("User '%s' is already online - Rejected.\n", account->userid);
+				WBUFW(buf,0) = 0x2734;
+				WBUFL(buf,2) = account->account_id;
+				charif_sendallwos(-1, buf, 6);
+				if( data->waiting_disconnect == -1 )
+					data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, account->account_id, 0);
+				return 3; // Rejected
+			}
+			else
+				; // the client disconnects after doing auth, so can't really kick it... need some form of expiration timer
+
 		}
 		}
 	}
 	}
 
 
@@ -667,7 +672,7 @@ int parse_fromchar(int fd)
 				auth_fifo[i].login_id2  == login_id2 &&
 				auth_fifo[i].login_id2  == login_id2 &&
 				auth_fifo[i].sex        == sex &&
 				auth_fifo[i].sex        == sex &&
 				auth_fifo[i].ip         == ip_ &&
 				auth_fifo[i].ip         == ip_ &&
-				!auth_fifo[i].delflag );
+				auth_fifo[i].delflag    == 0 );
 
 
 			if( i == AUTH_FIFO_SIZE || account_id <= 0 )
 			if( i == AUTH_FIFO_SIZE || account_id <= 0 )
 			{// authentication not found
 			{// authentication not found

+ 12 - 7
src/map/clif.c

@@ -12065,16 +12065,21 @@ void clif_parse_Adopt_request(int fd, struct map_session_data *sd)
 
 
 void clif_parse_Adopt_reply(int fd, struct map_session_data *sd)
 void clif_parse_Adopt_reply(int fd, struct map_session_data *sd)
 {
 {
-	struct map_session_data *p1_sd = map_id2sd(RFIFOL(fd,2)), *p2_sd = map_id2sd(RFIFOL(fd,6));
-	int result = RFIFOL(fd,10), pid = sd->adopt_invite;
+	int p1_id = RFIFOL(fd,2);
+	int p2_id = RFIFOL(fd,6);
+	int result = RFIFOL(fd,10);
+	struct map_session_data* p1_sd = map_id2sd(p1_id);
+	struct map_session_data* p2_sd = map_id2sd(p2_id);
 
 
+	int pid = sd->adopt_invite;
 	sd->adopt_invite = 0;
 	sd->adopt_invite = 0;
 
 
-	if( !p1_sd )
-		return; // Parent is not online
-
-	if( pid != p1_sd->status.account_id || !result )
-		return; // Not the same sender | Reply No
+	if( p1_sd == NULL || p2_sd == NULL )
+		return; // Both players need to be online
+	if( pid != p1_sd->status.account_id || p2_id != p1_sd->status.partner_id )
+		return; // Incorrect values
+	if( result == 0 )
+		return; // Rejected
 
 
 	pc_adoption(p1_sd, p2_sd, sd);
 	pc_adoption(p1_sd, p2_sd, sd);
 }
 }