public MPQCOF GetPlayerAnimation(eHero hero, eMobMode mobMode, PlayerEquipment equipment) => cache.AddOrGetExisting($"COF::{hero}{mobMode.ToToken()}{equipment.HashKey}", () => { var path = $"{ResourcePaths.PlayerAnimationBase}\\{hero.ToToken()}\\COF\\{hero.ToToken()}{mobMode.ToToken()}{equipment.WeaponClass.ToToken()}.cof"; return(MPQCOF.Load(mpqProvider.GetStream(path), Animations, hero, mobMode, equipment)); }, new System.Runtime.Caching.CacheItemPolicy { Priority = System.Runtime.Caching.CacheItemPriority.NotRemovable });
public void ResetAnimationData() { var lastMobMode = MobMode; switch (LocationDetails.MovementType) { case eMovementType.Stopped: MobMode = eMobMode.PlayerTownNeutral; break; case eMovementType.Walking: MobMode = eMobMode.PlayerTownWalk; break; case eMovementType.Running: MobMode = eMobMode.PlayerRun; break; default: MobMode = eMobMode.PlayerNeutral; break; } if (lastMobMode != MobMode) { renderFrameIndex = 0; } currentDirectionCache = directionCache.FirstOrDefault(x => x.MobMode == MobMode && x.Direction == directionConversion[LocationDetails.MovementDirection]); if (currentDirectionCache != null) { return; } animationData = resourceManager.GetPlayerAnimation(Hero, MobMode, Equipment); if (animationData == null) { throw new OpenDiablo2Exception("Could not locate animation for the character!"); } var palette = paletteProvider.PaletteTable["Units"]; CacheFrames(animationData.Layers.Select(layer => resourceManager.GetPlayerDCC(layer, Equipment, palette)).ToArray()); }