Browse Source

- Don't recall the player if it is on the same place as the recaller;
- Fixed part 2 of bugreport:4337, homunculus experience received now share with party members.

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

momacabu 12 years ago
parent
commit
875c7f5b8a
2 changed files with 8 additions and 3 deletions
  1. 7 2
      src/map/atcommand.c
  2. 1 1
      src/map/mob.c

+ 7 - 2
src/map/atcommand.c

@@ -2876,6 +2876,9 @@ ACMD_FUNC(recall)
         clif_displaymessage(fd, msg_txt(1020)); // You are not authorized to warp this player from their map.
         return -1;
     }
+    if (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y) {
+        return -1;
+    }
     pc_setpos(pl_sd, sd->mapindex, sd->bl.x, sd->bl.y, CLR_RESPAWN);
     sprintf(atcmd_output, msg_txt(46), pl_sd->status.name); // %s recalled!
     clif_displaymessage(fd, atcmd_output);
@@ -3549,6 +3552,8 @@ ACMD_FUNC(recallall)
     iter = mapit_getallusers();
     for (pl_sd = (TBL_PC *)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC *)mapit_next(iter)) {
         if (sd->status.account_id != pl_sd->status.account_id && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) {
+            if (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y)
+                continue; // Don't waste time warping the character to the same place.
             if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE))
                 count++;
             else {
@@ -3607,7 +3612,7 @@ ACMD_FUNC(guildrecall)
     iter = mapit_getallusers();
     for (pl_sd = (TBL_PC *)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC *)mapit_next(iter)) {
         if (sd->status.account_id != pl_sd->status.account_id && pl_sd->status.guild_id == g->guild_id) {
-            if (pc_get_group_level(pl_sd) > pc_get_group_level(sd))
+            if (pc_get_group_level(pl_sd) > pc_get_group_level(sd) || (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y))
                 continue; //Skip GMs greater than you.
             if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE))
                 count++;
@@ -3663,7 +3668,7 @@ ACMD_FUNC(partyrecall)
     iter = mapit_getallusers();
     for (pl_sd = (TBL_PC *)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC *)mapit_next(iter)) {
         if (sd->status.account_id != pl_sd->status.account_id && pl_sd->status.party_id == p->party.party_id) {
-            if (pc_get_group_level(pl_sd) > pc_get_group_level(sd))
+            if (pc_get_group_level(pl_sd) > pc_get_group_level(sd) || (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y))
                 continue; //Skip GMs greater than you.
             if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE))
                 count++;

+ 1 - 1
src/map/mob.c

@@ -2191,7 +2191,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
             else
                 job_exp = (unsigned int)cap_value(md->db->job_exp * per * bonus/100. * map[m].jexp/100., 1, UINT_MAX);
 
-            if ((temp = tmpsd[i]->status.party_id)>0 && !md->dmglog[i].flag == MDLF_HOMUN) { //Homun-done damage (flag 1) is not given to party
+            if ((temp = tmpsd[i]->status.party_id)>0 /*&& !md->dmglog[i].flag == MDLF_HOMUN*/) { //Homun-done damage (flag 1) is given to party
                 int j;
                 for (j=0; j<pnum && pt[j].id!=temp; j++); //Locate party.