diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/clif.c | 11 | ||||
-rw-r--r-- | src/map/mob.c | 43 | ||||
-rw-r--r-- | src/map/skill.c | 7 |
3 files changed, 35 insertions, 26 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index 7a0d6b4ad..aa2091054 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8548,11 +8548,12 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd) if (messagelen > CHAT_SIZE) { // messages mustn't be too long int i; // special case here - allow some more freedom for frost joke & dazzler - for(i = 0; i < MAX_SKILLTIMERSKILL; i++) // the only way to check ~.~ - if (sd->ud.skilltimerskill[i] && sd->ud.skilltimerskill[i]->timer != -1 && - (sd->ud.skilltimerskill[i]->skill_id == BA_FROSTJOKE || sd->ud.skilltimerskill[i]->skill_id == DC_SCREAM)) - break; - if (i == MAX_SKILLTIMERSKILL) { // normal message, too long + // TODO:? You could use a state flag when FrostJoke/Scream is used, and unset it once the skill triggers. [Skotlex] + for(i = 0; i < MAX_SKILLTIMERSKILL && sd->ud.skilltimerskill[i] && + sd->ud.skilltimerskill[i]->skill_id != BA_FROSTJOKE && + sd->ud.skilltimerskill[i]->skill_id != DC_SCREAM; i++); + + if (i == MAX_SKILLTIMERSKILL || !sd->ud.skilltimerskill[i]) { // normal message, too long ShowWarning("clif_parse_GlobalMessage: Player '%s' sent a message too long ('%.*s')!", sd->status.name, CHAT_SIZE, message); return; } diff --git a/src/map/mob.c b/src/map/mob.c index 9078454e9..f3eb3a22d 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1122,37 +1122,44 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) if (md->attacked_id && mode&MD_CANATTACK) { if (md->attacked_id == md->target_id) - { + { //Rude attacked check. if (!battle_check_range(&md->bl, tbl, md->status.rhw.range) && - ( - (!can_move && battle_config.mob_ai&0x2) || + ( //Can't attack back and can't reach back. + (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && + (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB].timer != -1)) || (!mob_can_reach(md, tbl, md->min_chase, MSS_RUSH)) ) && - DIFF_TICK(tick, md->ud.canmove_tick) > 0 && - md->state.attacked_count++ >= RUDE_ATTACKED_COUNT - ) - { //Rude-attacked (avoid triggering due to can-walk delay). - if (!mobskill_use(md, tick, MSC_RUDEATTACKED) && can_move) - unit_escape(bl, tbl, rand()%10 +1); + md->state.attacked_count++ >= RUDE_ATTACKED_COUNT && + !mobskill_use(md, tick, MSC_RUDEATTACKED) && //If can't rude Attack + can_move && unit_escape(bl, tbl, rand()%10 +1)) //Attempt escape + { //Escaped + md->attacked_id = 0; + return 0; } } else if ((abl= map_id2bl(md->attacked_id)) && (!tbl || mob_can_changetarget(md, abl, mode))) { if (md->bl.m != abl->m || abl->prev == NULL || (dist = distance_bl(&md->bl, abl)) >= MAX_MINCHASE || battle_check_target(bl, abl, BCT_ENEMY) <= 0 || - (battle_config.mob_ai&0x2 && !status_check_skilluse(bl, abl, 0, 0)) || - !mob_can_reach(md, abl, dist+md->db->range3, MSS_RUSH) || - ( //Gangster Paradise check - abl->type == BL_PC && !(mode&MD_BOSS) && - ((TBL_PC*)abl)->state.gangsterparadise + (battle_config.mob_ai&0x2 && !status_check_skilluse(bl, abl, 0, 0)) || //Retaliate check + (!battle_check_range(&md->bl, abl, md->status.rhw.range) && + ( //Reach check + (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && + (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB].timer != -1)) || + !mob_can_reach(md, abl, dist+md->db->range3, MSS_RUSH) + ) ) - ) { //Can't attack back + ) { //Rude attacked if (md->state.attacked_count++ >= RUDE_ATTACKED_COUNT && - !mobskill_use(md, tick, MSC_RUDEATTACKED) && can_move) - unit_escape(bl, abl, rand()%10 +1); + !mobskill_use(md, tick, MSC_RUDEATTACKED) && can_move && + unit_escape(bl, abl, rand()%10 +1)) + { //Escaped. + //TODO: Maybe it shouldn't attempt to run if it has another, valid target? + md->attacked_id = 0; + return 0; + } } else if (!(battle_config.mob_ai&0x2) && !status_check_skilluse(bl, abl, 0, 0)) { //Can't attack back, but didn't invoke a rude attacked skill... - md->attacked_id = 0; //Simply unlock, shouldn't attempt to run away when in dumb_ai mode. } else { //Attackable if (!tbl || dist < md->status.rhw.range || !check_distance_bl(&md->bl, tbl, dist) || battle_gettarget(tbl) != md->bl.id) diff --git a/src/map/skill.c b/src/map/skill.c index cdba67d5f..f5283b9d8 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -7173,9 +7173,9 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns case UNT_SPIDERWEB: case UNT_ANKLESNARE: - if(sg->val2==0 && tsc && tsc->data[type].timer==-1){ + if(sg->val2==0 && tsc){ int sec = skill_get_time2(sg->skill_id,sg->skill_lv); - if (sc_start(bl,type,100,sg->skill_lv,sec)) + if (sc_start2(bl,type,100,sg->skill_lv,sg->group_id,sec)) { struct TimerData* td = get_timer(tsc->data[type].timer); if (td) sec = DIFF_TICK(td->tick, tick); @@ -7447,7 +7447,8 @@ int skill_unit_onout (struct skill_unit *src, struct block_list *bl, unsigned in struct block_list *target = map_id2bl(sg->val2); if (target && target==bl) { - status_change_end(bl,SC_SPIDERWEB,-1); + if (sc && sc->data[type].timer!=-1 && sc->data[type].val2 == sg->group_id) + status_change_end(bl,type,-1); sg->limit = DIFF_TICK(tick,sg->tick)+1000; } break; |