From 4e2c773c1e4203b4e9db62c016445e0443dd39ff Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 20 Feb 2006 14:24:59 +0000 Subject: - Corrected implementation of Gangster Paradise to just prevent mobs from targetting you. - Likely fixed Close Confine not unlocking the target when you move/are moved. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5343 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 4 ++++ src/map/map.c | 19 ++++++++++++------- src/map/mob.c | 17 +++++++++++++---- src/map/status.c | 4 +--- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 03c7ad4da..e84b640e5 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -5,6 +5,10 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS 2006/02/20 + * Corrected the implementation of Gangster's Paradise to work as it should. + [Skotlex] + * Fixed Close-confine not properly ending on a knockback (that includes + backsliding) [Skotlex] * Changed MAX_RANDITEM from 2000 to 10000 to fit new databases [Komurka] * Fixed Taekwon stances not triggering. [Skotlex] * Added atcommand @exp [Skotlex] diff --git a/src/map/map.c b/src/map/map.c index cc43f3705..d1d557059 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -490,6 +490,7 @@ int map_delblock_sub (struct block_list *bl, int flag) */ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) { int x0 = bl->x, y0 = bl->y; + struct status_change *sc = NULL; int moveblock = ( x0/BLOCK_SIZE != x1/BLOCK_SIZE || y0/BLOCK_SIZE != y1/BLOCK_SIZE); if (!bl->prev) { @@ -499,8 +500,16 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) { return 0; } //TODO: Perhaps some outs of bounds checking should be placed here? - if (bl->type&BL_CHAR) + if (bl->type&BL_CHAR) { skill_unit_move(bl,tick,2); + sc = status_get_sc(bl); + if (sc && sc->count) { + if (sc->data[SC_CLOSECONFINE].timer != -1) + status_change_end(bl, SC_CLOSECONFINE, -1); + if (sc->data[SC_CLOSECONFINE2].timer != -1) + status_change_end(bl, SC_CLOSECONFINE2, -1); + } + } if (moveblock) map_delblock_sub(bl,0); #ifdef CELL_NOSTACK else map_delblcell(bl); @@ -512,22 +521,18 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) { else map_addblcell(bl); #endif if (bl->type&BL_CHAR) { - struct status_change *sc = status_get_sc(bl); skill_unit_move(bl,tick,3); if (sc) { if (sc->option&OPTION_CLOAK) skill_check_cloaking(bl); if (sc->count) { if (sc->data[SC_DANCING].timer != -1) { - if (sc->data[SC_DANCING].val1 == CG_MOONLIT) //Cancel Moonlight Petals if moved from casting position. [Skotlex] + //Cancel Moonlight Petals if moved from casting position. [Skotlex] + if (sc->data[SC_DANCING].val1 == CG_MOONLIT) skill_stop_dancing(bl); else skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, bl->m, x1-x0, y1-y0); } - if (sc->data[SC_CLOSECONFINE].timer != -1) - status_change_end(bl, SC_CLOSECONFINE, -1); - if (sc->data[SC_CLOSECONFINE2].timer != -1) - status_change_end(bl, SC_CLOSECONFINE2, -1); } } } diff --git a/src/map/mob.c b/src/map/mob.c index af8cb9dea..db752c556 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1285,6 +1285,9 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) switch (bl->type) { case BL_PC: + if (((struct map_session_data*)bl)->state.gangsterparadise && + !(status_get_mode(&md->bl)&MD_BOSS)) + return 0; //Gangster paradise protection. case BL_MOB: if((dist=distance_bl(&md->bl, bl)) < md->db->range2 && (md->db->range > 6 || mob_can_reach(md,bl,dist+1, MSS_FOLLOW)) @@ -1598,8 +1601,10 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) if (md->target_id) { //Check validity of current target. [Skotlex] tbl = map_id2bl(md->target_id); - if (!tbl || tbl->m != md->bl.m || !status_check_skilluse(&md->bl, tbl, 0, 0)) - { //Unlock current target. + if (!tbl || tbl->m != md->bl.m || !status_check_skilluse(&md->bl, tbl, 0, 0) || ( + tbl->type == BL_PC && !(mode&MD_BOSS) && + ((struct map_session_data*)tbl)->state.gangsterparadise + )) { //Unlock current target. if (md->state.state == MS_WALK && (battle_config.mob_ai&8 || !tbl)) //Inmediately stop chasing. mob_stop_walking(md, 2); mob_unlocktarget(md, tick-(battle_config.mob_ai&8?3000:0)); //Imediately do random walk. @@ -1616,8 +1621,12 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) (dist = distance_bl(&md->bl, abl)) >= 32 || battle_check_target(bl, abl, BCT_ENEMY) <= 0 || (battle_config.mob_ai&2 && !status_check_skilluse(bl, abl, 0, 0)) || - !mob_can_reach(md, abl, dist+2, MSS_RUSH)) //Some more cells of grace... - { //Can't attack back + !mob_can_reach(md, abl, dist+2, MSS_RUSH || + ( //Gangster Paradise check + abl->type == BL_PC && !(mode&MD_BOSS) && + ((struct map_session_data*)abl)->state.gangsterparadise + ) + )) { //Can't attack back if (md->attacked_count++ > 3) { if (mobskill_use(md, tick, MSC_RUDEATTACKED) == 0 && mode&MD_CANMOVE && mob_can_move(md)) diff --git a/src/map/status.c b/src/map/status.c index 8ceb69c06..ce0242511 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -457,14 +457,12 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int struct map_session_data *sd = (struct map_session_data*) target; if (pc_isinvisible(sd)) return 0; - if ((tsc->option&hide_flag || sd->state.gangsterparadise) + if (tsc->option&hide_flag && (sd->state.perfect_hiding || !(race == 4 || race == 6 || mode&MD_DETECTOR)) && !(mode&MD_BOSS)) return 0; } break; - case BL_PET: - return 0; case BL_ITEM: //Allow targetting of items to pick'em up (or in the case of mobs, to loot them). //TODO: Would be nice if this could be used to judge whether the player can or not pick up the item it targets. [Skotlex] if (mode&MD_LOOTER) -- cgit v1.2.3-70-g09d2