Ver código fonte

- Fixed mercenaries not warping to their master if the master is more than 15 cells away

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15108 54d463be-8e91-2dee-dedb-b68131a5f0ec
epoque11 13 anos atrás
pai
commit
bf05deda6f
2 arquivos alterados com 14 adições e 0 exclusões
  1. 3 0
      src/map/mercenary.h
  2. 11 0
      src/map/unit.c

+ 3 - 0
src/map/mercenary.h

@@ -7,6 +7,9 @@
 #include "status.h" // struct status_data, struct status_change
 #include "unit.h" // struct unit_data
 
+// number of cells that a mercenary can walk to from it's master before being warped
+#define MAX_MER_DISTANCE 15
+
 enum {
 	ARCH_MERC_GUILD,
 	SPEAR_MERC_GUILD,

+ 11 - 0
src/map/unit.c

@@ -115,12 +115,14 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data
 	struct map_session_data *sd;
 	struct mob_data         *md;
 	struct unit_data        *ud;
+	struct mercenary_data   *mrd;
 
 	bl = map_id2bl(id);
 	if(bl == NULL)
 		return 0;
 	sd = BL_CAST(BL_PC, bl);
 	md = BL_CAST(BL_MOB, bl);
+	mrd = BL_CAST(BL_MER, bl);
 	ud = unit_bl2ud(bl);
 	
 	if(ud == NULL) return 0;
@@ -175,6 +177,11 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data
 		} else
 			sd->areanpc_id=0;
 
+		if( sd->md && !check_distance_bl(&sd->bl, &sd->md->bl, MAX_MER_DISTANCE) )
+		{// mercenary is too far from the master so warp the master's position
+			unit_warp( &sd->md->bl, sd->bl.m, sd->bl.x, sd->bl.y, CLR_TELEPORT );
+		}
+
 		if (sd->state.gmaster_flag &&
 			(battle_config.guild_aura&((agit_flag || agit2_flag)?2:1)) &&
 			(battle_config.guild_aura&(map_flag_gvg2(bl->m)?8:4))
@@ -218,6 +225,10 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data
 			clif_move(ud);
 		}
 	}
+	else if( mrd && mrd->master && !check_distance_bl(&mrd->master->bl, bl, MAX_MER_DISTANCE) )
+	{// mercenary is too far from the master so warp the master's position
+		unit_warp( bl, mrd->master->bl.id, mrd->master->bl.x, mrd->master->bl.y, CLR_TELEPORT );
+	}
 
 	if(tid == INVALID_TIMER) //A directly invoked timer is from battle_stop_walking, therefore the rest is irrelevant.
 		return 0;