diff options
author | Haru <haru@dotalux.com> | 2018-07-24 02:48:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-24 02:48:34 +0200 |
commit | c04d79112575bc4e756231f8b447378dbab951ad (patch) | |
tree | 2493a91bcbbc4de969356c994944c13c50355679 | |
parent | 182d5044829d51d868c33846e6fafc7185acabe2 (diff) | |
parent | a3afe42f9025c1049c05da0b2b99aad7ca8a6907 (diff) | |
download | hercules-c04d79112575bc4e756231f8b447378dbab951ad.tar.gz hercules-c04d79112575bc4e756231f8b447378dbab951ad.tar.bz2 hercules-c04d79112575bc4e756231f8b447378dbab951ad.tar.xz hercules-c04d79112575bc4e756231f8b447378dbab951ad.zip |
Merge pull request #2088 from guilherme-gm/fix-ghostmonsters
Fixed monsters not disappearing from some clients upon death
-rw-r--r-- | conf/map/battle/client.conf | 7 | ||||
-rw-r--r-- | src/map/battle.c | 1 | ||||
-rw-r--r-- | src/map/battle.h | 1 | ||||
-rw-r--r-- | src/map/clif.c | 15 | ||||
-rw-r--r-- | src/map/clif.h | 1 | ||||
-rw-r--r-- | src/map/map.h | 1 |
6 files changed, 24 insertions, 2 deletions
diff --git a/conf/map/battle/client.conf b/conf/map/battle/client.conf index 61ce0e279..dfdb7740c 100644 --- a/conf/map/battle/client.conf +++ b/conf/map/battle/client.conf @@ -72,6 +72,13 @@ area_size: 14 // Chat area size (how many squares away from a player can they chat) chat_area_size: 9 +// Area which monster death packets should be sent to. +// This should be set to the farthest distance a player can reach in 250ms +// after a monster dies. +// Setting it to (area_size + 18) (18 being the range of Monk's Snap skill) +// should be a great value +dead_area_size: 32 + // Maximum walk path (how many cells a player can walk going to cursor) // default: 17(official) max_walk_path: 17 diff --git a/src/map/battle.c b/src/map/battle.c index e571977fe..fceb30be1 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -7205,6 +7205,7 @@ static const struct battle_data { { "vcast_stat_scale", &battle_config.vcast_stat_scale, 530, 1, INT_MAX, }, { "area_size", &battle_config.area_size, 14, 0, INT_MAX, }, { "chat_area_size", &battle_config.chat_area_size, 9, 0, INT_MAX, }, + { "dead_area_size", &battle_config.dead_area_size, 32, 0, INT_MAX, }, { "zeny_from_mobs", &battle_config.zeny_from_mobs, 0, 0, 1, }, { "mobs_level_up", &battle_config.mobs_level_up, 0, 0, 1, }, { "mobs_level_up_exp_rate", &battle_config.mobs_level_up_exp_rate, 1, 1, INT_MAX, }, diff --git a/src/map/battle.h b/src/map/battle.h index f4176f142..9f5207e95 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -366,6 +366,7 @@ struct Battle_Config { int castrate_dex_scale; // added by [MouseJstr] int area_size; // added by [MouseJstr] int chat_area_size; // added by [gumi] + int dead_area_size; // Monster die area [KirieZ] int max_def, over_def_bonus; //added by [Skotlex] diff --git a/src/map/clif.c b/src/map/clif.c index e15a65902..904bfdd68 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -434,6 +434,7 @@ static bool clif_send(const void *buf, int len, struct block_list *bl, enum send struct battleground_data *bgd = NULL; int x0 = 0, x1 = 0, y0 = 0, y1 = 0, fd; struct s_mapiterator* iter; + int area_size; if( type != ALL_CLIENT ) nullpo_ret(bl); @@ -472,13 +473,18 @@ static bool clif_send(const void *buf, int len, struct block_list *bl, enum send case AREA: case AREA_WOSC: + case AREA_DEAD: if (sd && bl->prev == NULL) //Otherwise source misses the packet.[Skotlex] clif->send (buf, len, bl, SELF); /* Fall through */ case AREA_WOC: case AREA_WOS: + if (type == AREA_DEAD) + area_size = DEAD_AREA_SIZE; + else + area_size = AREA_SIZE; nullpo_retr(true, bl); - map->foreachinarea(clif->send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, + map->foreachinarea(clif->send_sub, bl->m, bl->x - area_size, bl->y - area_size, bl->x + area_size, bl->y + area_size, BL_PC, buf, len, bl, type); break; case AREA_CHAT_WOC: @@ -909,7 +915,12 @@ static void clif_clearunit_area(struct block_list *bl, clr_type type) WBUFL(buf,2) = bl->id; WBUFB(buf,6) = type; - clif->send(buf, packet_len(0x80), bl, type == CLR_DEAD ? AREA : AREA_WOS); + /** + * When monster dies, there's a delay before the packet is sent, + * so we send it to a bigger area to avoid clients at the edge + * walking out of the area and missing it [KirieZ] + */ + clif->send(buf, packet_len(0x80), bl, type == CLR_DEAD ? AREA_DEAD : AREA_WOS); if (clif->isdisguised(bl)) { WBUFL(buf,2) = -bl->id; diff --git a/src/map/clif.h b/src/map/clif.h index 47b2c8f46..0077566b5 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -92,6 +92,7 @@ typedef enum send_target { AREA_WOC, // area, without chatrooms AREA_WOSC, // area, without own chatrooms AREA_CHAT_WOC, // hearable area, without chatrooms + AREA_DEAD, // area, for clear unit (monster death) CHAT, // current chatroom CHAT_WOS, // current chatroom, without self PARTY, diff --git a/src/map/map.h b/src/map/map.h index e346e72ba..d6779ca91 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -48,6 +48,7 @@ enum E_MAPSERVER_ST { #define MAX_NPC_PER_MAP 512 #define AREA_SIZE (battle->bc->area_size) #define CHAT_AREA_SIZE (battle->bc->chat_area_size) +#define DEAD_AREA_SIZE (battle->bc->dead_area_size) #define DAMAGELOG_SIZE 30 #define LOOTITEM_SIZE 10 #define MAX_MOBSKILL 50 |