Fixed syncronization issues with events and warping.
This commit is contained in:
parent
c393752f05
commit
e503fb210c
|
@ -19,6 +19,8 @@ using System.Linq;
|
|||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace StardustCore
|
||||
{
|
||||
|
@ -44,6 +46,8 @@ namespace StardustCore
|
|||
|
||||
public bool playerJustDisconnected;
|
||||
|
||||
public bool justWarped;
|
||||
|
||||
public static string ContentDirectory;
|
||||
public override void Entry(IModHelper helper)
|
||||
{
|
||||
|
@ -87,10 +91,22 @@ namespace StardustCore
|
|||
|
||||
StardewModdingAPI.Events.GameEvents.UpdateTick += GameEvents_UpdateTick;
|
||||
|
||||
Helper.Events.Player.Warped += Player_Warped;
|
||||
|
||||
ModHelper.Events.GameLoop.ReturnedToTitle += GameLoop_ReturnedToTitle;
|
||||
|
||||
}
|
||||
|
||||
private void Player_Warped(object sender, StardewModdingAPI.Events.WarpedEventArgs e)
|
||||
{
|
||||
|
||||
SerializationManager.cleanUpInventory();
|
||||
//SerializationManager.cleanUpWorld();
|
||||
//SerializationManager.cleanUpStorageContainers();
|
||||
justWarped = true;
|
||||
}
|
||||
|
||||
|
||||
private void GameLoop_ReturnedToTitle(object sender, StardewModdingAPI.Events.ReturnedToTitleEventArgs e)
|
||||
{
|
||||
if (Game1.player != null)
|
||||
|
@ -247,6 +263,12 @@ namespace StardustCore
|
|||
ModMonitor.Log("Restore objects after peer disconnect!");
|
||||
SerializationManager.restoreAllModObjects(SerializationManager.trackedObjectList);
|
||||
}
|
||||
else if (justWarped && Game1.eventUp==false && Game1.activeClickableMenu==null)
|
||||
{
|
||||
justWarped = false;
|
||||
ModMonitor.Log("Restore objects after player warping!");
|
||||
SerializationManager.restoreAllModObjects(SerializationManager.trackedObjectList,true);
|
||||
}
|
||||
}
|
||||
|
||||
private void ControlEvents_KeyPressed(object sender, StardewModdingAPI.Events.EventArgsKeyPressed e)
|
||||
|
@ -261,10 +283,12 @@ namespace StardustCore
|
|||
{
|
||||
Game1.game1.Disposed += Game1_Disposed;
|
||||
|
||||
string invPath = Path.Combine(ModCore.ModHelper.DirectoryPath, "PlayerData", Game1.player.Name+"_"+Game1.player.uniqueMultiplayerID, "PlayerInventory");
|
||||
string worldPath = Path.Combine(ModCore.ModHelper.DirectoryPath, Game1.player.Name+"_"+Game1.player.uniqueMultiplayerID, "ObjectsInWorld"); ;
|
||||
string trashPath = Path.Combine(ModCore.ModHelper.DirectoryPath, "ModTrashFolder");
|
||||
string chestPath = Path.Combine(ModCore.ModHelper.DirectoryPath, "StorageContainers");
|
||||
string basePath=Path.Combine( ModCore.ModHelper.DirectoryPath, "PlayerData", Game1.player.Name + "_" + Game1.player.uniqueMultiplayerID);
|
||||
|
||||
string invPath = Path.Combine(basePath,"PlayerInventory");
|
||||
string worldPath = Path.Combine(basePath, "ObjectsInWorld");
|
||||
string trashPath = Path.Combine(basePath,"ModTrashFolder");
|
||||
string chestPath = Path.Combine(basePath, "StorageContainers");
|
||||
SerializationManager = new SerializationManager(invPath, trashPath, worldPath, chestPath);
|
||||
SerializationManager.initializeDefaultSuportedTypes();
|
||||
|
||||
|
|
|
@ -281,6 +281,7 @@ namespace StardustCore
|
|||
{
|
||||
performRemoveAction(this.TileLocation, this.thisLocation);
|
||||
who.addItemToInventory(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -571,6 +572,8 @@ namespace StardustCore
|
|||
{
|
||||
|
||||
}
|
||||
|
||||
this.thisLocation = null;
|
||||
base.performRemoveAction(tileLocation, environment);
|
||||
}
|
||||
|
||||
|
@ -1254,6 +1257,13 @@ namespace StardustCore
|
|||
/// <param name="I"></param>
|
||||
public static void Serialize(Item I)
|
||||
{
|
||||
|
||||
if((I as CoreObject).thisLocation != null)
|
||||
{
|
||||
SerializeToWorldPath(I);
|
||||
return;
|
||||
}
|
||||
|
||||
String savePath = ModCore.SerializationManager.playerInventoryPath;
|
||||
String fileName = I.Name + ".json";
|
||||
String resultPath = Path.Combine(savePath, fileName);
|
||||
|
@ -1271,6 +1281,26 @@ namespace StardustCore
|
|||
//StardustCore.ModCore.ModHelper.WriteJsonFile<CoreObject>(resultPath, (CoreObject)I);
|
||||
}
|
||||
|
||||
public static void SerializeToWorldPath(Item I)
|
||||
{
|
||||
String savePath = ModCore.SerializationManager.objectsInWorldPath;
|
||||
String fileName = I.Name + ".json";
|
||||
String resultPath = Path.Combine(savePath, fileName);
|
||||
int count = 0;
|
||||
while (File.Exists(resultPath))
|
||||
{
|
||||
resultPath = Serialization.SerializationManager.getValidSavePathIfDuplicatesExist(I, savePath, count);
|
||||
count++;
|
||||
}
|
||||
JsonSerializerSettings settings = new JsonSerializerSettings();
|
||||
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
|
||||
(I as CoreObject).textureName = (I as CoreObject).TextureSheet.Name;
|
||||
string json = JsonConvert.SerializeObject(I, Formatting.Indented, settings);
|
||||
System.IO.File.WriteAllText(resultPath, json);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Serializes the said item to a chest.
|
||||
/// </summary>
|
||||
|
|
|
@ -318,10 +318,11 @@ namespace StardustCore.Serialization
|
|||
/// Reloads all modded objects added by this mod back to the game in proper locations.
|
||||
/// </summary>
|
||||
/// <param name="thingsToAddBackIn"></param>
|
||||
public void restoreAllModObjects(List<IItemSerializeable> thingsToAddBackIn)
|
||||
public void restoreAllModObjects(List<IItemSerializeable> thingsToAddBackIn, bool onlyInventory=false)
|
||||
{
|
||||
processDirectoryForDeserialization(playerInventoryPath,thingsToAddBackIn);
|
||||
|
||||
processDirectoryForDeserialization(playerInventoryPath,thingsToAddBackIn);
|
||||
if (onlyInventory) return;
|
||||
|
||||
// Log.AsyncG("Done deserializing player inventory.");
|
||||
try
|
||||
|
@ -472,7 +473,7 @@ namespace StardustCore.Serialization
|
|||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
throw new Exception(err.ToString());
|
||||
//throw new Exception(err.ToString());
|
||||
return;
|
||||
}
|
||||
//Util.placementAction(cObj, cObj.thisLocation,(int)cObj.tileLocation.X,(int) cObj.tileLocation.Y,null,false);
|
||||
|
|
Loading…
Reference in New Issue