public static WorldPlayer Load(ZPackage pkg) { var worldPlayer = new WorldPlayer(); int num = pkg.ReadInt(); if (!ValheimVersion.IsPlayerVersionCompatible(num)) { return(null); } if (num >= 28) { worldPlayer.PlayerStats_kills = pkg.ReadInt(); worldPlayer.PlayerStats_deaths = pkg.ReadInt(); worldPlayer.PlayerStats_crafts = pkg.ReadInt(); worldPlayer.PlayerStats_builds = pkg.ReadInt(); } worldPlayer.WorldPlayerData.Clear(); int num2 = pkg.ReadInt(); for (int i = 0; i < num2; i++) { long key = pkg.ReadLong(); var worldPlayerData = new WorldPlayerData(); worldPlayerData.m_haveCustomSpawnPoint = pkg.ReadBool(); worldPlayerData.m_spawnPoint = pkg.ReadVector3(); worldPlayerData.m_haveLogoutPoint = pkg.ReadBool(); worldPlayerData.m_logoutPoint = pkg.ReadVector3(); if (num >= 30) { worldPlayerData.m_haveDeathPoint = pkg.ReadBool(); worldPlayerData.m_deathPoint = pkg.ReadVector3(); } worldPlayerData.m_homePoint = pkg.ReadVector3(); if (num >= 29 && pkg.ReadBool()) { worldPlayerData.m_mapData = pkg.ReadByteArray(); } worldPlayer.WorldPlayerData.Add(key, worldPlayerData); } worldPlayer.PlayerName = pkg.ReadString(); worldPlayer.PlayerId = pkg.ReadLong(); worldPlayer.StartSeed = pkg.ReadString(); if (pkg.ReadBool()) { var byteArray = pkg.ReadByteArray(); var playerPkg = new ZPackage(byteArray); worldPlayer.Player = PlayerReaderWriter.Load(playerPkg); } else { worldPlayer.Player = null; } return(worldPlayer); }
private bool LoadPlayerFromDisk() { try { ZPackage zpackage = this.LoadPlayerDataFromDisk(); if (zpackage == null) { ZLog.LogWarning((object)"No player data"); return(false); } int version = zpackage.ReadInt(); if (!Version.IsPlayerVersionCompatible(version)) { ZLog.Log((object)"Player data is not compatible, ignoring"); return(false); } if (version >= 28) { this.m_playerStats.m_kills = zpackage.ReadInt(); this.m_playerStats.m_deaths = zpackage.ReadInt(); this.m_playerStats.m_crafts = zpackage.ReadInt(); this.m_playerStats.m_builds = zpackage.ReadInt(); } this.m_worldData.Clear(); int num = zpackage.ReadInt(); for (int index = 0; index < num; ++index) { long key = zpackage.ReadLong(); PlayerProfile.WorldPlayerData worldPlayerData = new PlayerProfile.WorldPlayerData(); worldPlayerData.m_haveCustomSpawnPoint = zpackage.ReadBool(); worldPlayerData.m_spawnPoint = zpackage.ReadVector3(); worldPlayerData.m_haveLogoutPoint = zpackage.ReadBool(); worldPlayerData.m_logoutPoint = zpackage.ReadVector3(); if (version >= 30) { worldPlayerData.m_haveDeathPoint = zpackage.ReadBool(); worldPlayerData.m_deathPoint = zpackage.ReadVector3(); } worldPlayerData.m_homePoint = zpackage.ReadVector3(); if (version >= 29 && zpackage.ReadBool()) { worldPlayerData.m_mapData = zpackage.ReadByteArray(); } this.m_worldData.Add(key, worldPlayerData); } this.m_playerName = zpackage.ReadString(); this.m_playerID = zpackage.ReadLong(); this.m_startSeed = zpackage.ReadString(); this.m_playerData = !zpackage.ReadBool() ? (byte[])null : zpackage.ReadByteArray(); } catch (Exception ex) { ZLog.LogWarning((object)("Exception while loading player profile:" + this.m_filename + " , " + ex.ToString())); } return(true); }
/// <summary> /// Receive and handle an incoming package /// </summary> /// <param name="sender"></param> /// <param name="package"></param> internal void ReceivePackage(long sender, ZPackage package) { if (package == null || package.Size() <= 0) { return; } Logger.LogDebug($"[{ID}] Received package"); try { CacheExpirations.RemoveAll(kv => { if (kv.Key < DateTimeOffset.Now.Ticks) { PackageCache.Remove(kv.Value); return(true); } return(false); }); byte packageFlags = package.ReadByte(); if ((packageFlags & FRAGMENTED_PACKAGE) != 0) { long uniqueIdentifier = package.ReadLong(); string cacheKey = sender.ToString() + uniqueIdentifier; int fragment = package.ReadInt(); int fragments = package.ReadInt(); if (!PackageCache.TryGetValue(cacheKey, out SortedDictionary <int, byte[]> dataFragments)) { dataFragments = new SortedDictionary <int, byte[]>(); PackageCache[cacheKey] = dataFragments; CacheExpirations.Add(new KeyValuePair <long, string>(DateTimeOffset.Now.AddSeconds(60).Ticks, cacheKey)); } dataFragments.Add(fragment, package.ReadByteArray()); if (dataFragments.Count < fragments) { return; } PackageCache.Remove(cacheKey); package = new ZPackage(dataFragments.Values.SelectMany(a => a).ToArray()); packageFlags = package.ReadByte(); } ZNet.instance.StartCoroutine(HandlePackageRoutine(sender, package, packageFlags)); } catch (Exception e) { Logger.LogWarning($"[{ID}] Error caught while applying package: {e}"); } }
public static void Deserialize(this PlayerProfile profile, ZPackage data) { Debug.Assert(data.ReadInt() <= Version.m_playerVersion); profile.m_playerStats.m_kills = data.ReadInt(); profile.m_playerStats.m_deaths = data.ReadInt(); profile.m_playerStats.m_crafts = data.ReadInt(); profile.m_playerStats.m_builds = data.ReadInt(); profile.m_worldData.Clear(); int num = data.ReadInt(); for (int i = 0; i < num; i++) { long key = data.ReadLong(); PlayerProfile.WorldPlayerData worldPlayerData = (PlayerProfile.WorldPlayerData)Activator.CreateInstance(typeof(PlayerProfile.WorldPlayerData), true); worldPlayerData.m_haveCustomSpawnPoint = data.ReadBool(); worldPlayerData.m_spawnPoint = data.ReadVector3(); worldPlayerData.m_haveLogoutPoint = data.ReadBool(); worldPlayerData.m_logoutPoint = data.ReadVector3(); worldPlayerData.m_haveDeathPoint = data.ReadBool(); worldPlayerData.m_deathPoint = data.ReadVector3(); worldPlayerData.m_homePoint = data.ReadVector3(); if (data.ReadBool()) { worldPlayerData.m_mapData = data.ReadByteArray(); } profile.m_worldData.Add(key, worldPlayerData); } profile.m_playerName = data.ReadString(); profile.m_playerID = data.ReadLong(); if (profile.m_playerID == 0L) { profile.m_playerID = Utils.GenerateUID(); } profile.m_startSeed = data.ReadString(); if (data.ReadBool()) { profile.m_playerData = data.ReadByteArray(); } }
private IEnumerator HandlePackageRoutine(long sender, ZPackage package, byte packageFlags) { Logger.LogDebug($"[{ID}] Processing package"); try { ++ProcessingCount; if ((packageFlags & COMPRESSED_PACKAGE) != 0) { byte[] data = package.ReadByteArray(); MemoryStream input = new MemoryStream(data); MemoryStream output = new MemoryStream(); using (DeflateStream deflateStream = new DeflateStream(input, CompressionMode.Decompress)) { deflateStream.CopyTo(output); } package = new ZPackage(output.ToArray()); packageFlags = package.ReadByte(); Logger.LogDebug($"[{ID}] Decompressed package to length {output.Length}"); } if ((packageFlags & JOTUNN_PACKAGE) != JOTUNN_PACKAGE) { Logger.LogWarning($"[{ID}] Package flag does not equal {JOTUNN_PACKAGE} ({packageFlags:X4})"); yield break; } byte[] finalBytes = package.ReadByteArray(); ZPackage finalPackage = new ZPackage(finalBytes); package = finalPackage; if (!ZNet.instance.IsServer()) { yield return(OnClientReceive(sender, package)); } else { yield return(OnServerReceive(sender, package)); } } finally { --ProcessingCount; } }
private static void RPC_ReceiveConfigsSellThat(ZRpc rpc, ZPackage pkg) { Log.LogTrace("Received package."); try { var serialized = pkg.ReadByteArray(); Log.LogTrace("Deserializing package."); using (MemoryStream memStream = new MemoryStream(serialized)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); var responseObject = binaryFormatter.Deserialize(memStream); if (responseObject is ConfigurationPackage configPackage) { Log.LogDebug("Received and deserialized config package"); Log.LogTrace("Unpackaging general config."); ConfigurationManager.GeneralConfig = (GeneralConfig)configPackage.GeneralConfig; Log.LogTrace("Successfully set general config."); Log.LogTrace("Unpackaging buy configs."); ConfigurationManager.TraderBuyConfig = (List <TraderBuyingConfig>)configPackage.BuyConfigs; Log.LogTrace("Successfully set buy configs."); Log.LogTrace("Unpacking sell configs"); ConfigurationManager.TraderSellConfig = (List <TraderSellConfig>)configPackage.SellConfig; Log.LogTrace("Successfully set sell configs."); } else { Log.LogWarning("Received bad config package. Unable to load."); } } } catch (Exception e) { Log.LogError("Error while attempting to read received config package.", e); } }
public static void Unpack(ZPackage package) { var serialized = package.ReadByteArray(); Log.LogDebug($"Deserializing package size: {serialized.Length} bytes"); using (MemoryStream memStream = new MemoryStream(serialized)) { using (var zipStream = new GZipStream(memStream, CompressionMode.Decompress, true)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); var responseObject = binaryFormatter.Deserialize(zipStream); if (responseObject is CompressedPackage compressedPackage) { compressedPackage.AfterUnpack(responseObject); } } } }
private static void RPC_ReceiveConfigsEnhancedProgressTracker(ZRpc rpc, ZPackage pkg) { Log.LogTrace("Received package."); try { var serialized = pkg.ReadByteArray(); Log.LogTrace("Deserializing package."); using (MemoryStream memStream = new MemoryStream(serialized)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); var responseObject = binaryFormatter.Deserialize(memStream); if (responseObject is ConfigurationPackage configPackage) { Log.LogDebug("Received and deserialized config package"); Log.LogTrace("Unpackaging general config."); ConfigurationManager.GeneralConfig = configPackage.GeneralConfig; Log.LogTrace("Successfully set general config."); Log.LogTrace("Unpackaging tribe configs."); ConfigurationManager.TribeConfigurations = configPackage.TribeConfig; Log.LogTrace("Successfully set tribe configs."); } else { Log.LogWarning("Received bad config package. Unable to load."); } } } catch (Exception e) { Log.LogError("Error while attempting to read received config package.", e); } }
public bool LoadPlayerFromDisk(out string error) { error = string.Empty; ZPackage zPackage = LoadPlayerDataFromDisk(); //backup DirectoryInfo dir = Directory.CreateDirectory("backup"); File.WriteAllBytes($"{dir.FullName}/{m_filename}", zPackage.GetArray()); if (zPackage == null) { error = "No player data"; return(false); } m_version = zPackage.ReadInt(); if (!VersionInfo.IsPlayerVersionCompatible(m_version)) { error = "Player data is not compatible, ignoring"; return(false); } if (m_version >= 28) { m_playerStats.m_kills = zPackage.ReadInt(); m_playerStats.m_deaths = zPackage.ReadInt(); m_playerStats.m_crafts = zPackage.ReadInt(); m_playerStats.m_builds = zPackage.ReadInt(); } int num2 = zPackage.ReadInt(); for (int i = 0; i < num2; i++) { long key = zPackage.ReadLong(); WorldPlayerData worldPlayerData = new WorldPlayerData(); worldPlayerData.m_haveCustomSpawnPoint = zPackage.ReadBool(); worldPlayerData.m_spawnPoint = zPackage.ReadVector3(); worldPlayerData.m_haveLogoutPoint = zPackage.ReadBool(); worldPlayerData.m_logoutPoint = zPackage.ReadVector3(); if (m_version >= 30) { worldPlayerData.m_haveDeathPoint = zPackage.ReadBool(); worldPlayerData.m_deathPoint = zPackage.ReadVector3(); } worldPlayerData.m_homePoint = zPackage.ReadVector3(); if (m_version >= 29 && zPackage.ReadBool()) { worldPlayerData.m_mapData = zPackage.ReadByteArray(); } m_worldData.Add(key, worldPlayerData); } m_playerName = zPackage.ReadString(); m_playerID = zPackage.ReadLong(); m_startSeed = zPackage.ReadString(); m_playerData = null; if (zPackage.ReadBool()) { m_playerData = zPackage.ReadByteArray(); } return(true); }
private void Deserialize(ZPackage pkg) { Version = pkg.ReadInt(); if (Version > LatestVersion) { LogError($"BetterContinents mod is out of date: world expects config version {Version}, mod config version is {LatestVersion}"); throw new Exception($"BetterContinents mod is out of date: world expects config version {Version}, mod config version is {LatestVersion}"); } WorldUId = pkg.ReadLong(); EnabledForThisWorld = pkg.ReadBool(); if (EnabledForThisWorld) { GlobalScale = pkg.ReadSingle(); MountainsAmount = pkg.ReadSingle(); SeaLevelAdjustment = pkg.ReadSingle(); MaxRidgeHeight = pkg.ReadSingle(); RidgeScale = pkg.ReadSingle(); RidgeBlendSigmoidB = pkg.ReadSingle(); RidgeBlendSigmoidXOffset = pkg.ReadSingle(); var heightmapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(heightmapFilePath)) { Heightmap = new ImageMapFloat(heightmapFilePath, pkg.ReadByteArray()); if (Version <= 4 && !Heightmap.CreateMapLegacy() || Version > 4 && !Heightmap.CreateMap()) { Heightmap = null; } HeightmapAmount = pkg.ReadSingle(); HeightmapBlend = pkg.ReadSingle(); HeightmapAdd = pkg.ReadSingle(); } OceanChannelsEnabled = pkg.ReadBool(); if (Version >= 2) { RiversEnabled = pkg.ReadBool(); //LakesEnabled = pkg.ReadBool(); var biomemapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(biomemapFilePath)) { Biomemap = new ImageMapBiome(biomemapFilePath, pkg.ReadByteArray()); if (!Biomemap.CreateMap()) { Biomemap = null; } } ForestScale = pkg.ReadSingle(); ForestAmountOffset = pkg.ReadSingle(); OverrideStartPosition = pkg.ReadBool(); StartPositionX = pkg.ReadSingle(); StartPositionY = pkg.ReadSingle(); } else { RiversEnabled = true; ForestScale = 1; ForestAmountOffset = 0; OverrideStartPosition = false; StartPositionX = 0; StartPositionY = 0; //LakesEnabled = true; } // Version 3 if (Version >= 3) { var spawnmapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(spawnmapFilePath)) { Spawnmap = new ImageMapSpawn(spawnmapFilePath, pkg); } } // Version 4 // (nothing) // Version 5 if (Version >= 5) { var roughmapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(roughmapFilePath)) { Roughmap = new ImageMapFloat(roughmapFilePath, pkg.ReadByteArray()); if (!Roughmap.CreateMap()) { Roughmap = null; } RoughmapBlend = pkg.ReadSingle(); } UseRoughInvertedAsFlat = pkg.ReadBool(); FlatmapBlend = pkg.ReadSingle(); if (!UseRoughInvertedAsFlat) { var flatmapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(flatmapFilePath)) { Flatmap = new ImageMapFloat(flatmapFilePath, pkg.ReadByteArray()); if (!Flatmap.CreateMap()) { Flatmap = null; } } } var forestmapFilePath = pkg.ReadString(); if (!string.IsNullOrEmpty(forestmapFilePath)) { Forestmap = new ImageMapFloat(forestmapFilePath, pkg.ReadByteArray()); if (!Forestmap.CreateMap()) { Forestmap = null; } ForestmapMultiply = pkg.ReadSingle(); ForestmapAdd = pkg.ReadSingle(); } DisableMapEdgeDropoff = pkg.ReadBool(); MountainsAllowedAtCenter = pkg.ReadBool(); ForestFactorOverrideAllTrees = pkg.ReadBool(); } // Version 6 if (Version >= 6) { HeightmapOverrideAll = pkg.ReadBool(); HeightmapMask = pkg.ReadSingle(); } else { HeightmapOverrideAll = false; HeightmapMask = 0; } } }