Kaynağa Gözat

- 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

skotlex 18 yıl önce
ebeveyn
işleme
bd25ce6f90
5 değiştirilmiş dosya ile 29 ekleme ve 9 silme
  1. 5 0
      Changelog-Trunk.txt
  2. 8 1
      src/map/clif.c
  3. 1 0
      src/map/clif.h
  4. 11 8
      src/map/pc.c
  5. 4 0
      src/map/skill.c

+ 5 - 0
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

+ 8 - 1
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;

+ 1 - 0
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);

+ 11 - 8
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.
-	// Šî–{“I‚È�‰Šú‰»
 	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)

+ 4 - 0
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)){