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
941 lines
29 KiB
C++
941 lines
29 KiB
C++
#include "Contents/Effects/Particles/Particle.h"
|
|
#include "UI/Window/WindowId.h"
|
|
#include "Client/Mode/CGameMode.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "Contents/Actors/RenderObject.h"
|
|
#include "Contents/Camera/Camera.h"
|
|
#include "Contents/Configuration/ServiceOptions.h"
|
|
#include "Contents/Ground/TerrainHeight.h"
|
|
#include "Contents/Jobs/JobInheritance.h"
|
|
#include "Contents/World/World.h"
|
|
#include "Render/DX9/RendererDX9.h"
|
|
#include "Render/Primitives/RenderPrimitive.h"
|
|
#include "Render/Projection/RendererViewport.h"
|
|
#include "Render/Renderer.h"
|
|
#include "Render/TextureQuad.h"
|
|
#include "Render/Textures/Texture.h"
|
|
#include "Render/Textures/TextureCache.h"
|
|
#include "Resource/ResourceMgr.h"
|
|
#include "Resource/World/TerrainResource.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <regex>
|
|
|
|
// INLINED
|
|
static __forceinline float ToRadians(float degrees) {
|
|
return (degrees / 180.0f) * 3.141592f;
|
|
}
|
|
|
|
// INLINED
|
|
static __forceinline void SetClipCorners(RenderVertex* vertices, const EZeffectTransform& transform) {
|
|
if (transform.ax[1] > transform.ax[0]) {
|
|
vertices[0].x = transform.ax[3];
|
|
vertices[1].x = transform.ax[0];
|
|
vertices[2].x = transform.ax[2];
|
|
vertices[3].x = transform.ax[1];
|
|
vertices[0].u = vertices[1].u = transform.u;
|
|
vertices[2].u = vertices[3].u = transform.us + transform.u;
|
|
} else {
|
|
vertices[0].x = transform.ax[2];
|
|
vertices[1].x = transform.ax[1];
|
|
vertices[2].x = transform.ax[3];
|
|
vertices[3].x = transform.ax[0];
|
|
vertices[0].u = vertices[1].u = transform.us + transform.u;
|
|
vertices[2].u = vertices[3].u = transform.u;
|
|
}
|
|
|
|
if (transform.ay[2] > transform.ay[1]) {
|
|
vertices[0].y = transform.ay[3];
|
|
vertices[1].y = transform.ay[0];
|
|
vertices[2].y = transform.ay[2];
|
|
vertices[3].y = transform.ay[1];
|
|
vertices[1].v = vertices[3].v = transform.v;
|
|
vertices[0].v = vertices[2].v = transform.vs + transform.v;
|
|
} else {
|
|
vertices[0].y = transform.ay[0];
|
|
vertices[1].y = transform.ay[3];
|
|
vertices[2].y = transform.ay[1];
|
|
vertices[3].y = transform.ay[2];
|
|
vertices[0].v = vertices[2].v = transform.v;
|
|
vertices[1].v = vertices[3].v = transform.vs + transform.v;
|
|
}
|
|
}
|
|
|
|
// INLINED
|
|
static __forceinline std::uint32_t ClipColor(const EZeffectTransform& transform, float alpha) {
|
|
return (((((static_cast<int>(transform.crA * alpha) << 8) + static_cast<unsigned char>(transform.crR)) << 8) + static_cast<unsigned char>(transform.crG)) << 8) +
|
|
static_cast<unsigned char>(transform.crB);
|
|
}
|
|
|
|
// INLINED
|
|
static __forceinline CTexture* ClipTexture(EZeffectClip* clip, const EZeffectTransform& transform, const CEZ2STRParticle& particle) {
|
|
const int frame = static_cast<int>(transform.aniframe);
|
|
if (particle.m_texturePrefix.size() == 0) {
|
|
return clip->Texture(frame < 0 ? 0 : frame);
|
|
}
|
|
|
|
return clip->Texture(frame < 0 ? 0 : frame, particle.m_texturePrefix);
|
|
}
|
|
|
|
// OFFSET: 0x00B3C440
|
|
// FUNCTION: fn_18809
|
|
float RandomRange(float minimum, float maximum) {
|
|
if (minimum == maximum) {
|
|
return minimum;
|
|
}
|
|
|
|
const int low = static_cast<int>(minimum * 10.0f);
|
|
const int value = rand();
|
|
const int span = std::abs(-low - static_cast<int>(maximum * -10.0f)) + 1;
|
|
return static_cast<float>(value % span + low) * 0.1f;
|
|
}
|
|
|
|
// OFFSET: 0x00B3C4B0
|
|
// FUNCTION: fn_18810
|
|
std::string EmitterKey(std::string effect, std::string emitter) {
|
|
std::string key = "_" + effect + "_" + emitter;
|
|
const std::size_t marker = key.find("@");
|
|
if (marker != std::string::npos) {
|
|
key.erase(marker, 1);
|
|
}
|
|
|
|
return key;
|
|
}
|
|
|
|
// OFFSET: 0x00B3C6F0
|
|
// FUNCTION: fn_18811
|
|
std::string EmitterInfoKey(std::string effect) {
|
|
std::string key = "_" + effect + "_emitterInfo";
|
|
const std::size_t marker = key.find("@");
|
|
if (marker != std::string::npos) {
|
|
key.erase(marker, 1);
|
|
}
|
|
|
|
return key;
|
|
}
|
|
|
|
// OFFSET: 0x00B3C880
|
|
// FUNCTION: fn_18812
|
|
vector2d RandomDiscPoint(float x, float y, long long radius) {
|
|
const double turn = rand() / 32767.0;
|
|
const double distance = SquareRoot(static_cast<float>(rand() / 32767.0)) * static_cast<float>(radius);
|
|
vector2d point;
|
|
const double angle = (turn + turn) * 3.141592653589;
|
|
point.x = static_cast<float>(x + ClientCos(static_cast<float>(angle)) * distance);
|
|
point.y = static_cast<float>(y + ClientSin(static_cast<float>(angle)) * distance);
|
|
return point;
|
|
}
|
|
|
|
// OFFSET: 0x00B3CBA0
|
|
// FUNCTION: fn_18813
|
|
CEZ2STRParticle::CEZ2STRParticle(vector3d position, int flags) : CParticle(position, flags) {
|
|
this->Clear();
|
|
}
|
|
|
|
// INLINED
|
|
CEZ2STRParticle::~CEZ2STRParticle() {
|
|
}
|
|
|
|
|
|
// OFFSET: 0x00B3CFC0
|
|
// FUNCTION: fn_18815
|
|
void CEZ2STRParticle::ReleaseResource() {
|
|
this->m_res = nullptr;
|
|
}
|
|
|
|
// OFFSET: 0x00B3D030
|
|
// FUNCTION: fn_18816
|
|
std::string CEZ2STRParticle::ResolvePath(const std::string& name) {
|
|
std::smatch match;
|
|
const bool matched = std::regex_match(name, match, std::regex("^(.+\\\\)(\\w+\\.str)$"));
|
|
if (matched && match.size() >= 3) {
|
|
std::string path = match[1].str() + "min_" + match[2].str();
|
|
if (ResourceMgr::Instance().Exists(path) == true) {
|
|
return path;
|
|
}
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
// OFFSET: 0x00B3D540
|
|
// FUNCTION: fn_18817
|
|
void CEZ2STRParticle::Clear() {
|
|
this->Reset();
|
|
this->m_res = nullptr;
|
|
this->m_data = nullptr;
|
|
this->m_finishedClips = 0;
|
|
this->m_frame = 0;
|
|
this->m_loop = false;
|
|
std::memset(this->m_cursors, 0, sizeof(this->m_cursors));
|
|
std::memset(this->m_transforms, 0, sizeof(this->m_transforms));
|
|
this->m_endFrame = 0;
|
|
this->m_counting = false;
|
|
this->m_lifeTime = 0;
|
|
this->m_repeat = 0;
|
|
this->m_delay = 0;
|
|
this->m_angle = 0;
|
|
this->m_pitch = 0;
|
|
this->m_yaw = 0;
|
|
this->m_scale = 1.0f;
|
|
this->m_alpha = 1.0f;
|
|
this->m_windowId = -1;
|
|
this->m_attachToWindow = false;
|
|
this->m_visible = true;
|
|
this->m_windowOffset.x = 0;
|
|
this->m_windowOffset.y = 0;
|
|
this->m_windowOffset.z = 0;
|
|
this->m_shiftX = 0;
|
|
this->m_shiftY = 0;
|
|
this->m_lift = 0;
|
|
this->m_followActor = false;
|
|
this->m_flipX = false;
|
|
this->m_flipY = false;
|
|
this->m_hold = false;
|
|
this->m_screenShiftY = 0;
|
|
this->m_screenShiftX = 0;
|
|
this->m_groundHeight = -1000.0f;
|
|
}
|
|
|
|
// OFFSET: 0x00B3D6F0
|
|
// FUNCTION: fn_18818
|
|
void CEZ2STRParticle::Restart() {
|
|
CEZeffectRes* resource = this->m_res;
|
|
if (!resource) {
|
|
return;
|
|
}
|
|
|
|
this->m_finishedClips = 0;
|
|
this->m_frame = 0;
|
|
this->m_data = reinterpret_cast<EZeffectData*>(&resource->maximumFrame);
|
|
this->m_clipLimit = this->m_data->clipCount;
|
|
if (this->m_data->clips[0].frameCount == 0) {
|
|
--this->m_clipLimit;
|
|
}
|
|
|
|
for (int i = 0; i < this->m_data->clipCount; ++i) {
|
|
this->m_cursors[i] = 0;
|
|
}
|
|
|
|
SecureZeroMemory(this->m_transforms, sizeof(this->m_transforms));
|
|
}
|
|
|
|
// OFFSET: 0x00B3D7A0
|
|
// FUNCTION: fn_18819
|
|
void CEZ2STRParticle::Open(std::string name) {
|
|
this->m_res = CResPtr<CEZeffectRes>(static_cast<CEZeffectRes*>(ResourceMgr::Instance().Load(name)));
|
|
this->m_name = name;
|
|
|
|
char directory[256];
|
|
std::memset(directory, 0, sizeof(directory) - 1);
|
|
_splitpath(name.c_str(), nullptr, directory, nullptr, nullptr);
|
|
this->m_texturePrefix = std::string(directory);
|
|
this->Restart();
|
|
}
|
|
|
|
// OFFSET: 0x00B3D9D0
|
|
// FUNCTION: fn_18820
|
|
void CEZ2STRParticle::Load(const std::string& name) {
|
|
if (g_serviceOptions.Get(229)) {
|
|
this->Open(this->ResolvePath(name));
|
|
} else {
|
|
this->Open(name);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B3DA60
|
|
// FUNCTION: fn_18821
|
|
bool CEZ2STRParticle::Process(float x, float y, float z) {
|
|
if (!this->m_res) {
|
|
return false;
|
|
}
|
|
|
|
if (this->m_delay > 0) {
|
|
this->m_delay -= 16;
|
|
return true;
|
|
}
|
|
|
|
const int lifeTime = this->m_lifeTime;
|
|
if (lifeTime != 0) {
|
|
this->m_counting = true;
|
|
}
|
|
|
|
if (this->m_counting == true && this->m_frame - lifeTime >= 0) {
|
|
this->life = -1.0f;
|
|
return false;
|
|
}
|
|
|
|
if (this->m_finishedClips >= this->m_clipLimit) {
|
|
if (this->m_hold) {
|
|
this->UpdatePosition(x, y, z);
|
|
return true;
|
|
}
|
|
|
|
if (!this->m_loop && this->m_frame - this->m_endFrame >= 0 && this->m_frame - lifeTime >= 0) {
|
|
if (this->m_repeat <= 0) {
|
|
this->life = -1.0f;
|
|
return false;
|
|
}
|
|
|
|
--this->m_repeat;
|
|
}
|
|
|
|
this->Restart();
|
|
}
|
|
|
|
this->UpdatePosition(x, y, z);
|
|
|
|
for (int i = 0; i < this->m_data->clipCount; ++i) {
|
|
this->m_active[i] = false;
|
|
EZeffectClip* clip = &this->m_data->clips[i];
|
|
if (!clip || !clip->frameCount || this->m_cursors[i] == -1) {
|
|
continue;
|
|
}
|
|
|
|
const EZeffectKeyFrame* key = &clip->frames[this->m_cursors[i]];
|
|
const int elapsed = this->m_frame - key->frame;
|
|
if (elapsed < 0) {
|
|
continue;
|
|
}
|
|
|
|
if ((clip->frameCount == 1 && key->frame == this->m_frame)
|
|
|| (clip->frameCount != 1
|
|
&& (this->m_cursors[i] + 1 < clip->frameCount ? elapsed != 0 && key[1].frame == this->m_frame
|
|
: key->frame == this->m_frame))) {
|
|
const int cursor = this->m_cursors[i] + 1;
|
|
this->m_cursors[i] = cursor;
|
|
if (cursor < clip->frameCount - 1) {
|
|
++key;
|
|
} else {
|
|
this->m_cursors[i] = -1;
|
|
++this->m_finishedClips;
|
|
}
|
|
}
|
|
|
|
EZeffectTransform& transform = this->m_transforms[i];
|
|
if (key->type == 0) {
|
|
transform = key->transform;
|
|
if (this->m_cursors[i] != -1 && clip->frameCount > 1) {
|
|
const int next = this->m_cursors[i] + 1;
|
|
if (next < clip->frameCount && key[1].frame == key->frame) {
|
|
this->m_cursors[i] = next;
|
|
}
|
|
}
|
|
} else {
|
|
transform.x += key->transform.x;
|
|
transform.y += key->transform.y;
|
|
transform.u += key->transform.u;
|
|
transform.v += key->transform.v;
|
|
transform.us += key->transform.us;
|
|
transform.vs += key->transform.vs;
|
|
transform.u2 += key->transform.u2;
|
|
transform.v2 += key->transform.v2;
|
|
transform.us2 += key->transform.us2;
|
|
transform.vs2 += key->transform.vs2;
|
|
transform.ax[0] += key->transform.ax[0];
|
|
transform.ax[1] += key->transform.ax[1];
|
|
transform.ax[2] += key->transform.ax[2];
|
|
transform.ax[3] += key->transform.ax[3];
|
|
transform.ay[0] += key->transform.ay[0];
|
|
transform.ay[1] += key->transform.ay[1];
|
|
transform.ay[2] += key->transform.ay[2];
|
|
transform.ay[3] += key->transform.ay[3];
|
|
transform.crR += key->transform.crR;
|
|
transform.crG += key->transform.crG;
|
|
transform.crB += key->transform.crB;
|
|
transform.crA += key->transform.crA;
|
|
transform.rz += key->transform.rz;
|
|
|
|
switch (key->transform.anitype) {
|
|
case 1:
|
|
transform.aniframe += key->transform.aniframe;
|
|
break;
|
|
case 2:
|
|
transform.aniframe += key->transform.anidelta;
|
|
if (transform.aniframe >= static_cast<float>(clip->textureCount)) {
|
|
transform.aniframe = static_cast<float>(clip->textureCount) - 1.0f;
|
|
}
|
|
break;
|
|
case 3: {
|
|
const float frame = key->transform.anidelta + transform.aniframe;
|
|
transform.aniframe = frame;
|
|
const float count = static_cast<float>(clip->textureCount);
|
|
if (frame >= count) {
|
|
transform.aniframe = frame - static_cast<float>(static_cast<int>(frame / count)) * count;
|
|
}
|
|
break;
|
|
}
|
|
case 4: {
|
|
float frame = transform.aniframe - key->transform.anidelta;
|
|
transform.aniframe = frame;
|
|
if (frame < 0.0f) {
|
|
const float count = static_cast<float>(clip->textureCount);
|
|
frame -= count * 0.0f;
|
|
if (frame < 0.0f) {
|
|
frame += count;
|
|
}
|
|
transform.aniframe = frame;
|
|
}
|
|
break;
|
|
}
|
|
case 5: {
|
|
const int last = clip->textureCount - 1;
|
|
const int frame = static_cast<int>(static_cast<float>(elapsed) * key->transform.anidelta + transform.aniframe);
|
|
const int bounce = frame / last;
|
|
if (bounce & 1) {
|
|
transform.aniframe = static_cast<float>((bounce + 1) * last - frame);
|
|
} else {
|
|
transform.aniframe = static_cast<float>(frame - bounce * last);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
this->m_active[i] = true;
|
|
}
|
|
|
|
++this->m_frame;
|
|
if (this->m_counting == true) {
|
|
this->m_lifeTime -= 16;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00B3E010
|
|
// FUNCTION: fn_18822
|
|
__declspec(safebuffers) void CEZ2STRParticle::UpdatePosition(float x, float y, float z) {
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
RenderVertex screen = {0, 0, 0, 0, 0, 0xFF000000, 0, 0};
|
|
g_renderer->viewport.Project(&this->position.x, mode->camera->frame.view.values, screen);
|
|
this->m_screen.x = screen.x + x;
|
|
this->m_screen.y = screen.y + y;
|
|
this->m_screen.z = screen.z + z;
|
|
|
|
if (this->flags == 0x205 || this->flags == 0x225) {
|
|
this->m_screen.x = static_cast<float>(g_renderer->viewport.centerX) + this->m_windowOffset.x;
|
|
this->m_screen.y =
|
|
(static_cast<float>(g_renderer->viewport.centerY) - static_cast<float>(g_renderer->viewport.centerY) * 0.2f) + this->m_windowOffset.y;
|
|
if (this->m_attachToWindow == true) {
|
|
UIWindow* window = g_windowMgr.LookupWindow(this->m_windowId);
|
|
if (window) {
|
|
this->m_visible = true;
|
|
this->m_screen.x = static_cast<float>(window->geometry.x) + this->m_windowOffset.x;
|
|
this->m_screen.y = static_cast<float>(window->geometry.y) + this->m_windowOffset.y;
|
|
return;
|
|
}
|
|
|
|
this->m_visible = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B3E170
|
|
// FUNCTION: fn_18823
|
|
void CEZ2STRParticle::DrawBillboards(const matrix& view) {
|
|
if (!this->m_data || !this->m_visible) {
|
|
return;
|
|
}
|
|
|
|
for (int i = 1; i < this->m_data->clipCount; ++i) {
|
|
if (this->m_active[i]) {
|
|
this->RenderBillboard(&this->m_data->clips[i], &this->m_transforms[i], view, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B3E1F0
|
|
// FUNCTION: fn_18824
|
|
void CEZ2STRParticle::DrawScreen(const matrix& view) {
|
|
if (!this->m_data || !this->m_visible) {
|
|
return;
|
|
}
|
|
|
|
for (int i = 1; i < this->m_data->clipCount; ++i) {
|
|
if (this->m_active[i]) {
|
|
this->RenderScreen(&this->m_data->clips[i], &this->m_transforms[i], view, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B3E270
|
|
// FUNCTION: fn_18825
|
|
void CEZ2STRParticle::RenderBillboard(EZeffectClip* clip, EZeffectTransform* transform, const matrix& view, int index) {
|
|
RenderPrimitive* primitive = g_renderer->primitives.Acquire();
|
|
RenderVertex* vertices = primitive->vertices;
|
|
SetClipCorners(vertices, *transform);
|
|
|
|
CTexture* texture = ClipTexture(clip, *transform, *this);
|
|
const float scaleU = static_cast<float>(texture->ImageWidth()) / static_cast<float>(texture->TextureWidth());
|
|
const float scaleV = static_cast<float>(texture->ImageHeight()) / static_cast<float>(texture->TextureHeight());
|
|
|
|
matrix world;
|
|
world.MakeZRotation(ToRadians(static_cast<float>(transform->rz / 2.8444444444444)));
|
|
vector3d offset;
|
|
offset.x = transform->x - 320.0f;
|
|
offset.z = 0;
|
|
offset.y = transform->y - 240.0f;
|
|
world.AppendTranslate(&offset.x);
|
|
const float scale = this->m_scale;
|
|
const float scaleY = this->m_flipY ? scale * -1.0f : scale;
|
|
const float scaleX = this->m_flipX ? scale * -1.0f : scale;
|
|
world.AppendScale(scaleX, scaleY, 1.0f);
|
|
world.AppendZRotation(ToRadians(this->m_angle));
|
|
world.AppendXRotation(ToRadians(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->camera.pitch));
|
|
world.AppendYRotation(ToRadians(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->camera.yaw));
|
|
world.AppendTranslate(&this->position.x);
|
|
|
|
matrix combined;
|
|
combined.Compose(world, view);
|
|
for (int i = 0; i < 4; ++i) {
|
|
vector3d point = {vertices[i].x, vertices[i].y, vertices[i].z};
|
|
g_renderer->viewport.Project(&point.x, combined.values, vertices[i]);
|
|
vertices[i].rhw = this->depthOffset + vertices[i].rhw;
|
|
vertices[i].z = RhwToDepth(vertices[i].rhw);
|
|
vertices[i].u = scaleU * vertices[i].u;
|
|
vertices[i].v = scaleV * vertices[i].v;
|
|
vertices[i].specular = 0xFFFFFFFF;
|
|
vertices[i].diffuse = ClipColor(*transform, this->m_alpha);
|
|
}
|
|
|
|
primitive->texture = texture;
|
|
primitive->sourceBlend = transform->srcalpha;
|
|
primitive->destinationBlend = transform->destalpha;
|
|
primitive->textureMode = transform->mtpreset;
|
|
this->flags |= 0x20;
|
|
this->submit(primitive, this->flags);
|
|
}
|
|
|
|
// OFFSET: 0x00B3E6E0
|
|
// FUNCTION: fn_18826
|
|
void CEZ2STRParticle::RenderScreen(EZeffectClip* clip, EZeffectTransform* transform, const matrix& view, int index) {
|
|
RenderPrimitive* primitive = g_renderer->primitives.Acquire();
|
|
RenderVertex* vertices = primitive->vertices;
|
|
SetClipCorners(vertices, *transform);
|
|
|
|
float screenX;
|
|
float screenY;
|
|
float rhw;
|
|
g_renderer->ProjectViewport(&this->position.x, view.values, &screenX, &screenY, &rhw);
|
|
const float sine = ClientSin(ToRadians(static_cast<float>(transform->rz / 2.8444444444444)));
|
|
const float cosine = ClientCos(ToRadians(static_cast<float>(transform->rz / 2.8444444444444)));
|
|
float scale = g_renderer->ScaleDistance(rhw);
|
|
if (this->m_followActor == true) {
|
|
if (CRenderObject* actor = FindRenderObject(this->m_actorId)) {
|
|
actor->ScaleByFadePulse(scale);
|
|
}
|
|
}
|
|
|
|
if (this->m_attachToWindow == true) {
|
|
switch (this->m_windowId) {
|
|
case WID_RUNESYSTEMWND:
|
|
case 10022:
|
|
case 10023:
|
|
case 10026:
|
|
scale = 1.0f;
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
const float rotated = vertices[i].x * sine + vertices[i].y * cosine;
|
|
vertices[i].x = ((vertices[i].x * cosine - vertices[i].y * sine) + (transform->x - 320.0f)) * scale + this->m_screen.x;
|
|
if (IsScreenShakeActive()) {
|
|
const float shake = screenY - this->m_screen.y;
|
|
vertices[i].y = (this->m_screen.y - ((transform->y - 240.0f) + rotated) * scale) + (shake + shake);
|
|
} else {
|
|
vertices[i].y = ((transform->y - 240.0f) + rotated) * scale + this->m_screen.y;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
float x = (vertices[i].x - screenX) * this->m_scale;
|
|
float y = (vertices[i].y - screenY) * this->m_scale;
|
|
if (this->m_flipX) {
|
|
x *= -1.0f;
|
|
}
|
|
if (this->m_flipY) {
|
|
y *= -1.0f;
|
|
}
|
|
vertices[i].x = x + screenX;
|
|
vertices[i].y = y + screenY;
|
|
}
|
|
|
|
if (this->m_angle > 0.0f || this->m_pitch > 0.0f || this->m_yaw > 0.0f) {
|
|
matrix rotation;
|
|
rotation.Identity();
|
|
if (this->m_angle > 0.0f) {
|
|
rotation.AppendZRotation(ToRadians(this->m_angle));
|
|
}
|
|
if (this->m_pitch > 0.0f) {
|
|
rotation.AppendXRotation(ToRadians(this->m_pitch));
|
|
}
|
|
if (this->m_yaw > 0.0f) {
|
|
rotation.AppendYRotation(ToRadians(this->m_yaw));
|
|
}
|
|
|
|
const float* values = rotation.values;
|
|
for (int i = 0; i < 4; ++i) {
|
|
const float x = vertices[i].x - screenX;
|
|
const float y = vertices[i].y - screenY;
|
|
vertices[i].x = values[0] * x + values[3] * y + values[6] * 0.0f + values[9] + screenX;
|
|
vertices[i].y = values[1] * x + values[4] * y + values[7] * 0.0f + values[10] + screenY;
|
|
}
|
|
}
|
|
|
|
for (long long i = 0; i < 4; ++i) {
|
|
vertices[i].x = this->m_shiftX + vertices[i].x;
|
|
vertices[i].y = this->m_shiftY + vertices[i].y;
|
|
}
|
|
|
|
for (long long i = 0; i < 4; ++i) {
|
|
vertices[i].y -= static_cast<float>(this->m_lift);
|
|
}
|
|
|
|
for (long long i = 0; i < 4; ++i) {
|
|
vertices[i].x += this->m_screenShiftX;
|
|
vertices[i].y -= this->m_screenShiftY;
|
|
}
|
|
|
|
CTexture* texture = ClipTexture(clip, *transform, *this);
|
|
const float depth = static_cast<float>(index) * 1e-05f;
|
|
const float scaleU = static_cast<float>(texture->ImageWidth()) / static_cast<float>(texture->TextureWidth());
|
|
const float scaleV = static_cast<float>(texture->ImageHeight()) / static_cast<float>(texture->TextureHeight());
|
|
for (int i = 0; i < 4; ++i) {
|
|
vertices[i].u = scaleU * vertices[i].u;
|
|
vertices[i].v = scaleV * vertices[i].v;
|
|
vertices[i].specular = 0xFFFFFFFF;
|
|
vertices[i].z = 3.102122e-05f;
|
|
vertices[i].diffuse = ClipColor(*transform, this->m_alpha);
|
|
vertices[i].rhw = rhw - depth;
|
|
}
|
|
|
|
primitive->texture = texture;
|
|
primitive->sourceBlend = transform->srcalpha;
|
|
primitive->destinationBlend = transform->destalpha;
|
|
primitive->textureMode = transform->mtpreset;
|
|
this->flags |= 0x20;
|
|
this->submit(primitive, this->flags);
|
|
}
|
|
|
|
// OFFSET: 0x00B3F050
|
|
// FUNCTION: fn_18827
|
|
void CEZ2STRParticle::RenderGround(EZeffectClip* clip, EZeffectTransform* transform, const matrix& view, int index) {
|
|
RenderPrimitive* primitive = g_renderer->primitives.Acquire();
|
|
RenderVertex* vertices = primitive->vertices;
|
|
SetClipCorners(vertices, *transform);
|
|
|
|
CTexture* texture = ClipTexture(clip, *transform, *this);
|
|
const float scaleU = static_cast<float>(texture->ImageWidth()) / static_cast<float>(texture->TextureWidth());
|
|
const float scaleV = static_cast<float>(texture->ImageHeight()) / static_cast<float>(texture->TextureHeight());
|
|
|
|
matrix world;
|
|
world.MakeZRotation(ToRadians(static_cast<float>(transform->rz / 2.8444444444444)));
|
|
vector3d point;
|
|
point.x = transform->x - 320.0f;
|
|
point.z = 0;
|
|
point.y = transform->y - 240.0f;
|
|
world.AppendTranslate(&point.x);
|
|
const float scale = this->m_scale;
|
|
const float scaleY = this->m_flipY ? scale * -1.0f : scale;
|
|
const float scaleX = this->m_flipX ? scale * -1.0f : scale;
|
|
world.AppendScale(scaleX, scaleY, 1.0f);
|
|
world.AppendXRotation(ToRadians(-90.0f));
|
|
world.AppendYRotation(ToRadians(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->camera.yaw + this->m_angle));
|
|
world.AppendTranslate(&this->position.x);
|
|
|
|
const float* values = world.values;
|
|
for (int i = 0; i < 4; ++i) {
|
|
const float x = vertices[i].x;
|
|
const float y = vertices[i].y;
|
|
const float z = vertices[i].z;
|
|
point.x = x * values[0] + y * values[3] + z * values[6] + values[9];
|
|
point.y = x * values[1] + y * values[4] + z * values[7] + values[10];
|
|
point.z = x * values[2] + y * values[5] + z * values[8] + values[11];
|
|
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
|
|
point.y = mode->scene->terrain->PlaneHeight(point.x, point.z) - 2.0f;
|
|
if (this->m_groundHeight != -1000.0f && point.y - this->m_groundHeight > 5.0f) {
|
|
point.y = this->m_groundHeight;
|
|
}
|
|
this->m_groundHeight = point.y;
|
|
|
|
g_renderer->viewport.Project(&point.x, view.values, vertices[i]);
|
|
vertices[i].rhw = this->depthOffset + vertices[i].rhw;
|
|
vertices[i].z = RhwToDepth(vertices[i].rhw);
|
|
vertices[i].u = scaleU * vertices[i].u;
|
|
vertices[i].v = scaleV * vertices[i].v;
|
|
vertices[i].specular = 0xFFFFFFFF;
|
|
vertices[i].diffuse = ClipColor(*transform, this->m_alpha);
|
|
}
|
|
|
|
primitive->texture = texture;
|
|
primitive->sourceBlend = transform->srcalpha;
|
|
primitive->destinationBlend = transform->destalpha;
|
|
primitive->textureMode = transform->mtpreset;
|
|
this->flags |= 0x20;
|
|
this->submit(primitive, this->flags);
|
|
}
|
|
|
|
// OFFSET: 0x00B3F550
|
|
// FUNCTION: fn_18828
|
|
void CEZ2STRParticle::DrawGround(const matrix& view) {
|
|
if (!this->m_data || !this->m_visible) {
|
|
return;
|
|
}
|
|
|
|
for (int i = 1; i < this->m_data->clipCount; ++i) {
|
|
if (this->m_active[i]) {
|
|
this->RenderGround(&this->m_data->clips[i], &this->m_transforms[i], view, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B3F5D0
|
|
// FUNCTION: fn_18829
|
|
void CEZ2STRParticle::Advance(float amount) {
|
|
if (!this->m_res) {
|
|
return;
|
|
}
|
|
|
|
const int count = static_cast<int>(static_cast<float>(this->m_data->maximumFrame) * amount);
|
|
for (int i = 0; i < count; ++i) {
|
|
this->Process(0.0f, -80.0f, 0.0f);
|
|
}
|
|
}
|
|
|
|
// INLINED
|
|
static __forceinline void ResetParticle(CParticle& particle) {
|
|
particle.red = 0xFF;
|
|
particle.green = 0xFF;
|
|
particle.blue = 0xFF;
|
|
particle.scale = 1.0f;
|
|
particle.speedParameter = 0;
|
|
particle.texture = nullptr;
|
|
particle.alpha = 0xFF;
|
|
particle.angleBits = 0;
|
|
particle.life = 0;
|
|
particle.auxiliaryParameter = 0;
|
|
particle.auxiliaryIndex = 0;
|
|
particle.elapsedFrames = 0;
|
|
particle.renderOptions = 0;
|
|
particle.offsetX = 0;
|
|
particle.offsetY = 0;
|
|
particle.offsetZ = 0;
|
|
particle.sourceBlend = 5;
|
|
particle.destinationBlend = 2;
|
|
particle.primitive = RenderPrimitive();
|
|
particle.transform.Identity();
|
|
particle.depthOffset = 0;
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
particle.vertices[i].x = 0;
|
|
particle.vertices[i].y = 0;
|
|
particle.vertices[i].z = 0;
|
|
particle.corners[i].x = 0;
|
|
particle.corners[i].y = 0;
|
|
particle.corners[i].z = 0;
|
|
}
|
|
|
|
InitParticleQuad(particle.vertices);
|
|
particle.submit = SubmitParticlePrimitive;
|
|
}
|
|
|
|
// OFFSET: 0x00B3F630
|
|
// FUNCTION: fn_18830
|
|
CParticle::CParticle(vector3d position, int flags) : flags(flags), position(position) {
|
|
for (RenderVertex& vertex : this->vertices) {
|
|
vertex.x = 0;
|
|
vertex.y = 0;
|
|
vertex.z = 0;
|
|
vertex.rhw = 0;
|
|
vertex.diffuse = 0;
|
|
vertex.specular = 0xFF000000;
|
|
vertex.u = 0;
|
|
vertex.v = 0;
|
|
}
|
|
|
|
for (vector3d& corner : this->corners) {
|
|
corner.x = 0;
|
|
corner.y = 0;
|
|
corner.z = 0;
|
|
}
|
|
|
|
this->submit = SubmitParticlePrimitive;
|
|
ResetParticle(*this);
|
|
}
|
|
|
|
// OFFSET: 0x00B3F950
|
|
// FUNCTION: fn_18831
|
|
CParticle::~CParticle() {
|
|
}
|
|
|
|
// OFFSET: 0x00B3F990
|
|
// FUNCTION: fn_18833
|
|
__declspec(noinline) void CParticle::Reset() {
|
|
ResetParticle(*this);
|
|
}
|
|
|
|
// OFFSET: 0x00B3FBF0
|
|
// FUNCTION: fn_18834
|
|
void ParticleUnused420() {
|
|
}
|
|
|
|
// OFFSET: 0x00B3FC00
|
|
// FUNCTION: fn_18835
|
|
void ParticleUnused421() {
|
|
}
|
|
|
|
// OFFSET: 0x00B3FC10
|
|
// FUNCTION: fn_18836
|
|
void CParticle::SetQuad(RenderVertex* vertices, float top, float bottom, float left, float right) {
|
|
const std::uint32_t color = ((this->alpha << 8 | this->red) << 8 | this->green) << 8 | this->blue;
|
|
vertices[0].diffuse = color;
|
|
vertices[1].diffuse = color;
|
|
vertices[2].diffuse = color;
|
|
vertices[3].diffuse = color;
|
|
|
|
vertices[0].u = left;
|
|
vertices[0].v = top;
|
|
vertices[1].v = top;
|
|
vertices[1].u = right;
|
|
vertices[2].u = left;
|
|
vertices[2].v = bottom;
|
|
vertices[3].u = right;
|
|
vertices[3].v = bottom;
|
|
}
|
|
|
|
// OFFSET: 0x00B3FC80
|
|
// FUNCTION: fn_18837
|
|
void InitParticleQuad(RenderVertex* vertices) {
|
|
vertices[0].x = -1.0f;
|
|
vertices[0].y = 1.0f;
|
|
vertices[0].z = 1.0f;
|
|
vertices[1].x = 1.0f;
|
|
vertices[1].y = 1.0f;
|
|
vertices[1].z = 1.0f;
|
|
vertices[2].x = -1.0f;
|
|
vertices[2].y = -1.0f;
|
|
vertices[2].z = 1.0f;
|
|
vertices[3].x = 1.0f;
|
|
vertices[3].y = -1.0f;
|
|
vertices[3].z = 1.0f;
|
|
}
|
|
|
|
// OFFSET: 0x00B3FCE0
|
|
// FUNCTION: fn_18838
|
|
void CParticle::Render(const ParticleQuad& quad) {
|
|
this->Render(quad.billboard, quad.top, quad.bottom, quad.left, quad.right, quad.unused, quad.depth);
|
|
}
|
|
|
|
// OFFSET: 0x00B3FD10
|
|
// FUNCTION: fn_18839
|
|
void CParticle::Render(bool billboard, float top, float bottom, float left, float right, bool unused, bool depth) {
|
|
bool shaped = false;
|
|
for (int i = 0; i < 4; ++i) {
|
|
if (this->vertices[i].x != 0.0f || this->vertices[i].y != 0.0f || this->vertices[i].z != 0.0f) {
|
|
shaped = true;
|
|
}
|
|
}
|
|
|
|
if (!shaped) {
|
|
return;
|
|
}
|
|
|
|
this->SetQuad(this->vertices, top, bottom, left, right);
|
|
for (int i = 0; i < 4; ++i) {
|
|
this->primitive.vertices[i] = this->vertices[i];
|
|
}
|
|
|
|
RenderVertex* output = this->primitive.vertices;
|
|
const matrix& view = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->frame.view;
|
|
const matrix* local;
|
|
matrix placed;
|
|
if (!billboard) {
|
|
matrix translation;
|
|
translation.Identity();
|
|
translation.MakeTranslate(this->position.x, this->position.y, this->position.z);
|
|
matrix rotation;
|
|
rotation.Identity();
|
|
rotation.AppendYRotation(ToRadians(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->camera.yaw));
|
|
matrix facing;
|
|
facing.Compose(rotation, translation);
|
|
placed.Compose(this->transform, facing);
|
|
local = &placed;
|
|
} else {
|
|
local = &this->transform;
|
|
}
|
|
|
|
matrix world;
|
|
world.Compose(*local, view);
|
|
for (int i = 0; i < 4; ++i) {
|
|
vector3d point = {output[i].x, output[i].y, output[i].z};
|
|
g_renderer->viewport.Project(&point.x, world.values, output[i]);
|
|
const float rhw = this->depthOffset + output[i].rhw;
|
|
output[i].rhw = rhw;
|
|
if (0.0f > rhw) {
|
|
return;
|
|
}
|
|
|
|
float z = 0.0f;
|
|
if (depth) {
|
|
z = RhwToDepth(rhw);
|
|
}
|
|
output[i].z = z;
|
|
}
|
|
|
|
this->primitive.texture = this->texture;
|
|
this->primitive.sourceBlend = this->sourceBlend;
|
|
this->primitive.destinationBlend = this->destinationBlend;
|
|
g_renderer->queues.Submit(&this->primitive, static_cast<std::uint16_t>(this->flags), g_renderer->fog.supported != 0, g_depthStart, g_depthEnd);
|
|
}
|
|
|
|
// OFFSET: 0x00B40100
|
|
// FUNCTION: fn_18840
|
|
void ParticleUnused422() {
|
|
}
|
|
|
|
// OFFSET: 0x00B40110
|
|
// FUNCTION: fn_18841
|
|
void ParticleUnused423() {
|
|
}
|
|
|
|
// OFFSET: 0x00B40120
|
|
// FUNCTION: fn_18842
|
|
void CParticle::SetColor(short redValue, short greenValue, short blueValue) {
|
|
if (redValue != -1) {
|
|
this->red = redValue;
|
|
}
|
|
if (greenValue != -1) {
|
|
this->green = greenValue;
|
|
}
|
|
if (blueValue != -1) {
|
|
this->blue = blueValue;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00B40160
|
|
// FUNCTION: fn_18843
|
|
void CParticle::SetTexture(const char* name) {
|
|
this->texture = g_texMgr.Load(name, 0, false, true, false);
|
|
}
|
|
|
|
// OFFSET: 0x00B40190
|
|
// FUNCTION: fn_18844
|
|
void CParticle::SetTexture(std::string name) {
|
|
this->texture = g_texMgr.Load(name.c_str(), 0, false, true, false);
|
|
}
|
|
|
|
// OFFSET: 0x00B40200
|
|
// FUNCTION: fn_18845
|
|
void CParticle::SetRenderFlag(unsigned char value) {
|
|
*reinterpret_cast<unsigned char*>(&this->primitive.depthFlags) = value;
|
|
}
|
|
|
|
// OFFSET: 0x00B40210
|
|
// FUNCTION: fn_18846
|
|
void SubmitParticlePrimitive(RenderCommand* primitive, int flags) {
|
|
static_cast<CRendererDX9*>(g_renderer)->Submit(primitive, static_cast<std::uint16_t>(flags));
|
|
}
|