Batch #16619 by ragnarok-clanker: forced by an admin (1 lower score(s), 13 changed function(s)); checked with 460 compiled unit(s), including every includer of Source/Client/Mode/CGameMode.h, Source/Contents/Achievement/AchievementMgr.h, Source/Contents/Actors/ActorNameCard.h, Source/Contents/Actors/GameActor.h, Source/Contents/Actors/GndRiser.h, Source/Contents/Actors/GroundScope.h, Source/Contents/Actors/Item.h, Source/Contents/Actors/PlayerNameDictionary.h, Source/Contents/Actors/Resources/EquipmentResourceMgr.h, Source/Contents/AdventureGuide/AdventureGuideMgr.h, Source/Contents/CashEmotion/CashEmotionMgr.h, Source/Contents/Clan/ClanInfo.h, Source/Contents/CombatTypes.h, Source/Contents/Configuration/ConfigMgr.h, Source/Contents/Effects/Core/CellRangeEffect.h, Source/Contents/Effects/Core/ChangeSizeEffect.h, Source/Contents/Effects/Core/DummyEffectLauncher.h, Source/Contents/Effects/Core/Effect.h, Source/Contents/Effects/Core/EffectActor.h, Source/Contents/Effects/Core/EffectLists.h, Source/Contents/Effects/Core/EffectMaker.h, Source/Contents/Effects/Core/EffectMemoryMgr.h, Source/Contents/Effects/Core/EffectMessageId.h, Source/Contents/Effects/Core/EffectPoint.h, Source/Contents/Effects/Core/EffectPrimId.h, Source/Contents/Effects/Core/EffectTypes.h, Source/Contents/Effects/Core/MsgEffect.h, Source/Contents/Effects/Core/RagEffect.h, Source/Contents/Effects/Core/RagEffectState.h, Source/Contents/Effects/Core/ShowEffect.h, Source/Contents/Effects/Core/SquareRangeEffect.h, Source/Contents/Effects/EffectResourceSwitcher.h, Source/Contents/Effects/Particles/AnimatedEmitterEffect.h, Source/Contents/Effects/Particles/CharacterParticleBundle.h, Source/Contents/Effects/Particles/EZ2STREffect.h, Source/Contents/Effects/Particles/EZ2STREffectEx.h, Source/Contents/Effects/Particles/EffectEmitter.h, Source/Contents/Effects/Particles/EmitterEffect.h, Source/Contents/Effects/Particles/Particle.h, Source/Contents/Effects/Particles/ParticlePool.h, Source/Contents/Effects/Particles/SpriteEffect.h, Source/Contents/Effects/Particles/SpriteParticle.h, Source/Contents/Effects/Primitives/EffectPrim.h, Source/Contents/Effects/Primitives/EffectPrimitiveMotion.h, Source/Contents/Effects/Primitives/EffectPrimitiveState.h, Source/Contents/Effects/RDamageVar.h, Source/Contents/Effects/Skills/AMachineEffect.h, Source/Contents/Effects/Skills/AcidifiedThrow.h, Source/Contents/Effects/Skills/ArrowEffect.h, Source/Contents/Effects/Skills/AstralStrikeEffect.h, Source/Contents/Effects/Skills/AxeBoomerang.h, Source/Contents/Effects/Skills/Bash.h, Source/Contents/Effects/Skills/BezierArcThrowEffect.h, Source/Contents/Effects/Skills/BindTrapEffect.h, Source/Contents/Effects/Skills/BlastForge.h, Source/Contents/Effects/Skills/CaneOfEvilEyeEffect.h, Source/Contents/Effects/Skills/CartCannon.h, Source/Contents/Effects/Skills/ChargingPierceEffect.h, Source/Contents/Effects/Skills/CherryBlossomEffect.h, Source/Contents/Effects/Skills/ClimaxEffect.h, Source/Contents/Effects/Skills/CloudEffect.h, Source/Contents/Effects/Skills/CloudKillEffect.h, Source/Contents/Effects/Skills/CommonFloorEffect.h, Source/Contents/Effects/Skills/Competentia.h, Source/Contents/Effects/Skills/CresciveBolt.h, Source/Contents/Effects/Skills/ElectricEffect.h, Source/Contents/Effects/Skills/EnergyOrbEffect.h, Source/Contents/Effects/Skills/EvilLandEffect.h, Source/Contents/Effects/Skills/EvilsPawEffect.h, Source/Contents/Effects/Skills/FlowerCastingEffect.h, Source/Contents/Effects/Skills/FortuneKissEffect.h, Source/Contents/Effects/Skills/FriggSongEffect.h, Source/Contents/Effects/Skills/FuumaShouakuEffect.h, Source/Contents/Effects/Skills/GlassWallEffect.h, Source/Contents/Effects/Skills/GravityControlEffect.h, Source/Contents/Effects/Skills/HealEffect.h, Source/Contents/Effects/Skills/HealSpEffect.h, Source/Contents/Effects/Skills/HitLineEffect.h, Source/Contents/Effects/Skills/JupitelThunderStormEffect.h, Source/Contents/Effects/Skills/Level150Effect.h, Source/Contents/Effects/Skills/Level99Effect.h, Source/Contents/Effects/Skills/Level99Orb1Effect.h, Source/Contents/Effects/Skills/Level99Orb2Effect.h, Source/Contents/Effects/Skills/LightSphereEffect.h, Source/Contents/Effects/Skills/MagicFloorEffect.h, Source/Contents/Effects/Skills/MagnumBreak.h, Source/Contents/Effects/Skills/MandraAttackEffect.h, Source/Contents/Effects/Skills/MapChainEffect.h, Source/Contents/Effects/Skills/MapMagicZoneEffect.h, Source/Contents/Effects/Skills/MappillarEffect.h, Source/Contents/Effects/Skills/MonsterSkillEffects.h, Source/Contents/Effects/Skills/NyanggrassEffect.h, Source/Contents/Effects/Skills/PartyMemberEffects.h, Source/Contents/Effects/Skills/PokJukEffect.h, Source/Contents/Effects/Skills/PowderingEffect.h, Source/Contents/Effects/Skills/RainbowEffect.h, Source/Contents/Effects/Skills/RectUpEffect.h, Source/Contents/Effects/Skills/RedLineEffect.h, Source/Contents/Effects/Skills/RichManKim.h, Source/Contents/Effects/Skills/RotateBgEffect.h, Source/Contents/Effects/Skills/RotateItemEffect.h, Source/Contents/Effects/Skills/RotateLineEffect.h, Source/Contents/Effects/Skills/SaintCastingEffect.h, Source/Contents/Effects/Skills/ScatterEffect.h, Source/Contents/Effects/Skills/ShadowExceedEffect.h, Source/Contents/Effects/Skills/SkillEffects.h, Source/Contents/Effects/Skills/SmokeEffect.h, Source/Contents/Effects/Skills/SoulCollectEffect.h, Source/Contents/Effects/Skills/SoulUnityEffect.h, Source/Contents/Effects/Skills/SphereWind2Effect.h, Source/Contents/Effects/Skills/SphereWindEffect.h, Source/Contents/Effects/Skills/StarEffect.h, Source/Contents/Effects/Skills/StarEmperorEffect.h, Source/Contents/Effects/Skills/StealEffect.h, Source/Contents/Effects/Skills/StormCannonEffect.h, Source/Contents/Effects/Skills/StormGustEffect.h, Source/Contents/Effects/Skills/StormKickEffect.h, Source/Contents/Effects/Skills/SunStanceEffect.h, Source/Contents/Effects/Skills/TalismanMarkEffect.h, Source/Contents/Effects/Skills/TetraBallEffect.h, Source/Contents/Effects/Skills/ThrowEffects.h, Source/Contents/Effects/Skills/TriangleShotArrow.h, Source/Contents/Effects/Skills/ViolentQuakeEffect.h, Source/Contents/Effects/Skills/WhirlwindEffect.h, Source/Contents/Effects/Skills/WindEffect.h, Source/Contents/EntryQueue/EntryQueueMgr.h, Source/Contents/Events/CheckAttendanceMgr.h, Source/Contents/Events/RouletteMgr.h, Source/Contents/Events/ShowRankingScheduler.h, Source/Contents/Events/SpecialPopupMgr.h, Source/Contents/Guild/GuildInfo.h, Source/Contents/Guild/GuildMgr.h, Source/Contents/Guild/GuildTip.h, Source/Contents/Items/ClientItemLists.h, Source/Contents/Items/EnchantMgr.h, Source/Contents/Items/ItemDBToIDMgr.h, Source/Contents/Items/JobCodeForItem.h, Source/Contents/Map/FlyingShipRouteInfo.h, Source/Contents/Map/MapInfoMgr.h, Source/Contents/Map/MapPropertyMgr.h, Source/Contents/Map/MapSkyMgr.h, Source/Contents/Map/PrivateAirplaneMgr.h, Source/Contents/Map/TownInfoMgr.h, Source/Contents/Monster/ChampionMonsterMgr.h, Source/Contents/Movement/MovementRouteInterpolation.h, Source/Contents/Movement/TerrainPathSearch.h, Source/Contents/Navigation/NavigationManager.h, Source/Contents/Pet/PetEnums.h, Source/Contents/Pet/PetEvolutionMgr.h, Source/Contents/Quest/RenewQuestMgr.h, Source/Contents/Repute/ReputeMgr.h, Source/Contents/Repute/ReputeRecords.h, Source/Contents/Rodex/RodexMailStore.h, Source/Contents/RuneSystem/RuneSystem.h, Source/Contents/Skills/GraffiSkill.h, Source/Contents/Skin/SkinMgr.h, Source/Contents/Sprites/SpriteLayerDrawing.h, Source/Contents/Sprites/SpriteLayerOrder.h, Source/Contents/Sprites/SpriteRidingOffset.h, Source/Contents/Sprites/SpriteRidingPolicy.h, Source/Contents/Tables/ForbiddenWords.h, Source/Contents/Tables/MessageTable.h, Source/Contents/Tables/SimpleStringMgr.h, Source/Contents/Tables/TableMng.h, Source/Contents/Tables/TipBoxTitles.h, Source/Contents/Tables/TipOfTheDay.h, Source/Contents/Time/ServerTimeManager.h, Source/Contents/World/WorldViewData.h, Source/UI/Guild/UIGuildWnd.h, Source/UI/Lists/UIScrollBarVariants.h, Source/UI/Rodex/UIRodexInboxWnd.h, Source/UI/RuneSystem/UIRuneSystemWindows.h, Source/UI/RuneSystem/UIRuneSystemWnd.h, Source/UI/Text/UIAchWnd.h, Source/UI/UIReputeWnd.h, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UIRoMapWnd.h, Source/Utility/JsonCppLoader.h, Source/Contents/AchievementMgr.h, Source/Contents/ActorNameCard.h, Source/Contents/Actors/GraffiSkill.h, Source/Contents/Actors/PetEnums.h, Source/Contents/AdventureGuideMgr.h, Source/Contents/CashEmotionMgr.h, Source/Contents/ChampionMonsterMgr.h, Source/Contents/CheckAttendanceMgr.h, Source/Contents/ClanInfo.h, Source/Contents/ClientItemLists.h, Source/Contents/Combat/CombatTypes.h, Source/Contents/ConfigMgr.h, Source/Contents/EffectResourceSwitcher.h, Source/Contents/Effects/AMachineEffect.h, Source/Contents/Effects/AcidifiedThrow.h, Source/Contents/Effects/AnimatedEmitterEffect.h, Source/Contents/Effects/ArrowEffect.h, Source/Contents/Effects/AstralStrikeEffect.h, Source/Contents/Effects/AxeBoomerang.h, Source/Contents/Effects/Bash.h, Source/Contents/Effects/BezierArcThrowEffect.h, Source/Contents/Effects/BindTrapEffect.h, Source/Contents/Effects/BlastForge.h, Source/Contents/Effects/CaneOfEvilEyeEffect.h, Source/Contents/Effects/CartCannon.h, Source/Contents/Effects/CellRangeEffect.h, Source/Contents/Effects/ChangeSizeEffect.h, Source/Contents/Effects/CharacterParticleBundle.h, Source/Contents/Effects/ChargingPierceEffect.h, Source/Contents/Effects/CherryBlossomEffect.h, Source/Contents/Effects/ClimaxEffect.h, Source/Contents/Effects/CloudEffect.h, Source/Contents/Effects/CloudKillEffect.h, Source/Contents/Effects/CommonFloorEffect.h, Source/Contents/Effects/Competentia.h, Source/Contents/Effects/CresciveBolt.h, Source/Contents/Effects/DummyEffectLauncher.h, Source/Contents/Effects/EZ2STREffect.h, Source/Contents/Effects/EZ2STREffectEx.h, Source/Contents/Effects/Effect.h, Source/Contents/Effects/EffectActor.h, Source/Contents/Effects/EffectEmitter.h, Source/Contents/Effects/EffectLists.h, Source/Contents/Effects/EffectMaker.h, Source/Contents/Effects/EffectMemoryMgr.h, Source/Contents/Effects/EffectMessageId.h, Source/Contents/Effects/EffectPoint.h, Source/Contents/Effects/EffectPrim.h, Source/Contents/Effects/EffectPrimId.h, Source/Contents/Effects/EffectPrimitiveMotion.h, Source/Contents/Effects/EffectPrimitiveState.h, Source/Contents/Effects/EffectTypes.h, Source/Contents/Effects/ElectricEffect.h, Source/Contents/Effects/EmitterEffect.h, Source/Contents/Effects/EnergyOrbEffect.h, Source/Contents/Effects/EvilLandEffect.h, Source/Contents/Effects/EvilsPawEffect.h, Source/Contents/Effects/FlowerCastingEffect.h, Source/Contents/Effects/FortuneKissEffect.h, Source/Contents/Effects/FriggSongEffect.h, Source/Contents/Effects/FuumaShouakuEffect.h, Source/Contents/Effects/GlassWallEffect.h, Source/Contents/Effects/GravityControlEffect.h, Source/Contents/Effects/HealEffect.h, Source/Contents/Effects/HealSpEffect.h, Source/Contents/Effects/HitLineEffect.h, Source/Contents/Effects/JupitelThunderStormEffect.h, Source/Contents/Effects/Level150Effect.h, Source/Contents/Effects/Level99Effect.h, Source/Contents/Effects/Level99Orb1Effect.h, Source/Contents/Effects/Level99Orb2Effect.h, Source/Contents/Effects/LightSphereEffect.h, Source/Contents/Effects/MagicFloorEffect.h, Source/Contents/Effects/MagnumBreak.h, Source/Contents/Effects/MandraAttackEffect.h, Source/Contents/Effects/MapChainEffect.h, Source/Contents/Effects/MapMagicZoneEffect.h, Source/Contents/Effects/MappillarEffect.h, Source/Contents/Effects/MonsterSkillEffects.h, Source/Contents/Effects/MsgEffect.h, Source/Contents/Effects/NyanggrassEffect.h, Source/Contents/Effects/Particle.h, Source/Contents/Effects/ParticlePool.h, Source/Contents/Effects/PartyMemberEffects.h, Source/Contents/Effects/PokJukEffect.h, Source/Contents/Effects/PowderingEffect.h, Source/Contents/Effects/RagEffect.h, Source/Contents/Effects/RagEffectState.h, Source/Contents/Effects/RainbowEffect.h, Source/Contents/Effects/RectUpEffect.h, Source/Contents/Effects/RedLineEffect.h, Source/Contents/Effects/RichManKim.h, Source/Contents/Effects/RotateBgEffect.h, Source/Contents/Effects/RotateItemEffect.h, Source/Contents/Effects/RotateLineEffect.h, Source/Contents/Effects/SaintCastingEffect.h, Source/Contents/Effects/ScatterEffect.h, Source/Contents/Effects/ShadowExceedEffect.h, Source/Contents/Effects/ShowEffect.h, Source/Contents/Effects/SkillEffects.h, Source/Contents/Effects/SmokeEffect.h, Source/Contents/Effects/SoulCollectEffect.h, Source/Contents/Effects/SoulUnityEffect.h, Source/Contents/Effects/SphereWind2Effect.h, Source/Contents/Effects/SphereWindEffect.h, Source/Contents/Effects/SpriteEffect.h, Source/Contents/Effects/SpriteParticle.h, Source/Contents/Effects/SquareRangeEffect.h, Source/Contents/Effects/StarEffect.h, Source/Contents/Effects/StarEmperorEffect.h, Source/Contents/Effects/StealEffect.h, Source/Contents/Effects/StormCannonEffect.h, Source/Contents/Effects/StormGustEffect.h, Source/Contents/Effects/StormKickEffect.h, Source/Contents/Effects/SunStanceEffect.h, Source/Contents/Effects/TalismanMarkEffect.h, Source/Contents/Effects/TetraBallEffect.h, Source/Contents/Effects/ThrowEffects.h, Source/Contents/Effects/TriangleShotArrow.h, Source/Contents/Effects/ViolentQuakeEffect.h, Source/Contents/Effects/WhirlwindEffect.h, Source/Contents/Effects/WindEffect.h, Source/Contents/EnchantMgr.h, Source/Contents/EntryQueueMgr.h, Source/Contents/EquipmentResourceMgr.h, Source/Contents/FlyingShipRouteInfo.h, Source/Contents/ForbiddenWords.h, Source/Contents/GuildInfo.h, Source/Contents/GuildMgr.h, Source/Contents/GuildTip.h, Source/Contents/ItemDBToIDMgr.h, Source/Contents/Items/RuneSystem.h, Source/Contents/JobCodeForItem.h, Source/Contents/MapInfoMgr.h, Source/Contents/MapPropertyMgr.h, Source/Contents/MapSkyMgr.h, Source/Contents/MessageTable.h, Source/Contents/MovementRouteInterpolation.h, Source/Contents/NavigationManager.h, Source/Contents/PetEvolutionMgr.h, Source/Contents/PlayerNameDictionary.h, Source/Contents/PrivateAirplaneMgr.h, Source/Contents/RDamageVar.h, Source/Contents/RenewQuestMgr.h, Source/Contents/ReputeMgr.h, Source/Contents/ReputeRecords.h, Source/Contents/RodexMailStore.h, Source/Contents/RouletteMgr.h, Source/Contents/ServerTimeManager.h, Source/Contents/ShowRankingScheduler.h, Source/Contents/SimpleStringMgr.h, Source/Contents/SkinMgr.h, Source/Contents/SpecialPopupMgr.h, Source/Contents/SpriteLayerDrawing.h, Source/Contents/SpriteLayerOrder.h, Source/Contents/SpriteRidingOffset.h, Source/Contents/SpriteRidingPolicy.h, Source/Contents/TableMng.h, Source/Contents/TerrainPathSearch.h, Source/Contents/TipBoxTitles.h, Source/Contents/TipOfTheDay.h, Source/Contents/TownInfoMgr.h, Source/Contents/WorldView/WorldViewData.h. Adds to the build: Source/Contents/Achievement/AchievementMgr.cpp, Source/Contents/Actors/ActorGeometry.cpp, Source/Contents/Actors/ActorNameCache.cpp, Source/Contents/Actors/ActorNameCard.cpp, Source/Contents/Actors/ActorNameDirectory.cpp, Source/Contents/Actors/ActorNameRequests.cpp, Source/Contents/Actors/PlayerNameDictionary.cpp, Source/Contents/Actors/Resources/BodyResources.cpp, Source/Contents/Actors/Resources/EquipmentResources.cpp, Source/Contents/Actors/Resources/HeadResources.cpp, Source/Contents/Actors/Resources/MonsterResources.cpp, Source/Contents/Actors/Resources/RobeResources.cpp, Source/Contents/Actors/Resources/StatusIconImages.cpp, Source/Contents/AdventureGuide/AdventureGuideMgr.cpp, Source/Contents/CashEmotion/CashEmotionMgr.cpp, Source/Contents/Clan/ClanInfo.cpp, Source/Contents/Configuration/ConfigMgr.cpp, Source/Contents/Effects/Core/CellRangeEffect.cpp, Source/Contents/Effects/Core/ChangeSizeEffect.cpp, Source/Contents/Effects/Core/DummyEffectLauncher.cpp, Source/Contents/Effects/Core/Effect.cpp, Source/Contents/Effects/Core/EffectActor.cpp, Source/Contents/Effects/Core/EffectAttachments.cpp, Source/Contents/Effects/Core/EffectForceRender.cpp, Source/Contents/Effects/Core/EffectLists.cpp, Source/Contents/Effects/Core/EffectMaker.cpp, Source/Contents/Effects/Core/EffectMemoryMgr.cpp, Source/Contents/Effects/Core/EffectTypes.cpp, Source/Contents/Effects/Core/EffectVisibility.cpp, Source/Contents/Effects/Core/MsgEffect.cpp, Source/Contents/Effects/Core/RagEffect.cpp, Source/Contents/Effects/Core/RagEffectInitialization.cpp, Source/Contents/Effects/Core/ShowEffect.cpp, Source/Contents/Effects/Core/SquareRangeEffect.cpp, Source/Contents/Effects/EffectResourceSwitcher.cpp, Source/Contents/Effects/Particles/AnimatedEmitterEffect.cpp, Source/Contents/Effects/Particles/CharacterParticleBundle.cpp, Source/Contents/Effects/Particles/EZ2STREffect.cpp, Source/Contents/Effects/Particles/EZ2STREffectEx.cpp, Source/Contents/Effects/Particles/EmitterEffect.cpp, Source/Contents/Effects/Particles/Particle.cpp, Source/Contents/Effects/Particles/ParticlePool.cpp, Source/Contents/Effects/Particles/SpriteEffect.cpp, Source/Contents/Effects/Particles/SpriteParticle.cpp, Source/Contents/Effects/Primitives/EffectPrim.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveArcs.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveColor.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveGlowSquares.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveMotion.cpp, Source/Contents/Effects/Primitives/EffectPrimitivePanels.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveRecords.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveRendering.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveSprites.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveState.cpp, Source/Contents/Effects/Primitives/EffectPrimitiveSweeps.cpp, Source/Contents/Effects/RDamageVar.cpp, Source/Contents/Effects/Skills/AMachineEffect.cpp, Source/Contents/Effects/Skills/AcidifiedThrow.cpp, Source/Contents/Effects/Skills/ArrowEffect.cpp, Source/Contents/Effects/Skills/AstralStrikeEffect.cpp, Source/Contents/Effects/Skills/AxeBoomerang.cpp, Source/Contents/Effects/Skills/Bash.cpp, Source/Contents/Effects/Skills/BezierArcThrowEffect.cpp, Source/Contents/Effects/Skills/BindTrapEffect.cpp, Source/Contents/Effects/Skills/BlastForge.cpp, Source/Contents/Effects/Skills/CaneOfEvilEyeEffect.cpp, Source/Contents/Effects/Skills/CartCannon.cpp, Source/Contents/Effects/Skills/ChargingPierceEffect.cpp, Source/Contents/Effects/Skills/CherryBlossomEffect.cpp, Source/Contents/Effects/Skills/ClimaxEffect.cpp, Source/Contents/Effects/Skills/CloudEffect.cpp, Source/Contents/Effects/Skills/CloudKillEffect.cpp, Source/Contents/Effects/Skills/CommonFloorEffect.cpp, Source/Contents/Effects/Skills/Competentia.cpp, Source/Contents/Effects/Skills/CresciveBolt.cpp, Source/Contents/Effects/Skills/ElectricEffect.cpp, Source/Contents/Effects/Skills/EnergyOrbEffect.cpp, Source/Contents/Effects/Skills/EvilLandEffect.cpp, Source/Contents/Effects/Skills/EvilsPawEffect.cpp, Source/Contents/Effects/Skills/FlowerCastingEffect.cpp, Source/Contents/Effects/Skills/FortuneKissEffect.cpp, Source/Contents/Effects/Skills/FriggSongEffect.cpp, Source/Contents/Effects/Skills/FuumaShouakuEffect.cpp, Source/Contents/Effects/Skills/GlassWallEffect.cpp, Source/Contents/Effects/Skills/HealEffect.cpp, Source/Contents/Effects/Skills/HealSpEffect.cpp, Source/Contents/Effects/Skills/HitLineEffect.cpp, Source/Contents/Effects/Skills/JupitelThunderStormEffect.cpp, Source/Contents/Effects/Skills/Level150Effect.cpp, Source/Contents/Effects/Skills/Level99Effect.cpp, Source/Contents/Effects/Skills/Level99Orb1Effect.cpp, Source/Contents/Effects/Skills/Level99Orb2Effect.cpp, Source/Contents/Effects/Skills/LightSphereEffect.cpp, Source/Contents/Effects/Skills/MagicFloorEffect.cpp, Source/Contents/Effects/Skills/MagnumBreak.cpp, Source/Contents/Effects/Skills/MandraAttackEffect.cpp, Source/Contents/Effects/Skills/MapChainEffect.cpp, Source/Contents/Effects/Skills/MapMagicZoneEffect.cpp, Source/Contents/Effects/Skills/MappillarEffect.cpp, Source/Contents/Effects/Skills/MeteorEffect.cpp, Source/Contents/Effects/Skills/MonsterSkillEffects.cpp, Source/Contents/Effects/Skills/NyanggrassEffect.cpp, Source/Contents/Effects/Skills/PartyMemberEffects.cpp, Source/Contents/Effects/Skills/PokJukEffect.cpp, Source/Contents/Effects/Skills/PowderingEffect.cpp, Source/Contents/Effects/Skills/RainbowEffect.cpp, Source/Contents/Effects/Skills/RectUpEffect.cpp, Source/Contents/Effects/Skills/RedLineEffect.cpp, Source/Contents/Effects/Skills/RichManKim.cpp, Source/Contents/Effects/Skills/RotateBgEffect.cpp, Source/Contents/Effects/Skills/RotateItemEffect.cpp, Source/Contents/Effects/Skills/RotateLineEffect.cpp, Source/Contents/Effects/Skills/SaintCastingEffect.cpp, Source/Contents/Effects/Skills/ScatterEffect.cpp, Source/Contents/Effects/Skills/ShadowExceedEffect.cpp, Source/Contents/Effects/Skills/ShadowExceedNewEffect.cpp, Source/Contents/Effects/Skills/SmokeEffect.cpp, Source/Contents/Effects/Skills/SoulCollectEffect.cpp, Source/Contents/Effects/Skills/SoulUnityEffect.cpp, Source/Contents/Effects/Skills/SphereWind2Effect.cpp, Source/Contents/Effects/Skills/SphereWindEffect.cpp, Source/Contents/Effects/Skills/StarEffect.cpp, Source/Contents/Effects/Skills/StarEmperorEffect.cpp, Source/Contents/Effects/Skills/StealEffect.cpp, Source/Contents/Effects/Skills/StormCannonEffect.cpp, Source/Contents/Effects/Skills/StormGustEffect.cpp, Source/Contents/Effects/Skills/StormKickEffect.cpp, Source/Contents/Effects/Skills/SunStanceEffect.cpp, Source/Contents/Effects/Skills/TalismanMarkEffect.cpp, Source/Contents/Effects/Skills/TetraBallEffect.cpp, Source/Contents/Effects/Skills/ThrowEffects.cpp, Source/Contents/Effects/Skills/TriangleShotArrow.cpp, Source/Contents/Effects/Skills/ViolentQuakeEffect.cpp, Source/Contents/Effects/Skills/WindEffect.cpp, Source/Contents/Emblems/EmblemCacheRaw.cpp, Source/Contents/Emblems/GuildEmblemLookup.cpp, Source/Contents/Emblems/GuildEmblemState.cpp, Source/Contents/EntryQueue/EntryQueueMgr.cpp, Source/Contents/Events/CheckAttendanceMgr.cpp, Source/Contents/Events/RouletteMgr.cpp, Source/Contents/Events/ShowRankingScheduler.cpp, Source/Contents/Events/SpecialPopupMgr.cpp, Source/Contents/Guild/GuildInfo.cpp, Source/Contents/Guild/GuildMgr.cpp, Source/Contents/Guild/GuildTip.cpp, Source/Contents/Items/ClientItemLists.cpp, Source/Contents/Items/EnchantMgr.cpp, Source/Contents/Items/ItemDBToIDMgr.cpp, Source/Contents/Items/JobCodeForItem.cpp, Source/Contents/Map/FlyingShipRouteInfo.cpp, Source/Contents/Map/MapInfoMgr.cpp, Source/Contents/Map/MapNameTable.cpp, Source/Contents/Map/MapPropertyMgr.cpp, Source/Contents/Map/MapSkyMgr.cpp, Source/Contents/Map/PrivateAirplaneMgr.cpp, Source/Contents/Map/TownInfoMgr.cpp, Source/Contents/Models/ModelKeyframes.cpp, Source/Contents/Monster/ChampionMonsterMgr.cpp, Source/Contents/Monster/EnemyMonsterTalk.cpp, Source/Contents/Monster/MonsterSpeech.cpp, Source/Contents/Monster/MonsterXmlActions.cpp, Source/Contents/Movement/ActorMovementRoute.cpp, Source/Contents/Movement/MovementRoute.cpp, Source/Contents/Movement/MovementRouteInterpolation.cpp, Source/Contents/Movement/MovementTraversal.cpp, Source/Contents/Movement/Pathfinding.cpp, Source/Contents/Movement/TerrainPathSearch.cpp, Source/Contents/Navigation/NavigationCandidates.cpp, Source/Contents/Navigation/NavigationDestinations.cpp, Source/Contents/Navigation/NavigationGraph.cpp, Source/Contents/Navigation/NavigationLink.cpp, Source/Contents/Navigation/NavigationRequest.cpp, Source/Contents/Navigation/NavigationRoute.cpp, Source/Contents/Navigation/NavigationSource.cpp, Source/Contents/Navigation/NpcLocationRadius.cpp, Source/Contents/Navigation/WorldNavigation.cpp, Source/Contents/Pet/PetEvolutionMgr.cpp, Source/Contents/Pet/PetStatus.cpp, Source/Contents/Pet/PetStrings.cpp, Source/Contents/Pet/PetTalk.cpp, Source/Contents/Pet/PetTalkNames.cpp, Source/Contents/Quest/RenewQuestMgr.cpp, Source/Contents/Repute/ReputeMgr.cpp, Source/Contents/Rodex/RodexMailStore.cpp, Source/Contents/RuneSystem/RuneSystem.cpp, Source/Contents/Skills/GraffiSkill.cpp, Source/Contents/Skin/SkinCatalog.cpp, Source/Contents/Skin/SkinInfo.cpp, Source/Contents/Skin/SkinMgr.cpp, Source/Contents/Sound/HitSounds.cpp, Source/Contents/Sprites/RobeOpacity.cpp, Source/Contents/Sprites/RobeTopLayer.cpp, Source/Contents/Sprites/SpriteFrameSynchronization.cpp, Source/Contents/Sprites/SpriteJob.cpp, Source/Contents/Sprites/SpriteLayerDepth.cpp, Source/Contents/Sprites/SpriteLayerDrawing.cpp, Source/Contents/Sprites/SpriteLayerOrder.cpp, Source/Contents/Sprites/SpriteRidingOffset.cpp, Source/Contents/Sprites/SpriteRidingPolicy.cpp, Source/Contents/Sprites/SpriteRobe.cpp, Source/Contents/Sprites/SpriteRobeCommands.cpp, Source/Contents/Sprites/SpriteShadow.cpp, Source/Contents/Tables/ClientXmlTables.cpp, Source/Contents/Tables/ForbiddenWords.cpp, Source/Contents/Tables/MessageTable.cpp, Source/Contents/Tables/SimpleStringMgr.cpp, Source/Contents/Tables/TableMng.cpp, Source/Contents/Tables/TipBoxTitles.cpp, Source/Contents/Tables/TipOfTheDay.cpp, Source/Contents/Time/ClientTiming.cpp, Source/Contents/Time/ServerTimeManager.cpp, Source/Contents/World/WorldViewData.cpp Deletes: Source/Contents/AchievementMgr.cpp, Source/Contents/AchievementMgr.h, Source/Contents/ActorGeometry.cpp, Source/Contents/ActorMovementRoute.cpp, Source/Contents/ActorNameCache.cpp, Source/Contents/ActorNameCard.cpp, Source/Contents/ActorNameCard.h, Source/Contents/ActorNameDirectory.cpp, Source/Contents/ActorNameRequests.cpp, Source/Contents/Actors/GraffiSkill.cpp, Source/Contents/Actors/GraffiSkill.h, Source/Contents/Actors/PetEnums.h, Source/Contents/AdventureGuideMgr.cpp, Source/Contents/AdventureGuideMgr.h, Source/Contents/BodyResources.cpp, Source/Contents/CashEmotionMgr.cpp, Source/Contents/CashEmotionMgr.h, Source/Contents/ChampionMonsterMgr.cpp, Source/Contents/ChampionMonsterMgr.h, Source/Contents/CheckAttendanceMgr.cpp, Source/Contents/CheckAttendanceMgr.h, Source/Contents/ClanInfo.cpp, Source/Contents/ClanInfo.h, Source/Contents/ClientItemLists.cpp, Source/Contents/ClientItemLists.h, Source/Contents/ClientTiming.cpp, Source/Contents/ClientXmlTables.cpp, Source/Contents/Combat/CombatTypes.h, Source/Contents/ConfigMgr.cpp, Source/Contents/ConfigMgr.h, Source/Contents/EffectResourceSwitcher.cpp, Source/Contents/EffectResourceSwitcher.h, Source/Contents/Effects/AMachineEffect.cpp, Source/Contents/Effects/AMachineEffect.h, Source/Contents/Effects/AcidifiedThrow.cpp, Source/Contents/Effects/AcidifiedThrow.h, Source/Contents/Effects/AnimatedEmitterEffect.cpp, Source/Contents/Effects/AnimatedEmitterEffect.h, Source/Contents/Effects/ArrowEffect.cpp, Source/Contents/Effects/ArrowEffect.h, Source/Contents/Effects/AstralStrikeEffect.cpp, Source/Contents/Effects/AstralStrikeEffect.h, Source/Contents/Effects/AxeBoomerang.cpp, Source/Contents/Effects/AxeBoomerang.h, Source/Contents/Effects/Bash.cpp, Source/Contents/Effects/Bash.h, Source/Contents/Effects/BezierArcThrowEffect.cpp, Source/Contents/Effects/BezierArcThrowEffect.h, Source/Contents/Effects/BindTrapEffect.cpp, Source/Contents/Effects/BindTrapEffect.h, Source/Contents/Effects/BlastForge.cpp, Source/Contents/Effects/BlastForge.h, Source/Contents/Effects/CaneOfEvilEyeEffect.cpp, Source/Contents/Effects/CaneOfEvilEyeEffect.h, Source/Contents/Effects/CartCannon.cpp, Source/Contents/Effects/CartCannon.h, Source/Contents/Effects/CellRangeEffect.cpp, Source/Contents/Effects/CellRangeEffect.h, Source/Contents/Effects/ChangeSizeEffect.cpp, Source/Contents/Effects/ChangeSizeEffect.h, Source/Contents/Effects/CharacterParticleBundle.cpp, Source/Contents/Effects/CharacterParticleBundle.h, Source/Contents/Effects/ChargingPierceEffect.cpp, Source/Contents/Effects/ChargingPierceEffect.h, Source/Contents/Effects/CherryBlossomEffect.cpp, Source/Contents/Effects/CherryBlossomEffect.h, Source/Contents/Effects/ClimaxEffect.cpp, Source/Contents/Effects/ClimaxEffect.h, Source/Contents/Effects/CloudEffect.cpp, Source/Contents/Effects/CloudEffect.h, Source/Contents/Effects/CloudKillEffect.cpp, Source/Contents/Effects/CloudKillEffect.h, Source/Contents/Effects/CommonFloorEffect.cpp, Source/Contents/Effects/CommonFloorEffect.h, Source/Contents/Effects/Competentia.cpp, Source/Contents/Effects/Competentia.h, Source/Contents/Effects/CresciveBolt.cpp, Source/Contents/Effects/CresciveBolt.h, Source/Contents/Effects/DummyEffectLauncher.cpp, Source/Contents/Effects/DummyEffectLauncher.h, Source/Contents/Effects/EZ2STREffect.cpp, Source/Contents/Effects/EZ2STREffect.h, Source/Contents/Effects/EZ2STREffectEx.cpp, Source/Contents/Effects/EZ2STREffectEx.h, Source/Contents/Effects/Effect.cpp, Source/Contents/Effects/Effect.h, Source/Contents/Effects/EffectActor.cpp, Source/Contents/Effects/EffectActor.h, Source/Contents/Effects/EffectAttachments.cpp, Source/Contents/Effects/EffectEmitter.h, Source/Contents/Effects/EffectForceRender.cpp, Source/Contents/Effects/EffectLists.cpp, Source/Contents/Effects/EffectLists.h, Source/Contents/Effects/EffectMaker.cpp, Source/Contents/Effects/EffectMaker.h, Source/Contents/Effects/EffectMemoryMgr.cpp, Source/Contents/Effects/EffectMemoryMgr.h, Source/Contents/Effects/EffectMessageId.h, Source/Contents/Effects/EffectPoint.h, Source/Contents/Effects/EffectPrim.cpp, Source/Contents/Effects/EffectPrim.h, Source/Contents/Effects/EffectPrimId.h, Source/Contents/Effects/EffectPrimitiveArcs.cpp, Source/Contents/Effects/EffectPrimitiveColor.cpp, Source/Contents/Effects/EffectPrimitiveGlowSquares.cpp, Source/Contents/Effects/EffectPrimitiveMotion.cpp, Source/Contents/Effects/EffectPrimitiveMotion.h, Source/Contents/Effects/EffectPrimitivePanels.cpp, Source/Contents/Effects/EffectPrimitiveRecords.cpp, Source/Contents/Effects/EffectPrimitiveRendering.cpp, Source/Contents/Effects/EffectPrimitiveSprites.cpp, Source/Contents/Effects/EffectPrimitiveState.cpp, Source/Contents/Effects/EffectPrimitiveState.h, Source/Contents/Effects/EffectPrimitiveSweeps.cpp, Source/Contents/Effects/EffectTypes.cpp, Source/Contents/Effects/EffectTypes.h, Source/Contents/Effects/EffectVisibility.cpp, Source/Contents/Effects/ElectricEffect.cpp, Source/Contents/Effects/ElectricEffect.h, Source/Contents/Effects/EmitterEffect.cpp, Source/Contents/Effects/EmitterEffect.h, Source/Contents/Effects/EnergyOrbEffect.cpp, Source/Contents/Effects/EnergyOrbEffect.h, Source/Contents/Effects/EvilLandEffect.cpp, Source/Contents/Effects/EvilLandEffect.h, Source/Contents/Effects/EvilsPawEffect.cpp, Source/Contents/Effects/EvilsPawEffect.h, Source/Contents/Effects/FlowerCastingEffect.cpp, Source/Contents/Effects/FlowerCastingEffect.h, Source/Contents/Effects/FortuneKissEffect.cpp, Source/Contents/Effects/FortuneKissEffect.h, Source/Contents/Effects/FriggSongEffect.cpp, Source/Contents/Effects/FriggSongEffect.h, Source/Contents/Effects/FuumaShouakuEffect.cpp, Source/Contents/Effects/FuumaShouakuEffect.h, Source/Contents/Effects/GlassWallEffect.cpp, Source/Contents/Effects/GlassWallEffect.h, Source/Contents/Effects/GravityControlEffect.h, Source/Contents/Effects/HealEffect.cpp, Source/Contents/Effects/HealEffect.h, Source/Contents/Effects/HealSpEffect.cpp, Source/Contents/Effects/HealSpEffect.h, Source/Contents/Effects/HitLineEffect.cpp, Source/Contents/Effects/HitLineEffect.h, Source/Contents/Effects/JupitelThunderStormEffect.cpp, Source/Contents/Effects/JupitelThunderStormEffect.h, Source/Contents/Effects/Level150Effect.cpp, Source/Contents/Effects/Level150Effect.h, Source/Contents/Effects/Level99Effect.cpp, Source/Contents/Effects/Level99Effect.h, Source/Contents/Effects/Level99Orb1Effect.cpp, Source/Contents/Effects/Level99Orb1Effect.h, Source/Contents/Effects/Level99Orb2Effect.cpp, Source/Contents/Effects/Level99Orb2Effect.h, Source/Contents/Effects/LightSphereEffect.cpp, Source/Contents/Effects/LightSphereEffect.h, Source/Contents/Effects/MagicFloorEffect.cpp, Source/Contents/Effects/MagicFloorEffect.h, Source/Contents/Effects/MagnumBreak.cpp, Source/Contents/Effects/MagnumBreak.h, Source/Contents/Effects/MandraAttackEffect.cpp, Source/Contents/Effects/MandraAttackEffect.h, Source/Contents/Effects/MapChainEffect.cpp, Source/Contents/Effects/MapChainEffect.h, Source/Contents/Effects/MapMagicZoneEffect.cpp, Source/Contents/Effects/MapMagicZoneEffect.h, Source/Contents/Effects/MappillarEffect.cpp, Source/Contents/Effects/MappillarEffect.h, Source/Contents/Effects/MeteorEffect.cpp, Source/Contents/Effects/MonsterSkillEffects.cpp, Source/Contents/Effects/MonsterSkillEffects.h, Source/Contents/Effects/MsgEffect.cpp, Source/Contents/Effects/MsgEffect.h, Source/Contents/Effects/NyanggrassEffect.cpp, Source/Contents/Effects/NyanggrassEffect.h, Source/Contents/Effects/Particle.cpp, Source/Contents/Effects/Particle.h, Source/Contents/Effects/ParticlePool.cpp, Source/Contents/Effects/ParticlePool.h, Source/Contents/Effects/PartyMemberEffects.cpp, Source/Contents/Effects/PartyMemberEffects.h, Source/Contents/Effects/PokJukEffect.cpp, Source/Contents/Effects/PokJukEffect.h, Source/Contents/Effects/PowderingEffect.cpp, Source/Contents/Effects/PowderingEffect.h, Source/Contents/Effects/RagEffect.cpp, Source/Contents/Effects/RagEffect.h, Source/Contents/Effects/RagEffectInitialization.cpp, Source/Contents/Effects/RagEffectState.h, Source/Contents/Effects/RainbowEffect.cpp, Source/Contents/Effects/RainbowEffect.h, Source/Contents/Effects/RectUpEffect.cpp, Source/Contents/Effects/RectUpEffect.h, Source/Contents/Effects/RedLineEffect.cpp, Source/Contents/Effects/RedLineEffect.h, Source/Contents/Effects/RichManKim.cpp, Source/Contents/Effects/RichManKim.h, Source/Contents/Effects/RotateBgEffect.cpp, Source/Contents/Effects/RotateBgEffect.h, Source/Contents/Effects/RotateItemEffect.cpp, Source/Contents/Effects/RotateItemEffect.h, Source/Contents/Effects/RotateLineEffect.cpp, Source/Contents/Effects/RotateLineEffect.h, Source/Contents/Effects/SaintCastingEffect.cpp, Source/Contents/Effects/SaintCastingEffect.h, Source/Contents/Effects/ScatterEffect.cpp, Source/Contents/Effects/ScatterEffect.h, Source/Contents/Effects/ShadowExceedEffect.cpp, Source/Contents/Effects/ShadowExceedEffect.h, Source/Contents/Effects/ShadowExceedNewEffect.cpp, Source/Contents/Effects/ShowEffect.cpp, Source/Contents/Effects/ShowEffect.h, Source/Contents/Effects/SkillEffects.h, Source/Contents/Effects/SmokeEffect.cpp, Source/Contents/Effects/SmokeEffect.h, Source/Contents/Effects/SoulCollectEffect.cpp, Source/Contents/Effects/SoulCollectEffect.h, Source/Contents/Effects/SoulUnityEffect.cpp, Source/Contents/Effects/SoulUnityEffect.h, Source/Contents/Effects/SphereWind2Effect.cpp, Source/Contents/Effects/SphereWind2Effect.h, Source/Contents/Effects/SphereWindEffect.cpp, Source/Contents/Effects/SphereWindEffect.h, Source/Contents/Effects/SpriteEffect.cpp, Source/Contents/Effects/SpriteEffect.h, Source/Contents/Effects/SpriteParticle.cpp, Source/Contents/Effects/SpriteParticle.h, Source/Contents/Effects/SquareRangeEffect.cpp, Source/Contents/Effects/SquareRangeEffect.h, Source/Contents/Effects/StarEffect.cpp, Source/Contents/Effects/StarEffect.h, Source/Contents/Effects/StarEmperorEffect.cpp, Source/Contents/Effects/StarEmperorEffect.h, Source/Contents/Effects/StealEffect.cpp, Source/Contents/Effects/StealEffect.h, Source/Contents/Effects/StormCannonEffect.cpp, Source/Contents/Effects/StormCannonEffect.h, Source/Contents/Effects/StormGustEffect.cpp, Source/Contents/Effects/StormGustEffect.h, Source/Contents/Effects/StormKickEffect.cpp, Source/Contents/Effects/StormKickEffect.h, Source/Contents/Effects/SunStanceEffect.cpp, Source/Contents/Effects/SunStanceEffect.h, Source/Contents/Effects/TalismanMarkEffect.cpp, Source/Contents/Effects/TalismanMarkEffect.h, Source/Contents/Effects/TetraBallEffect.cpp, Source/Contents/Effects/TetraBallEffect.h, Source/Contents/Effects/ThrowEffects.cpp, Source/Contents/Effects/ThrowEffects.h, Source/Contents/Effects/TriangleShotArrow.cpp, Source/Contents/Effects/TriangleShotArrow.h, Source/Contents/Effects/ViolentQuakeEffect.cpp, Source/Contents/Effects/ViolentQuakeEffect.h, Source/Contents/Effects/WhirlwindEffect.h, Source/Contents/Effects/WindEffect.cpp, Source/Contents/Effects/WindEffect.h, Source/Contents/EmblemCacheRaw.cpp, Source/Contents/EnchantMgr.cpp, Source/Contents/EnchantMgr.h, Source/Contents/EnemyMonsterTalk.cpp, Source/Contents/EntryQueueMgr.cpp, Source/Contents/EntryQueueMgr.h, Source/Contents/EquipmentResourceMgr.h, Source/Contents/EquipmentResources.cpp, Source/Contents/FlyingShipRouteInfo.cpp, Source/Contents/FlyingShipRouteInfo.h, Source/Contents/ForbiddenWords.cpp, Source/Contents/ForbiddenWords.h, Source/Contents/GuildEmblemLookup.cpp, Source/Contents/GuildEmblemState.cpp, Source/Contents/GuildInfo.cpp, Source/Contents/GuildInfo.h, Source/Contents/GuildMgr.cpp, Source/Contents/GuildMgr.h, Source/Contents/GuildTip.cpp, Source/Contents/GuildTip.h, Source/Contents/HeadResources.cpp, Source/Contents/HitSounds.cpp, Source/Contents/ItemDBToIDMgr.cpp, Source/Contents/ItemDBToIDMgr.h, Source/Contents/Items/RuneSystem.cpp, Source/Contents/Items/RuneSystem.h, Source/Contents/JobCodeForItem.cpp, Source/Contents/JobCodeForItem.h, Source/Contents/MapInfoMgr.cpp, Source/Contents/MapInfoMgr.h, Source/Contents/MapNameTable.cpp, Source/Contents/MapPropertyMgr.cpp, Source/Contents/MapPropertyMgr.h, Source/Contents/MapSkyMgr.cpp, Source/Contents/MapSkyMgr.h, Source/Contents/MessageTable.cpp, Source/Contents/MessageTable.h, Source/Contents/ModelKeyframes.cpp, Source/Contents/MonsterResources.cpp, Source/Contents/MonsterSpeech.cpp, Source/Contents/MonsterXmlActions.cpp, Source/Contents/MovementRoute.cpp, Source/Contents/MovementRouteInterpolation.cpp, Source/Contents/MovementRouteInterpolation.h, Source/Contents/MovementTraversal.cpp, Source/Contents/NavigationCandidates.cpp, Source/Contents/NavigationDestinations.cpp, Source/Contents/NavigationGraph.cpp, Source/Contents/NavigationLink.cpp, Source/Contents/NavigationManager.h, Source/Contents/NavigationRequest.cpp, Source/Contents/NavigationRoute.cpp, Source/Contents/NavigationSource.cpp, Source/Contents/NpcLocationRadius.cpp, Source/Contents/Pathfinding.cpp, Source/Contents/PetEvolutionMgr.cpp, Source/Contents/PetEvolutionMgr.h, Source/Contents/PetStatus.cpp, Source/Contents/PetStrings.cpp, Source/Contents/PetTalk.cpp, Source/Contents/PetTalkNames.cpp, Source/Contents/PlayerNameDictionary.cpp, Source/Contents/PlayerNameDictionary.h, Source/Contents/PrivateAirplaneMgr.cpp, Source/Contents/PrivateAirplaneMgr.h, Source/Contents/RDamageVar.cpp, Source/Contents/RDamageVar.h, Source/Contents/RenewQuestMgr.cpp, Source/Contents/RenewQuestMgr.h, Source/Contents/ReputeMgr.cpp, Source/Contents/ReputeMgr.h, Source/Contents/ReputeRecords.h, Source/Contents/RobeOpacity.cpp, Source/Contents/RobeResources.cpp, Source/Contents/RobeTopLayer.cpp, Source/Contents/RodexMailStore.cpp, Source/Contents/RodexMailStore.h, Source/Contents/RouletteMgr.cpp, Source/Contents/RouletteMgr.h, Source/Contents/ServerTimeManager.cpp, Source/Contents/ServerTimeManager.h, Source/Contents/ShowRankingScheduler.cpp, Source/Contents/ShowRankingScheduler.h, Source/Contents/SimpleStringMgr.cpp, Source/Contents/SimpleStringMgr.h, Source/Contents/SkinCatalog.cpp, Source/Contents/SkinInfo.cpp, Source/Contents/SkinMgr.cpp, Source/Contents/SkinMgr.h, Source/Contents/SpecialPopupMgr.cpp, Source/Contents/SpecialPopupMgr.h, Source/Contents/SpriteFrameSynchronization.cpp, Source/Contents/SpriteJob.cpp, Source/Contents/SpriteLayerDepth.cpp, Source/Contents/SpriteLayerDrawing.cpp, Source/Contents/SpriteLayerDrawing.h, Source/Contents/SpriteLayerOrder.cpp, Source/Contents/SpriteLayerOrder.h, Source/Contents/SpriteRidingOffset.cpp, Source/Contents/SpriteRidingOffset.h, Source/Contents/SpriteRidingPolicy.cpp, Source/Contents/SpriteRidingPolicy.h, Source/Contents/SpriteRobe.cpp, Source/Contents/SpriteRobeCommands.cpp, Source/Contents/SpriteShadow.cpp, Source/Contents/StatusIconImages.cpp, Source/Contents/TableMng.cpp, Source/Contents/TableMng.h, Source/Contents/TerrainPathSearch.cpp, Source/Contents/TerrainPathSearch.h, Source/Contents/TipBoxTitles.cpp, Source/Contents/TipBoxTitles.h, Source/Contents/TipOfTheDay.cpp, Source/Contents/TipOfTheDay.h, Source/Contents/TownInfoMgr.cpp, Source/Contents/TownInfoMgr.h, Source/Contents/WorldNavigation.cpp, Source/Contents/WorldView/WorldViewData.cpp, Source/Contents/WorldView/WorldViewData.h
1211 lines
36 KiB
C++
1211 lines
36 KiB
C++
#include "UI/Window/UIEnums.h"
|
|
#include "Client/Mode/ModeMessage.h"
|
|
#include "Contents/Actors/GameActor.h"
|
|
#include "Contents/Actors/ActorEnums.h"
|
|
#include "Contents/Jobs/JobId.h"
|
|
#include "Contents/Skills/SkillId.h"
|
|
|
|
#include "Client/Mode/CGameMode.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "Client/Session.h"
|
|
#include "Contents/Actors/ActorNameCard.h"
|
|
#include "Contents/Actors/ActorStateFlags.h"
|
|
#include "Contents/Actors/GroundScope.h"
|
|
#include "Contents/Actors/MercenaryAI.h"
|
|
#include "Contents/Actors/Pc.h"
|
|
#include "Contents/Configuration/ServiceOptions.h"
|
|
#include "Contents/Jobs/JobInheritance.h"
|
|
#include "Contents/Effects/Core/EffectTypes.h"
|
|
#include "Contents/Ground/TerrainHeight.h"
|
|
#include "Contents/Map/MapSkyMgr.h"
|
|
#include "Contents/Tables/MessageTable.h"
|
|
#include "Contents/World/World.h"
|
|
#include "Utility/Math/AffineMatrix.h"
|
|
#include "Render/Renderer.h"
|
|
#include "Resource/Sprites/ActionResource.h"
|
|
#include "Resource/World/TerrainResource.h"
|
|
#include "UI/Gauges/UIPcGage.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
#include "Contents/Effects/Core/RagEffect.h"
|
|
#include "Resource/MSGSTRINGID.h"
|
|
#include <cmath>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <windows.h>
|
|
#include <timeapi.h>
|
|
|
|
// INLINED
|
|
static vector3d& operator+=(vector3d& target, const vector3d& offset) {
|
|
target.x += offset.x;
|
|
target.y += offset.y;
|
|
target.z += offset.z;
|
|
return target;
|
|
}
|
|
|
|
// OFFSET: 0x00CB1930
|
|
// FUNCTION: fn_21099
|
|
void CGameActor::ProcessDamageMessages() {
|
|
for (auto it = this->willBeAttackedList.begin(); it != this->willBeAttackedList.end();) {
|
|
if (timeGetTime() < it->time) {
|
|
++it;
|
|
continue;
|
|
}
|
|
|
|
if (it->damage > 0) {
|
|
const std::uint32_t targetAid = it->targetAid;
|
|
const std::uint32_t attackerAid = it->attackerAid;
|
|
char partyNotice[500];
|
|
char notice[500];
|
|
notice[0] = '\0';
|
|
partyNotice[0] = '\0';
|
|
|
|
std::string targetName = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->ActorName(targetAid);
|
|
std::string attackerName = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->ActorName(attackerAid);
|
|
|
|
std::size_t position = targetName.find('#');
|
|
if (position != std::string::npos) {
|
|
targetName.resize(position);
|
|
}
|
|
|
|
position = attackerName.find('#');
|
|
if (position != std::string::npos) {
|
|
attackerName.resize(position);
|
|
}
|
|
|
|
if (targetName.empty()) {
|
|
const CActorNameCard& card = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->LookupNameCard(targetAid);
|
|
targetName.assign(card.displayName.empty() ? std::string(LookupMessage(MSI_WHO_IS)) : card.displayName);
|
|
}
|
|
|
|
if (attackerName.empty()) {
|
|
const CActorNameCard& card = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->LookupNameCard(attackerAid);
|
|
attackerName.assign(card.displayName.empty() ? std::string(LookupMessage(MSI_WHO_IS)) : card.displayName);
|
|
}
|
|
|
|
if (IsPlayerJob(this->GetEffectiveJob(-1))) {
|
|
if (g_session.m_aid == targetAid) {
|
|
std::sprintf(notice, LookupMessage(MSI_I_RECEIVED_DAMAGE), attackerName.c_str(), it->damage);
|
|
} else if (g_session.IsPartyMember(targetAid, true)) {
|
|
std::sprintf(partyNotice, LookupMessage(MSI_PARTY_RECEIVED_DAMAGE), targetName.c_str(), attackerName.c_str(), it->damage);
|
|
}
|
|
} else {
|
|
if (g_session.m_aid == attackerAid) {
|
|
std::sprintf(notice, LookupMessage(MSI_I_GAVE_DAMAGE), targetName.c_str(), it->damage);
|
|
} else if (g_session.IsPartyMember(attackerAid, true)) {
|
|
std::sprintf(partyNotice, LookupMessage(MSI_PARTY_GAVE_DAMAGE), attackerName.c_str(), targetName.c_str(), it->damage);
|
|
}
|
|
}
|
|
|
|
if (std::strlen(notice) != 0) {
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(notice), 0xFFFF, 16, 0, 0);
|
|
}
|
|
|
|
if (std::strlen(partyNotice) != 0) {
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(partyNotice), 0xC8C8FF, 17, 0, 0);
|
|
}
|
|
}
|
|
|
|
ActorDamageMessage& message = *it;
|
|
this->SendMsg(
|
|
nullptr, message.action, message.action >> 31, reinterpret_cast<int>(&message.targetAid), 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0);
|
|
it = this->willBeAttackedList.erase(it);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CB2040
|
|
// FUNCTION: fn_21100
|
|
void CGameActor::RegisterPos() {
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
int column;
|
|
int row;
|
|
mode->WorldCell(this->render.position.x, this->render.position.z, column, row);
|
|
mode->SendMsg(MM_ADDREGISTERPOS, this->render.accountId, column, row, 0);
|
|
}
|
|
|
|
// OFFSET: 0x00CB0FD0
|
|
// FUNCTION: fn_21097
|
|
#pragma auto_inline(off)
|
|
bool CGameActor::ProcessState() {
|
|
if (static_cast<std::uint32_t>(this->freezeEndTick) > 0 && timeGetTime() > static_cast<std::uint32_t>(this->freezeEndTick)) {
|
|
this->render.isMotionFreezed = false;
|
|
this->freezeEndTick = 0;
|
|
}
|
|
|
|
if (static_cast<std::uint32_t>(this->vanishTime) > 0) {
|
|
if (timeGetTime() > static_cast<std::uint32_t>(this->vanishTime)) {
|
|
return false;
|
|
}
|
|
const unsigned int alpha = (static_cast<std::uint32_t>(this->vanishTime) - timeGetTime()) >> 1;
|
|
reinterpret_cast<unsigned char*>(&this->render.color)[3] = alpha > 255 ? 255 : static_cast<unsigned char>(alpha);
|
|
}
|
|
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
CWorld* world = mode->scene;
|
|
const std::uint32_t serverTime = g_session.GetServerTime();
|
|
int moved = 0;
|
|
|
|
switch (this->render.state) {
|
|
case ST_AUTOCOUNTER:
|
|
if (this->isCounter == 0) {
|
|
this->isCounter = 1;
|
|
if (g_session.IsPlayerJobId(this->GetEffectiveJob(-1)) != 0) {
|
|
if (IsJobWeaponAllowed(this->GetEffectiveJob(-1), this->sex, this->GetWeapon())) {
|
|
this->SetAction(0x58, 4, 1);
|
|
} else {
|
|
this->SetAction(0x50, 4, 1);
|
|
}
|
|
} else {
|
|
this->SetAction(0x10, 4, 1);
|
|
}
|
|
this->render.isMotionFreezed = true;
|
|
}
|
|
if (timeGetTime() >= this->skillRechargeEndTick) {
|
|
this->isCounter = 0;
|
|
this->render.isMotionFreezed = false;
|
|
this->SetState(0, 1);
|
|
this->SendMsg(nullptr, AM_DELETE_SKILL_RECHARGEGAGE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
this->ProcessMotion();
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_STAND:
|
|
if (this->render.motionType == 1 && this->render.isMotionFinished) {
|
|
this->SetState(0, 1);
|
|
} else if (this->objectType == 7 && this->render.accountId == g_session.petGid && static_cast<std::uint32_t>(this->petEmotionStartTick) > 0 &&
|
|
timeGetTime() > static_cast<std::uint32_t>(this->petEmotionStartTick) + 3000) {
|
|
if (rand() % 100 < 25) {
|
|
const int hungry = g_session.GetPetHungryState(g_session.petHunger);
|
|
const int friendly = g_session.GetPetFriendlyState(g_session.m_petFriendly);
|
|
const int action = g_session.GetPetActionNumber(hungry, friendly, 4);
|
|
const int emotion = g_session.GetPetEmotionNumber(g_session.petJob, 4, hungry);
|
|
mode->SendMsg(MM_PET_ACT, emotion, 0, 0, 0);
|
|
mode->SendMsg(MM_PET_ACT, action, 0, 0, 0);
|
|
}
|
|
this->petEmotionStartTick = 0;
|
|
}
|
|
this->ProcessMotion();
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_MOVE:
|
|
if (this->route.Empty()) {
|
|
break;
|
|
} else {
|
|
const vector3d old = this->render.position;
|
|
const int previousIndex = this->pathStartCell;
|
|
std::uint32_t nextTick;
|
|
float cellX;
|
|
float cellY;
|
|
this->pathStartCell = this->route.NextPoint(serverTime, &nextTick, &cellX, &cellY);
|
|
float destX;
|
|
float destZ;
|
|
mode->CellCenter(static_cast<int>(cellX), static_cast<int>(cellY), destX, destZ);
|
|
int dtNext = static_cast<int>(nextTick) - static_cast<int>(this->lastServerTime);
|
|
int dtNow = static_cast<int>(serverTime) - static_cast<int>(this->lastServerTime);
|
|
if (dtNext < 0) {
|
|
dtNext = 0;
|
|
}
|
|
if (dtNow < 0) {
|
|
dtNow = 0;
|
|
}
|
|
if (dtNext > 0 && dtNow > 0) {
|
|
moved = 1;
|
|
const float ratio = static_cast<float>(dtNow) / static_cast<float>(dtNext);
|
|
this->render.position.x = (destX - old.x) * ratio + old.x;
|
|
this->render.position.z = (destZ - old.z) * ratio + old.z;
|
|
}
|
|
if (this->isNeverAnimation == 0) {
|
|
float angle;
|
|
if (old.x == this->render.position.x && old.z == this->render.position.z) {
|
|
angle = this->render.angle;
|
|
} else {
|
|
angle = (static_cast<float>(std::atan2(static_cast<double>(this->render.position.x - old.x),
|
|
static_cast<double>(-(this->render.position.z - old.z)))) /
|
|
3.141592f) *
|
|
180.0f;
|
|
if (angle >= 360.0f) {
|
|
angle -= 360.0f;
|
|
}
|
|
if (angle < 0.0f) {
|
|
angle += 360.0f;
|
|
}
|
|
this->render.angle = angle;
|
|
}
|
|
this->render.previousAnimation = this->Get8Dir(angle) + this->render.animation;
|
|
}
|
|
const float movedX = this->render.position.x - old.x;
|
|
this->dist += SquareRoot(movedX * movedX + (this->render.position.z - old.z) * (this->render.position.z - old.z));
|
|
if (this->isNeverAnimation == 0) {
|
|
this->ProcessMotionWithDist();
|
|
}
|
|
if (this->pathStartCell != -1 || serverTime < nextTick) {
|
|
if (previousIndex != this->pathStartCell) {
|
|
std::int32_t pointX = 0;
|
|
std::int32_t pointY = 0;
|
|
if (this->route.Point(previousIndex, &pointX, &pointY)) {
|
|
float notifyX = 0.0f;
|
|
float notifyZ = 0.0f;
|
|
mode->CellCenter(pointX, pointY, notifyX, notifyZ);
|
|
this->NotifyCellMove(¬ifyX, ¬ifyZ);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
this->render.position.x = destX;
|
|
this->render.position.z = destZ;
|
|
this->NotifyCellMove(&this->render.position.x, &this->render.position.z);
|
|
this->SetState(0, 1);
|
|
this->isNeverAnimation = 0;
|
|
this->render.isMotionFreezed = false;
|
|
if (this->isAsuraAttack != 0) {
|
|
this->isAsuraAttack = 0;
|
|
this->SetFrameSequence(0x60, 2, 2, 0x60, 2, 1, 3000, 0);
|
|
}
|
|
mode->SetFollowTicks(0, 0);
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
goto applyHeight;
|
|
}
|
|
|
|
case ST_ATTACK:
|
|
case ST_ATTACK2:
|
|
case ST_THROW:
|
|
case 0x34:
|
|
case 0x35:
|
|
case 0x36:
|
|
case 0x38:
|
|
case 0x39:
|
|
case 0x3A:
|
|
case 0x3B:
|
|
this->ProcessMotion();
|
|
if (this->render.isMotionFinished) {
|
|
this->SetState(0, 1);
|
|
}
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_BEGIN_SKILL:
|
|
this->isCounter = 0;
|
|
this->ProcessMotion();
|
|
{
|
|
const int frames = static_cast<int>(this->GetElapsedFrames());
|
|
if (this->hitTargetAid != 0) {
|
|
if (frames % 34 == 0) {
|
|
CRenderObject* target = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->GetGameActorByAID(this->hitTargetAid);
|
|
if (target != nullptr) {
|
|
this->Face(target->render.position.x, target->render.position.z);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_PICKUP:
|
|
case ST_SKILL:
|
|
case ST_AB_SPECIAL:
|
|
this->isCounter = 0;
|
|
this->ProcessMotion();
|
|
if (this->render.isMotionFinished) {
|
|
this->SetState(0, 1);
|
|
}
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_DAMAGE:
|
|
this->isCounter = 0;
|
|
this->ProcessMotion();
|
|
{
|
|
const vector3d old = this->render.position;
|
|
const float deltaX = this->damageDestX - this->render.position.x;
|
|
const float deltaZ = this->damageDestZ - this->render.position.z;
|
|
const unsigned int remaining = this->render.motionStartTime - timeGetTime() + 200;
|
|
const unsigned int elapsed = timeGetTime() - this->lastProcessStateTime;
|
|
if (remaining != 0) {
|
|
moved = 1;
|
|
const float elapsedTime = static_cast<float>(elapsed);
|
|
const float totalTime = static_cast<float>(remaining);
|
|
this->render.position.x = elapsedTime * deltaX / totalTime + old.x;
|
|
this->render.position.z = deltaZ * elapsedTime / totalTime + old.z;
|
|
}
|
|
if (this->render.isMotionFinished) {
|
|
this->render.position.x = this->damageDestX;
|
|
this->render.position.z = this->damageDestZ;
|
|
moved = 1;
|
|
this->SetState(0, 1);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ST_DEAD:
|
|
this->render.frameSequenceActive = 0;
|
|
this->render.animationSequenceActive = 0;
|
|
this->render.timedSequenceActive = 0;
|
|
this->render.isMotionFreezed = false;
|
|
this->isCounter = 0;
|
|
this->ProcessMotion();
|
|
if (this->render.isMotionFinished && this->willBeAttackedList.size() == 0) {
|
|
mode->SendMsg(MM_DELETEREGISTERPOS, static_cast<int>(this->render.accountId), 0, 0, 0);
|
|
const int job = this->GetEffectiveJob(-1);
|
|
if ((job > 31 && job < 1000) || g_session.IsMonsterClass(job) || this->objectType == 9 ||
|
|
g_session.IsCompanionJob(job)) {
|
|
this->MakeCorpse();
|
|
return false;
|
|
}
|
|
}
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
case ST_SLEEP:
|
|
case ST_DANCE:
|
|
case ST_SING:
|
|
case ST_READYSHOT:
|
|
case ST_READYJUMP:
|
|
case ST_LANDJUMP:
|
|
case ST_R_STORM:
|
|
case ST_R_DOWN:
|
|
case ST_R_TURN:
|
|
case ST_R_COUNTER:
|
|
case ST_R_DODGE:
|
|
case ST_A_COUNTER:
|
|
case ST_A_JUMPKICK:
|
|
case ST_THROW2:
|
|
case ST_A_STORM:
|
|
case ST_A_DOWN:
|
|
case ST_A_TURN:
|
|
case ST_SG_DOWN:
|
|
case ST_SG_TURN:
|
|
case ST_NINJASKILL1:
|
|
case ST_NINJASKILL2:
|
|
case ST_NINJAREADY:
|
|
case ST_GUNSKILL1:
|
|
case ST_GUNSKILL2:
|
|
case ST_GUNSKILL3:
|
|
case ST_GUNREADY:
|
|
case ST_GUNREADY2:
|
|
case ST_MADOSKILL:
|
|
case ST_MADOSKILL2:
|
|
case 0x2F:
|
|
case 0x30:
|
|
case 0x31:
|
|
case 0x32:
|
|
case 0x33:
|
|
case 0x37:
|
|
this->isCounter = 0;
|
|
this->ProcessMotion();
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
return true;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->lastServerTime = serverTime;
|
|
if (moved != 0) {
|
|
applyHeight:
|
|
this->render.position.y = world->terrain->Height(this->render.position.x, this->render.position.z);
|
|
this->render.position += this->positionDelta;
|
|
}
|
|
return true;
|
|
}
|
|
#pragma auto_inline(on)
|
|
|
|
// OFFSET: 0x00CA83A0
|
|
// FUNCTION: fn_20988
|
|
CGameActor::CGameActor()
|
|
: accel(), damageNumberCount(0), lastDamage(0), homunMsg(), homunResMsg(), merMsg(), merResMsg(),
|
|
positionDelta(), shapeShift(0), savedShapeShift(0) {
|
|
this->ResetState();
|
|
}
|
|
|
|
// OFFSET: 0x00CAF4F0
|
|
// FUNCTION: fn_21084
|
|
void CGameActor::ResetState() {
|
|
this->statusEffects[11] = 0;
|
|
this->statusEffects[2] = 0;
|
|
this->statusEffects[3] = 0;
|
|
this->statusEffects[1] = 0;
|
|
this->statusEffects[0] = 0;
|
|
this->statusEffects[6] = 0;
|
|
this->statusEffects[4] = 0;
|
|
this->statusEffects[5] = 0;
|
|
this->statusEffects[9] = 0;
|
|
this->statusEffects[7] = 0;
|
|
this->statusEffects[8] = 0;
|
|
this->statusEffects[10] = 0;
|
|
this->statusEffects[12] = 0;
|
|
this->render.position.x = 0.0f;
|
|
this->render.position.y = 0.0f;
|
|
this->render.position.z = 0.0f;
|
|
this->render.angle = 0.0f;
|
|
this->render.animation = 0;
|
|
this->render.previousAnimation = 0;
|
|
this->render.curMotion = 0;
|
|
this->render.state = 0;
|
|
this->render.motionType = 0;
|
|
this->render.speed = 1.0f;
|
|
this->render.visibilityOptions[0] = 1;
|
|
this->accel.x = 0.0f;
|
|
this->accel.y = 0.0f;
|
|
this->accel.z = 0.0f;
|
|
this->dist = 0;
|
|
this->render.accountId = 0xFFFFFFFF;
|
|
this->lastServerTime = g_session.GetServerTime();
|
|
this->lastProcessStateTime = timeGetTime();
|
|
this->render.screenX = 0;
|
|
this->render.screenY = 0;
|
|
this->actorWindows[0] = 0;
|
|
this->actorWindows[1] = 0;
|
|
this->actorWindows[2] = 0;
|
|
this->actorWindows[3] = 0;
|
|
this->chatWidth = 0;
|
|
this->nameWidth = 0;
|
|
this->render.isMotionFinished = false;
|
|
this->hitTargetAid = 0;
|
|
this->attackMotion = -1.0f;
|
|
this->pathStartCell = -1;
|
|
this->render.visibilityOptions[1] = 1;
|
|
this->render.motionStartTime = timeGetTime();
|
|
this->petEmotionStartTick = 0;
|
|
this->skillRechargeEndTick = timeGetTime() - 5000;
|
|
this->skillRechargeStartTick = timeGetTime() - 10000;
|
|
this->effectLaunchCnt = 3600;
|
|
this->render.color = 0xFFFFFFFF;
|
|
this->render.visible = 1;
|
|
this->render.flatDepth = 0;
|
|
this->willBeDead = 0;
|
|
this->bodyState = 0;
|
|
this->stateFlags = 0;
|
|
this->SetRiding(0);
|
|
this->effectState = 0;
|
|
this->healthState = 0;
|
|
this->vanishTime = 0;
|
|
this->levelAuraType = 0;
|
|
this->hasLevelAura = 0;
|
|
this->characterLevel = 0;
|
|
this->isCounter = 0;
|
|
this->isTrickDead = 0;
|
|
this->isPlayHitWave = 0;
|
|
std::memset(this->hitWaveName, 0, sizeof(this->hitWaveName));
|
|
this->guildId = 0;
|
|
this->freezeEndTick = 0;
|
|
this->actorType = 0;
|
|
this->sceneNameWindow = 0;
|
|
this->actorTitleWindow = 0;
|
|
this->isNeverAnimation = 0;
|
|
this->isAsuraAttack = 0;
|
|
this->isBladeStop = 0;
|
|
this->homunAI = 0;
|
|
this->merAI = 0;
|
|
this->objectType = 4;
|
|
this->actorWindows[4] = 0;
|
|
this->transformJobs[0] = -1;
|
|
this->transformJobs[1] = -1;
|
|
this->transformJobs[2] = -1;
|
|
this->monsterTransformJob = -1;
|
|
this->transformPriority = 0;
|
|
this->charmType = 0;
|
|
this->charmCount = 0;
|
|
this->movementState[0] = 0;
|
|
this->movementState[1] = 0;
|
|
this->movementState[2] = 0;
|
|
this->movementState[3] = 0;
|
|
this->movementState[4] = 0;
|
|
this->movementState[5] = 0;
|
|
this->hasHp = 0;
|
|
this->maxHp = 0;
|
|
this->hpGaugeWindow = 0;
|
|
this->hpGaugeFlags = 0;
|
|
this->hasSp = 0;
|
|
this->spGaugeValue = 0;
|
|
this->mountedState = 0;
|
|
this->actorFlags = 0;
|
|
this->emblemVersion = 0;
|
|
this->firstFollowerEffect = 0;
|
|
this->secondFollowerEffect = 0;
|
|
|
|
this->maximumValue = 0;
|
|
}
|
|
|
|
// OFFSET: 0x00CAFF00
|
|
// FUNCTION: fn_21091
|
|
void CGameActor::UpdateGaugePositions() {
|
|
// GLOBAL: gl_24991
|
|
static float s_gaugeOffsetY = static_cast<float>(g_renderer->viewport.height * 81 / 480);
|
|
|
|
if (this->actorWindows[0] != 0) {
|
|
if (timeGetTime() < this->chatTick + 5000) {
|
|
UIWindow* window = reinterpret_cast<UIWindow*>(this->actorWindows[0]);
|
|
int x = this->render.screenX - this->chatWidth / 2;
|
|
if (x < -3) {
|
|
x = -3;
|
|
}
|
|
const int maximumX = g_renderer->viewport.width - window->geometry.width + 3;
|
|
if (x > maximumX) {
|
|
x = maximumX;
|
|
}
|
|
int y = static_cast<int>(
|
|
static_cast<float>(this->render.screenY) - s_gaugeOffsetY * this->render.distanceScale - static_cast<float>(this->chatHeight)
|
|
);
|
|
if (y < -3) {
|
|
y = -3;
|
|
}
|
|
const int maximumY = g_renderer->viewport.height - window->geometry.height + 3;
|
|
if (y > maximumY) {
|
|
y = maximumY;
|
|
}
|
|
window->Move(x, y);
|
|
} else {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[0]));
|
|
this->actorWindows[0] = 0;
|
|
}
|
|
}
|
|
|
|
if (this->actorWindows[1] != 0) {
|
|
reinterpret_cast<UIWindow*>(this->actorWindows[1])->Move(
|
|
this->render.screenX - 70,
|
|
static_cast<int>(static_cast<float>(this->render.screenY) - s_gaugeOffsetY * this->render.distanceScale - 17.0f)
|
|
);
|
|
}
|
|
|
|
if (this->actorWindows[2] != 0) {
|
|
reinterpret_cast<UIWindow*>(this->actorWindows[2])->Move(
|
|
this->render.screenX - 70,
|
|
static_cast<int>(static_cast<float>(this->render.screenY) - s_gaugeOffsetY * this->render.distanceScale - 17.0f - 17.0f)
|
|
);
|
|
}
|
|
|
|
if (this->actorWindows[3] != 0) {
|
|
if (timeGetTime() > this->skillRechargeEndTick) {
|
|
this->SendMsg(nullptr, AM_DELETE_SKILL_RECHARGEGAGE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
if (this->render.state == 8) {
|
|
this->SetState(0, 1);
|
|
}
|
|
} else {
|
|
reinterpret_cast<UIWindow*>(this->actorWindows[3])->Move(
|
|
this->render.screenX - 30,
|
|
static_cast<int>(static_cast<float>(this->render.screenY) - s_gaugeOffsetY * this->render.distanceScale)
|
|
);
|
|
const std::uint32_t total = this->skillRechargeEndTick - this->skillRechargeStartTick;
|
|
std::uint32_t elapsed = timeGetTime() - this->skillRechargeStartTick;
|
|
if (elapsed > total) {
|
|
elapsed = total;
|
|
}
|
|
reinterpret_cast<UIRechargeGage*>(this->actorWindows[3])->SetValues(elapsed, total);
|
|
}
|
|
}
|
|
|
|
if (this->actorWindows[4] != 0) {
|
|
reinterpret_cast<UIWindow*>(this->actorWindows[4])->Move(
|
|
this->render.screenX - 70,
|
|
static_cast<int>(static_cast<float>(this->render.screenY) - s_gaugeOffsetY * this->render.distanceScale - 17.0f - 17.0f)
|
|
);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CA8D70
|
|
// FUNCTION: fn_20994
|
|
CGameActor::~CGameActor() {
|
|
this->ReleaseAttachments();
|
|
}
|
|
|
|
// OFFSET: 0x00CAF260
|
|
// FUNCTION: fn_21079
|
|
void CGameActor::ReleaseAttachments() {
|
|
if (this->homunAI && reinterpret_cast<CMercenaryAI*>(this->homunAI)->state) {
|
|
reinterpret_cast<CMercenaryAI*>(this->homunAI)->Shutdown();
|
|
delete reinterpret_cast<CMercenaryAI*>(this->homunAI);
|
|
this->homunAI = 0;
|
|
}
|
|
|
|
if (this->merAI && reinterpret_cast<CMercenaryAI*>(this->merAI)->state) {
|
|
reinterpret_cast<CMercenaryAI*>(this->merAI)->Shutdown();
|
|
delete reinterpret_cast<CMercenaryAI*>(this->merAI);
|
|
this->merAI = 0;
|
|
}
|
|
|
|
if (this->actorWindows[0]) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[0]));
|
|
this->actorWindows[0] = 0;
|
|
}
|
|
|
|
if (this->actorWindows[1]) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[1]));
|
|
this->actorWindows[1] = 0;
|
|
}
|
|
|
|
if (this->actorWindows[2]) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[2]));
|
|
this->actorWindows[2] = 0;
|
|
}
|
|
|
|
if (this->actorWindows[3]) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[3]));
|
|
this->actorWindows[3] = 0;
|
|
}
|
|
|
|
if (this->actorWindows[4]) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorWindows[4]));
|
|
this->actorWindows[4] = 0;
|
|
}
|
|
|
|
if (this->hpGaugeWindow) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->hpGaugeWindow));
|
|
this->hpGaugeWindow = 0;
|
|
}
|
|
|
|
for (std::list<CGameObject*>::iterator it = this->msgEffectList.begin(); it != this->msgEffectList.end(); ++it) {
|
|
(*it)->SendMsg(nullptr, AM_MSGMASTER_DEAD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
this->msgEffectList.erase(this->msgEffectList.begin(), this->msgEffectList.end());
|
|
|
|
if (g_session.GetSiegeMode() && this->sceneNameWindow) {
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->RemoveNotificationWindow(this->sceneNameWindow);
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->sceneNameWindow));
|
|
this->sceneNameWindow = 0;
|
|
}
|
|
|
|
if (this->actorTitleWindow) {
|
|
g_windowMgr.Schedule(reinterpret_cast<UIWindow*>(this->actorTitleWindow));
|
|
this->actorTitleWindow = 0;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CB0220
|
|
// FUNCTION: fn_21092
|
|
void CGameActor::UpdateStateEffects() {
|
|
if (g_updateTick > 0 && this->render.effectPhaseBytes[0] == 1) {
|
|
this->render.flags = 0;
|
|
this->render.effectPhaseBytes[0] = 0;
|
|
}
|
|
|
|
if (StateFlagsClear(this->stateFlags)) {
|
|
this->effectLaunchCnt = 36000;
|
|
return;
|
|
}
|
|
|
|
const DWORD now = timeGetTime();
|
|
if (StateFlag00(this->stateFlags) && static_cast<unsigned>(this->effectLaunchCnt) >= static_cast<unsigned>(EffectLifetime(22))) {
|
|
this->effectLaunchCnt = 0;
|
|
CRagEffect* effect = this->LaunchEffect(22, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
if (effect) {
|
|
effect->SendMsg(nullptr, AM_SETCOUNT, 0, static_cast<std::int64_t>((static_cast<std::uint64_t>(now) >> 4) % 10 + 1), 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (StateFlag13(this->stateFlags) && static_cast<unsigned>(this->effectLaunchCnt) >= static_cast<unsigned>(EffectLifetime(33))) {
|
|
this->effectLaunchCnt = 0;
|
|
CRagEffect* effect = this->LaunchEffect(33, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
|
|
if (effect) {
|
|
effect->SendMsg(nullptr, AM_SETCOUNT, 0, static_cast<std::int64_t>((static_cast<std::uint64_t>(now) >> 4) % 10 + 1), 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
++this->effectLaunchCnt;
|
|
}
|
|
|
|
// OFFSET: 0x00CB03E0
|
|
// FUNCTION: fn_21093
|
|
void CGameActor::UpdateHpGauge() {
|
|
if (this->hpGaugeWindow == 0) {
|
|
return;
|
|
}
|
|
|
|
if (g_serviceOptions.Get(0xD5) && reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->displayMode != 0 &&
|
|
!StateFlag01(this->stateFlags) && !StateFlag02(this->stateFlags) && !StateFlag06(this->stateFlags) &&
|
|
g_windowMgr.windowVisibilityState != 2) {
|
|
reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->Show(1);
|
|
if (this->render.state == 3 && reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->current != 0) {
|
|
reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->SetValues(0, reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->maximum);
|
|
}
|
|
const int y = static_cast<int>(static_cast<float>(ScaleByScreenHeight(12)) * this->render.distanceScale + static_cast<float>(this->render.screenY));
|
|
reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->Move(
|
|
this->render.screenX - reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->geometry.width / 2, y);
|
|
reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->Invalidate();
|
|
return;
|
|
}
|
|
|
|
reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->Show(0);
|
|
}
|
|
|
|
// OFFSET: 0x00CB0A90
|
|
// FUNCTION: fn_21095
|
|
void CGameActor::ProcessMotionWithDist() {
|
|
const int frames = static_cast<int>(this->render.action->FrameCount(this->render.previousAnimation));
|
|
this->render.curMotion = static_cast<int>(this->dist * 0.37f * 4.0f / this->render.speed) % frames;
|
|
}
|
|
|
|
// OFFSET: 0x00CB18E0
|
|
// FUNCTION: fn_21098
|
|
bool CGameActor::UpdateFadeOut() {
|
|
if (static_cast<std::uint32_t>(this->vanishTime) > 0) {
|
|
if (timeGetTime() > static_cast<std::uint32_t>(this->vanishTime)) {
|
|
return false;
|
|
}
|
|
|
|
const std::uint32_t remaining = (static_cast<std::uint32_t>(this->vanishTime) - timeGetTime()) / 2;
|
|
reinterpret_cast<unsigned char*>(&this->render.color)[3] = static_cast<unsigned char>(remaining > 0xFF ? 0xFF : remaining);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00CACFE0
|
|
// FUNCTION: fn_21050
|
|
int __stdcall MountedJob(int job, std::uint32_t flags) {
|
|
if (job == 0xfd6) {
|
|
if (StateFlag19(flags)) {
|
|
return 0xff0;
|
|
}
|
|
if (StateFlag23(flags)) {
|
|
return 0xff8;
|
|
}
|
|
if (StateFlag24(flags)) {
|
|
return 0xffa;
|
|
}
|
|
if (StateFlag25(flags)) {
|
|
return 0xffc;
|
|
}
|
|
if (StateFlag26(flags)) {
|
|
return 0xffe;
|
|
}
|
|
} else if (job == 0xfdc) {
|
|
if (StateFlag19(flags)) {
|
|
return 0xff1;
|
|
}
|
|
if (StateFlag23(flags)) {
|
|
return 0xff9;
|
|
}
|
|
if (StateFlag24(flags)) {
|
|
return 0xffb;
|
|
}
|
|
if (StateFlag25(flags)) {
|
|
return 0xffd;
|
|
}
|
|
if (StateFlag26(flags)) {
|
|
return 0xfff;
|
|
}
|
|
} else if (job == 0x1000) {
|
|
if (StateFlag19(flags)) {
|
|
return 0x100d;
|
|
}
|
|
} else if (job == 0xfd8) {
|
|
if (StateFlag21(flags)) {
|
|
return 0xff4;
|
|
}
|
|
} else if (job == 0xfde) {
|
|
if (StateFlag21(flags)) {
|
|
return 0xff5;
|
|
}
|
|
} else if (job == 0x1002) {
|
|
if (StateFlag21(flags)) {
|
|
return 0x100f;
|
|
}
|
|
} else if (job == 0xfda) {
|
|
if (StateFlag22(flags)) {
|
|
return 0xff6;
|
|
}
|
|
} else if (job == 0xfe0) {
|
|
if (StateFlag22(flags)) {
|
|
return 0xff7;
|
|
}
|
|
} else if (job == 0x1004) {
|
|
if (StateFlag22(flags)) {
|
|
return 0x1010;
|
|
}
|
|
} else if (job == 0x7) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xd;
|
|
}
|
|
} else if (job == 0xe) {
|
|
if (StateFlag05(flags)) {
|
|
return 0x15;
|
|
}
|
|
} else if (job == 0xfa8) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xfae;
|
|
}
|
|
} else if (job == 0xfbe) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xfc4;
|
|
}
|
|
} else if (job == 0xfaf) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xfb6;
|
|
}
|
|
} else if (job == 0xfc5) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xfcc;
|
|
}
|
|
} else if (job == 0xfe2) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xff2;
|
|
}
|
|
} else if (job == 0xfe9) {
|
|
if (StateFlag05(flags)) {
|
|
return 0xff3;
|
|
}
|
|
} else if (job == 0x1006) {
|
|
if (StateFlag05(flags)) {
|
|
return 0x100e;
|
|
}
|
|
} else if (job == 0xfcf) {
|
|
if (StateFlag15(flags)) {
|
|
return 0xfd0;
|
|
}
|
|
} else if (job == 0x1082) {
|
|
if (StateFlag15(flags)) {
|
|
return 0x108e;
|
|
}
|
|
} else if (job == 0x10a1) {
|
|
if (StateFlag21(flags) == true) {
|
|
return 0x10b6;
|
|
}
|
|
} else if (job == 0x109d) {
|
|
if (StateFlag22(flags) == true) {
|
|
return 0x10b7;
|
|
}
|
|
} else if (job == 0x109c) {
|
|
if (StateFlag19(flags) == true) {
|
|
return 0x10b8;
|
|
}
|
|
} else if (job == 0x10a2) {
|
|
if (StateFlag05(flags) == true) {
|
|
return 0x10b9;
|
|
}
|
|
} else if (job == 0x10ce) {
|
|
if (StateFlag15(flags)) {
|
|
return 0x10dc;
|
|
}
|
|
}
|
|
return job;
|
|
}
|
|
|
|
// OFFSET: 0x00CAD420
|
|
// FUNCTION: fn_21051
|
|
int CGameActor::GetEffectCounter(int effectId) {
|
|
switch (effectId) {
|
|
case HT_BLITZBEAT:
|
|
case SN_FALCONASSAULT:
|
|
case WH_HAWKRUSH:
|
|
case WH_HAWKBOOMERANG:
|
|
case WH_WILD_WALK:
|
|
return this->statusEffects[0];
|
|
}
|
|
switch (effectId) {
|
|
case RA_WUGSTRIKE:
|
|
case RA_WUGBITE:
|
|
return this->statusEffects[1];
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// OFFSET: 0x00CAD4B0
|
|
// FUNCTION: fn_21053
|
|
float CGameActor::GetNameOffset() {
|
|
float scale = 1.0f;
|
|
if ((this->render.flags & 0x10) != 0) {
|
|
const unsigned int angle = this->render.pulsePhases[0] * 4 + 90;
|
|
if (angle > 270) {
|
|
scale = 0.5f;
|
|
} else {
|
|
scale = ((angle >= 90 ? g_sinTable[angle] : g_sinTable[90]) + 1.0f) * 0.25f + g_depthAverageHalf;
|
|
}
|
|
}
|
|
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case JT_CHICKEN:
|
|
case JT_CHICKEN2:
|
|
case JT_CHICKEN_H:
|
|
case JT_CHICKEN2_H:
|
|
case JT_RUNE_CHICKEN:
|
|
case JT_RUNE_CHICKEN_H:
|
|
case JT_ROYAL_CHICKEN:
|
|
case JT_ROYAL_CHICKEN_H:
|
|
case JT_WOLF_RANGER:
|
|
case JT_WOLF_RANGER_H:
|
|
case JT_MADOGEAR:
|
|
case JT_MADOGEAR_H:
|
|
case JT_RUNE_CHICKEN2:
|
|
case JT_RUNE_CHICKEN2_H:
|
|
case JT_RUNE_CHICKEN3:
|
|
case JT_RUNE_CHICKEN3_H:
|
|
case JT_RUNE_CHICKEN4:
|
|
case JT_RUNE_CHICKEN4_H:
|
|
case JT_RUNE_CHICKEN5:
|
|
case JT_RUNE_CHICKEN5_H:
|
|
case JT_WOLF_WINDHAWK:
|
|
case JT_MEISTER_MADOGEAR:
|
|
case JT_DRAGON_KNIGHT_CHICKEN:
|
|
case JT_IMPERIAL_GUARD_CHICKEN:
|
|
return scale * 6.0f;
|
|
case JT_CHICKEN_B:
|
|
case JT_CHICKEN2_B:
|
|
case JT_RUNE_CHICKEN_B:
|
|
case JT_ROYAL_CHICKEN_B:
|
|
case JT_WOLF_RANGER_B:
|
|
case JT_MADOGEAR_B:
|
|
return scale * 4.0f;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (!g_session.IsPlayerJobId(this->GetEffectiveJob(-1)) && !g_session.IsNpcJob(this->GetEffectiveJob(-1)) &&
|
|
this->render.accountId != g_session.m_aid) {
|
|
return 0.0f;
|
|
}
|
|
|
|
if (g_session.IsBabyJob(this->GetEffectiveJob(-1))) {
|
|
if (this->isRiding) {
|
|
return 4.0f;
|
|
}
|
|
return -1.0f;
|
|
}
|
|
|
|
if (g_session.IsDoramJob(this->GetEffectiveJob(-1))) {
|
|
if (this->isRiding) {
|
|
return scale * -3.0f;
|
|
}
|
|
return scale * -2.0f;
|
|
}
|
|
|
|
if (!this->isRiding) {
|
|
return 0.0f;
|
|
}
|
|
|
|
CPc* pc = dynamic_cast<CPc*>(this);
|
|
if (!pc) {
|
|
return scale * 6.0f;
|
|
}
|
|
|
|
switch (static_cast<unsigned int>(pc->appearanceJob)) {
|
|
case JT_GUNSLINGER:
|
|
case JT_REBELLION:
|
|
case JT_NIGHT_WATCH:
|
|
return 0.0f;
|
|
case JT_NOVICE:
|
|
case JT_SUPERNOVICE:
|
|
case JT_NOVICE_H:
|
|
case JT_SUPERNOVICE2:
|
|
case JT_HYPER_NOVICE:
|
|
case JT_DRUID:
|
|
case JT_KARNOS:
|
|
case JT_ALITEA:
|
|
return scale + scale;
|
|
default:
|
|
return scale * 6.0f;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CAD780
|
|
// FUNCTION: fn_21054
|
|
float CGameActor::GetNameHeight() {
|
|
switch (this->GetEffectiveJob(-1)) {
|
|
case JT_CHICKEN:
|
|
case JT_CHICKEN2:
|
|
case JT_CHICKEN_H:
|
|
case JT_CHICKEN2_H:
|
|
case JT_RUNE_CHICKEN:
|
|
case JT_RUNE_CHICKEN_H:
|
|
case JT_ROYAL_CHICKEN:
|
|
case JT_ROYAL_CHICKEN_H:
|
|
case JT_WOLF_RANGER:
|
|
case JT_WOLF_RANGER_H:
|
|
case JT_MADOGEAR:
|
|
case JT_MADOGEAR_H:
|
|
case JT_RUNE_CHICKEN2:
|
|
case JT_RUNE_CHICKEN2_H:
|
|
case JT_RUNE_CHICKEN3:
|
|
case JT_RUNE_CHICKEN3_H:
|
|
case JT_RUNE_CHICKEN4:
|
|
case JT_RUNE_CHICKEN4_H:
|
|
case JT_RUNE_CHICKEN5:
|
|
case JT_RUNE_CHICKEN5_H:
|
|
case JT_WOLF_WINDHAWK:
|
|
case JT_MEISTER_MADOGEAR:
|
|
case JT_DRAGON_KNIGHT_CHICKEN:
|
|
case JT_IMPERIAL_GUARD_CHICKEN:
|
|
return 23.0f;
|
|
case JT_CHICKEN_B:
|
|
case JT_CHICKEN2_B:
|
|
case JT_RUNE_CHICKEN_B:
|
|
case JT_ROYAL_CHICKEN_B:
|
|
case JT_WOLF_RANGER_B:
|
|
case JT_MADOGEAR_B:
|
|
return 19.0f;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (!g_session.IsPlayerJobId(this->GetEffectiveJob(-1)) && !g_session.IsNpcJob(this->GetEffectiveJob(-1)) &&
|
|
this->render.accountId != g_session.m_aid) {
|
|
return 18.0f;
|
|
}
|
|
|
|
if (g_session.IsDoramJob(this->GetEffectiveJob(-1)) || !this->isRiding) {
|
|
return 18.0f;
|
|
}
|
|
|
|
CPc* pc = dynamic_cast<CPc*>(this);
|
|
if (!pc) {
|
|
return 23.0f;
|
|
}
|
|
|
|
switch (static_cast<unsigned int>(pc->appearanceJob)) {
|
|
case JT_GUNSLINGER:
|
|
case JT_REBELLION:
|
|
case JT_NIGHT_WATCH:
|
|
return 18.0f;
|
|
case JT_NOVICE:
|
|
case JT_SUPERNOVICE:
|
|
case JT_NOVICE_H:
|
|
case JT_SUPERNOVICE2:
|
|
case JT_HYPER_NOVICE:
|
|
case JT_DRUID:
|
|
case JT_KARNOS:
|
|
case JT_ALITEA:
|
|
return 19.0f;
|
|
default:
|
|
return 23.0f;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CAD990
|
|
// FUNCTION: fn_21055
|
|
CSprRes* CGameActor::GetSprite() {
|
|
return this->render.sprite;
|
|
}
|
|
|
|
// OFFSET: 0x00CAD9A0
|
|
// FUNCTION: fn_21056
|
|
__declspec(noinline) float CGameActor::GetElapsedFrames() {
|
|
return static_cast<float>(static_cast<double>(timeGetTime() - this->render.motionStartTime) / 24.0);
|
|
}
|
|
|
|
// OFFSET: 0x00CADAF0
|
|
// FUNCTION: fn_21058
|
|
int CGameActor::GetGaugeCurrent() {
|
|
if (this->hpGaugeWindow == 0) {
|
|
return -1;
|
|
}
|
|
return reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->current;
|
|
}
|
|
|
|
// OFFSET: 0x00CADB10
|
|
// FUNCTION: fn_21059
|
|
int CGameActor::GetGaugeMaximum() {
|
|
if (this->hpGaugeWindow == 0) {
|
|
return -1;
|
|
}
|
|
return reinterpret_cast<UIPcGage*>(this->hpGaugeWindow)->maximum;
|
|
}
|
|
|
|
// OFFSET: 0x00CADB30
|
|
// FUNCTION: fn_21060
|
|
void CGameActor::ResetTransformJobs() {
|
|
this->transformJobs[0] = -1;
|
|
this->transformJobs[1] = -1;
|
|
this->transformJobs[2] = -1;
|
|
this->monsterTransformJob = -1;
|
|
this->transformPriority = 0;
|
|
}
|
|
|
|
// OFFSET: 0x00CADC90
|
|
// FUNCTION: fn_21065
|
|
__declspec(noinline) bool CSession::IsMonsterClass(int job) {
|
|
if ((job > 1000 && job < 3999) || static_cast<unsigned int>(job - 20021) <= 11978) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// OFFSET: 0x00CADCC0
|
|
// FUNCTION: fn_21066
|
|
bool CGameActor::HasPendingDamage() {
|
|
return this->willBeAttackedList.size() > 0;
|
|
}
|
|
|
|
// OFFSET: 0x00CADCF0
|
|
// FUNCTION: fn_21067
|
|
bool CGameActor::UpdateMaximumValue(std::int64_t value) {
|
|
bool result = false;
|
|
if (this->maximumValue < value) {
|
|
result = true;
|
|
}
|
|
this->maximumValue = value;
|
|
return result;
|
|
}
|
|
|
|
// OFFSET: 0x00CADD30
|
|
// FUNCTION: fn_21068
|
|
int CGameActor::IsPlayerClass(int job) {
|
|
return IsPlayerJob(job);
|
|
}
|
|
|
|
// OFFSET: 0x00CAE1B0
|
|
// FUNCTION: fn_21072
|
|
void CGameActor::SetStackedEffect(int effectId, bool on) {
|
|
if (on) {
|
|
for (const int id : this->exclusiveEffects) {
|
|
this->ApplyEffectState(id, false);
|
|
}
|
|
this->exclusiveEffects.insert(effectId);
|
|
for (const int id : this->exclusiveEffects) {
|
|
this->ApplyEffectState(id, true);
|
|
}
|
|
} else {
|
|
this->exclusiveEffects.erase(effectId);
|
|
this->ApplyEffectState(effectId, false);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00CAE3B0
|
|
// FUNCTION: fn_21073
|
|
void __stdcall CreateHallucinationPc(
|
|
int job, int sex, int head, const vector3d* position, int alpha, int weapon, int shield, int bodyPalette
|
|
) {
|
|
CPc* pc = new (std::nothrow) CPc;
|
|
if (pc == nullptr) {
|
|
return;
|
|
}
|
|
|
|
pc->sex = sex & 1;
|
|
pc->SetActorJob(job);
|
|
pc->SetSprHead(head);
|
|
pc->SetImfFileName();
|
|
pc->SetBodyPalette(weapon);
|
|
pc->SetHeadPalette(shield);
|
|
pc->SetBodyCostume(bodyPalette, 0);
|
|
|
|
CHalluPC* hallu = new CHalluPC(pc);
|
|
hallu->render.position = *position;
|
|
unsigned char* const argb = reinterpret_cast<unsigned char*>(&hallu->render.color);
|
|
if (alpha != -1) {
|
|
argb[3] = static_cast<unsigned char>(alpha);
|
|
}
|
|
*reinterpret_cast<std::uint16_t*>(argb + 1) = 0xFFFF;
|
|
argb[0] = 0xFF;
|
|
|
|
CRenderObject* object = hallu;
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->scene->objects.push_back(object);
|
|
delete pc;
|
|
}
|
|
|
|
// OFFSET: 0x00AA20D0
|
|
// FUNCTION: fn_17210
|
|
bool CGameActor::HasActiveMercenaryAI() {
|
|
const int* entry = reinterpret_cast<const int*>(this->merAI);
|
|
return entry && entry[1] != 0;
|
|
}
|