Prechádzať zdrojové kódy

- Corrected the pet/homunc data not being free'd if the player logs out before being authed.
- Initialized player's speed on pc_setnewpc to prevent homunculus copying a speed of 0.
- Added comment to reloadbattleconf specifying that some settings do not take effect inmediately.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9975 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 18 rokov pred
rodič
commit
e45a007db2
6 zmenil súbory, kde vykonal 34 pridanie a 18 odobranie
  1. 4 0
      Changelog-Trunk.txt
  2. 2 0
      conf-tmpl/atcommand_athena.conf
  3. 2 0
      src/map/map.c
  4. 2 1
      src/map/pc.c
  5. 1 2
      src/map/status.c
  6. 23 15
      src/map/unit.c

+ 4 - 0
Changelog-Trunk.txt

@@ -4,6 +4,10 @@ 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.
 
 2007/03/08
+	* Corrected the pet/homunc data not being free'd if the player logs out
+	  before being authed.
+	* Initialized player's speed on pc_setnewpc to prevent homunculus copying a
+	  speed of 0.
 	* Corrected ranged add-status only triggering if the attack is arrow
 	  based.
 	* Updated counter add-status so they trigger on ranged attacks instead of

+ 2 - 0
conf-tmpl/atcommand_athena.conf

@@ -748,6 +748,8 @@ refreshonline: 99
 reloadatcommand: 99
 
 // Re-load battle config (admin command)
+// Note that some player config settings won't take effect until relog
+// (display exp, display zeny, display skill delay fail, ...)
 reloadbattleconf: 99
 
 // Re-load status database (admin command)

+ 2 - 0
src/map/map.c

@@ -1669,6 +1669,8 @@ void map_deliddb(struct block_list *bl) {
 int map_quit(struct map_session_data *sd) {
 
 	if(!sd->state.auth) { //Removing a player that hasn't even finished loading
+		if (sd->pd) unit_free(&sd->pd->bl,-1);
+		if (sd->hd) unit_free(&sd->hd->bl,-1);
 		idb_remove(pc_db,sd->status.account_id);
 		idb_remove(charid_db,sd->status.char_id);
 		idb_remove(id_db,sd->bl.id);

+ 2 - 1
src/map/pc.c

@@ -358,7 +358,8 @@ int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id, int lo
 	sd->bl.type      = BL_PC;
 	sd->canlog_tick  = gettick();
 	sd->state.waitingdisconnect = 0;
-
+	//Required to prevent homunculus copuing a base speed of 0.
+	sd->battle_status.speed = sd->base_status.speed = DEFAULT_WALK_SPEED;
 	return 0;
 }
 

+ 1 - 2
src/map/status.c

@@ -2370,8 +2370,7 @@ int status_calc_homunculus(struct homun_data *hd, int first)
 		status->rhw.range = 1 + status->size;
 		status->mode = MD_CANMOVE|MD_CANATTACK;
 		status->speed = DEFAULT_WALK_SPEED;
-		if (battle_config.hom_setting&0x8 &&
-			hd->master && hd->master->state.auth) //Master needs be authed to have valid speed.
+		if (battle_config.hom_setting&0x8 && hd->master)
 			status->speed = status_get_speed(&hd->master->bl);
 
 		status->hp = 1;

+ 23 - 15
src/map/unit.c

@@ -1739,6 +1739,8 @@ int unit_remove_map(struct block_list *bl, int clrtype) {
 /*==========================================
  * Function to free all related resources to the bl
  * if unit is on map, it is removed using the clrtype specified
+ * If clrtype is <0, no saving is performed. This is only for non-authed
+ * objects that shouldn't be on a map yet.
  *------------------------------------------
  */
 
@@ -1825,9 +1827,11 @@ int unit_free(struct block_list *bl, int clrtype) {
 		guild_send_memberinfoshort(sd,0);
 		pc_cleareventtimer(sd);		
 		pc_delspiritball(sd,sd->spiritball,1);
-		chrif_save_scdata(sd); //Save status changes, then clear'em out from memory. [Skotlex]
-		pc_makesavestatus(sd);
-		pc_clean_skilltree(sd);
+		if (clrtype >= 0) {
+			chrif_save_scdata(sd); //Save status changes, then clear'em out from memory. [Skotlex]
+			pc_makesavestatus(sd);
+			pc_clean_skilltree(sd);
+		}
 	} else if( bl->type == BL_PET ) {
 		struct pet_data *pd = (struct pet_data*)bl;
 		struct map_session_data *sd = pd->msd;
@@ -1870,12 +1874,14 @@ int unit_free(struct block_list *bl, int clrtype) {
 			aFree (pd->loot);
 			pd->loot = NULL;
 		}
-		if(pd->pet.intimate > 0)
-			intif_save_petdata(pd->pet.account_id,&pd->pet);
-		else
-		{	//Remove pet.
-			intif_delete_petdata(pd->pet.pet_id);
-			if (sd) sd->status.pet_id = 0;
+		if (clrtype >= 0) {
+			if(pd->pet.intimate > 0)
+				intif_save_petdata(pd->pet.account_id,&pd->pet);
+			else
+			{	//Remove pet.
+				intif_delete_petdata(pd->pet.pet_id);
+				if (sd) sd->status.pet_id = 0;
+			}
 		}
 		if (sd) sd->pd = NULL;
 	} else if(bl->type == BL_MOB) {
@@ -1912,12 +1918,14 @@ int unit_free(struct block_list *bl, int clrtype) {
 		struct map_session_data *sd = hd->master;
 		// Desactive timers
 		merc_hom_hungry_timer_delete(hd);
-		if (hd->homunculus.intimacy > 0)
-			merc_save(hd); 
-		else
-		{
-			intif_homunculus_requestdelete(hd->homunculus.hom_id);
-			if (sd) sd->status.hom_id = 0;
+		if (clrtype >= 0) {
+			if (hd->homunculus.intimacy > 0)
+				merc_save(hd); 
+			else
+			{
+				intif_homunculus_requestdelete(hd->homunculus.hom_id);
+				if (sd) sd->status.hom_id = 0;
+			}
 		}
 		if(sd) sd->hd = NULL;
 	}