private void WriteStatValues(CharacterSnapshot snap, StatisticCategory cat, TextWriter writer)
 {
     foreach (var statName in cat.Items)
     {
         int statVal = snap.GetStatisticValue(cat, statName);
         writer.Write(statVal);
         writer.Write(";");
     }
 }
 public void SetUI(CharacterSnapshot snapshot, RewindUI context)
 {
     this.context          = context;
     this.snapshot         = snapshot;
     turnText.text         = $"Turn {snapshot.Turn}";
     damageText.text       = $"+{snapshot.Damage}";
     armourText.text       = $"+{snapshot.Armour}";
     healthSlider.maxValue = snapshot.MaxHealth;
     healthSlider.value    = snapshot.Health;
     healthFill.color      = healthGradient.Evaluate(healthSlider.normalizedValue);
 }
        private CharacterSnapshot ParseCharacterSnapshot(SkyrimSavegame savegame)
        {
            CharacterSnapshot snap = new CharacterSnapshot();

            snap.Id       = savegame.GetNumber();
            snap.Label    = savegame.GetLabel();
            snap.SaveTime = savegame.GetSaveTime();
            snap.Level    = savegame.GetPlayerLevel();
            snap.Location = savegame.GetPlayerLocation();

            snap.StatisticValue = ParseStats(savegame);

            return(snap);
        }
        public CharacterList ParseCharacters(params SkyrimSavegame[] savegames)
        {
            parsedCharacters = new Dictionary <string, Character>();

            foreach (var sg in savegames)
            {
                Character skyrimPlayer;
                string    name = sg.GetPlayerName();
                if (parsedCharacters.ContainsKey(name))
                {
                    skyrimPlayer = parsedCharacters[name];
                }
                else
                {
                    skyrimPlayer           = new Character();
                    skyrimPlayer.Name      = name;
                    skyrimPlayer.Race      = sg.GetPlayerRace();
                    parsedCharacters[name] = skyrimPlayer;
                }
                CharacterSnapshot        snap  = ParseCharacterSnapshot(sg);
                List <CharacterSnapshot> snaps = new List <CharacterSnapshot>();
                if (skyrimPlayer.Snapshot != null)
                {
                    snaps.AddRange(skyrimPlayer.Snapshot);
                }
                snaps.Add(snap);
                skyrimPlayer.Snapshot = snaps.ToArray();
            }

            CharacterList charList = new CharacterList();

            charList.Character = parsedCharacters.Values.ToArray();
            foreach (Character c in charList.Character)
            {
                c.Snapshot = c.Snapshot.OrderBy(snap => snap.Id).ToArray();
            }
            return(charList);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// generate a snapshot package the specified character and freeze the character if it's a migration.
        /// </summary>
        /// <returns></returns>
        public static async Task <PackageMetadata> CreatePackage(PackageMetadata metadata)
        {
            metadata.Cookie = ThreadSafeRandom.NextString(TransferManagerConstants.CookieChars, TransferManagerConstants.CookieLength);

            // obtain character snapshot
            CharacterSnapshot             snapshot = new CharacterSnapshot();
            TaskCompletionSource <object> tsc      = new TaskCompletionSource <object>();

            OfflinePlayer offlinePlayer = PlayerManager.GetOfflinePlayer(metadata.CharacterId);

            if (offlinePlayer == null)
            {
                return(null); // character must be logged out
            }
            snapshot.Player = offlinePlayer.Biota;
            DatabaseManager.Shard.GetCharacters(metadata.AccountId, false, new Action <List <Character> >(new Action <List <Character> >((chars) =>
            {
                snapshot.Character = chars.FirstOrDefault(k => k.Id == metadata.CharacterId);

                if (snapshot.Character == null)
                {
                    tsc.SetResult(new object());
                    return;
                }

                if (snapshot.Character.IsReadOnly)
                {
                    snapshot.Character = null;
                    tsc.SetResult(new object());
                    return;
                }

                if (metadata.PackageType == PackageType.Migrate)
                {
                    // place character in migrating state
                    snapshot.Character.IsReadOnly = true;
                    DatabaseManager.Shard.SaveCharacter(snapshot.Character, new ReaderWriterLockSlim(), null);
                }

                DatabaseManager.Shard.GetPossessedBiotasInParallel(snapshot.Character.Id, new Action <PossessedBiotas>((pb) =>
                {
                    snapshot.PossessedBiotas = pb;
                    tsc.SetResult(new object());
                }));
            })));
            await tsc.Task;

            if (snapshot.Character == null)
            {
                return(null); // character not found
            }

            // prepare scratch directory
            string basePath = Path.Combine(TransferManagerUtil.EnsureTransferPath(log), metadata.Cookie);

            Directory.CreateDirectory(basePath);

            // serialize, save, and sign
            string playerPath = Path.Combine(basePath, snapshot.Player.Id + ".json");

            File.WriteAllText(playerPath, JsonConvert.SerializeObject(snapshot.Player, TransferManagerUtil.GetSerializationSettings()));
            CertificateManager.SignFile(playerPath);
            foreach (Biota biota in snapshot.PossessedBiotas.Inventory.Union(snapshot.PossessedBiotas.WieldedItems))
            {
                string biotaPath = Path.Combine(basePath, biota.Id + ".json");
                File.WriteAllText(biotaPath, JsonConvert.SerializeObject(biota, TransferManagerUtil.GetSerializationSettings()));
                CertificateManager.SignFile(biotaPath);
            }

            string metaPath = Path.Combine(basePath, "packinfo.json");

            File.WriteAllText(metaPath, JsonConvert.SerializeObject(metadata, TransferManagerUtil.GetSerializationSettings()));
            CertificateManager.SignFile(metaPath);

            CertificateManager.ExportCert(Path.Combine(basePath, "signer.crt"));

            // compress
            metadata.FilePath = Path.Combine(TransferManagerUtil.EnsureTransferPath(log), metadata.Cookie + ".zip");
            ZipFile.CreateFromDirectory(basePath, metadata.FilePath);

            // cleanup
            Directory.Delete(basePath, true);

            // save
            DatabaseManager.Shard.SaveCharacterTransfer(new CharacterTransfer()
            {
                AccountId       = metadata.AccountId,
                PackageSourceId = metadata.CharacterId,
                TransferType    = (uint)metadata.PackageType,
                TransferTime    = (ulong)Time.GetUnixTime(),
                Cookie          = metadata.Cookie,
            }, new ReaderWriterLockSlim(), null);

            return(metadata);
        }
Ejemplo n.º 6
0
 public static IBuff Bleeding(CharacterSnapshot source, float period, float duration, int damagePerTick)
 {
     return(new DamageOverTime("Bleeding", source, period, duration, damagePerTick, DamageType.Physical));
 }
 /// <summary>
 ///     Default constructor.
 /// </summary>
 public CharacterSnapshotEvent()
 {
     Snapshot = new CharacterSnapshot();
 }
 /// <summary>
 ///     Constructor letting the user specify the character snapshot to use.
 /// </summary>
 /// <param name="snap"></param>
 public CharacterSnapshotEvent(CharacterSnapshot snap)
 {
     Snapshot = snap;
 }
Ejemplo n.º 9
0
 public void SetState(CharacterSnapshot snapshot)
 {
     rewindSystem.RestoreSnapshot(snapshot.Turn);
     activateButton.interactable = false;
     Close();
 }