Batch #17140 by ragnarok-clanker: 250 byte-identical, 218 confirmed by peer review. - fn_03093 EffectResourceSwitcher::SetNames: logic confirmed by peer review - fn_03097 EffectResourceSwitcher::OnProcess: logic confirmed by peer review - fn_03154 CSkillAction_DamageWereRaptorForm::SpawnAttack02Effect: logic confirmed by peer review - fn_03155 CSkillAction_DamageWereRaptorForm::PlayFormAttackEffect: logic confirmed by peer review (already on main) - fn_03156 CSkillAction_DamageWereWolfForm::PlayFormAttackEffect: logic confirmed by peer review (already on main) - fn_03157 CSkillAction_Icing::SpawnIcing: logic confirmed by peer review (already on main) - fn_03158 CSkillAction_ThunderingBasic::PlayThunderEffect: logic confirmed by peer review (already on main) - fn_03159 CSkillAction_ThunderingExpand::PlayThunderEffect: logic confirmed by peer review (already on main) - fn_03160 CSkillAction_DamageWereRaptorForm::SpawnDirectionalEffect: logic confirmed by peer review - fn_03177 CEfstAction_BasicAction::OnEfstBegin: logic confirmed by peer review - fn_03179 CSkillAction_Icing::OnSkillCast: byte-identical - fn_03180 CSkillAction_Thundering::OnSkillCast: logic confirmed by peer review (already on main) - fn_03185 CEfstAction_AnimalForm::ResetAnimalForm: logic confirmed by peer review (already on main) - fn_03188 CSkillAction_AT_ALPHA_CLAW::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03192 CSkillAction_AT_PULSE_OF_MADNESS::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03196 CSkillAction_AT_FRENZY_FANG::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03200 CSkillAction_AT_PINION_SHOT::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03205 CSkillAction_AT_QUILL_SPEAR::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03206 CSkillAction_AT_QUILL_SPEAR_S::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03210 CSkillAction_AT_NATURE_HARMONY::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03217 CSkillAction_AT_GRAVITY_HOLE::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03219 CSkillAction_AT_CHILLING_BLAST::OnSkillEffect: logic confirmed by peer review - fn_03222 CSkillObjectAction_AT_GLACIER_MONOLITH::OnSkillObjectCreate: logic confirmed by peer review - fn_03223 CSkillObjectAction_AT_GLACIER_MONOLITH::OnSkillObjectRemove: logic confirmed by peer review - fn_03225 CSkillAction_AT_GLACIER_NOVA::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_03226 CSkillAction_AT_GLACIER_SHARD::OnGroundSkillCast: logic confirmed by peer review (already on main) - fn_03227 CSkillAction_AT_GLACIER_SHARD::OnSkillEffect: logic confirmed by peer review - fn_03229 CSkillAction_AT_GLACIER_STOMP::OnSkillEffect: logic confirmed by peer review - fn_03231 CSkillAction_AT_ROARING_CHARGE::OnSkillEffect: logic confirmed by peer review - fn_03233 CSkillAction_AT_ROARING_CHARGE_S::OnSkillEffect: logic confirmed by peer review - fn_03234 CSkillAction_AT_ROARING_PIERCER::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03235 CSkillAction_AT_ROARING_PIERCEER_S::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03237 CSkillAction_AT_FURIOS_STORM::OnSkillEffect: logic confirmed by peer review - fn_03243 CSkillAction_AT_ALPHA_PHASE::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03247 CSkillAction_AT_APEX_PHASE::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03251 CSkillAction_AT_FLIP_FLAP::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03256 CSkillAction_AT_AERO_SYNC::OnSkillEffect: logic confirmed by peer review - fn_03259 CEfstAction_FLIP_FLAP_TARGET::OnEfstBegin: logic confirmed by peer review (already on main) - fn_03261 CSkillAction_AT_SAVAGE_LUNGE::OnSkillEffect: logic confirmed by peer review - fn_03264 CSkillAction_AT_TEMPEST_FLAP::OnSkillCast: logic confirmed by peer review (already on main) - fn_03265 CSkillAction_AT_TEMPEST_FLAP::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03267 CSkillAction_AT_TERRA_HARVEST::OnSkillEffect: logic confirmed by peer review - fn_03268 CSkillAction_AT_TERRA_WAVE::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_03270 CSkillAction_AT_SOLID_STOMP::OnSkillEffect: logic confirmed by peer review - fn_03274 CEfstAction_ZEPHYR_LINK::OnEfstBegin: logic confirmed by peer review - fn_03277 CEfstAction_INSANE::OnEfstBegin: logic confirmed by peer review - fn_03280 CEfstAction_INSANE2::OnEfstBegin: logic confirmed by peer review - fn_03281 CEfstAction_INSANE3::OnEfstBegin: logic confirmed by peer review - fn_03327 CSkillAction_AT_PRIMAL_CLAW::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03329 CSkillAction_AT_FERAL_CLAW::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03341 CSkillAction_KR_DOUBLE_SLASH::OnSkillEffect: logic confirmed by peer review - fn_03343 CSkillAction_KR_NASTY_SLASH::OnSkillEffect: logic confirmed by peer review - fn_03347 CSkillAction_KR_CLAW_WAVE::OnGroundSkillEffect: logic confirmed by peer review - fn_03349 CSkillAction_KR_EARTH_DRILL::OnSkillHit: logic confirmed by peer review - fn_03351 CSkillAction_KR_EARTH_STAMP::OnGroundSkillEffect: logic confirmed by peer review - fn_03354 CSkillAction_KR_GROUND_BLOOM::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03355 CSkillAction_KR_THUNDERING_CALL::OnSkillEffect: logic confirmed by peer review - fn_03356 CSkillAction_KR_THUNDERING_CALL_S::OnSkillEffect: logic confirmed by peer review - fn_03358 CSkillAction_KR_THUNDERING_FOCUS::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03360 CSkillAction_KR_THUNDERING_FOCUS_S::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03361 CSkillAction_KR_THUNDERING_ORB::OnGroundSkillEffect: logic confirmed by peer review - fn_03362 CSkillAction_KR_THUNDERING_ORB_S::OnGroundSkillEffect: logic confirmed by peer review - fn_03363 CSkillAction_KR_ICE_SPLASH::OnSkillEffect: logic confirmed by peer review - fn_03366 CSkillObjectAction_KR_ICE_PILLAR::OnSkillObjectCreate: logic confirmed by peer review - fn_03369 CSkillAction_KR_FEATHER_SPRINKLE::OnSkillEffect: logic confirmed by peer review - fn_03374 CSkillAction_KR_SHARPEN_GUST::OnSkillEffect: logic confirmed by peer review - fn_03378 CSkillAction_KR_SHARPEN_HAIL::OnSkillCast: logic confirmed by peer review - fn_03379 CSkillAction_KR_SHARPEN_HAIL::OnSkillEffect: logic confirmed by peer review - fn_03384 CSkillAction_KR_IRON_HOWLING::OnSkillEffect: logic confirmed by peer review - fn_03390 CSkillAction_KR_TYPHOON_WING::OnGroundSkillEffect: logic confirmed by peer review - fn_03396 CEfstAction_WIND_VEIL::OnEfstBegin: logic confirmed by peer review - fn_03400 CSkillAction_SKID_KR_CHOP_CHOP::OnSkillEffect: logic confirmed by peer review (already on main) - fn_03436 CMapSkyMgr::CreateClouds: logic confirmed by peer review (already on main) - fn_04459 CSkillAction_DR_WERERAPTOR::OnSkillEffect: logic confirmed by peer review - fn_04466 CSkillAction_DR_ENRAGE_WOLF::OnSkillEffect: logic confirmed by peer review - fn_04472 CSkillAction_DR_BLOOD_HOWLING::OnSkillEffect: logic confirmed by peer review - fn_04476 CSkillAction_DR_NOMERCY_CLAW::OnSkillEffect: logic confirmed by peer review - fn_04478 CSkillAction_DR_HUNGER::OnSkillEffect: logic confirmed by peer review - fn_04479 CSkillAction_DR_HUNGER::OnSkillHit: logic confirmed by peer review - fn_04481 CSkillAction_DR_CRUEL_BITE::OnSkillEffect: logic confirmed by peer review - fn_04485 CSkillAction_DR_ENRAGE_RAPTOR::OnSkillEffect: logic confirmed by peer review - fn_04491 CSkillAction_DR_PREENING::OnSkillEffect: logic confirmed by peer review - fn_04495 CSkillAction_DR_SHOOTING_FEATHER::OnSkillEffect: logic confirmed by peer review (already on main) - fn_04498 CSkillAction_DR_FLICKING_TONADO::OnSkillEffect: logic confirmed by peer review - fn_04500 CSkillAction_DR_LOW_FLIGHT::OnSkillEffect: logic confirmed by peer review - fn_04504 CSkillAction_DR_NATURE_SHIELD::OnSkillEffect: logic confirmed by peer review - fn_04522 CSkillAction_DR_TRUTH_OF_EARTH::OnSkillEffect: logic confirmed by peer review - fn_04528 CSkillAction_DR_TRUTH_OF_ICE::OnSkillEffect: logic confirmed by peer review (already on main) - fn_04534 CSkillAction_DR_TRUTH_OF_WIND::OnSkillEffect: logic confirmed by peer review - fn_04540 CSkillAction_DR_CUTTING_WIND::OnSkillEffect: logic confirmed by peer review - fn_04541 CSkillAction_DR_CUTTING_WIND::OnSkillDamage: logic confirmed by peer review - fn_04545 CSkillAction_DR_WIND_BOMB::OnSkillEffect: logic confirmed by peer review - fn_04546 CSkillAction_DR_WIND_BOMB::OnSkillDamage: logic confirmed by peer review - fn_04547 CSkillAction_DR_AROUND_FLOWER::OnSkillEffect: logic confirmed by peer review - fn_04548 CSkillAction_DR_EARTH_FLOWER::OnSkillEffect: logic confirmed by peer review (already on main) - fn_04549 CSkillAction_DR_ICE_CLOUD::OnSkillEffect: logic confirmed by peer review - fn_04550 CSkillAction_DR_ICE_TOTEM::OnSkillEffect: logic confirmed by peer review - fn_04552 CSkillAction_DR_WEREWOLF::OnSkillEffect: logic confirmed by peer review - fn_05551 CEnchantMgr::HandleEnchantResult: logic confirmed by peer review - fn_07446 CShowEffect::Add: logic confirmed by peer review - fn_08326 CEfstAction_ChangeSize::OnEfstBegin: byte-identical (already on main) - fn_08329 CEfstAction_GenderChange::OnEfstBegin: byte-identical - fn_08330 CEfstAction_GenderChange::OnEfstEnd: logic confirmed by peer review - fn_08332 CEfstAction_ShowEffect::OnEfstBegin: byte-identical (already on main) - fn_08336 CSkillAction_RA_UNLIMIT::OnSkillEffect: byte-identical - fn_08337 CEfstAction_UNLIMIT::OnEfstBegin: logic confirmed by peer review - fn_08340 CSkillAction_AG_ENERGY_CONVERSION::OnSkillCast: logic confirmed by peer review - fn_08341 CSkillAction_AG_ENERGY_CONVERSION::OnSkillEffect: byte-identical - fn_08342 CSkillAction_CD_DIVINUS_FLOS::OnSkillCast: byte-identical - fn_08343 CSkillAction_CD_DIVINUS_FLOS::OnSkillEffect: byte-identical - fn_08344 CSkillAction_CD_DIVINUS_FLOS::OnSkillDamage: logic confirmed by peer review - fn_08345 CSkillAction_SHC_ENCHANTING_SHADOW::OnSkillCast: byte-identical - fn_08349 CSkillAction_SHC_IMPACT_CRATER::OnSkillEffect: byte-identical - fn_08350 CSkillAction_SHC_IMPACT_CRATER::OnSkillDamage: byte-identical - fn_08352 CSkillAction_SHC_CROSS_SLASH::OnSkillEffect: byte-identical - fn_08353 CSkillAction_SHC_CROSS_SLASH::OnSkillDamage: byte-identical - fn_08355 CSkillAction_SHC_DANCING_KNIFE::OnSkillCast: byte-identical - fn_08356 CSkillAction_SHC_DANCING_KNIFE::OnSkillDamage: byte-identical - fn_08357 CEfstAction_DANCING_KNIFE::OnEfstBegin: byte-identical - fn_08361 CSkillAction_SHC_SHADOW_STAB::OnSkillEffect: byte-identical - fn_08362 CSkillAction_SHC_SHADOW_STAB::OnSkillDamage: logic confirmed by peer review - fn_08363 CSkillAction_SHC_SHADOW_EXCEED::OnSkillCast: byte-identical - fn_08364 CSkillAction_SHC_SHADOW_EXCEED::OnSkillEffect: byte-identical - fn_08372 CSkillAction_ABC_CHASING_BREAK::OnSkillEffect: logic confirmed by peer review (already on main) - fn_08373 CSkillAction_ABC_CHASING_BREAK::OnSkillDamage: byte-identical - fn_08376 CSkillAction_ABC_CHASING_SHOT::OnSkillCast: byte-identical - fn_08377 CSkillAction_ABC_CHASING_SHOT::OnSkillEffect: logic confirmed by peer review (already on main) - fn_08378 CSkillAction_ABC_CHASING_SHOT::OnSkillHit: byte-identical - fn_08379 CSkillAction_ABC_CHASING_SHOT::OnSkillDamage: byte-identical - fn_08381 CSkillAction_ABC_HIT_AND_SLIDING::OnSkillDamage: byte-identical - fn_08382 CSkillAction_ABC_ABYSS_FLAME::OnSkillCast: byte-identical - fn_08383 CSkillAction_ABC_ABYSS_FLAME::OnSkillEffect: byte-identical - fn_08384 CSkillAction_ABC_ABYSS_FLAME::OnSkillDamage: byte-identical - fn_08386 CSkillAction_ABC_ABYSS_FLAME_ATK::OnSkillEffect: byte-identical - fn_08387 CSkillAction_ABC_ABYSS_FLAME_ATK::OnSkillDamage: byte-identical - fn_08388 CSkillAction_EM_PSYCHIC_STREAM::OnSkillCast: byte-identical - fn_08389 CSkillAction_EM_PSYCHIC_STREAM::OnSkillEffect: byte-identical - fn_08390 CSkillAction_EM_PSYCHIC_STREAM::OnSkillDamage: byte-identical - fn_08392 CSkillAction_IQ_BLAZING_FLAME_BLAST::OnSkillCast: byte-identical - fn_08393 CSkillAction_IQ_BLAZING_FLAME_BLAST::OnSkillEffect: byte-identical - fn_08394 CSkillAction_IQ_BLAZING_FLAME_BLAST::OnSkillDamage: logic confirmed by peer review - fn_08437 CSkillAction_BO_MAYHEMIC_THORNS::OnSkillCast: byte-identical (already on main) - fn_08438 CSkillAction_BO_MAYHEMIC_THORNS::OnSkillEffect: byte-identical - fn_08440 CSkillAction_BO_EXPLOSIVE_POWDER::OnSkillEffect: byte-identical - fn_08442 CSkillAction_BO_MYSTERY_POWDER::OnSkillEffect: byte-identical - fn_08443 CSkillAction_BO_MYSTERY_POWDER::OnSkillDamage: byte-identical - fn_08444 CEfstAction_MYSTERY_POWDER::OnEfstBegin: byte-identical - fn_08448 CSkillAction_BO_DUST_EXPLOSION::OnSkillDamage: byte-identical - fn_08449 DustExplosionSpawner::operator(): logic confirmed by peer review - fn_08450 CSkillAction_DK_VIGOR::OnSkillEffect: byte-identical - fn_08451 CEfstAction_VIGOR::OnEfstBegin: byte-identical - fn_08456 CSkillAction_DK_SERVANTWEAPON_ATK::OnSkillHit: byte-identical - fn_08457 CSkillAction_DK_SERVANTWEAPON_ATK::OnSkillDamage: byte-identical - fn_08461 CSkillAction_DK_SERVANT_W_PHANTOM::OnSkillDamage: logic confirmed by peer review - fn_08462 CEfstAction_SERVANT_SIGN::OnEfstBegin: byte-identical - fn_08468 CSkillAction_DK_SERVANT_W_PHANTOM::OnSkillHit: logic confirmed by peer review (already on main) - fn_08470 CSkillAction_DK_SERVANT_W_DEMOL::OnSkillHit: logic confirmed by peer review - fn_08471 CSkillAction_DK_SERVANT_W_DEMOL::OnSkillDamage: byte-identical - fn_08473 CSkillAction_DK_STORMSLASH::OnSkillEffect: logic confirmed by peer review - fn_08477 CSkillAction_DK_MADNESS_CRUSHER::OnSkillDamage: byte-identical - fn_08479 CSkillAction_DK_DRAGONIC_PIERCE::OnSkillCast: byte-identical - fn_08480 CSkillAction_DK_DRAGONIC_PIERCE::OnSkillEffect: logic confirmed by peer review (already on main) - fn_08481 CSkillAction_DK_DRAGONIC_PIERCE::OnSkillDamage: byte-identical - fn_08484 CSkillAction_DK_DRAGONIC_BREATH::OnSkillEffect: byte-identical - fn_08485 CSkillAction_DK_DRAGONIC_BREATH::OnSkillHit: logic confirmed by peer review - fn_08488 CSkillAction_DK_CHARGINGPIERCE::OnSkillEffect: byte-identical - fn_08490 CEfstAction_CHARGINGPIERCE_COUNT::OnEfstBegin: logic confirmed by peer review - fn_08493 CSkillAction_DK_HACKANDSLASHER::OnSkillEffect: byte-identical - fn_08494 CSkillAction_DK_HACKANDSLASHER::OnSkillDamage: byte-identical - fn_08496 CSkillAction_DK_HACKANDSLASHER_ATK::OnSkillDamage: byte-identical - fn_08498 CSkillAction_NPC_BLOCK_EXPLOSION::OnSkillEffect: byte-identical - fn_08500 CSkillAction_NPC_FROST_FIELD::OnSkillEffect: logic confirmed by peer review - fn_08501 CSkillAction_NPC_FROST_FIELD::OnSkillDamage: byte-identical - fn_08502 CEfstAction_FROST_STORM::OnEfstBegin: byte-identical - fn_08506 CSkillAction_NPC_LIGHTNING_JUDGEMENT::OnSkillEffect: logic confirmed by peer review - fn_08507 CSkillAction_NPC_LIGHTNING_JUDGEMENT::OnSkillDamage: byte-identical - fn_08508 CEfstAction_GROGGY::OnEfstBegin: byte-identical - fn_08511 CSkillAction_NPC_RESET_EFST::OnSkillEffect: logic confirmed by peer review - fn_08512 CEfstAction_TARGET_MARKER::OnEfstBegin: byte-identical - fn_08517 CSkillAction_NPC_AIMED_SHOWER::OnSkillEffect: logic confirmed by peer review - fn_08518 CSkillAction_NPC_AIMED_SHOWER::OnSkillDamage: byte-identical - fn_08520 CSkillAction_NPC_BLAZING_ERUPTION::OnSkillEffect: logic confirmed by peer review - fn_08522 CEfstAction_BLOCK_SEAL::OnEfstBegin: byte-identical - fn_08527 CSkillAction_HN_DOUBLEBOWLINGBASH::OnSkillEffect: byte-identical - fn_08530 CSkillAction_HN_MEGA_SONIC_BLOW::OnSkillEffect: byte-identical - fn_08533 CSkillAction_HN_SHIELD_CHAIN_RUSH::OnSkillEffect: byte-identical - fn_08536 CSkillAction_HN_SPIRAL_PIERCE_MAX::OnSkillEffect: logic confirmed by peer review - fn_08539 CSkillAction_HN_METEOR_STORM_BUSTER::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08544 CSkillAction_HN_JUPITEL_THUNDER_STORM::OnSkillEffect: byte-identical - fn_08547 CSkillAction_HN_JACK_FROST_NOVA::OnSkillCast: logic confirmed by peer review - fn_08550 CSkillObjectAction_HN_JACK_FROST_NOVA::OnSkillObjectCreate: byte-identical - fn_08551 CSkillObjectAction_HN_JACK_FROST_NOVA::OnSkillObjectRemove: byte-identical - fn_08554 CSkillAction_HN_HELLS_DRIVE::OnSkillEffect: logic confirmed by peer review - fn_08558 CSkillObjectAction_HN_GROUND_GRAVITATION::OnSkillObjectCreate: byte-identical - fn_08562 CSkillAction_HN_NAPALM_VULCAN_STRIKE::OnSkillHit: byte-identical - fn_08565 CSkillAction_HN_BREAKINGLIMIT::OnSkillEffect: byte-identical - fn_08566 CEfstAction_BREAKINGLIMIT::OnEfstBegin: byte-identical - fn_08571 CSkillAction_HN_RULEBREAK::OnSkillEffect: byte-identical - fn_08572 CEfstAction_RULEBREAK::OnEfstBegin: byte-identical - fn_08575 CSkillAction_HN_OVERCOMING_CRISIS::OnSkillEffect: byte-identical - fn_08579 CSkillAction_IG_CROSS_RAIN::OnSkillCast: byte-identical - fn_08581 CSkillObjectAction_IG_CROSS_RAIN::OnSkillObjectCreate: logic confirmed by peer review - fn_08583 CSkillAction_IG_GRAND_JUDGEMENT::OnSkillCast: byte-identical - fn_08584 CSkillAction_IG_GRAND_JUDGEMENT::OnSkillEffect: logic confirmed by peer review - fn_08585 CEfstAction_IG_GRAND_JUDGEMENT::OnEfstBegin: byte-identical - fn_08590 CSkillAction_IG_GUARDIAN_SHIELD::OnSkillEffect: byte-identical - fn_08591 CEfstAction_IG_GUARDIAN_SHIELD::OnEfstBegin: byte-identical - fn_08596 CSkillAction_IG_HOLY_SHIELD::OnSkillCast: byte-identical - fn_08597 CSkillAction_IG_HOLY_SHIELD::OnSkillEffect: byte-identical - fn_08598 CEfstAction_IG_HOLY_SHIELD::OnEfstBegin: byte-identical - fn_08604 CSkillAction_IG_JUDGEMENT_CROSS::OnSkillCast: byte-identical - fn_08605 CSkillAction_IG_JUDGEMENT_CROSS::OnSkillEffect: logic confirmed by peer review - fn_08606 CSkillAction_IG_JUDGEMENT_CROSS::OnSkillHit: byte-identical - fn_08607 CSkillAction_IG_JUDGEMENT_CROSS::OnSkillDamage: logic confirmed by peer review - fn_08609 CSkillAction_IG_OVERSLASH::OnSkillCast: byte-identical - fn_08610 CSkillAction_IG_OVERSLASH::OnSkillEffect: byte-identical - fn_08611 CSkillAction_IG_OVERSLASH::OnSkillDamage: byte-identical - fn_08612 CSkillAction_IG_REBOUND_SHIELD::OnSkillCast: byte-identical - fn_08613 CSkillAction_IG_REBOUND_SHIELD::OnSkillEffect: byte-identical - fn_08617 CSkillAction_IG_ULTIMATE_SACRIFICE::OnSkillEffect: byte-identical - fn_08618 CEfstAction_IG_ULTIMATE_SACRIFICE::OnEfstBegin: logic confirmed by peer review - fn_08622 CSkillAction_IG_IMPERIAL_CROSS::OnSkillEffect: byte-identical - fn_08623 CSkillAction_IG_IMPERIAL_CROSS::OnSkillDamage: byte-identical - fn_08625 CSkillAction_IG_RADIANT_SPEAR::OnSkillCast: byte-identical - fn_08626 CSkillAction_IG_RADIANT_SPEAR::OnSkillEffect: logic confirmed by peer review - fn_08627 CSkillAction_IG_RADIANT_SPEAR::OnSkillDamage: byte-identical - fn_08628 CSkillAction_IG_IMPERIAL_PRESSURE::OnSkillCast: byte-identical - fn_08629 CSkillAction_IG_IMPERIAL_PRESSURE::OnSkillEffect: byte-identical - fn_08630 CSkillAction_IG_IMPERIAL_PRESSURE::OnSkillDamage: byte-identical - fn_08632 CSkillAction_IG_SHIELD_SHOOTING::OnSkillCast: byte-identical - fn_08633 CSkillAction_IG_SHIELD_SHOOTING::OnSkillEffect: logic confirmed by peer review - fn_08634 CSkillAction_IG_SHIELD_SHOOTING::OnSkillDamage: byte-identical - fn_08636 CSkillAction_IG_ATTACK_STANCE::OnSkillCast: byte-identical - fn_08637 CSkillAction_IG_ATTACK_STANCE::OnSkillEffect: byte-identical - fn_08638 CEfstAction_IG_ATTACK_STANCE::OnEfstBegin: byte-identical - fn_08644 CSkillAction_IG_GUARD_STANCE::OnSkillCast: byte-identical - fn_08645 CSkillAction_IG_GUARD_STANCE::OnSkillEffect: byte-identical - fn_08646 CEfstAction_IG_GUARD_STANCE::OnEfstBegin: byte-identical - fn_08653 CSkillAction_MT_SPARK_BLASTER::OnSkillEffect: byte-identical - fn_08657 CSkillAction_MT_TRIPLE_LASER::OnSkillHit: byte-identical - fn_08659 CSkillAction_MT_MIGHTY_SMASH::OnSkillEffect: byte-identical - fn_08662 CSkillAction_MT_ENERGY_CANNONADE::OnSkillCast: byte-identical - fn_08663 CSkillAction_MT_ENERGY_CANNONADE::OnSkillEffect: byte-identical - fn_08664 CSkillAction_MT_ENERGY_CANNONADE::OnSkillHit: byte-identical - fn_08665 CSkillAction_MT_ENERGY_CANNONADE::OnSkillDamage: byte-identical - fn_08667 CSkillAction_MT_RUSH_STRIKE::OnSkillEffect: logic confirmed by peer review - fn_08668 CSkillAction_MT_RUSH_STRIKE::OnSkillDamage: byte-identical - fn_08670 CSkillAction_MT_POWERFUL_SWING::OnSkillEffect: logic confirmed by peer review - fn_08671 CSkillAction_MT_POWERFUL_SWING::OnSkillDamage: byte-identical - fn_08676 CSkillAction_NW_INTENSIVE_AIM::OnSkillEffect: byte-identical - fn_08677 CEfstAction_INTENSIVE_AIM_COUNT::OnEfstBegin: logic confirmed by peer review - fn_08680 CSkillAction_NW_GRENADE_FRAGMENT::OnSkillEffect: logic confirmed by peer review - fn_08683 CSkillAction_NW_THE_VIGILANTE_AT_NIGHT_GUN_GATLING::OnSkillEffect: logic confirmed by peer review - fn_08685 CSkillAction_NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN::OnSkillEffect: logic confirmed by peer review - fn_08688 CSkillAction_NW_ONLY_ONE_BULLET::OnTargetSkillCast: byte-identical - fn_08689 CSkillAction_NW_ONLY_ONE_BULLET::OnSkillDamage: byte-identical - fn_08692 CSkillAction_NW_SPIRAL_SHOOTING::OnSkillEffect: byte-identical - fn_08695 CSkillAction_NW_MAGAZINE_FOR_ONE::OnSkillEffect: byte-identical - fn_08698 CSkillAction_NW_WILD_FIRE::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08702 CSkillAction_NW_BASIC_GRENADE::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08707 CSkillAction_NW_HASTY_FIRE_IN_THE_HOLE::OnGroundSkillEffect: logic confirmed by peer review - fn_08713 CSkillObjectAction_NW_GRENADES_DROPPING::OnSkillObjectCreate: byte-identical - fn_08716 CSkillAction_NW_AUTO_FIRING_LAUNCHER::OnSkillEffect: byte-identical - fn_08719 CSkillAction_NW_HIDDEN_CARD::OnSkillEffect: byte-identical - fn_08720 CEfstAction_HIDDEN_CARD::OnEfstBegin: byte-identical - fn_08727 CSkillObjectAction_NW_MISSION_BOMBARD::OnSkillObjectCreate: byte-identical - fn_08729 CSkillAction_NW_WILD_SHOT::OnSkillCast: byte-identical - fn_08730 CSkillAction_NW_WILD_SHOT::OnSkillEffect: logic confirmed by peer review - fn_08731 CSkillAction_NW_WILD_SHOT::OnSkillDamage: byte-identical - fn_08734 CSkillAction_NW_MIDNIGHT_FALLEN::OnSkillCast: byte-identical - fn_08735 CSkillAction_NW_MIDNIGHT_FALLEN::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08736 CSkillAction_NW_MIDNIGHT_FALLEN::OnSkillDamage: byte-identical - fn_08738 CEfstAction_NIGHTMARE::OnEfstBegin: byte-identical - fn_08741 CEfstAction_SHADOW_CLOCK::OnEfstBegin: byte-identical - fn_08744 CSkillObjectAction_SS_SBUNSHIN::OnSkillObjectCreate: byte-identical - fn_08745 CSkillObjectAction_SS_SBUNSHIN::OnSkillObjectRemove: byte-identical - fn_08746 CSkillObjectAction_SS_KUNAITRAP::OnSkillObjectCreate: byte-identical - fn_08747 CSkillObjectAction_SS_KUNAITRAP::OnSkillObjectRemove: byte-identical - fn_08748 CSkillAction_SS_TOKEDASU::OnGroundSkillEffect: logic confirmed by peer review - fn_08752 CSkillAction_SS_AKUMUKESU::OnSkillEffect: byte-identical - fn_08755 CSkillAction_SS_SHINKIROU::OnSkillCast: byte-identical (already on main) - fn_08756 CSkillAction_SS_KAGEGARI::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08759 CSkillAction_SS_KAGENOMAI::OnSkillEffect: byte-identical - fn_08762 CSkillAction_SS_KAGEGISSEN::OnSkillEffect: byte-identical - fn_08764 CSkillAction_SS_FUUMASHOUAKU::OnSkillCast: byte-identical - fn_08765 CSkillObjectAction_NPC_FUUMA::OnSkillObjectCreate: byte-identical - fn_08767 CSkillAction_SS_FUUMAKOUCHIKU::OnSkillCast: byte-identical - fn_08768 CSkillAction_SS_FUUMAKOUCHIKU::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08769 CSkillAction_SS_FUUMASHOUAKU_HIT::OnSkillHit: byte-identical - fn_08771 CSkillAction_SS_KUNAIWAIKYOKU::OnSkillCast: byte-identical - fn_08772 CSkillAction_SS_KUNAIWAIKYOKU::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08774 CSkillAction_SS_KUNAIKAITEN::OnSkillEffect: logic confirmed by peer review - fn_08776 CSkillAction_SS_KUNAIKUSSETSU::OnSkillCast: byte-identical - fn_08777 CSkillAction_SS_KUNAIKUSSETSU::OnSkillEffect: logic confirmed by peer review - fn_08781 CSkillAction_SS_SEKIENHOU::OnSkillEffect: logic confirmed by peer review (already on main) - fn_08785 CSkillAction_SS_REIKETSUHOU::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08788 CSkillAction_SS_RAIDENPOU::OnSkillCast: byte-identical - fn_08789 CSkillAction_SS_RAIDENPOU::OnSkillEffect: byte-identical - fn_08790 CSkillAction_SS_RAIDENPOU::OnSkillDamage: byte-identical - fn_08794 CSkillAction_SS_KINRYUUHOU::OnSkillEffect: byte-identical - fn_08795 CSkillAction_SS_KINRYUUHOU::OnSkillDamage: byte-identical - fn_08799 CSkillAction_SS_ANTENPOU::OnSkillEffect: byte-identical - fn_08803 CSkillAction_SS_KAGEAKUMU::OnSkillHit: byte-identical - fn_08807 CSkillAction_SS_HITOUAKUMU::OnSkillEffect: logic confirmed by peer review - fn_08811 CSkillAction_SS_ANKOKURYUUAKUMU::OnSkillEffect: byte-identical - fn_08812 CSkillAction_SS_ANKOKURYUUAKUMU::OnSkillHit: byte-identical - fn_08813 CSkillAction_SS_FOUR_CHARM::OnSkillEffect: logic confirmed by peer review - fn_08815 CSkillObjectAction_SKE_STAR_CANNON::OnSkillObjectCreate: byte-identical - fn_08818 CSkillAction_SKE_ALL_IN_THE_SKY::OnTargetSkillCast: byte-identical - fn_08820 CEfstAction_SKY_ENCHANT::OnEfstBegin: byte-identical - fn_08822 CEfstAction_SKY_ENCHANT::OnEfstUpdate: byte-identical - fn_08824 CSkillAction_SKE_SKY_SUN::OnSkillEffect: logic confirmed by peer review - fn_08825 CSkillAction_SKE_SKY_SUN::OnSkillDamage: byte-identical - fn_08827 CSkillAction_SKE_SKY_MOON::OnSkillCast: logic confirmed by peer review - fn_08828 CSkillAction_SKE_SKY_MOON::OnSkillEffect: byte-identical - fn_08829 CSkillAction_SKE_SKY_MOON::OnSkillDamage: byte-identical - fn_08830 CSkillAction_SKE_STAR_LIGHT_KICK::OnSkillEffect: byte-identical - fn_08831 CSkillAction_SKE_STAR_LIGHT_KICK::OnSkillDamage: byte-identical - fn_08833 CEfstAction_RISING_SUN::OnEfstBegin: logic confirmed by peer review - fn_08835 CEfstAction_RISING_SUN::OnEfstUpdate: byte-identical - fn_08836 CEfstAction_NOON_SUN::OnEfstBegin: logic confirmed by peer review - fn_08838 CEfstAction_NOON_SUN::OnEfstUpdate: byte-identical - fn_08839 CEfstAction_SUNSET_SUN::OnEfstBegin: logic confirmed by peer review - fn_08841 CEfstAction_SUNSET_SUN::OnEfstUpdate: byte-identical - fn_08843 CSkillAction_SKE_NOON_BLAST::OnSkillEffect: byte-identical - fn_08845 CSkillAction_SKE_SUNSET_BLAST::OnSkillEffect: logic confirmed by peer review - fn_08847 CEfstAction_RISING_MOON::OnEfstBegin: byte-identical - fn_08849 CEfstAction_RISING_MOON::OnEfstUpdate: byte-identical - fn_08850 CEfstAction_MIDNIGHT_MOON::OnEfstBegin: byte-identical - fn_08852 CEfstAction_MIDNIGHT_MOON::OnEfstUpdate: byte-identical - fn_08853 CEfstAction_DAWN_MOON::OnEfstBegin: byte-identical - fn_08855 CEfstAction_DAWN_MOON::OnEfstUpdate: byte-identical - fn_08858 CSkillAction_SKE_MIDNIGHT_KICK::OnSkillEffect: byte-identical - fn_08861 CSkillAction_SKE_DAWN_BREAK::OnSkillEffect: byte-identical - fn_08865 CSkillObjectAction_SKE_TWINKLING_GALAXY::OnSkillObjectCreate: byte-identical - fn_08868 CEfstAction_STAR_BURST::OnEfstBegin: byte-identical - fn_08876 CSkillAction_SOA_TALISMAN_OF_FIVE_ELEMENTS::OnSkillEffect: byte-identical - fn_08879 CSkillAction_SOA_TALISMAN_OF_SOUL_STEALING::OnSkillHit: logic confirmed by peer review - fn_08881 CSkillAction_SOA_EXORCISM_OF_MALICIOUS_SOUL::OnSkillEffect: byte-identical - fn_08883 CSkillAction_SOA_TALISMAN_OF_BLUE_DRAGON::OnSkillEffect: logic confirmed by peer review - fn_08884 CEfstAction_T_FIRST_GOD::OnEfstBegin: byte-identical - fn_08888 CSkillAction_SOA_TALISMAN_OF_WHITE_TIGER::OnSkillEffect: logic confirmed by peer review - fn_08889 CEfstAction_T_SECOND_GOD::OnEfstBegin: byte-identical - fn_08893 CSkillAction_SOA_TALISMAN_OF_RED_PHOENIX::OnSkillEffect: byte-identical - fn_08894 CEfstAction_T_THIRD_GOD::OnEfstBegin: byte-identical - fn_08898 CSkillAction_SOA_TALISMAN_OF_BLACK_TORTOISE::OnGroundSkillEffect: logic confirmed by peer review (already on main) - fn_08900 CEfstAction_T_FOURTH_GOD::OnEfstBegin: byte-identical - fn_08904 CSkillAction_SOA_TALISMAN_OF_FOUR_BEARING_GOD::OnSkillEffect: byte-identical - fn_08906 CSkillAction_SOA_CIRCLE_OF_DIRECTIONS_AND_ELEMENTALS::OnSkillEffect: byte-identical - fn_08907 CEfstAction_T_FIVETH_GOD::OnEfstBegin: byte-identical - fn_08912 CSkillAction_SOA_SOUL_OF_HEAVEN_AND_EARTH::OnSkillEffect: byte-identical - fn_08913 CEfstAction_HEAVEN_AND_EARTH::OnEfstBegin: byte-identical - fn_08918 CSkillAction_SOA_TALISMAN_OF_PROTECTION::OnSkillEffect: byte-identical - fn_08921 CSkillAction_SOA_TALISMAN_OF_WARRIOR::OnSkillEffect: byte-identical - fn_08924 CSkillAction_SOA_TALISMAN_OF_MAGICIAN::OnSkillEffect: byte-identical - fn_08926 CSkillAction_SOA_SOUL_GATHERING::OnSkillEffect: byte-identical - fn_08929 CSkillObjectAction_SOA_TOTEM_OF_TUTELARY::OnSkillObjectCreate: byte-identical - fn_08930 CSkillObjectAction_SOA_TOTEM_OF_TUTELARY::OnSkillObjectRemove: byte-identical - fn_08932 CSkillAction_SH_CHUL_HO_SONIC_CLAW::OnSkillEffect: logic confirmed by peer review - fn_08935 CSkillAction_SH_HOWLING_OF_CHUL_HO::OnSkillEffect: byte-identical - fn_08936 CEfstAction_HOGOGONG::OnEfstBegin: byte-identical - fn_08941 CSkillAction_SH_HOGOGONG_STRIKE::OnSkillHit: byte-identical - fn_08943 CSkillAction_SH_KI_SUL_WATER_SPRAYING::OnSkillEffect: byte-identical - fn_08945 CSkillAction_SH_MARINE_FESTIVAL_OF_KI_SUL::OnSkillEffect: byte-identical - fn_08946 CEfstAction_MARINE_FESTIVAL::OnEfstBegin: byte-identical - fn_08948 CSkillAction_SH_SANDY_FESTIVAL_OF_KI_SUL::OnSkillEffect: byte-identical - fn_08949 CEfstAction_SANDY_FESTIVAL::OnEfstBegin: byte-identical - fn_08951 CSkillAction_SH_KI_SUL_RAMPAGE::OnSkillEffect: byte-identical - fn_08953 CSkillAction_SH_COLORS_OF_HYUN_ROK::OnSkillEffect: logic confirmed by peer review - fn_08957 CSkillObjectAction_SH_HYUN_ROKS_BREEZE::OnSkillObjectCreate: byte-identical - fn_08959 CSkillAction_SH_HYUN_ROK_CANNON::OnSkillEffect: byte-identical - fn_08961 CSkillAction_SH_TEMPORARY_COMMUNION::OnSkillEffect: byte-identical - fn_08962 CEfstAction_TEMPORARY_COMMUNION::OnEfstBegin: logic confirmed by peer review - fn_08967 CSkillAction_SH_BLESSING_OF_MYSTICAL_CREATURES::OnSkillEffect: byte-identical - fn_08969 CSkillAction_SH_CHUL_HO_BATTERING::OnSkillCast: byte-identical - fn_08970 CSkillAction_SH_CHUL_HO_BATTERING::OnSkillEffect: byte-identical - fn_08971 CSkillAction_SH_CHUL_HO_BATTERING::OnSkillDamage: logic confirmed by peer review - fn_08972 CSkillAction_SH_HYUN_ROK_SPIRIT_POWER::OnSkillCast: byte-identical - fn_08973 CSkillAction_SH_HYUN_ROK_SPIRIT_POWER::OnSkillEffect: byte-identical - fn_08974 CSkillAction_SH_HYUN_ROK_SPIRIT_POWER::OnSkillDamage: byte-identical - fn_08976 CSkillAction_TR_ROSEBLOSSOM::OnSkillDamage: byte-identical - fn_08977 CSkillAction_TR_ROSEBLOSSOM_ATK::OnSkillDamage: byte-identical - fn_08978 CSkillAction_TR_KVASIR_SONATA::OnSkillCast: byte-identical - fn_08979 CSkillAction_TR_KVASIR_SONATA::OnSkillEffect: byte-identical - fn_08982 CSkillAction_TR_PRON_MARCH::OnSkillCast: logic confirmed by peer review - fn_08983 CSkillAction_TR_PRON_MARCH::OnSkillEffect: byte-identical - fn_08987 CSkillAction_TR_JAWAII_SERENADE::OnSkillCast: byte-identical - fn_08988 CSkillAction_TR_JAWAII_SERENADE::OnSkillEffect: byte-identical - fn_08992 CSkillAction_TR_AIN_RHAPSODY::OnSkillCast: byte-identical - fn_08993 CSkillAction_TR_AIN_RHAPSODY::OnSkillEffect: byte-identical - fn_08997 CSkillAction_TR_GEF_NOCTURN::OnSkillCast: byte-identical - fn_08998 CSkillAction_TR_GEF_NOCTURN::OnSkillEffect: logic confirmed by peer review - fn_09002 CSkillAction_TR_RHYTHMICAL_WAVE::OnSkillCast: logic confirmed by peer review - fn_09003 CSkillAction_TR_RHYTHMICAL_WAVE::OnSkillEffect: byte-identical - fn_09004 CSkillAction_TR_RHYTHMICAL_WAVE::OnSkillDamage: byte-identical - fn_09006 CSkillAction_TR_METALIC_FURY::OnSkillEffect: byte-identical - fn_09007 CSkillAction_TR_MYSTIC_SYMPHONY::OnSkillCast: byte-identical - fn_09008 CSkillAction_TR_MYSTIC_SYMPHONY::OnSkillEffect: byte-identical - fn_09009 CEfstAction_MYSTIC_SYMPHONY::OnEfstBegin: byte-identical - fn_09015 CSkillAction_TR_RHYTHMSHOOTING::OnSkillCast: byte-identical - fn_09016 CSkillAction_TR_RHYTHMSHOOTING::OnSkillHit: byte-identical - fn_09017 CSkillAction_TR_RHYTHMSHOOTING::OnSkillDamage: byte-identical - fn_09018 CSkillAction_TR_ROKI_CAPRICCIO::OnSkillCast: byte-identical - fn_09019 CSkillAction_TR_ROKI_CAPRICCIO::OnSkillEffect: byte-identical - fn_09020 CSkillAction_TR_ROSEBLOSSOM::OnSkillCast: byte-identical - fn_09021 CSkillAction_TR_ROSEBLOSSOM::OnSkillEffect: byte-identical - fn_09023 CSkillAction_WH_GALESTORM::OnSkillCast: logic confirmed by peer review - fn_09024 CSkillAction_WH_GALESTORM::OnSkillEffect: byte-identical - fn_09025 CSkillAction_WH_GALESTORM::OnSkillDamage: byte-identical - fn_09026 CSkillAction_WH_CALAMITYGALE::OnSkillCast: byte-identical - fn_09027 CSkillAction_WH_CALAMITYGALE::OnSkillEffect: byte-identical - fn_09028 CEfstAction_CALAMITYGALE::OnEfstBegin: byte-identical - fn_09037 CSkillAction_WH_CRESCIVE_BOLT::OnSkillCast: byte-identical - fn_09038 CSkillAction_WH_CRESCIVE_BOLT::OnSkillDamage: byte-identical - fn_09039 CSkillAction_WH_WILD_WALK::OnSkillCast: byte-identical - fn_09040 CSkillAction_WH_WILD_WALK::OnSkillEffect: byte-identical - fn_09041 CSkillAction_WH_WILD_WALK::OnSkillDamage: logic confirmed by peer review - fn_10225 UIRuneSystemWnd::SendMsg: logic confirmed by peer review - fn_17682 CWorld::LoadMapEffects: logic confirmed by peer review (already on main) - fn_17955 CChampionMonsterMgr::ApplyEffects: logic confirmed by peer review (already on main) - fn_20087 CRagEffect::OnProcess3: logic confirmed by peer review - fn_21019 CGameActor::SetHatEffect: logic confirmed by peer review (already on main) - fn_21020 CGameActor::SetEffectState: byte-identical (already on main) - fn_21021 CGameActor::SetEffectInstance: byte-identical - fn_21112 CGameActor::SendMsg: logic confirmed by peer review - fn_21156 CGameActor::SetCharm: logic confirmed by peer review - fn_21166 CGameActor::SetTetraBall: logic confirmed by peer review (already on main) - fn_21194 CGameActor::PlayGroundSkillEffect: logic confirmed by peer review (already on main) - fn_21196 CGameActor::ProcessSkillMessage: logic confirmed by peer review - fn_21296 CGameMode::LaunchTargetEffect: logic confirmed by peer review - fn_21312 LaunchBulletSpriteEffect: byte-identical - fn_21314 CGameMode::PlayItemUseEffect: logic confirmed by peer review - fn_21953 CGameMode::ApplyStatusChange: logic confirmed by peer review - fn_21963 CGameMode::NotifySkillCasting: logic confirmed by peer review - fn_21965 LaunchSkillActorEffect: logic confirmed by peer review - fn_21967 LaunchSkillCastEffect: logic confirmed by peer review - fn_21970 CGameMode::ReceiveActorStatusValue: logic confirmed by peer review - fn_22008 CGameMode::SpawnSkillWarningPlanes: logic confirmed by peer review (already on main) - fn_22013 CGameMode::ReceiveRuneRewardPacket: logic confirmed by peer review - fn_22027 CGameMode::ReceiveRuneGradeResult: logic confirmed by peer review (already on main) - fn_22037 CGameMode::ReceiveGradeEnchantResult: logic confirmed by peer review (already on main) - fn_22038 CGameMode::ReceiveAchievementUpdate: logic confirmed by peer review - fn_22128 CGameMode::ReceiveWindow348Result: logic confirmed by peer review - fn_22140 CGameMode::ReceiveStatusChangeNotice: logic confirmed by peer review - fn_22143 CGameMode::ReceiveNotifyEffect: logic confirmed by peer review (already on main) - fn_22147 CGameMode::ReceiveNotifyGroundSkill: logic confirmed by peer review (already on main) - fn_22149 CGameMode::ReceiveNotifySkill: logic confirmed by peer review (already on main) - fn_22189 CGameMode::ReceiveSoulEnergy: logic confirmed by peer review (already on main) - fn_22192 CGameMode::UpdateActorSpiritCount: logic confirmed by peer review (already on main) - fn_22208 CGameMode::ReceiveSkillUse: logic confirmed by peer review (already on main) - fn_22252 CItem::SendMsg: logic confirmed by peer review (already on main) - fn_22670 CPlayer::ReapplySkillEffects: logic confirmed by peer review (already on main) - fn_23895 CSession::PlaySkillEffect: logic confirmed by peer review - fn_23896 CSession::PlaySkillTargetEffect: byte-identical - fn_23901 CSession::PlaySkillGroundEffect: logic confirmed by peer review - fn_24271 CSkill::LaunchGroundEffects: logic confirmed by peer review - fn_24287 CSkill::OnProcess: logic confirmed by peer review - fn_24296 CDummyEffectLauncher::SendMsg: logic confirmed by peer review - fn_24302 CSkill::SendMsg: logic confirmed by peer review - fn_45483 LaunchLuaSkillEffect: logic confirmed by peer review - fn_45492 CSkillAction_WH_CRESCIVE_BOLT::OnSkillHit: logic confirmed by peer review - fn_18774 EffectLists::Spawn: logic confirmed by peer review - fn_21763 CGameMode::ReceiveBroadcast: logic confirmed by peer review (already on main) - fn_21777 CGameMode::ReceiveZoneServerChange: logic confirmed by peer review (already on main) - fn_22566 CPc::RenderBodyOutline: logic confirmed by peer review (already on main) - fn_22594 CGrannyPc::Render: logic confirmed by peer review (already on main) - fn_22597 CGrannyPc::RenderCached: logic confirmed by peer review (already on main) - fn_19253 SetWindEffectInfo: logic confirmed by peer review (already on main) Reviewed-by: ragnarok-clanker
949 lines
33 KiB
C++
949 lines
33 KiB
C++
#include "Contents/Actors/Skill.h"
|
|
#include "Contents/Actors/ActorEnums.h"
|
|
#include "Contents/Skills/SkillId.h"
|
|
#include "Contents/Skills/SkillUnitId.h"
|
|
|
|
#include "Contents/Actors/ActorPickNode.h"
|
|
#include "Contents/Skills/GraffiSkill.h"
|
|
|
|
#include "Client/Mode/CGameMode.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "Client/Session/Session.h"
|
|
#include "Contents/Actors/Pc.h"
|
|
#include "Contents/Effects/Skills/CaneOfEvilEyeEffect.h"
|
|
#include "Contents/Effects/Particles/EZ2STREffect.h"
|
|
#include "Contents/Effects/Core/Effect.h"
|
|
#include "Contents/Effects/Core/EffectLists.h"
|
|
#include "Contents/Effects/Core/EffectTypes.h"
|
|
#include "Contents/Effects/Core/RagEffect.h"
|
|
#include "Contents/Ground/TerrainHeight.h"
|
|
#include "Contents/Models/ModelActor.h"
|
|
#include "Contents/Skills/SkillInfo.h"
|
|
#include "Contents/Sound/SoundMgr.h"
|
|
#include "Contents/World/World.h"
|
|
#include "Resource/Models/ModelResource.h"
|
|
#include "Resource/ResourceMgr.h"
|
|
#include "Render/Renderer.h"
|
|
#include "Render/Drawing/SpriteGeometry.h"
|
|
#include "Resource/World/TerrainResource.h"
|
|
#include "UI/Text/UITransBalloonText.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
|
|
#include <cstring>
|
|
#include <cstdlib>
|
|
#include <new>
|
|
#include <windows.h>
|
|
#include <timeapi.h>
|
|
|
|
struct SkillHitMessage {
|
|
/* 0000 */ int skillId;
|
|
/* 0004 */ int damage;
|
|
/* 0008 */ int action;
|
|
/* 000C */ std::uint32_t targetAid;
|
|
/* 0010 */ int startTime;
|
|
/* 0014 */ int monsterValue;
|
|
/* 0018 */ int hitCount;
|
|
/* 001C */ int cellX;
|
|
/* 0020 */ int cellY;
|
|
/* 0024 */ int attackMotionTime;
|
|
/* 0028 */ int motionSpeed;
|
|
};
|
|
|
|
struct SkillUnitMessage {
|
|
/* 0000 */ std::uint32_t aid;
|
|
/* 0004 */ std::uint32_t owner;
|
|
/* 0008 */ int type;
|
|
/* 000C */ int x;
|
|
/* 0010 */ int y;
|
|
/* 0014 */ unsigned char visible;
|
|
/* 0018 */ int range;
|
|
/* 001C */ int level;
|
|
/* 0020 */ std::uint32_t characterId;
|
|
};
|
|
|
|
#if defined(_WIN32) && !defined(_WIN64)
|
|
static_assert(sizeof(SkillHitMessage) == 0x2C);
|
|
static_assert(sizeof(SkillUnitMessage) == 0x24);
|
|
#endif
|
|
|
|
// OFFSET: 0x00E4A350
|
|
// FUNCTION: fn_24252
|
|
CGraffiSkill::CGraffiSkill() : CSkill(0) {
|
|
}
|
|
|
|
// OFFSET: 0x00E4A6D0
|
|
// FUNCTION: fn_24256
|
|
CSkill::CSkill(std::uint32_t aid) {
|
|
this->skillAid = aid;
|
|
this->SetActorJob(0x7E);
|
|
this->m_effectTimer = 0x8CA0;
|
|
this->render.visibilityOptions[1] = 0;
|
|
this->render.enabled = 0;
|
|
this->actorWindows[0] = 0;
|
|
this->m_model = nullptr;
|
|
this->m_effect = nullptr;
|
|
this->sourceActorId = 0;
|
|
this->range = 0;
|
|
this->m_hasEffect = false;
|
|
this->m_targets.clear();
|
|
}
|
|
|
|
// OFFSET: 0x00E4AA30
|
|
// FUNCTION: fn_24259
|
|
CSkill::~CSkill() {
|
|
if (this->actorWindows[0] != 0) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[0]));
|
|
this->actorWindows[0] = 0;
|
|
}
|
|
|
|
this->ReleaseModel();
|
|
for (std::vector<std::uint64_t>::iterator it = this->m_targets.begin(); it != this->m_targets.end(); ++it) {
|
|
std::uint64_t target = *it;
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->SendObjectMessage(this, target, 24, 0, 0, 0, 0);
|
|
}
|
|
|
|
this->m_targets.clear();
|
|
}
|
|
|
|
// OFFSET: 0x00E4B400
|
|
// FUNCTION: fn_24268
|
|
const char* CSkill::GetTrapModelName() {
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case UNT_BLASTMINE:
|
|
case UNT_REVERBERATION:
|
|
case UNT_NETHERWORLD:
|
|
case UNT_WALLOFTHORN:
|
|
return "외부소품\\트랩03_3.rsm";
|
|
case UNT_SKIDTRAP:
|
|
return "외부소품\\트랩02.rsm";
|
|
case UNT_THORNS_TRAP:
|
|
return "event\\3차트랩_가시01.rsm";
|
|
case UNT_LANDMINE:
|
|
return "외부소품\\트랩03.rsm";
|
|
case UNT_SHOCKWAVE:
|
|
return "외부소품\\트랩03_6.rsm";
|
|
case UNT_SANDMAN:
|
|
return "외부소품\\트랩03_4.rsm";
|
|
case UNT_FLASHER:
|
|
return "외부소품\\트랩03_5.rsm";
|
|
case UNT_FREEZINGTRAP:
|
|
return "외부소품\\트랩03_2.rsm";
|
|
case UNT_CLAYMORETRAP:
|
|
return "외부소품\\트랩04.rsm";
|
|
case UNT_TALKIEBOX:
|
|
return "외부소품\\트랩05.rsm";
|
|
case UNT_ANKLESNARE:
|
|
case UNT_EARTHSTRAIN:
|
|
return "외부소품\\트랩01.rsm";
|
|
case UNT_MAGENTATRAP:
|
|
return "event\\3차트랩_변화01.rsm";
|
|
case UNT_COBALTTRAP:
|
|
return "event\\3차트랩_변수01.rsm";
|
|
case UNT_MAIZETRAP:
|
|
return "event\\3차트랩_변지01.rsm";
|
|
case UNT_VERDURETRAP:
|
|
return "event\\3차트랩_변풍01.rsm";
|
|
case UNT_FIRINGTRAP:
|
|
return "event\\3차트랩_화01.rsm";
|
|
case UNT_ICEBOUNDTRAP:
|
|
return "event\\3차트랩_수01.rsm";
|
|
case UNT_ELECTRICSHOCKER:
|
|
return "event\\3차트랩_풍01.rsm";
|
|
case UNT_CLUSTERBOMB:
|
|
return "event\\3차트랩_지01.rsm";
|
|
case UNT_DEEPBLINDTRAP:
|
|
return "effect\\deepblindtrap\\deep_trap.rsm2";
|
|
case UNT_SOLIDTRAP:
|
|
return "effect\\solidtrap\\sol_trap.rsm2";
|
|
case UNT_SWIFTTRAP:
|
|
return "effect\\swifttrap\\swi_trap.rsm2";
|
|
case UNT_FLAMETRAP:
|
|
return "effect\\flametrap\\fla_trap.rsm2";
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E4B580
|
|
// FUNCTION: fn_24269
|
|
void CSkill::ReleaseModel() {
|
|
if (this->m_model == nullptr) {
|
|
return;
|
|
}
|
|
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
WorldSpatialTree* spatial = &mode->scene->spatial;
|
|
if (spatial != nullptr) {
|
|
spatial->RemoveModel(this->m_model, 0);
|
|
}
|
|
|
|
delete this->m_model;
|
|
this->m_model = nullptr;
|
|
if (this->m_effect != nullptr) {
|
|
this->m_effect->SendMsg(nullptr, AM_MASTER_DEAD, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
|
|
this->m_effect = nullptr;
|
|
if (this->m_hasEffect) {
|
|
g_effectMgr->Find(this->skillAid, this->m_effectId)->RetireIfInactive();
|
|
this->m_hasEffect = false;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E503F0
|
|
// FUNCTION: fn_24294
|
|
void CSkill::Render(int argument) {
|
|
if (this->render.enabled) {
|
|
float x;
|
|
float y;
|
|
float reciprocalDepth;
|
|
g_renderer->ProjectViewport(&this->render.position.x, reinterpret_cast<const float*>(argument), &x, &y, &reciprocalDepth);
|
|
CRenderer* renderer = g_renderer;
|
|
float scale = renderer->ScaleDistance(reciprocalDepth);
|
|
scale /= g_heightScale;
|
|
this->render.distanceScale = scale;
|
|
|
|
float bounds[5];
|
|
bounds[0] = x - (renderer->viewport.uiScaleX + renderer->viewport.uiScaleX) * scale;
|
|
bounds[1] = y - (renderer->viewport.uiScaleY + renderer->viewport.uiScaleY) * scale;
|
|
bounds[2] = (renderer->viewport.uiScaleX + renderer->viewport.uiScaleX) * scale + x;
|
|
bounds[3] = y;
|
|
bounds[4] = reciprocalDepth;
|
|
this->SetRenderInfo(bounds, x, y);
|
|
} else {
|
|
this->UpdateTlvertex(reinterpret_cast<const float*>(argument));
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E4B690
|
|
// FUNCTION: fn_24271
|
|
void CSkill::LaunchGroundEffects(int effectId, int, int duration) {
|
|
if (g_effectMgr->HasAllocator(effectId)) {
|
|
g_effectMgr->Spawn(this->render.accountId, effectId, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 1, 0);
|
|
}
|
|
|
|
unsigned interval = EffectLifetime(effectId) - 20;
|
|
if (duration > 0) {
|
|
interval = duration - 20;
|
|
}
|
|
if (this->m_effectTimer < interval) {
|
|
return;
|
|
}
|
|
|
|
this->m_effectTimer = 0;
|
|
const int range = this->range < 0 ? 0 : this->range;
|
|
for (int column = -range; column <= range; ++column) {
|
|
for (int row = -range; row <= range; ++row) {
|
|
const float x = static_cast<float>(column * 6) + this->render.position.x + static_cast<float>(rand() % 11) * 0.2f - 1.0f;
|
|
const float z = static_cast<float>(row * 6) + this->render.position.z + static_cast<float>(rand() % 11) * 0.2f - 1.0f;
|
|
float y = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->terrain->Height(x, z);
|
|
if (effectId == 0x3BF || effectId == 0x3CF) {
|
|
y += 20.0f;
|
|
}
|
|
y -= static_cast<float>(rand() % 11) * 0.4f;
|
|
|
|
vector3d position;
|
|
position.x = x;
|
|
position.y = y;
|
|
position.z = z;
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->LaunchDummyEffect(&position, effectId, interval + 20, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E55100
|
|
// FUNCTION: fn_24303
|
|
void CSkill::SetRenderInfo(const float* box, float x, float y) {
|
|
if (this->render.visibilityOptions[1] != 0) {
|
|
// GLOBAL: gl_25171
|
|
static int minimum = static_cast<int>(g_renderer->UiScaleX() * 34.0f);
|
|
ActorPickInfo* info = new ActorPickInfo;
|
|
info->left = box[0] < box[2] ? box[0] : box[2];
|
|
info->top = box[1];
|
|
info->depth = box[4] + 350.0f;
|
|
info->right = box[0] > box[2] ? box[0] : box[2];
|
|
info->bottom = box[3];
|
|
info->depthOffset = box[4] + 350.0f;
|
|
info->accountId = this->skillAid;
|
|
info->job = this->GetEffectiveJob(-1);
|
|
info->healthState = 0;
|
|
info->kind = 2;
|
|
|
|
const int width = static_cast<int>(info->right - info->left);
|
|
if (width < minimum) {
|
|
const float pad = static_cast<float>((minimum - width) / 2);
|
|
info->right += pad;
|
|
info->left -= pad;
|
|
}
|
|
|
|
const int height = static_cast<int>(info->bottom - info->top);
|
|
if (height < minimum) {
|
|
const float pad = static_cast<float>((minimum - height) / 2);
|
|
info->bottom += pad;
|
|
info->top -= pad;
|
|
}
|
|
|
|
g_actorPickNode.AddPickInfo(info);
|
|
}
|
|
|
|
this->SetTlvert(x, y);
|
|
}
|
|
|
|
// OFFSET: 0x00E55320
|
|
// FUNCTION: fn_24304
|
|
void CSkill::ShowModel(const char* modelName) {
|
|
if (modelName == nullptr || this->render.enabled == 0) {
|
|
return;
|
|
}
|
|
|
|
this->ReleaseModel();
|
|
const float diffuse[3] = {0.5f, 0.7f, 0.5f};
|
|
const float white[3] = {1.0f, 1.0f, 1.0f};
|
|
const float ambient[3] = {0.5f, 0.5f, 0.5f};
|
|
auto* resource = static_cast<C3dModelRes*>(ResourceMgr::Instance().Load(modelName));
|
|
if (resource->major == 1) {
|
|
this->m_model = new C3dActorV1;
|
|
} else if (resource->major == 2) {
|
|
this->m_model = new C3dActorV2;
|
|
}
|
|
|
|
this->m_model->CopyVolumes(resource->volumes);
|
|
this->m_model->SetSpeed(1.0f);
|
|
const vector3d position = this->render.position;
|
|
this->m_model->SetPosition(position);
|
|
this->m_model->Assign(*resource);
|
|
this->m_model->Animate(3.0);
|
|
this->m_model->occlusionEnabled = 0;
|
|
this->m_model->playback = 0;
|
|
this->m_model->Prepare(diffuse, white, ambient);
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->spatial.InsertModel(*this->m_model, 0);
|
|
}
|
|
|
|
// OFFSET: 0x00E51BD0
|
|
// FUNCTION: fn_24302
|
|
void CSkill::SendMsg(CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int, int, int, int) {
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
|
|
switch (static_cast<std::int64_t>(a) << 32 | static_cast<std::uint32_t>(message)) {
|
|
case AM_CHAT: {
|
|
const char* text = reinterpret_cast<const char*>(b);
|
|
if (std::strlen(text) == 0) {
|
|
return;
|
|
}
|
|
|
|
this->chatTick = timeGetTime();
|
|
if (this->actorWindows[0] == 0) {
|
|
UITransBalloonText* balloon =
|
|
new UITransBalloonText();
|
|
this->actorWindows[0] = reinterpret_cast<int>(balloon);
|
|
balloon->SetSize(8, 8);
|
|
g_windowMgr.AddRenderedFront(reinterpret_cast<UIWindow*>(this->actorWindows[0]));
|
|
}
|
|
|
|
UITransBalloonText* balloon = reinterpret_cast<UITransBalloonText*>(this->actorWindows[0]);
|
|
balloon->SetText(text, 35);
|
|
balloon->SetColors(0xFF8080, 0);
|
|
this->chatWidth = balloon->geometry.width;
|
|
this->chatHeight = balloon->geometry.height;
|
|
balloon->Move(this->render.screenX - this->chatWidth / 2, this->render.screenY - g_renderer->viewport.height * 110 / 480);
|
|
return;
|
|
}
|
|
case AM_SKILL: {
|
|
const SkillHitMessage* hit = reinterpret_cast<const SkillHitMessage*>(b);
|
|
const int skillId = hit->skillId;
|
|
const int monsterValue = hit->monsterValue;
|
|
const int cellX = hit->cellX;
|
|
const int cellY = hit->cellY;
|
|
const int motionSpeed = hit->motionSpeed;
|
|
int hitCount = hit->hitCount;
|
|
if (hitCount == 0) {
|
|
hitCount = 1;
|
|
}
|
|
const int damage = hit->damage / hitCount;
|
|
|
|
CRenderObject* target = nullptr;
|
|
if (g_session.m_aid == hit->targetAid) {
|
|
target = mode->scene->player;
|
|
g_session.GetDisplayJob();
|
|
} else {
|
|
CRenderObject* actor = mode->scene->GetGameActorByAID(hit->targetAid);
|
|
CRenderObject* skill = mode->scene->GetSkillByAID(hit->targetAid);
|
|
if (actor != nullptr) {
|
|
target = actor;
|
|
} else if (skill != nullptr) {
|
|
target = skill;
|
|
}
|
|
if (target != nullptr) {
|
|
static_cast<CGameActor*>(target)->GetEffectiveJob(-1);
|
|
}
|
|
}
|
|
|
|
int effectId = skillId < 493 ? 0 : -1;
|
|
switch (skillId) {
|
|
case MG_FIREWALL:
|
|
effectId = 0x31;
|
|
break;
|
|
case PR_MAGNUS:
|
|
effectId = 0x98;
|
|
break;
|
|
case WZ_VERMILION:
|
|
case SJ_BOOKOFCREATINGSTAR:
|
|
effectId = 0x34;
|
|
break;
|
|
case WZ_STORMGUST:
|
|
case NPC_STORMGUST2:
|
|
effectId = 0x33;
|
|
break;
|
|
case SG_SUN_WARM:
|
|
case SG_MOON_WARM:
|
|
case SG_STAR_WARM:
|
|
effectId = 0x247;
|
|
break;
|
|
case AG_MYSTERY_ILLUSION:
|
|
effectId = 0x6EF;
|
|
break;
|
|
case AG_VIOLENT_QUAKE_ATK:
|
|
case AG_STRANTUM_TREMOR:
|
|
effectId = 0x764;
|
|
break;
|
|
case AG_ALL_BLOOM_ATK:
|
|
case AG_ALL_BLOOM_ATK2:
|
|
effectId = 0x707;
|
|
break;
|
|
case AG_TORNADO_STORM:
|
|
effectId = 0x6F4;
|
|
break;
|
|
case AG_FLORAL_FLARE_ROAD:
|
|
effectId = 0x70F;
|
|
break;
|
|
case ABC_ABYSS_SQUARE:
|
|
case EM_LIGHTNING_LAND:
|
|
case EM_VENOM_SWAMP:
|
|
case EM_CONFLAGRATION:
|
|
case MH_BLAST_FORGE:
|
|
effectId = g_session.FindSkillFollowEffect(skillId);
|
|
break;
|
|
case WH_DEEPBLINDTRAP:
|
|
effectId = 0x753;
|
|
break;
|
|
case WH_SOLIDTRAP:
|
|
effectId = 0x75B;
|
|
break;
|
|
case WH_SWIFTTRAP:
|
|
effectId = 0x757;
|
|
break;
|
|
case WH_FLAMETRAP:
|
|
effectId = 0x782;
|
|
break;
|
|
}
|
|
|
|
if (target != nullptr) {
|
|
ActorDamageMessage damageMessage;
|
|
damageMessage.targetAid = this->hitTargetAid;
|
|
damageMessage.action = 26;
|
|
damageMessage.damage = damage;
|
|
damageMessage.time = timeGetTime();
|
|
damageMessage.attackerAid = this->skillAid;
|
|
damageMessage.cellX = cellX;
|
|
damageMessage.cellY = cellY;
|
|
damageMessage.hitEffect = effectId;
|
|
damageMessage.effectId = -1;
|
|
damageMessage.monsterValue = monsterValue;
|
|
damageMessage.motionSpeed = static_cast<float>(motionSpeed) / 288.0f;
|
|
damageMessage.blueDamage = 0;
|
|
damageMessage.skillId = skillId;
|
|
damageMessage.skillTarget = 0;
|
|
|
|
const int address = reinterpret_cast<int>(&damageMessage);
|
|
int total = damage;
|
|
target->SendMsg(this, AM_WILL_BE_ATTACKED, 0, address, address >> 31, total, total >> 31, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
for (int index = 0; index < hitCount - 1;) {
|
|
++index;
|
|
damageMessage.time += g_multiHitInterval;
|
|
total += damage;
|
|
damageMessage.skillTarget = index;
|
|
target->SendMsg(this, AM_WILL_BE_ATTACKED, 0, address, address >> 31, total, total >> 31, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (this->m_model != nullptr) {
|
|
this->m_model->playback = 1;
|
|
}
|
|
return;
|
|
}
|
|
case AM_SKILLSTANDENTRY: {
|
|
const SkillUnitMessage* unit = reinterpret_cast<const SkillUnitMessage*>(b);
|
|
this->range = unit->range;
|
|
this->skillAid = unit->aid;
|
|
this->render.accountId = unit->aid;
|
|
this->SetActorJob(unit->type);
|
|
this->render.enabled = unit->visible;
|
|
if (unit->visible) {
|
|
this->render.enabled = 1;
|
|
} else {
|
|
const bool visible =
|
|
g_session.m_aid == unit->owner ||
|
|
g_session.PartyByCharacter(unit->characterId).valid != 0;
|
|
this->render.enabled = visible;
|
|
}
|
|
|
|
mode->CellCenter(unit->x, unit->y, this->render.position.x, this->render.position.z);
|
|
this->render.position.y = mode->scene->terrain->Height(this->render.position.x, this->render.position.z);
|
|
this->m_effectId = -1;
|
|
|
|
const vector3d& position = this->render.position;
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case UNT_ICEWALL:
|
|
this->render.visibilityOptions[1] = 1;
|
|
return;
|
|
case UNT_FIREWALL:
|
|
case UNT_FIRE_MANTLE: {
|
|
const vector3d& player = mode->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\EF_FireWall.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
}
|
|
case UNT_TATAMIGAESHI:
|
|
case UNT_FIREWALK:
|
|
case UNT_ELECTRICWALK:
|
|
case UNT_VACUUM_EXTREME:
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_GROUNDDRIFT_WIND:
|
|
this->m_effectId = 0x6B;
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_WALLOFTHORN:
|
|
this->m_effectId = 0x6A;
|
|
this->render.visibilityOptions[1] = 1;
|
|
return;
|
|
case UNT_WARMER:
|
|
this->m_effectId = 0x6A;
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_GROUNDDRIFT_DARK:
|
|
case UNT_GROUNDDRIFT_FIRE:
|
|
case UNT_GROUNDDRIFT_NEUTRAL:
|
|
this->m_effectId = 0x63;
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_GROUNDDRIFT_POISON:
|
|
this->m_effectId = 0x8B;
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_MAGENTATRAP:
|
|
case UNT_COBALTTRAP:
|
|
case UNT_MAIZETRAP:
|
|
case UNT_VERDURETRAP:
|
|
this->m_effectId = 0x8B;
|
|
this->render.visibilityOptions[1] = 0;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_ELECTRICSHOCKER:
|
|
this->m_effectId = 0x6B;
|
|
this->render.visibilityOptions[1] = 0;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (!this->HasId(0x91)) {
|
|
this->LaunchEffect(0x91, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
}
|
|
return;
|
|
case UNT_FIRINGTRAP:
|
|
case UNT_CLUSTERBOMB:
|
|
this->m_effectId = 0x6B;
|
|
this->render.visibilityOptions[1] = 0;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_ICEBOUNDTRAP:
|
|
this->m_effectId = 0x6C;
|
|
this->render.visibilityOptions[1] = 0;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_GROUNDDRIFT_WATER:
|
|
this->m_effectId = 0x6C;
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_KAEN:
|
|
if (rand() % 8 == 0) {
|
|
const vector3d& player = mode->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\화염진.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
}
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
case UNT_TRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_BLASTMINE:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x6A;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_REVERBERATION:
|
|
case UNT_NETHERWORLD:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x1D0;
|
|
return;
|
|
case UNT_SKIDTRAP:
|
|
case UNT_ANKLESNARE:
|
|
case UNT_LANDMINE:
|
|
case UNT_TALKIEBOX:
|
|
case UNT_THORNS_TRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_SANDMAN:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x8B;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_FLASHER:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x63;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_FREEZINGTRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x6C;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_CLAYMORETRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->m_effectId = 0x6B;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
return;
|
|
case UNT_SHOCKWAVE:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->render.enabled && !this->HasId(0x91)) {
|
|
this->LaunchEffect(0x91, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
}
|
|
return;
|
|
case UNT_FEINTBOMB: {
|
|
CPc* source;
|
|
if (unit->owner == g_session.m_aid) {
|
|
source = reinterpret_cast<CPc*>(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->player);
|
|
} else {
|
|
source = static_cast<CPc*>(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->GetGameActorByAID(this->sourceActorId));
|
|
}
|
|
if (source != nullptr) {
|
|
CreateHallucinationPc(
|
|
source->GetEffectiveJob(-1), source->sex, source->head, &this->render.position, 180, source->render.bodyPalette,
|
|
source->headPalette, source->GetBodyCostume()
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
case UNT_KINGS_GRACE: {
|
|
const vector3d& player = mode->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\lg_kings_grace.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
}
|
|
case UNT_MAGMA_ERUPTION: {
|
|
const vector3d& player = mode->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\NC_MAGMA_ERUPTION.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
this->render.visibilityOptions[1] = 0;
|
|
return;
|
|
}
|
|
case UNT_PNEUMA:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8D, position, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_B_TRAP:
|
|
switch (unit->level) {
|
|
case 1:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x42D, position, 0, -1, 0, 0);
|
|
return;
|
|
case 2:
|
|
case 3:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x42E, position, 0, -1, 0, 0);
|
|
return;
|
|
case 4:
|
|
case 5:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x42F, position, 0, -1, 0, 0);
|
|
return;
|
|
}
|
|
return;
|
|
case UNT_CATNIPPOWDER:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x450, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_NYANGGRASS: {
|
|
const vector3d& player = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\su_nyanggrass.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x465, position, 0, unit->level, 0, 0);
|
|
return;
|
|
}
|
|
case UNT_CREATINGSTAR: {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x4B0, position, 0, -1, 0, 0);
|
|
const vector3d& player = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->player->render.position;
|
|
g_soundMgr->PlayWave("effect\\g카트토네이도.wav", position.x - player.x, 0.0f, position.z - player.z, 250, 40, 1.0f, 0);
|
|
return;
|
|
}
|
|
case UNT_SEEDTRAP:
|
|
switch (unit->level) {
|
|
case 1:
|
|
this->m_effectId = 0x642;
|
|
break;
|
|
case 2:
|
|
this->m_effectId = 0x643;
|
|
break;
|
|
case 3:
|
|
this->m_effectId = 0x644;
|
|
break;
|
|
case 4:
|
|
this->m_effectId = 0x645;
|
|
break;
|
|
case 5:
|
|
this->m_effectId = 0x646;
|
|
break;
|
|
}
|
|
return;
|
|
case UNT_PNEUMATICUS_PROCELLA:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x7A5, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_RAIN_OF_CRYSTAL:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x6D8)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x6D8);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x6D8, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_VIOLENT_QUAKE:
|
|
g_effectMgr->Retire(this->render.accountId, 0x701);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x701, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_ASTRAL_STRIKE:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x6E8)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x6E8);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x6E8, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_MYSTERY_ILLUSION:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x6EC)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x6EC);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x6EC, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_TORNADO_STORM:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x6F0)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x6F0);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x6F0, position, 0, unit->level, 0, 0);
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x6F1)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x6F1);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x6F1, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_ALL_BLOOM:
|
|
g_effectMgr->Retire(this->render.accountId, 0x702);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x702, position, 0, unit->level, 0, 0);
|
|
g_effectMgr->Retire(this->render.accountId, 0x703);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x703, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_FLORAL_FLARE_ROAD:
|
|
g_effectMgr->Retire(this->render.accountId, 0x70C);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x70C, position, 0, unit->level, 0, 0);
|
|
return;
|
|
case UNT_STRANTUM_TREMOR:
|
|
for (std::int64_t effectId = 0x765; effectId <= 0x766; ++effectId) {
|
|
if (!g_effectMgr->Has(this->render.accountId, static_cast<int>(effectId))) {
|
|
g_effectMgr->Retire(this->render.accountId, static_cast<int>(effectId));
|
|
}
|
|
CEffect* effect = g_effectMgr->Spawn(this->render.accountId, static_cast<int>(effectId), position, 0, unit->level, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetAngle(90.0f);
|
|
static_cast<CEZ2STRScreenEffect*>(effect)->followCamera = 1;
|
|
}
|
|
}
|
|
return;
|
|
case UNT_VENOM_SWAMP:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x7EF)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x7EF);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x7EF, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_LIGHTNING_LAND:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x7FA)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x7FA);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x7FA, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x7F9)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x7F9);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x7F9, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_CONFLAGRATION:
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x808)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x808);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x808, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (!g_effectMgr->Has(this->render.accountId, 0x807)) {
|
|
g_effectMgr->Retire(this->render.accountId, 0x807);
|
|
}
|
|
g_effectMgr->Spawn(this->render.accountId, 0x807, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_ABYSS_SQUARE:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x852, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x851, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_ACIDIFIED_ZONE_FIRE: {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8A0, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8A1, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
CEffect* effect = g_effectMgr->Spawn(this->render.accountId, 0x8A2, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
effect = g_effectMgr->Spawn(this->render.accountId, 0x8A3, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
return;
|
|
}
|
|
case UNT_ACIDIFIED_ZONE_WATER: {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8A8, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8A9, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
CEffect* effect = g_effectMgr->Spawn(this->render.accountId, 0x8AA, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
effect = g_effectMgr->Spawn(this->render.accountId, 0x8AB, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
return;
|
|
}
|
|
case UNT_ACIDIFIED_ZONE_WIND: {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8B0, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8B1, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
CEffect* effect = g_effectMgr->Spawn(this->render.accountId, 0x8B2, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
effect = g_effectMgr->Spawn(this->render.accountId, 0x8B3, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
return;
|
|
}
|
|
case UNT_ACIDIFIED_ZONE_GROUND: {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8B8, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
g_effectMgr->Spawn(this->render.accountId, 0x8B9, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
CEffect* effect = g_effectMgr->Spawn(this->render.accountId, 0x8BA, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
effect = g_effectMgr->Spawn(this->render.accountId, 0x8BB, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
if (effect != nullptr) {
|
|
effect->SetDelay(10);
|
|
}
|
|
return;
|
|
}
|
|
case UNT_CANE_OF_EVIL_EYE:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x903, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_DEEPBLINDTRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->render.enabled) {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x752, position, 0, -1, 0, 0);
|
|
}
|
|
return;
|
|
case UNT_SWIFTTRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->render.enabled) {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x756, position, 0, -1, 0, 0);
|
|
}
|
|
return;
|
|
case UNT_SOLIDTRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->render.enabled) {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x75A, position, 0, -1, 0, 0);
|
|
}
|
|
return;
|
|
case UNT_FLAMETRAP:
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->render.enabled) {
|
|
g_effectMgr->Spawn(this->render.accountId, 0x77F, position, 0, -1, 0, 0);
|
|
}
|
|
return;
|
|
default: {
|
|
CRenderObject* source = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->GetGameActorByAidIncludeMe(this->sourceActorId);
|
|
CSkillActionMgr* actions = CSkillActionMgr::GetInstance();
|
|
actions->OnSkillObjectCreate(this->GetEffectiveJob(-1), unit->level, this, static_cast<CGameActor*>(source));
|
|
return;
|
|
}
|
|
case 0x532C:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x925, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
}
|
|
}
|
|
case AM_SETJOB:
|
|
this->SetActorJob(b);
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case UNT_WARP_WAITING: {
|
|
const vector3d& player = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->player->render.position;
|
|
g_soundMgr->PlayWave(
|
|
"effect\\EF_Portal.wav", this->render.position.x - player.x, 0.0f, this->render.position.z - player.z, 250, 40, 1.0f, 0
|
|
);
|
|
break;
|
|
}
|
|
case UNT_USED_TRAPS:
|
|
if (this->m_effectId != -1 &&
|
|
!g_effectMgr->Spawn(0, this->m_effectId, this->render.position, 0, -1, 0, 0)) {
|
|
CRagEffect* effect = this->LaunchEffect(this->m_effectId, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
if (effect != nullptr) {
|
|
effect->SendMsg(nullptr, AM_SETPOS, 0, reinterpret_cast<int>(&this->render.position), 0, 0, 0, 0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
this->m_effectTimer = 36000;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->m_model != nullptr) {
|
|
this->m_model->playback = 1;
|
|
}
|
|
return;
|
|
case AM_DISAPPEAR:
|
|
if (this->GetEffectiveJob(-1) == UNT_CANE_OF_EVIL_EYE) {
|
|
CEffect* effect = g_effectMgr->Find(this->render.accountId, 0x903);
|
|
if (effect != nullptr) {
|
|
static_cast<CCaneOfEvilEyeEffect*>(effect)->Finish();
|
|
}
|
|
} else {
|
|
CSkillActionMgr* actions = CSkillActionMgr::GetInstance();
|
|
actions->OnSkillObjectRemove(this->GetEffectiveJob(-1), this);
|
|
}
|
|
return;
|
|
case AM_SKILL_UPDATE:
|
|
if (this->render.enabled) {
|
|
return;
|
|
}
|
|
|
|
this->render.enabled = 1;
|
|
this->ShowModel(this->GetTrapModelName());
|
|
if (this->GetEffectiveJob(-1) == UNT_SHOCKWAVE && !this->HasId(0x91)) {
|
|
this->LaunchEffect(0x91, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
}
|
|
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case UNT_DEEPBLINDTRAP:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x752, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_SOLIDTRAP:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x75A, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_SWIFTTRAP:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x756, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
case UNT_FLAMETRAP:
|
|
g_effectMgr->Spawn(this->render.accountId, 0x77F, vector3d{0.0f, 0.0f, 0.0f}, 0, -1, 0, 0);
|
|
return;
|
|
}
|
|
return;
|
|
default:
|
|
this->CGameActor::SendMsg(sender, message, a, b, c, d, e, f, g, h, i, 0, 0, 0, 0);
|
|
return;
|
|
}
|
|
}
|