From bd25ce6f90d8a3e9873d7efbc084a37b28ea1e3f Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 13 Nov 2006 19:15:03 +0000 Subject: [PATCH] - HP Conversion will fail when used at max SP. It should not display any errors to the client. - Modified yet again the login procedure. The initial status_calc_pc is invoked when the variable registries arrive, but the initial LoadEndAck will not be parsed until the registries have arrived. In the rare case this happens, pc_reg_received will take care of invoking the LoadEndAck function itself. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9208 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ src/map/clif.c | 9 ++++++++- src/map/clif.h | 1 + src/map/pc.c | 19 +++++++++++-------- src/map/skill.c | 4 ++++ 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 235846603a..602e203616 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/11/13 + * HP Conversion will fail when used at max SP. It should not display any + errors to the client. [Skotlex] + * Modified yet again the login procedure to enable character variables to + work on item scripts. It SHOULD work crashless now. Please report any + problems it may cause. * Volcano/Deluge/Violent Gale are now interchangeable, in the sense that as long as one of these is out, casting any of the three will not consume gems, and will use the remaining time of the previous one. In turn, Land diff --git a/src/map/clif.c b/src/map/clif.c index e79b7f78e2..01032a5355 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8250,7 +8250,14 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { if(sd->bl.prev != NULL) return; - + + if (!sd->state.auth) + { //Character loading is not complete yet! + //Let pc_reg_received reinvoke this when ready. + sd->state.connect_new = 0; + return; + } + if (sd->state.rewarp) { //Rewarp player. sd->state.rewarp = 0; diff --git a/src/map/clif.h b/src/map/clif.h index 51a2f5a5b4..5d1294825c 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -137,6 +137,7 @@ void clif_sitting(struct map_session_data *sd); void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type); int clif_soundeffectall(struct block_list *bl, char *name, int type, int coverage); void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, unsigned int tick); +void clif_parse_LoadEndAck(int fd,struct map_session_data *sd); // trade int clif_traderequest(struct map_session_data *sd,char *name); diff --git a/src/map/pc.c b/src/map/pc.c index e1a3555a03..8f7548dc0a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -593,7 +593,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t } else sd->class_ = i; //Initializations to null/0 unneeded since map_session_data was filled with 0 upon allocation. - // 基本的な初期化 sd->state.connect_new = 1; sd->followtimer = -1; // [MouseJstr] @@ -706,9 +705,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t sd->state.event_disconnect = 1; sd->state.event_kill_mob = 1; - status_calc_pc(sd,1); - - sd->state.auth = 1; { //Add IP field unsigned char *ip = (unsigned char *) &session[sd->fd]->client_addr.sin_addr; if (pc_isGM(sd)) @@ -818,8 +814,6 @@ int pc_reg_received(struct map_session_data *sd) sd->change_level = pc_readglobalreg(sd,"jobchange_level"); sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); - if (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE) - status_calc_pc(sd, 0); //Check +10 to all stats bonus. chrif_scdata_request(sd->status.account_id, sd->status.char_id); if (pc_checkskill(sd, TK_MISSION)) { @@ -848,7 +842,6 @@ int pc_reg_received(struct map_session_data *sd) if (i < sd->status.skill[sd->cloneskill_id].lv) sd->status.skill[sd->cloneskill_id].lv = i; sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag - clif_skillinfoblock(sd); } } @@ -871,8 +864,18 @@ int pc_reg_received(struct map_session_data *sd) sd->state.event_joblvup = 1; sd->state.event_loadmap = 1; } + //Weird... maybe registries were reloaded? + if (sd->state.auth) + return 0; - return 0; + status_calc_pc(sd,1); + sd->state.auth = 1; + if (!sd->state.connect_new && sd->fd) + { //Character already loaded map! Gotta trigger LoadEndAck manually. + sd->state.connect_new = 1; + clif_parse_LoadEndAck(sd->fd, sd); + } + return 1; } static int pc_calc_skillpoint(struct map_session_data* sd) diff --git a/src/map/skill.c b/src/map/skill.c index 98f11a2ddb..65b47863ba 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -8358,6 +8358,10 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t return 0; } break; + case PF_HPCONVERSION: + if (status->sp == status->max_sp) + return 0; //Unusable when at full SP. + break; } if(!(type&2)){