- 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
This commit is contained in:
skotlex 2006-11-13 19:15:03 +00:00
parent fe7ede9fc5
commit bd25ce6f90
5 changed files with 29 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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

View File

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