Merge pull request #288 from 'hotfix/issue139'

Signed-off-by: Cydh Ramdh <cydh@pservero.com>
This commit is contained in:
Cydh Ramdh 2015-04-30 22:54:06 +07:00
parent 77cd4df358
commit cb2ffa24c8
5 changed files with 51 additions and 15 deletions

View File

@ -1544,7 +1544,7 @@
//-- SO_WARMER //-- SO_WARMER
2452,2200:2400:2600:2800:3000,1000,0,40000:45000:50000:55000:60000,30000,35000:40000:45000:50000:55000,1800:1600:1400:1200:1000 2452,2200:2400:2600:2800:3000,1000,0,40000:45000:50000:55000:60000,30000,35000:40000:45000:50000:55000,1800:1600:1400:1200:1000
//-- SO_VACUUM_EXTREME //-- SO_VACUUM_EXTREME
2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,1000,5000,-1 2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,2000,5000,-1
//-- SO_VARETYR_SPEAR //-- SO_VARETYR_SPEAR
2454,2200:2400:2600:2800:3000,1000,0,0,2200:2400:2600:2800:3000,2000,1800:1600:1400:1200:1000 2454,2200:2400:2600:2800:3000,1000,0,0,2200:2400:2600:2800:3000,2000,1800:1600:1400:1200:1000
//-- SO_ARRULLO //-- SO_ARRULLO

View File

@ -1457,7 +1457,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
view_range = md->db->range2; view_range = md->db->range2;
mode = status_get_mode(&md->bl); mode = status_get_mode(&md->bl);
can_move = (mode&MD_CANMOVE)&&unit_can_move(&md->bl); can_move = (mode&MD_CANMOVE) && unit_can_move(&md->bl);
if (md->target_id) if (md->target_id)
{ //Check validity of current target. [Skotlex] { //Check validity of current target. [Skotlex]
@ -1561,7 +1561,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
return true; return true;
// Scan area for targets // Scan area for targets
if (!tbl && mode&MD_LOOTER && md->lootitem && DIFF_TICK(tick, md->ud.canact_tick) > 0 && if (!tbl && can_move && mode&MD_LOOTER && md->lootitem && DIFF_TICK(tick, md->ud.canact_tick) > 0 &&
(md->lootitem_count < LOOTITEM_SIZE || battle_config.monster_loot_type != 1)) (md->lootitem_count < LOOTITEM_SIZE || battle_config.monster_loot_type != 1))
{ // Scan area for items to loot, avoid trying to loot if the mob is full and can't consume the items. { // Scan area for items to loot, avoid trying to loot if the mob is full and can't consume the items.
map_foreachinshootrange (mob_ai_sub_hard_lootsearch, &md->bl, view_range, BL_ITEM, md, &tbl); map_foreachinshootrange (mob_ai_sub_hard_lootsearch, &md->bl, view_range, BL_ITEM, md, &tbl);

View File

@ -12332,6 +12332,13 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
case HW_GRAVITATION: case HW_GRAVITATION:
if(sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF) if(sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF)
link_group_id = sc->data[SC_GRAVITATION]->val4; link_group_id = sc->data[SC_GRAVITATION]->val4;
break;
case SO_VACUUM_EXTREME:
// Coordinates
val1 = x;
val2 = y;
val3 = 0; // Suck target at n seconds.
break;
} }
// Init skill unit group // Init skill unit group
@ -13426,12 +13433,12 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
break; break;
case UNT_VACUUM_EXTREME: case UNT_VACUUM_EXTREME:
if ( tsc && tsc->data[SC_HALLUCINATIONWALK] ) if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] ||
(tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled)
return 0; return 0;
else { else
sg->limit -= 100 * tstatus->str/20; // Apply effect and suck targets one-by-one each n seconds
sc_start(ss, bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit); sc_start4(ss, bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->group_id, (sg->val1<<16)|(sg->val2), ++sg->val3*500, (sg->limit - DIFF_TICK(tick, sg->tick)));
}
break; break;
case UNT_BANDING: case UNT_BANDING:

View File

@ -1201,6 +1201,7 @@ void initChangeTables(void)
StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE; StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE;
StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE; StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE;
StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOMOVE; StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_VACUUM_EXTREME] |= SCS_NOMOVE;
/* StatusChangeState (SCS_) NOPICKUPITEMS */ /* StatusChangeState (SCS_) NOPICKUPITEMS */
StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM;
@ -7799,7 +7800,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
) )
return 0; return 0;
case SC_VACUUM_EXTREME: case SC_VACUUM_EXTREME:
if(sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HOVERING]) if (sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HOVERING] || sc->data[SC_VACUUM_EXTREME] ||
(sc->data[SC_VACUUM_EXTREME_POSTDELAY] && sc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == val2))) // Ignore post delay from other vacuum (this will make stack effect enabled)
return 0; return 0;
break; break;
case SC_STONE: case SC_STONE:
@ -8160,6 +8162,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_ELECTRICSHOCKER: case SC_ELECTRICSHOCKER:
case SC_MAGNETICFIELD: case SC_MAGNETICFIELD:
case SC_NETHERWORLD: case SC_NETHERWORLD:
case SC_VACUUM_EXTREME:
return 0; return 0;
} }
} }
@ -9677,11 +9680,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val4 = tick / 1000; val4 = tick / 1000;
tick_time = 1000; // [GodLesZ] tick time tick_time = 1000; // [GodLesZ] tick time
break; break;
case SC_VACUUM_EXTREME:
tick -= (status->str / 20) * 1000;
val4 = val3 = tick / 100;
tick_time = 100; // [GodLesZ] tick time
break;
case SC_SWINGDANCE: case SC_SWINGDANCE:
val3 = 5 * val1 + val2; // Walk speed and aspd reduction. val3 = 5 * val1 + val2; // Walk speed and aspd reduction.
break; break;
@ -10129,6 +10127,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
tick_time = 3000; tick_time = 3000;
val4 = tick/tick_time; val4 = tick/tick_time;
break; break;
case SC_VACUUM_EXTREME:
// Suck target at n second, only if the n second is lower than the duration
// Doesn't apply to BL_PC
if (bl->type != BL_PC && val4 < tick && !unit_blown_immune(bl,0x1) && status->mode&MD_CANMOVE) {
tick_time = val4;
val4 = tick - tick_time;
}
else
val4 = 0;
break;
/* Rebellion */ /* Rebellion */
case SC_B_TRAP: case SC_B_TRAP:
@ -10311,7 +10319,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_PARALYSIS: case SC_PARALYSIS:
case SC_MAGNETICFIELD: case SC_MAGNETICFIELD:
case SC_ANKLE: case SC_ANKLE:
case SC_VACUUM_EXTREME:
if (!unit_blown_immune(bl,0x1)) if (!unit_blown_immune(bl,0x1))
unit_stop_walking(bl,1); unit_stop_walking(bl,1);
break; break;
@ -10319,6 +10326,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (bl->type == BL_PC || !unit_blown_immune(bl,0x1)) if (bl->type == BL_PC || !unit_blown_immune(bl,0x1))
unit_stop_walking(bl,1); unit_stop_walking(bl,1);
break; break;
case SC_VACUUM_EXTREME:
if (bl->type != BL_PC && !unit_blown_immune(bl,0x1)) {
unit_stop_walking(bl,1);
unit_stop_attack(bl);
}
break;
case SC_HIDING: case SC_HIDING:
case SC_CLOAKING: case SC_CLOAKING:
case SC_CLOAKINGEXCEED: case SC_CLOAKINGEXCEED:
@ -11308,6 +11321,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
map_addflooritem(&it, it.amount, bl->m,bl->x, bl->y, caster->status.char_id, 0, 0, 4); map_addflooritem(&it, it.amount, bl->m,bl->x, bl->y, caster->status.char_id, 0, 0, 4);
} }
break; break;
case SC_VACUUM_EXTREME:
///< !CHECKME: Seems on official, there's delay before same target can be vacuumed in same area again [Cydh]
sc_start2(bl, bl, SC_VACUUM_EXTREME_POSTDELAY, 100, sce->val1, sce->val2, skill_get_time2(SO_VACUUM_EXTREME,sce->val1));
break;
} }
opt_flag = 1; opt_flag = 1;
@ -12397,6 +12414,17 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
break; break;
sc_timer_next(3000 + tick, status_change_timer, bl->id, data); sc_timer_next(3000 + tick, status_change_timer, bl->id, data);
} }
break;
case SC_VACUUM_EXTREME:
if (sce->val4) {
if (unit_movepos(bl, sce->val3>>16, sce->val3&0xFFFF, 0, false)) {
clif_slide(bl, sce->val3>>16, sce->val3&0xFFFF);
clif_fixpos(bl);
}
sc_timer_next(tick+sce->val4, status_change_timer, bl->id, data);
sce->val4 = 0;
}
break;
} }
// Default for all non-handled control paths is to end the status // Default for all non-handled control paths is to end the status

View File

@ -702,6 +702,7 @@ typedef enum sc_type {
SC__CHAOS, SC__CHAOS,
SC_ELEMENTAL_SHIELD, SC_ELEMENTAL_SHIELD,
SC_CHASEWALK2, SC_CHASEWALK2,
SC_VACUUM_EXTREME_POSTDELAY,
SC_MTF_ASPD2, SC_MTF_ASPD2,
SC_MTF_RANGEATK2, SC_MTF_RANGEATK2,