Index: src/map/mercenary.c =================================================================== --- src/map/mercenary.c (revision 17348) +++ src/map/mercenary.c (working copy) @@ -321,6 +321,7 @@ map_addiddb(&md->bl); status_calc_mercenary(md,1); md->contract_timer = INVALID_TIMER; + md->masterteleport_timer = INVALID_TIMER; merc_contract_init(md); } else @@ -473,7 +474,7 @@ ShowError("read_mercenary_skilldb : Class %d not found in mercenary_db for skill entry.\n", class_); return false; } - + skill_id = atoi(str[1]); if( skill_id < MC_SKILLBASE || skill_id >= MC_SKILLBASE + MAX_MERCSKILL ) { @@ -502,7 +503,7 @@ { read_mercenarydb(); read_mercenary_skilldb(); - + //add_timer_func_list(mercenary_contract, "mercenary_contract"); return 0; } Index: src/map/unit.c =================================================================== --- src/map/unit.c (revision 17348) +++ src/map/unit.c (working copy) @@ -140,22 +140,15 @@ struct block_list *bl = map_id2bl(id); int *mast_tid = unit_get_masterteleport_timer(bl); - if(tid == INVALID_TIMER) + if(tid == INVALID_TIMER || mast_tid == NULL) return 0; - else if(*mast_tid && *mast_tid != tid) + else if(*mast_tid != tid) return 0; else { TBL_PC *msd = unit_get_master(bl); - switch(data){ - case BL_HOM: - case BL_ELEM: - case BL_PET : - case BL_MER : - if(msd && *mast_tid != INVALID_TIMER && !check_distance_bl(&msd->bl, bl, MAX_MER_DISTANCE)){ - *mast_tid = INVALID_TIMER; - unit_warp(bl, msd->bl.id, msd->bl.x, msd->bl.y, CLR_TELEPORT ); - } - break; + if(msd && !check_distance_bl(&msd->bl, bl, data)){ + *mast_tid = INVALID_TIMER; + unit_warp(bl, msd->bl.id, msd->bl.x, msd->bl.y, CLR_TELEPORT ); } } return 0; @@ -163,19 +156,19 @@ int unit_check_start_teleport_timer(struct block_list *sbl){ TBL_PC *msd = unit_get_master(sbl); - int max_dist=AREA_SIZE; + int max_dist=0; switch(sbl->type){ - //case BL_HOM: max_dist = MAX_HOM_DISTANCE; break; + case BL_HOM: max_dist = AREA_SIZE; break; case BL_ELEM: max_dist = MAX_ELEDISTANCE; break; - //case BL_PET : max_dist = MAX_PET_DISTANCE; break; + case BL_PET : max_dist = AREA_SIZE; break; case BL_MER : max_dist = MAX_MER_DISTANCE; break; } - if(msd){ //if there is a master + if(msd && max_dist){ //if there is a master and it's a valid type int *msd_tid = unit_get_masterteleport_timer(sbl); - + if(msd_tid == NULL) return 0; if (!check_distance_bl(&msd->bl, sbl, max_dist)) { if(*msd_tid == INVALID_TIMER || *msd_tid == 0) - *msd_tid = add_timer(gettick()+3000,unit_teleport_timer,sbl->id,BL_MER); + *msd_tid = add_timer(gettick()+3000,unit_teleport_timer,sbl->id,max_dist); } else { if(*msd_tid && *msd_tid != INVALID_TIMER) Index: src/map/pet.c =================================================================== --- src/map/pet.c (revision 17348) +++ src/map/pet.c (working copy) @@ -382,6 +382,7 @@ if( interval <= 0 ) interval = 1; pd->pet_hungry_timer = add_timer(gettick() + interval, pet_hungry, sd->bl.id, 0); + pd->masterteleport_timer = INVALID_TIMER; return 0; } Index: src/map/homunculus.c =================================================================== --- src/map/homunculus.c (revision 17348) +++ src/map/homunculus.c (working copy) @@ -798,6 +798,7 @@ status_calc_homunculus(hd,1); hd->hungry_timer = INVALID_TIMER; + hd->masterteleport_timer = INVALID_TIMER; return 0; } Index: src/map/elemental.c =================================================================== --- src/map/elemental.c (revision 17348) +++ src/map/elemental.c (working copy) @@ -261,6 +261,7 @@ status_calc_elemental(ed,1); ed->last_spdrain_time = ed->last_thinktime = gettick(); ed->summon_timer = INVALID_TIMER; + ed->masterteleport_timer = INVALID_TIMER; elemental_summon_init(ed); } else { memcpy(&sd->ed->elemental, ele, sizeof(struct s_elemental));