diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/map.c | 19 | ||||
-rw-r--r-- | src/map/mob.c | 18 | ||||
-rw-r--r-- | src/map/skill.c | 8 | ||||
-rw-r--r-- | src/map/skill.h | 1 | ||||
-rw-r--r-- | src/map/status.c | 4 |
5 files changed, 29 insertions, 21 deletions
diff --git a/src/map/map.c b/src/map/map.c index 0aa48b914..e24a4ba7f 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1484,8 +1484,10 @@ int map_search_freecell(struct block_list *src, int m, short *x,short *y, int rx if (rx >= 0 && ry >= 0) { tries = rx2*ry2; if (tries > 100) tries = 100; - } else - tries = 1000; //Must retry a lot for maps with many non-walkable tiles. + } else { + tries = map[m].xs*map[m].ys; + if (tries > 500) tries = 500; + } while(tries--) { *x = (rx >= 0)?(rand()%rx2-rx+bx):(rand()%(map[m].xs-2)+1); @@ -1498,12 +1500,15 @@ int map_search_freecell(struct block_list *src, int m, short *x,short *y, int rx { if(flag&2 && !unit_can_reach_pos(src, *x, *y, 1)) continue; - if(flag&4 && spawn++ < battle_config.no_spawn_on_player && - map_foreachinarea(map_count_sub, m, - *x-AREA_SIZE, *y-AREA_SIZE, *x+AREA_SIZE, *y+AREA_SIZE, BL_PC) - ) + if(flag&4) { + if (spawn >= 100) return 0; //Limit of retries reached. + if (spawn++ < battle_config.no_spawn_on_player && + map_foreachinarea(map_count_sub, m, + *x-AREA_SIZE, *y-AREA_SIZE, + *x+AREA_SIZE, *y+AREA_SIZE, BL_PC) + ) continue; - + } return 1; } } diff --git a/src/map/mob.c b/src/map/mob.c index e4f94679d..abf92a691 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2842,8 +2842,19 @@ int mob_clone_spawn(struct map_session_data *sd, int m, int x, int y, const char //Go Backwards to give better priority to advanced skills. for (i=0,j = MAX_SKILL_TREE-1;j>=0 && i< MAX_MOBSKILL ;j--) { skill_id = skill_tree[sd->status.class_][j].id; - if (!skill_id || sd->status.skill[skill_id].lv < 1 || (skill_get_inf2(skill_id)&(INF2_WEDDING_SKILL|INF2_GUILD_SKILL))) + if (!skill_id || sd->status.skill[skill_id].lv < 1 || + (skill_get_inf2(skill_id)&(INF2_WEDDING_SKILL|INF2_GUILD_SKILL)) || + skill_get_nocast(skill_id)&16 + ) + continue; + //Normal aggressive mob, disable skills that cannot help them fight + //against players (those with flags UF_NOMOB and UF_NOPC are specific + //to always aid players!) [Skotlex] + if (!(flag&1) && + skill_get_unit_id(skill_id, 0) && + skill_get_unit_flag(skill_id)&(UF_NOMOB|UF_NOPC)) continue; + memset (&ms[i], 0, sizeof(struct mob_skill)); ms[i].skill_id = skill_id; ms[i].skill_lv = sd->status.skill[skill_id].lv; @@ -2863,11 +2874,6 @@ int mob_clone_spawn(struct map_session_data *sd, int m, int x, int y, const char else ms[i].state = MSS_BERSERK; } else if(inf&INF_GROUND_SKILL) { - //Normal aggressive mob, disable skills that cannot help them fight - //against players (those with flags UF_NOMOB and UF_NOPC are specific - //to always aid players!) [Skotlex] - if (!(flag&1) && skill_get_unit_flag(skill_id)&(UF_NOMOB|UF_NOPC)) - continue; if (skill_get_inf2(skill_id)&INF2_TRAP) { //Traps! ms[i].state = MSS_IDLE; ms[i].target = MST_AROUND2; diff --git a/src/map/skill.c b/src/map/skill.c index 7cd697cc9..d2438c855 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -854,12 +854,8 @@ int skillnotok (int skillid, struct map_session_data *sd) // Check skill restrictions [Celest] if(!map_flag_vs(sd->bl.m) && skill_get_nocast (skillid) & 1) return 1; - if(map[sd->bl.m].flag.pvp) { - if(!battle_config.pk_mode && skill_get_nocast (skillid) & 2) - return 1; - if(battle_config.pk_mode && skill_get_nocast (skillid) & 16) - return 1; - } + if(map[sd->bl.m].flag.pvp && skill_get_nocast (skillid) & 2) + return 1; if(map_flag_gvg(sd->bl.m) && skill_get_nocast (skillid) & 4) return 1; if(agit_flag && skill_get_nocast (skillid) & 8) diff --git a/src/map/skill.h b/src/map/skill.h index 9d8714f16..f6d214046 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -160,6 +160,7 @@ int skill_get_castdef( int id ); int skill_get_weapontype( int id );
int skill_get_ammotype( int id );
int skill_get_ammo_qty( int id, int lv );
+int skill_get_nocast( int id );
int skill_get_unit_id(int id,int flag);
int skill_get_inf2( int id );
int skill_get_castcancel( int id );
diff --git a/src/map/status.c b/src/map/status.c index 98a6ad652..774f8b60d 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -4082,7 +4082,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val sc=status_get_sc(bl); status = status_get_status_data(bl); - if (!sc || !status || status_isdead(bl)) + if (!sc || status_isdead(bl)) return 0; switch (bl->type) @@ -4194,7 +4194,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val //Avoid cloaking with no wall and low skill level. [Skotlex] //Due to the cloaking card, we have to check the wall versus to known skill level rather than the used one. [Skotlex] // if (sd && skilllv < 3 && skill_check_cloaking(bl,&sd->sc)) - if (sd && pc_checkskill(sd, AS_CLOAKING)< 3 && skill_check_cloaking(bl, &sd->sc)) + if (sd && pc_checkskill(sd, AS_CLOAKING)< 3 && skill_check_cloaking(bl, sc)) return 0; break; case SC_MODECHANGE: |