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
This commit is contained in:
ultramage 2008-03-25 09:56:18 +00:00
parent 88243637cc
commit 9c07918456
11 changed files with 82 additions and 55 deletions

View File

@ -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).

View File

@ -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.

View File

@ -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.

View File

@ -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,{

View File

@ -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;

View File

@ -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]
//============================================================ //============================================================

View File

@ -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)))) if( (GM_value = isGM(account_id)) != 0 )
ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value); 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->account_id = account_id;
sd->login_id1 = RFIFOL(fd,6); sd->login_id1 = login_id1;
sd->login_id2 = RFIFOL(fd,10); sd->login_id2 = login_id2;
sd->sex = RFIFOB(fd,16); 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

View File

@ -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->account_id = account_id;
sd->login_id1 = RFIFOL(fd,6); sd->login_id1 = login_id1;
sd->login_id2 = RFIFOL(fd,10); sd->login_id2 = login_id2;
sd->sex = RFIFOB(fd,16); 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

View File

@ -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 ) if( data )
{ {// account is already marked as online!
//Request char servers to kick this account out. [Skotlex] if( data->char_server > -1 )
uint8 buf[8]; {
ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid); //Request char servers to kick this account out. [Skotlex]
WBUFW(buf,0) = 0x2734; uint8 buf[8];
WBUFL(buf,2) = auth_dat[i].account_id; ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid);
charif_sendallwos(-1, buf, 6); WBUFW(buf,0) = 0x2734;
if( data->waiting_disconnect == -1 ) WBUFL(buf,2) = auth_dat[i].account_id;
data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, auth_dat[i].account_id, 0); charif_sendallwos(-1, buf, 6);
return 3; // Rejected 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

View File

@ -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 ) if( data )
{ {// account is already marked as online!
//Request char servers to kick this account out. [Skotlex] if( data->char_server > -1 )
uint8 buf[8]; {// Request char servers to kick this account out. [Skotlex]
ShowNotice("User '%s' is already online - Rejected.\n", account->userid); uint8 buf[8];
WBUFW(buf,0) = 0x2734; ShowNotice("User '%s' is already online - Rejected.\n", account->userid);
WBUFL(buf,2) = account->account_id; WBUFW(buf,0) = 0x2734;
charif_sendallwos(-1, buf, 6); WBUFL(buf,2) = account->account_id;
if( data->waiting_disconnect == -1 ) charif_sendallwos(-1, buf, 6);
data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, account->account_id, 0); if( data->waiting_disconnect == -1 )
return 3; // Rejected 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

View File

@ -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 p1_id = RFIFOL(fd,2);
int result = RFIFOL(fd,10), pid = sd->adopt_invite; 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 ) if( p1_sd == NULL || p2_sd == NULL )
return; // Parent is not online return; // Both players need to be online
if( pid != p1_sd->status.account_id || p2_id != p1_sd->status.partner_id )
if( pid != p1_sd->status.account_id || !result ) return; // Incorrect values
return; // Not the same sender | Reply No if( result == 0 )
return; // Rejected
pc_adoption(p1_sd, p2_sd, sd); pc_adoption(p1_sd, p2_sd, sd);
} }