ace/Source/ACE.DatLoader/DatDatabase.cs

170 lines
5.8 KiB
C#
Raw Permalink Normal View History

Major migration from .net framework 4.6.1 to .net standard/core 2.0 (#573) * Remove files not referenced by their project (rogue files) These existed in the repo but weren't included in the ACE.Entity project: ACE.Entity\ILandBlock.cs ACE.Entity\WeenieAnimationOverride.cs ACE.Entity\WeeniePalletOverride.cs ACE.Entity\WeenieTextureMapOverride.cs When converting to .net standard, these files will be included in the projects again due to the way .net core/standard project files behave. They include all files in the local paths. Unlike .net framework csproj files, there is no list of files the project maintains. * Remove Settings.StyleCop from child folders I believe only the Settings.StyleCop in the root folder is needed, and will take effect for all child projects in the solution. * ACE.Common and ACE.Entity converted to .net standard 2.0 * ACE.DatLoader switched to .net standard 2.0 This includes the removal of: ACE.DatLoader\default.ruleset which I believe to be a rogue file. * ACE.CmdLineLauncher now .net core 2.0 To launch it from a command line use: dotnet ACE.CmdLineLauncher.dll This commit also removes AnyCPU from ACE.Common, ACE.DatLoader and ACE.Entity * ACE.DatLoader.Tests converted to .net standard 2.0 The project icon for ACE.DatLoader.Tests is no longer a C# icon with a half full flask. Not sure if there is any significance with that. * ACE.Tests converted to .net standard 2.0 Just like the other test project I converted, the C# Flask icon for the project is gone and now it's just a C# icon. * ACE.Database.Tests converted to .net standard 2 Same project icon issue as noted in the previous test conversions. * ACE.Database converted to .net standard 2.0 ACE.Database\Redeploy.cs -> CheckLocalDataPath() File permission checking has been commented out as it's not supported in .net standard/core. ACE: MySql.Data package updated to 6.10.4 * ACE: Remove GameMessageMotion.cs (rogue file) * ACE: Remove ACE.Diagnostics reference ACE.Diagnostics is a winforms app and not available to .net core 2.0 We need a better way to expose diagnostic information anyway. ACE should not be referencing ACE.Diagnostics * ACE.Tests changed to a .net core 2.0 project When ACE is changed to .net core 2.0, it's test must also be .net core 2.0. * ACE.Database: Remove MySqlResult MySqlResult inherited from DataTable and added a property and a couple functions, but they were never used, thus, MySqlResult isn't needed. * Update remaining MySql.Data references to 6.10.1 * Force appveyor to use VS 2017 * Remove unused System.Net.Http reference from projects. ACE.Api.Common ACE.Api.Host ACE.Api ACE.AuthApi.Host ACE.AuthApi Ace * Fix appveyor test paths. * ACE: DataTableExtensions added with Load fix for .net core 2.0 * Changelog * AppVeyor test fix maybe * Change ACE.Database.Tests and ACE.DatLoader.Tests to .net core 2.0 + test NuGet dependancies * ACE.Database: DataTableExtensions improved Rawaho method is better than Mag-nus method. * AppVeyor fix that's just cosmetic. Tests still don't actually exec. * AppVeyor test * Appveyor test * AppVeyor test * Switch AppVeyor from vstest.console to dotnet test * AppVeyor another test * AppVeyor test * AppVeyor final fix maybe? * AppVeyor: Went wrong way with directories... * AppVeyor almost there... * AppVeyor fatt fingers maybe? * ACE.CmdLineLauncher -> ACE.ACClientLauncher
2017-12-04 18:10:33 -06:00
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using log4net;
using ACE.DatLoader.FileTypes;
namespace ACE.DatLoader
{
public class DatDatabase
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private const uint DAT_HEADER_OFFSET = 0x140;
public string FilePath { get; }
Add support for client DAT patching from server (#3979) * Update DatFile.cs * Update DatFileType.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDBeginDDD.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDDataMessage.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update DDDHandler.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update Program.cs * committing changes provided Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * more wip changes * Update DDDManager.cs * Update DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update DDDHandler.cs * Update Session.cs * Update DDDManager.cs * Update Session.cs * Update DDDManager.cs * Update DDDManager.cs * Update GameMessageDDDDataMessage.cs * Update DDDHandler.cs * Update Session.cs * Update CAllIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create PTaggedIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update Session.cs * Update ConnectionListener.cs * Create DDDConfiguration.cs * Update MasterConfiguration.cs * Update Config.js.example * Update DDDManager.cs * Update DDDHandler.cs * Update Program.cs * Update PropertyManager.cs * Update WorldManager.cs * Update SessionTerminationReason.cs * Update DDDHandler.cs * Update DDDManager.cs * Update ConnectionListener.cs * Update SessionTerminationReason.cs * Update GameMessageDDDDataMessage.cs * Update AuthenticationHandler.cs * Update CharacterHandler.cs * Update PacketInboundLoginRequest.cs * Update Session.cs * Update DatFileType.cs --------- Co-authored-by: OptimShi <OptimShi@users.noreply.github.com>
2023-06-09 13:15:10 -04:00
public int Iteration { get { return GetTotalIterations(); } }
private FileStream stream { get; }
private static readonly object streamMutex = new object();
public DatDatabaseHeader Header { get; } = new DatDatabaseHeader();
public DatDirectory RootDirectory { get; }
public Dictionary<uint, DatFile> AllFiles { get; } = new Dictionary<uint, DatFile>();
Object overhaul (#384) * Object overhaul - clean up enums (#337) * Give property enums a static value to aviod positional fubar later on. Cleaned up using. * Cleaning up enums * Fixed Line ending update change log. * Review & Comment only || Object overhaul - POC (#339) * Give property enums a static value to aviod positional fubar later on. Cleaned up using. * Cleaning up enums * Fixed Line ending update change log. * Added new positionType * Started work on implementing object overhaul - want to make sure I am heading in the right direction. * Minor clean up, responded to feedback and fixed a few bugs. Thanks for the second and third set of eyes. * Object Overhaul - ready for review and merge. Still Work in Progress but a good spot. (#341) * Give property enums a static value to aviod positional fubar later on. Cleaned up using. * Cleaning up enums * Fixed Line ending update change log. * Added new positionType * Started work on implementing object overhaul - want to make sure I am heading in the right direction. * Minor clean up, responded to feedback and fixed a few bugs. Thanks for the second and third set of eyes. * Continued work. Please review as these are a LOT of manual changes. Compiles and you can log in. * Continued work. I have all of the items pulling from properties now. Still work to make baseAceObject and AceObject on thing / finish work around workmanship and actually kick the tires and start pulling data. Sorry this is taking so long. * Had time for a few more and cleaned up whitespace. * Good point to check in. All of the property tables are hooked up and loading data. I created the workmanship hackery we discussed. As always comments and suggestions much appreciated. * One quick shot to fix appveyor before bed. * * Continued work on Overhaul * Created mapping cross reference file to faciltate docuatation and cleaning up names - work in progress https://goo.gl/eaaNQb * Created new database schema for world_object - modified mysqlinstall.bat to refect new baseline * created script to ETL old schema to new schema. I have not included it as we will be refactoring the initial data load to use the new * schema according to Ripley. I have the script tested and posted on my dropbox if anyone wants it. I also have a complete data dump that * zips down to a manageable size. * BaseAceObject is now using the new schema * I re-hooked up telepoi to use the new schema. Still to do, convert to constructed statement * Next steps - refactor AceObject and make sure world objects load again. * Once that is complete - start same process using clone of this schema for character as discussed. * renabled more data loading. * Continued work on hooking data back up. Working on moveto debug command - this creates a world object. Not quite there yet. * WIP * Making progress. Test object able to be spwaned from new schema. Still to do, renable constructed statements, clean up and re-enable the other constructed statements. * updated worldbase * * Intital work done for new schema. Rebased and removed update sql files. (#353) * Tested and the auto setting of Physics and Weenie Header Flags looks really solid. Side note, the values we have * in the database for weenieHeaderFlags and PhysicsDescriptionFlag should probably be dropped we don't read them or use them now. * Doors, portals NPC's and signs are all back in the world now. * I would suggest we remearge with the main branch sooner rather than later - we can create another branch to introduce these * changes into the character side. * TODO items: * Creature spawns need to be refactored - I left them commented out. We need to ditch seperate tables that we have now, I think all * creature can use what we have now, plus maybe two additional world tables. Everything else fits into the current schema. * Test Ripley data and update ACE_World. * Refactor portals - I just left the old way in and faked it out with a view. * Once this looks good and stable and we fix any found bugs - we need to clone this over to the character database and start refactoring * That will get us to persisted inventory. * Objects - Game data refactored - issue with character login (#355) * wip * WIP - character login is trying to persist a world object * Still throwing an exception on player login. * Working Code - finished GameData - need to complete PhysicsData and ModelData. Thanks to @Lidefeath for finding my issue. * WIP compiles but has error on run. Data changes have broken something. Will fix tomorrow. * Wip - nothing really working yet. I can log in but item creation is not working. * Objects (#357) * wip * WIP - character login is trying to persist a world object * Still throwing an exception on player login. * Working Code - finished GameData - need to complete PhysicsData and ModelData. Thanks to @Lidefeath for finding my issue. * WIP compiles but has error on run. Data changes have broken something. Will fix tomorrow. * Wip - nothing really working yet. I can log in but item creation is not working. * Best attempt stabbed (#358) * wip 1 * wip 2 * wip 3 * wip 3 * i think thats it for now. good luck! * Read cached characters and launch to char list (#360) * First corrections and commenting out so the start to command line works * The basics for launching to character list is working. * Edit config.json for AppVeyor * Rework Base SQL scripts. (#361) Expect broken execution until views are corrected for ace_shard * Cleaning up error list (#362) Clearing stylecop issues and warnings in Error List * ACE Enum adjustments (#363) * More Enum Adjustments (#364) * More Enum Adjustments * Further Enum Refinement * Changed Enum Value * More Enum and Object Realignment (#365) * Adding Enums to better align with AC standards. GroupTypeChat and AccessLevel will be converted to these. * Object level changes to go with enum resorting * Extend ORM to allow aggregate functions i.e. MAX(column) and (#366) * Extend ORM to allow aggregate functions i.e. MAX(column) and implement GetNextCharacterId * For AppVeyor, thanks @ogmage78 for the sql * Implements IsCharacterNameAvailable and fixes some errors in the chargen code. (#367) * Character Loading (#368) * Cleaned up some whitespace issues. Still understanding the direction. * WIP added enums for PropertyAttribute * Wip got a lot of aceCharacter done - working on position - about 1/2 done. * WIP - Ace Character Loading. * Intital work done for loading character from ace_shard. Rebased and removed update sql files. * Tested up to position loading. Made changes to position, but have not loaded the dictionary yet. * Fixed a few bugs - attribute loading had a few. * TODO items: * Finish up loading positions then see what is left. * Work on saving as OptimShi - has character creation ready to go. * Fixed for rebase and apveyor * Hand wrote view per request and removed unneeded position. * Read character creation values from client_portal.dat (#369) * Read character creation values from client_portal.dat and assign to appropriate Character Properties * Added AceCharacter properties for the character appearance data * More fun in Zombieland - character loading. (#370) * [Og II] * Continued work loading character from ace_shard. Rebased * Added cascade delete to all child tables in ace_shard. * Completed and tested up to skillz loading. Made a few changes on the db side for key consistancy. * TODO items: * Finish up loading - spells, friends, allegiance info, spell comps, spell bars etc. etc.... * Fixed bug in setXXXProperty methods with the add new. Was not setting the AceObjectId * Fixed auto inc and unsealed position class and made aceObjectId virtual again. * SaveObject implemented in ShardDatabase.cs (#371) * First steps of SaveObject * Hopefully I didn't bork anything too hard. * Character creation -- data present on save appears to make its way to the DB. Thanks to Lidefeath for the starter here. * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Cleanup of DbGetListAttribute (#372) * First steps of SaveObject * Hopefully I didn't bork anything too hard. * Character creation -- data present on save appears to make its way to the DB. Thanks to Lidefeath for the starter here. * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Reworked DbGetListAttribute, got rid of hacky code. * Forgot to remove sloppy comments from refactoring. * Create Database.cs * Fix the "You do not own this character" error. (#373) * Refactoring, save/restore progress on object overhaul (#375) * First steps of SaveObject * added todo * Hopefully I didn't bork anything too hard. * Character creation -- data present on save appears to make its way to the DB. Thanks to Lidefeath for the starter here. * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Working on player login. Getting closer. At SendSelf in player.cs * Reworked DbGetListAttribute, got rid of hacky code. * Forgot to remove sloppy comments from refactoring. * Create Database.cs * Continued work on character login. A little closer - we can get into the world now. Please see change log for list of outstanding items. * Can log in, and walk around. Some properties still wrong. Still need to submit several DB level fixes. * Many fixups/bugfixes. Positions now save. Character logs in. Game doesn't crash. Can open multiple sessions. (some) ORM issues fixed Issues: World Objects still don't appear in game. Race found in ShardDatabase (commented) * Minor cleanups. * Object overhaul (#376) * First steps of SaveObject * added todo * Hopefully I didn't bork anything too hard. * Character creation -- data present on save appears to make its way to the DB. Thanks to Lidefeath for the starter here. * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Removed all references to SaveCharacterOptions -- replace with SaveObject(). * Working on player login. Getting closer. At SendSelf in player.cs * Reworked DbGetListAttribute, got rid of hacky code. * Forgot to remove sloppy comments from refactoring. * Create Database.cs * Continued work on character login. A little closer - we can get into the world now. Please see change log for list of outstanding items. * Can log in, and walk around. Some properties still wrong. Still need to submit several DB level fixes. * Many fixups/bugfixes. Positions now save. Character logs in. Game doesn't crash. Can open multiple sessions. (some) ORM issues fixed Issues: World Objects still don't appear in game. Race found in ShardDatabase (commented) * Properly load Data Id instances. Objects now "spawn" in-world, but don't interact properly. * Fixes to worldbase vw_teleport_location, player description, character handler. Player now gets proper stats and can teleportpoi. Vital inital values are off. * Sets options on load. May be bad/broken. Need to seriously think how AceObject/AceCharacter and WorldObject/Player should interact. We don't do that well now. * Fix to attribute2nd, using uint24 instead of uint16 for value (because monster's health can get huuuge). * Position refactor into backend object AceObjectPropertiesPosition and front-end object Position. * * fixed issues with the weenieHeaderFlags setting method, fixed PhysicsDescriptionFlag setting issue as well. * cleaned up and rebased data scripts for WorldBase and ShardBase * Found issue in my data that was ETL to our new schema - had two flag fields Reversed - that is fixed but would be no issue * once we have Ripley's new data export. I have shared out a link to the cleaned up data for use while we finish the new export. * https://www.dropbox.com/s/pohcruvalt9s38h/WorldandShardData.zip?dl=0 * I put in a nasty hack - hard coded weenieClassId on character save - it was being set to 0 and I could not find it. I marked with with a todo. * player.cs line 490 * Create Landblock.cs * Updated changelog * Fear the Walking Dead - More work on our object overhaul - bug fixes and continued work (#377) * Testing - fixed a few null reference check errors. Added in OptimShi player apperance code. * added back code needed for ci * Sending DataId and InstanceId data to character description. * Forgot to update change log * Added Ripley's changes to scheam * Create ShardBase.sql * Create WorldBase.sql * Made requested changes * Lord BucketHead - temp fix. Added start of equipping items and POC code (#378) * * Added getting and setting ContainerID and Wielder into AceObject and surfaced in worldObject * Put in a hack to show how equiped weapons and shields work. We will need to establish a place to store this data. * I put in big TODO to indentify the hack - it is benign and will not impact anything else other than to demo the placement * of the spear in Rand the Game Hunters hand in Holtburg. * Modified SetPhysicsDescriptionFlags so it can be container and weilder aware. * Worked with OptimShi and we put in a fix for Lord BucketHead. * Found and fixed one more bug with hair styles * Update Player.cs removed comment that was out of date. * SQL Scripts Re-based (#379) * SQL Scripts Rebased * More alignment of base DB script. * Final SQL script rebase * Code cleanup and a few bug fixes. (#380) * Code cleanup and a few bug fixes. Working to trello card. Board updated. * Added first part of wield item. * Update to remove class diagram * Update GameActionGetAndWieldItem.cs * Update GameEventWieldItem.cs * Fixed Position Saving. (#381) * Fixed Position Saving. * Fixed other minor character initialization bugs * Cleanup backing AceObject (#382) * Reworked AceObject/Player/WorldObject to better repsect AceObject as a unit backing. * Enough cleanup to commit. Fixed vitals (Attribute2nd) in the process. * Fixed bad rebase errors. Appears to work now. Can confirm vitals (Attribute2nds) initialize well, and can be raised. * Fixed bug with player creation and made a bunch of comments and notes about things I discovered so they would not get lost. (#383)
2017-06-16 09:54:39 -04:00
public ConcurrentDictionary<uint, FileType> FileCache { get; } = new ConcurrentDictionary<uint, FileType>();
public DatDatabase(string filePath, bool keepOpen = false)
{
if (!File.Exists(filePath))
throw new FileNotFoundException(filePath);
FilePath = filePath;
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
stream.Seek(DAT_HEADER_OFFSET, SeekOrigin.Begin);
using (var reader = new BinaryReader(stream, System.Text.Encoding.Default, true))
Header.Unpack(reader);
RootDirectory = new DatDirectory(Header.BTree, Header.BlockSize);
RootDirectory.Read(stream);
if (!keepOpen)
{
stream.Close();
stream.Dispose();
stream = null;
}
RootDirectory.AddFilesToList(AllFiles);
}
/// <summary>
/// This will try to find the object for the given fileId in local cache. If the object was not found, it will be read from the dat and cached.<para />
/// This function is thread safe.
/// </summary>
public T ReadFromDat<T>(uint fileId) where T : FileType, new()
{
// Check the FileCache so we don't need to hit the FileSystem repeatedly
if (FileCache.TryGetValue(fileId, out FileType result))
return (T)result;
var datReader = GetReaderForFile(fileId);
var obj = new T();
if (datReader != null)
{
using (var memoryStream = new MemoryStream(datReader.Buffer))
using (var reader = new BinaryReader(memoryStream))
obj.Unpack(reader);
}
// Store this object in the FileCache
obj = (T)FileCache.GetOrAdd(fileId, obj);
return obj;
}
public DatReader GetReaderForFile(uint fileId)
{
if (AllFiles.TryGetValue(fileId, out var file))
{
DatReader dr;
if (stream != null)
{
lock (streamMutex)
dr = new DatReader(stream, file.FileOffset, file.FileSize, Header.BlockSize);
}
else
dr = new DatReader(FilePath, file.FileOffset, file.FileSize, Header.BlockSize);
return dr;
}
if ((fileId & 0xFFFF) == 0xFFFE) // These are LandBlockInfo objects. Not every landblock has extra info (buildings, etc..)
{
//log.DebugFormat("Unable to find object_id {0:X8} in {1}", fileId, Enum.GetName(typeof(DatDatabaseType), Header.DataSet));
}
else
log.InfoFormat("Unable to find object_id {0:X8} in {1}", fileId, Enum.GetName(typeof(DatDatabaseType), Header.DataSet));
return null;
}
public void ExtractCategorizedPortalContents(string path)
{
foreach (KeyValuePair<uint, DatFile> entry in AllFiles)
{
string thisFolder;
if (entry.Value.GetFileType(DatDatabaseType.Portal) != null)
thisFolder = Path.Combine(path, entry.Value.GetFileType(DatDatabaseType.Portal).ToString());
else
thisFolder = Path.Combine(path, "UnknownType");
if (!Directory.Exists(thisFolder))
Directory.CreateDirectory(thisFolder);
string hex = entry.Value.ObjectId.ToString("X8");
string thisFile = Path.Combine(thisFolder, hex + ".bin");
// Use the DatReader to get the file data
DatReader dr = GetReaderForFile(entry.Value.ObjectId);
File.WriteAllBytes(thisFile, dr.Buffer);
}
}
/// <summary>
/// Gets the latest iteration from the dat file (basically, it functions like internal versioning system)
///
/// Per InterrogationResponse generate by the client:
/// PORTAL.DAT is 2072
/// client_English.dat (idDatFile.Type = 1, idDatFile.Id = 3) = 994
/// Cell.dat is 982
///
/// For final end-of-retail dat files, this returns:
/// Cell: 982
/// portal: 2072
/// highres: 497
/// Language: 994
/// </summary>
/// <returns>The iteration from the dat file, or 0 if there was an error</returns>
Add support for client DAT patching from server (#3979) * Update DatFile.cs * Update DatFileType.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDBeginDDD.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDDataMessage.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update DDDHandler.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update Program.cs * committing changes provided Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * more wip changes * Update DDDManager.cs * Update DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update DDDHandler.cs * Update Session.cs * Update DDDManager.cs * Update Session.cs * Update DDDManager.cs * Update DDDManager.cs * Update GameMessageDDDDataMessage.cs * Update DDDHandler.cs * Update Session.cs * Update CAllIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create PTaggedIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update Session.cs * Update ConnectionListener.cs * Create DDDConfiguration.cs * Update MasterConfiguration.cs * Update Config.js.example * Update DDDManager.cs * Update DDDHandler.cs * Update Program.cs * Update PropertyManager.cs * Update WorldManager.cs * Update SessionTerminationReason.cs * Update DDDHandler.cs * Update DDDManager.cs * Update ConnectionListener.cs * Update SessionTerminationReason.cs * Update GameMessageDDDDataMessage.cs * Update AuthenticationHandler.cs * Update CharacterHandler.cs * Update PacketInboundLoginRequest.cs * Update Session.cs * Update DatFileType.cs --------- Co-authored-by: OptimShi <OptimShi@users.noreply.github.com>
2023-06-09 13:15:10 -04:00
private int GetTotalIterations()
{
var iteration = ReadFromDat<Iteration>(FileTypes.Iteration.FILE_ID);
Add support for client DAT patching from server (#3979) * Update DatFile.cs * Update DatFileType.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDBeginDDD.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create GameMessageDDDDataMessage.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update DDDHandler.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update Program.cs * committing changes provided Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * more wip changes * Update DDDManager.cs * Update DDDManager.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update WorldManager.cs * Update DDDHandler.cs * Update Session.cs * Update DDDManager.cs * Update Session.cs * Update DDDManager.cs * Update DDDManager.cs * Update GameMessageDDDDataMessage.cs * Update DDDHandler.cs * Update Session.cs * Update CAllIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update CMostlyConsecutiveIntSet.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Create PTaggedIterationList.cs Co-Authored-By: OptimShi <OptimShi@users.noreply.github.com> * Update Session.cs * Update ConnectionListener.cs * Create DDDConfiguration.cs * Update MasterConfiguration.cs * Update Config.js.example * Update DDDManager.cs * Update DDDHandler.cs * Update Program.cs * Update PropertyManager.cs * Update WorldManager.cs * Update SessionTerminationReason.cs * Update DDDHandler.cs * Update DDDManager.cs * Update ConnectionListener.cs * Update SessionTerminationReason.cs * Update GameMessageDDDDataMessage.cs * Update AuthenticationHandler.cs * Update CharacterHandler.cs * Update PacketInboundLoginRequest.cs * Update Session.cs * Update DatFileType.cs --------- Co-authored-by: OptimShi <OptimShi@users.noreply.github.com>
2023-06-09 13:15:10 -04:00
if (iteration.TotalIterations > 0)
{
if (iteration.Ints.Count > 1)
log.Error($"{FilePath} contains an incomplete dat file!");
return iteration.TotalIterations;
}
else
{
log.Error($"Unable to read iteration from {FilePath}");
return 0;
}
}
}
}