From e89f2a34a9dccf3146ecc22a3b570936fe4aab6a Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 13 Nov 2006 19:15:03 +0000 Subject: - 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://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9208 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/clif.c | 9 ++++++++- src/map/clif.h | 1 + src/map/pc.c | 19 +++++++++++-------- src/map/skill.c | 4 ++++ 4 files changed, 24 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/map/clif.c b/src/map/clif.c index e79b7f78e..01032a535 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 51a2f5a5b..5d1294825 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 e1a3555a0..8f7548dc0 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 98f11a2dd..65b47863b 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)){ -- cgit v1.2.3-70-g09d2