diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index ae803e398b..03861358b8 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -28130,19 +28130,17 @@ Body: ItemCost: - Item: MenEater_Plant_Bottle Amount: 1 - Unit: - Id: Hells_Plant - Range: 2 - Interval: 300 # !TODO: Confirm interval - Target: Enemy - Id: 2491 Name: GN_HELLS_PLANT_ATK Description: Hell's Plant Attack MaxLevel: 5 Type: Weapon TargetType: Attack + DamageFlags: + Splash: true Hit: Single HitCount: 1 + SplashArea: 2 Element: Weapon CopyFlags: Skill: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 5cf2824383..701c6c588c 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4513,7 +4513,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * } break; case GN_HELLS_PLANT_ATK: - skillratio += -100 + 500 * skill_lv + sstatus->int_ * (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 5); // !TODO: Confirm INT and Cannibalize bonus + skillratio += -100 + 100 * skill_lv + sstatus->int_ * (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 5); // !TODO: Confirm INT and Cannibalize bonus RE_LVL_DMOD(100); break; // Physical Elemantal Spirits Attack Skills @@ -7254,7 +7254,7 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i return 0; } - if (ssc && ssc->data[SC_REF_T_POTION]) + if (ssc && (ssc->data[SC_REF_T_POTION] || ssc->data[SC_HELLS_PLANT])) return 0; if (flag & BF_SHORT) {//Bounces back part of the damage. diff --git a/src/map/map.cpp b/src/map/map.cpp index 50bc1c1ab5..2dfcb78847 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -489,8 +489,6 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick) skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0); if (sc->data[SC_BANDING]) skill_unit_move_unit_group(skill_id2group(sc->data[SC_BANDING]->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_HELLS_PLANT]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_HELLS_PLANT]->val4), bl->m, x1-x0, y1-y0); if (sc->data[SC_NEUTRALBARRIER_MASTER]) skill_unit_move_unit_group(skill_id2group(sc->data[SC_NEUTRALBARRIER_MASTER]->val2), bl->m, x1-x0, y1-y0); diff --git a/src/map/pc.cpp b/src/map/pc.cpp index f268d3ad7e..41a4eacf3e 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -6031,9 +6031,6 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in } else if(sd->state.active) //Tag player for rewarping after map-loading is done. [Skotlex] sd->state.rewarp = 1; - if (sc && sc->data[SC_HELLS_PLANT]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_HELLS_PLANT]->val4), m, x - sd->bl.x, y - sd->bl.y); - sd->mapindex = mapindex; sd->bl.m = m; sd->bl.x = sd->ud.to_x = x; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index ea1f1590d8..2d34ee516b 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1233,7 +1233,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if( sd ) { // These statuses would be applied anyway even if the damage was blocked by some skills. [Inkfish] - if( skill_id != WS_CARTTERMINATION && skill_id != AM_DEMONSTRATION && skill_id != CR_REFLECTSHIELD && skill_id != MS_REFLECTSHIELD + if( skill_id != WS_CARTTERMINATION && skill_id != AM_DEMONSTRATION && skill_id != CR_REFLECTSHIELD && skill_id != MS_REFLECTSHIELD && skill_id != GN_HELLS_PLANT_ATK #ifndef RENEWAL && skill_id != ASC_BREAKER #endif @@ -5138,6 +5138,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case GN_SPORE_EXPLOSION: case GN_DEMONIC_FIRE: case GN_FIRE_EXPANSION_ACID: + case GN_HELLS_PLANT_ATK: case KO_HAPPOKUNAI: case KO_HUUMARANKA: case KO_MUCHANAGE: @@ -7098,6 +7099,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SR_CRESCENTELBOW: case SR_LIGHTNINGWALK: case GN_CARTBOOST: + case GN_HELLS_PLANT: case KO_MEIKYOUSISUI: case ALL_ODINS_POWER: case ALL_FULL_THROTTLE: @@ -12931,12 +12933,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } break; - case GN_HELLS_PLANT: - status_change_end(src, type, INVALID_TIMER); // Remove previous group - if ((sg = skill_unitsetting(src, skill_id, skill_lv, src->x, src->y, 0)) != nullptr) - sc_start4(src, src, type, 100, skill_lv, 0, 0, sg->group_id, skill_get_time(skill_id, skill_lv)); - break; - case SO_FIREWALK: case SO_ELECTRICWALK: if( sc && sc->data[type] ) @@ -14775,11 +14771,6 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t } break; - case UNT_HELLS_PLANT: - if( battle_check_target(&unit->bl,bl,BCT_ENEMY) > 0 ) - skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &unit->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, SCSTART_NONE); - break; - case UNT_ZEPHYR: if (ss == bl) break; // Doesn't affect the Elemental diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 5031bea9a3..20dcef32bd 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -2203,7 +2203,7 @@ enum e_skill_unit_id : uint16 { UNT_DEMONIC_FIRE, UNT_FIRE_EXPANSION_SMOKE_POWDER, UNT_FIRE_EXPANSION_TEAR_GAS, - UNT_HELLS_PLANT, + UNT_HELLS_PLANT, // No longer a unit skill UNT_VACUUM_EXTREME, UNT_BANDING, UNT_FIRE_MANTLE, diff --git a/src/map/status.cpp b/src/map/status.cpp index 947f03ed47..f68da0b2b8 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -968,7 +968,7 @@ void initChangeTables(void) set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE ); set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER , SC_SMOKEPOWDER , EFST_FIRE_EXPANSION_SMOKE_POWDER, SCB_FLEE ); set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , EFST_FIRE_EXPANSION_TEAR_GAS , SCB_HIT|SCB_FLEE ); - set_sc( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE ); + set_sc_with_vfx( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE ); set_sc( GN_MANDRAGORA , SC_MANDRAGORA , EFST_MANDRAGORA , SCB_INT ); set_sc_with_vfx( GN_ILLUSIONDOPING , SC_ILLUSIONDOPING , EFST_ILLUSIONDOPING , SCB_HIT ); @@ -1608,6 +1608,7 @@ void initChangeTables(void) StatusDisplayType[SC_ANTI_M_BLAST] = BL_PC; StatusDisplayType[SC_SPRITEMABLE] = BL_PC; StatusDisplayType[SC_SV_ROOTTWIST] = BL_PC; + StatusDisplayType[SC_HELLS_PLANT] = BL_PC; // Costumes StatusDisplayType[SC_MOONSTAR] = BL_PC; @@ -11409,6 +11410,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val4 = tick / 1000; tick_time = 1000; // [GodLesZ] tick time break; + case SC_HELLS_PLANT: + tick_time = 333; + val4 = tick / tick_time; + break; case SC_SWINGDANCE: val3 = 3 * val1 + val2; // Walk speed and aspd reduction. break; @@ -13299,7 +13304,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const case SC_WARM: case SC__MANHOLE: case SC_BANDING: - case SC_HELLS_PLANT: if (sce->val4) { // Clear the group. struct skill_unit_group* group = skill_id2group(sce->val4); sce->val4 = 0; @@ -14354,6 +14358,14 @@ TIMER_FUNC(status_change_timer){ } break; + case SC_HELLS_PLANT: + if (--(sce->val4) > 0) { + skill_castend_damage_id(bl, bl, GN_HELLS_PLANT_ATK, sce->val1, tick, 0); + sc_timer_next(333 + tick); + return 0; + } + break; + case SC_VOICEOFSIREN: if( --(sce->val4) >= 0 ) { clif_emotion(bl,ET_THROB);