Corrected Cloud Kill behavior (#3127)

* Fixes #2731.
* Corrected Cloud Kill status being removed and not damaging players who are in the AoE.
Thanks to @redlightliu!
This commit is contained in:
Aleos 2018-06-18 16:02:04 -04:00 committed by GitHub
parent 5e9a23de03
commit f3eab9dd4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 11 additions and 32 deletions

View File

@ -146,7 +146,7 @@
2446,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_EARTHGRAVE 2446,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_EARTHGRAVE
2447,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_DIAMONDDUST 2447,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_DIAMONDDUST
2449,0xdf, , 0, 3:3:4:4:5,500,enemy, 0x018 //SO_PSYCHIC_WAVE 2449,0xdf, , 0, 3:3:4:4:5,500,enemy, 0x018 //SO_PSYCHIC_WAVE
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL 2450,0xe0, , 0, 3, 500,enemy, 0x8010 //SO_CLOUD_KILL
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER 2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME 2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA 2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA

View File

@ -148,7 +148,7 @@
2446,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_EARTHGRAVE 2446,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_EARTHGRAVE
2447,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_DIAMONDDUST 2447,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_DIAMONDDUST
2449,0xdf, , 0, 3:3:4:4:5,500,enemy, 0x018 //SO_PSYCHIC_WAVE 2449,0xdf, , 0, 3:3:4:4:5,500,enemy, 0x018 //SO_PSYCHIC_WAVE
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL 2450,0xe0, , 0, 3, 500,enemy, 0x8010 //SO_CLOUD_KILL
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER 2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME 2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA 2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA

View File

@ -1449,7 +1449,7 @@
export_constant(SC_SHRIMP); export_constant(SC_SHRIMP);
export_constant(SC_FRESHSHRIMP); export_constant(SC_FRESHSHRIMP);
export_constant(SC_ACTIVE_MONSTER_TRANSFORM); export_constant(SC_ACTIVE_MONSTER_TRANSFORM);
export_constant(SC_CLOUD_KILL); export_deprecated_constant(SC_CLOUD_KILL);
export_constant(SC_LJOSALFAR); export_constant(SC_LJOSALFAR);
export_constant(SC_MERMAID_LONGING); export_constant(SC_MERMAID_LONGING);
export_constant(SC_HAT_EFFECT); export_constant(SC_HAT_EFFECT);

View File

@ -13526,13 +13526,6 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
status_change_start(ss, bl, type, 10000, sg->skill_lv, 0, 0, 0, sg->limit, SCSTART_NOICON); status_change_start(ss, bl, type, 10000, sg->skill_lv, 0, 0, 0, sg->limit, SCSTART_NOICON);
break; break;
case UNT_CLOUD_KILL:
if(!sce) {
sc_start4(ss, bl, type, 100, sg->skill_lv, ss->id, unit->bl.id, 0, skill_get_time(sg->skill_id, sg->skill_lv));
status_change_start(ss, bl, SC_POISON, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF);
}
break;
case UNT_WARMER: case UNT_WARMER:
if (!sce && bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON) if (!sce && bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON)
sc_start2(ss, bl, type, 100, sg->skill_lv, ss->id, skill_get_time(sg->skill_id, sg->skill_lv)); sc_start2(ss, bl, type, 100, sg->skill_lv, ss->id, skill_get_time(sg->skill_id, sg->skill_lv));
@ -14174,6 +14167,12 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval); sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval);
break; break;
case UNT_CLOUD_KILL:
if (tsc && !tsc->data[type])
status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF);
skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
break;
case UNT_VACUUM_EXTREME: case UNT_VACUUM_EXTREME:
if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] || 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) (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)
@ -14403,7 +14402,6 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, unsigned int tick)
case EL_WATER_BARRIER: case EL_WATER_BARRIER:
case EL_ZEPHYR: case EL_ZEPHYR:
case EL_POWER_OF_GAIA: case EL_POWER_OF_GAIA:
case SO_CLOUD_KILL:
case SO_WARMER: case SO_WARMER:
case SO_FIRE_INSIGNIA: case SO_FIRE_INSIGNIA:
case SO_WATER_INSIGNIA: case SO_WATER_INSIGNIA:

View File

@ -778,7 +778,7 @@ void initChangeTables(void)
set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , EFST_PROPERTYWALK , SCB_NONE ); set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , EFST_PROPERTYWALK , SCB_NONE );
set_sc( SO_SPELLFIST , SC_SPELLFIST , EFST_SPELLFIST , SCB_NONE ); set_sc( SO_SPELLFIST , SC_SPELLFIST , EFST_SPELLFIST , SCB_NONE );
set_sc_with_vfx( SO_DIAMONDDUST , SC_CRYSTALIZE , EFST_COLD , SCB_NONE ); set_sc_with_vfx( SO_DIAMONDDUST , SC_CRYSTALIZE , EFST_COLD , SCB_NONE );
set_sc( SO_CLOUD_KILL , SC_CLOUD_KILL , EFST_CLOUD_KILL, SCB_NONE ); set_sc( SO_CLOUD_KILL , SC_POISON , EFST_CLOUD_KILL, SCB_NONE );
set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_WATK|SCB_CRI ); set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_WATK|SCB_CRI );
set_sc( SO_WARMER , SC_WARMER , EFST_WARMER , SCB_NONE ); set_sc( SO_WARMER , SC_WARMER , EFST_WARMER , SCB_NONE );
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , EFST_VACUUM_EXTREME , SCB_NONE ); set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , EFST_VACUUM_EXTREME , SCB_NONE );
@ -10485,11 +10485,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_PROPERTYWALK: case SC_PROPERTYWALK:
val3 = 0; val3 = 0;
break; break;
case SC_CLOUD_KILL:
val4 = tick / 500;
tick = -1; // Duration sent to the client should be infinite
tick_time = 500;
break;
case SC_STRIKING: case SC_STRIKING:
// val2 = watk bonus already calc // val2 = watk bonus already calc
val3 = 6 - val1;// spcost = 6 - level (lvl1:5 ... lvl 5: 1) val3 = 6 - val1;// spcost = 6 - level (lvl1:5 ... lvl 5: 1)
@ -13236,20 +13231,6 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
} }
break; break;
case SC_CLOUD_KILL: {
struct block_list *src = map_id2bl(sce->val2), *unit_bl = map_id2bl(sce->val3);
if (src && unit_bl){
map_freeblock_lock();
dounlock = true;
skill_attack(skill_get_type(status_sc2skill(type)), src, unit_bl, bl, SO_CLOUD_KILL, sce->val1, tick, 0);
if (!status_isdead(bl)) {
sc_timer_next(500 + tick);
}
}
}
break;
case SC_WARMER: { case SC_WARMER: {
int hp = 0; int hp = 0;
struct status_change *ssc = status_get_sc(map_id2bl(sce->val2)); struct status_change *ssc = status_get_sc(map_id2bl(sce->val2));

View File

@ -780,7 +780,7 @@ enum sc_type : int16 {
SC_ACTIVE_MONSTER_TRANSFORM, SC_ACTIVE_MONSTER_TRANSFORM,
SC_CLOUD_KILL, SC_CLOUD_KILL, // Deprecated
SC_LJOSALFAR, SC_LJOSALFAR,
SC_MERMAID_LONGING, SC_MERMAID_LONGING,