Got container objects to sync across the net which is good.

This commit is contained in:
JoshuaNavarro 2019-08-27 15:10:56 -07:00
parent 2f07190926
commit e0d61f19cc
14 changed files with 329 additions and 20 deletions

View File

@ -121,15 +121,21 @@ namespace Revitalize.Framework.Objects
{
get
{
//ModCore.log("Location Name is: " + this.info.locationName);
if (this._location == null)
{
this._location = Game1.getLocationFromName(this.info.locationName);
return this._location;
}
else
{
return Game1.getLocationFromName(this.info.locationName);
}
return this._location;
}
set
{
this._location = value;
if (this._location == null) this.info.locationName = "";
else
@ -168,10 +174,12 @@ namespace Revitalize.Framework.Objects
this.guid = Guid.Parse(guidString);
if (ModCore.CustomObjects.ContainsKey(this.guid))
{
//ModCore.log("Update item with guid: " + this.guid);
ModCore.CustomObjects[this.guid] = this;
}
else
{
//ModCore.log("Add in new guid: " + this.guid);
ModCore.CustomObjects.Add(this.guid,this);
}
@ -179,7 +187,7 @@ namespace Revitalize.Framework.Objects
{
if (ModCore.CustomObjects[oldGuid] == ModCore.CustomObjects[this.guid] && oldGuid != this.guid)
{
ModCore.CustomObjects.Remove(oldGuid);
//ModCore.CustomObjects.Remove(oldGuid);
}
}
}

View File

@ -155,7 +155,7 @@ namespace Revitalize.Framework.Objects.Extras
}
}
public override void pickUp()
public override void pickUp(Farmer who)
{
bool canPickUp = this.removeAndAddToPlayersInventory();
@ -163,7 +163,7 @@ namespace Revitalize.Framework.Objects.Extras
{
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
(pair.Value as ArcadeCabinetTile).removeFromLocation((pair.Value as ArcadeCabinetTile).location, pair.Key);
(pair.Value as ArcadeCabinetTile).removeFromLocation(who.currentLocation, pair.Key);
}
this.location = null;
}

View File

@ -143,6 +143,7 @@ namespace Revitalize.Framework.Objects.Furniture
public override void drawPlacementBounds(SpriteBatch spriteBatch, GameLocation location)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
if (!this.isPlaceable())

View File

@ -155,7 +155,7 @@ namespace Revitalize.Framework.Objects.Furniture
}
}
public override void pickUp()
public override void pickUp(Farmer Who)
{
bool canPickUp = this.removeAndAddToPlayersInventory();
@ -163,7 +163,7 @@ namespace Revitalize.Framework.Objects.Furniture
{
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
(pair.Value as LampTileComponent).removeFromLocation((pair.Value as LampTileComponent).location, pair.Key);
(pair.Value as LampTileComponent).removeFromLocation(Who.currentLocation, pair.Key);
}
this.location = null;
}

View File

@ -153,7 +153,7 @@ namespace Revitalize.Framework.Objects.Furniture
}
}
public override void pickUp()
public override void pickUp(Farmer who)
{
bool canPickUp = this.removeAndAddToPlayersInventory();
@ -161,7 +161,7 @@ namespace Revitalize.Framework.Objects.Furniture
{
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
(pair.Value as StorageFurnitureTile).removeFromLocation((pair.Value as StorageFurnitureTile).location, pair.Key);
(pair.Value as StorageFurnitureTile).removeFromLocation(who.currentLocation, pair.Key);
}
this.location = null;
}

View File

@ -155,7 +155,7 @@ namespace Revitalize.Framework.Objects.Furniture
}
}
public override void pickUp()
public override void pickUp(Farmer who)
{
bool canPickUp = this.removeAndAddToPlayersInventory();
@ -164,7 +164,7 @@ namespace Revitalize.Framework.Objects.Furniture
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
(pair.Value as TableTileComponent).clearHeldObject();
(pair.Value as TableTileComponent).removeFromLocation((pair.Value as TableTileComponent).location, pair.Key);
(pair.Value as TableTileComponent).removeFromLocation(who.currentLocation, pair.Key);
}
this.location = null;
}

View File

@ -50,6 +50,11 @@ namespace Revitalize.Framework.Objects.Furniture
this.Price = Info.price;
}
public override void updateWhenCurrentLocation(GameTime time, GameLocation environment)
{
base.updateWhenCurrentLocation(time, environment);
}
/// <summary>
/// Forcefully clears the held object without much fuss.
/// </summary>
@ -113,7 +118,11 @@ namespace Revitalize.Framework.Objects.Furniture
}
public override bool placementAction(GameLocation location, int x, int y, Farmer who = null)
{
this.updateInfo();
return base.placementAction(location, x, y, who);
}
public override bool performObjectDropInAction(Item dropInItem, bool probe, Farmer who)
{
return false; //this.pickUpItem()==PickUpState.DoNothing;
@ -235,7 +244,10 @@ namespace Revitalize.Framework.Objects.Furniture
public override Dictionary<string, string> getAdditionalSaveData()
{
Dictionary<string, string> saveData = base.getAdditionalSaveData();
if (this.containerObject.childrenGuids.ContainsKey(this.offsetKey))
{
Revitalize.ModCore.Serializer.SerializeGUID(this.containerObject.childrenGuids[this.offsetKey].ToString(), this);
}
this.containerObject.getAdditionalSaveData();
return saveData;
@ -251,7 +263,7 @@ namespace Revitalize.Framework.Objects.Furniture
y *= -1;
}
*/
this.updateInfo();
if (this.info == null)
{
Revitalize.ModCore.log("info is null");
@ -302,5 +314,22 @@ namespace Revitalize.Framework.Objects.Furniture
}
public override void draw(SpriteBatch spriteBatch, int xNonTile, int yNonTile, float layerDepth, float alpha = 1)
{
this.updateInfo();
base.draw(spriteBatch, xNonTile, yNonTile, layerDepth, alpha);
}
public override void drawInMenu(SpriteBatch spriteBatch, Vector2 location, float scaleSize, float transparency, float layerDepth, bool drawStackNumber, Color c, bool drawShadow)
{
this.updateInfo();
base.drawInMenu(spriteBatch, location, scaleSize, transparency, layerDepth, drawStackNumber, c, drawShadow);
}
public override void drawWhenHeld(SpriteBatch spriteBatch, Vector2 objectPosition, Farmer f)
{
this.updateInfo();
base.drawWhenHeld(spriteBatch, objectPosition, f);
}
}
}

View File

@ -5,6 +5,7 @@ using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using PyTK.CustomElementHandler;
using Revitalize.Framework.Utilities;
using StardewValley;
using StardewValley.Objects;
@ -12,6 +13,76 @@ namespace Revitalize.Framework.Objects
{
public class MultiTiledComponent : CustomObject,ISaveElement
{
public override string ItemInfo
{
get
{
string info = Revitalize.ModCore.Serializer.ToJSONString(this.info);
string guidStr = this.guid.ToString();
string offsetKey = this.offsetKey != null ? ModCore.Serializer.ToJSONString(this.offsetKey) : "";
string container=this.containerObject!=null? this.containerObject.guid.ToString():"";
return info+ "<" +guidStr+"<"+offsetKey+"<"+container;
}
set
{
if (string.IsNullOrEmpty(value)) return;
string[] data = value.Split('<');
string infoString = data[0];
string guidString = data[1];
string offsetVec = data[2];
string containerObject = data[3];
this.info = (BasicItemInformation)Revitalize.ModCore.Serializer.DeserializeFromJSONString(infoString, typeof(BasicItemInformation));
if (string.IsNullOrEmpty(offsetVec)) return;
if (string.IsNullOrEmpty(containerObject)) return;
this.offsetKey = ModCore.Serializer.DeserializeFromJSONString<Vector2>(offsetVec);
Guid oldGuid = this.guid;
this.guid = Guid.Parse(guidString);
if (ModCore.CustomObjects.ContainsKey(this.guid))
{
//ModCore.log("Update item with guid: " + this.guid);
ModCore.CustomObjects[this.guid] = this;
}
else
{
//ModCore.log("Add in new guid: " + this.guid);
ModCore.CustomObjects.Add(this.guid, this);
}
if (this.containerObject == null)
{
//ModCore.log(containerObject);
Guid containerGuid = Guid.Parse(containerObject);
if (ModCore.CustomObjects.ContainsKey(containerGuid))
{
this.containerObject = (MultiTiledObject)ModCore.CustomObjects[containerGuid];
this.containerObject.removeComponent(this.offsetKey);
this.containerObject.addComponent(this.offsetKey, this);
//ModCore.log("Set container object from existing object!");
}
else
{
//ModCore.log("Container hasn't been synced???");
MultiplayerUtilities.RequestGuidObject(containerGuid);
MultiplayerUtilities.RequestGuidObject_Tile(this.guid);
}
}
else
{
this.containerObject.updateInfo();
}
if (ModCore.CustomObjects.ContainsKey(oldGuid) && ModCore.CustomObjects.ContainsKey(this.guid))
{
if (ModCore.CustomObjects[oldGuid] == ModCore.CustomObjects[this.guid] && oldGuid != this.guid)
{
//ModCore.CustomObjects.Remove(oldGuid);
}
}
}
}
public MultiTiledObject containerObject;
public Vector2 offsetKey;
@ -29,6 +100,10 @@ namespace Revitalize.Framework.Objects
this.containerObject = obj;
}
public override void updateWhenCurrentLocation(GameTime time, GameLocation environment)
{
base.updateWhenCurrentLocation(time, environment);
}
public override bool isPassable()
{
return this.info.ignoreBoundingBox || Revitalize.ModCore.playerInfo.sittingInfo.SittingObject == this.containerObject;
@ -43,7 +118,7 @@ namespace Revitalize.Framework.Objects
public override bool clicked(Farmer who)
{
//ModCore.log("Clicked a multiTiledComponent!");
this.containerObject.pickUp();
this.containerObject.pickUp(who);
return true;
//return base.clicked(who);
}
@ -82,6 +157,7 @@ namespace Revitalize.Framework.Objects
/// <summary>Places an object down.</summary>
public override bool placementAction(GameLocation location, int x, int y, Farmer who = null)
{
this.updateInfo();
this.updateDrawPosition(x, y);
this.location = location;
@ -110,6 +186,7 @@ namespace Revitalize.Framework.Objects
public override void drawInMenu(SpriteBatch spriteBatch, Vector2 location, float scaleSize, float transparency, float layerDepth, bool drawStackNumber, Color c, bool drawShadow)
{
this.updateInfo();
if (drawStackNumber && this.maximumStackSize() > 1 && ((double)scaleSize > 0.3 && this.Stack != int.MaxValue) && this.Stack > 1)
Utility.drawTinyDigits(this.Stack, spriteBatch, location + new Vector2((float)(Game1.tileSize - Utility.getWidthOfTinyDigitString(this.Stack, 3f * scaleSize)) + 3f * scaleSize, (float)((double)Game1.tileSize - 18.0 * (double)scaleSize + 2.0)), 3f * scaleSize, 1f, Color.White);
if (drawStackNumber && this.Quality > 0)
@ -188,7 +265,12 @@ namespace Revitalize.Framework.Objects
saveData.Add("ParentGUID", this.containerObject.guid.ToString());
saveData.Add("GUID", this.guid.ToString());
if (this.containerObject.childrenGuids.ContainsKey(this.offsetKey))
{
Revitalize.ModCore.Serializer.SerializeGUID(this.containerObject.childrenGuids[this.offsetKey].ToString(), this);
}
this.containerObject.getAdditionalSaveData();
return saveData;
@ -210,6 +292,7 @@ namespace Revitalize.Framework.Objects
/// <summary>What happens when the object is drawn at a tile location.</summary>
public override void draw(SpriteBatch spriteBatch, int x, int y, float alpha = 1f)
{
this.updateInfo();
if (this.info.ignoreBoundingBox == true)
{
x *= -1;
@ -265,7 +348,23 @@ namespace Revitalize.Framework.Objects
}
public override void drawWhenHeld(SpriteBatch spriteBatch, Vector2 objectPosition, Farmer f)
{
base.drawWhenHeld(spriteBatch, objectPosition, f);
}
public override void draw(SpriteBatch spriteBatch, int xNonTile, int yNonTile, float layerDepth, float alpha = 1)
{
base.draw(spriteBatch, xNonTile, yNonTile, layerDepth, alpha);
}
public override void updateInfo()
{
if (this.containerObject != null)
{
this.containerObject.updateInfo();
}
base.updateInfo();
}
}
}

View File

@ -13,6 +13,44 @@ namespace Revitalize.Framework.Objects
{
public class MultiTiledObject : CustomObject
{
[JsonIgnore]
public override string ItemInfo
{
get
{
string infoStr = Revitalize.ModCore.Serializer.ToJSONString(this.info);
string guidStr = this.guid.ToString();
return infoStr+ "<" + guidStr;
}
set
{
if (string.IsNullOrEmpty(value)) return;
string[] data = value.Split('<');
string infoString = data[0];
string guidString = data[1];
this.info = (BasicItemInformation)Revitalize.ModCore.Serializer.DeserializeFromJSONString(infoString, typeof(BasicItemInformation));
Guid oldGuid = this.guid;
this.guid = Guid.Parse(guidString);
if (ModCore.CustomObjects.ContainsKey(this.guid))
{
ModCore.CustomObjects[this.guid] = this;
}
else
{
ModCore.CustomObjects.Add(this.guid, this);
}
if (ModCore.CustomObjects.ContainsKey(oldGuid) && ModCore.CustomObjects.ContainsKey(this.guid))
{
if (ModCore.CustomObjects[oldGuid] == ModCore.CustomObjects[this.guid] && oldGuid != this.guid)
{
//ModCore.CustomObjects.Remove(oldGuid);
}
}
}
}
[JsonIgnore]
public Dictionary<Vector2, StardewValley.Object> objects;
@ -104,6 +142,7 @@ namespace Revitalize.Framework.Objects
public override void draw(SpriteBatch spriteBatch, int x, int y, float alpha = 1)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
(pair.Value as MultiTiledComponent).draw(spriteBatch, x + ((int)pair.Key.X), y + ((int)pair.Key.Y), alpha);
@ -112,6 +151,7 @@ namespace Revitalize.Framework.Objects
public override void draw(SpriteBatch spriteBatch, int xNonTile, int yNonTile, float layerDepth, float alpha = 1)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
pair.Value.draw(spriteBatch, xNonTile + (int)pair.Key.X * Game1.tileSize, yNonTile + (int)pair.Key.Y * Game1.tileSize, layerDepth, alpha);
@ -122,6 +162,7 @@ namespace Revitalize.Framework.Objects
public override void drawInMenu(SpriteBatch spriteBatch, Vector2 location, float scaleSize, float transparency, float layerDepth, bool drawStackNumber, Color c, bool drawShadow)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
pair.Value.drawInMenu(spriteBatch, location + (pair.Key * 16), 1.0f, transparency, layerDepth, drawStackNumber, c, drawShadow);
//base.drawInMenu(spriteBatch, location, scaleSize, transparency, layerDepth, drawStackNumber, c, drawShadow);
@ -129,6 +170,7 @@ namespace Revitalize.Framework.Objects
public override void drawWhenHeld(SpriteBatch spriteBatch, Vector2 objectPosition, Farmer f)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
pair.Value.drawWhenHeld(spriteBatch, objectPosition + (pair.Key * Game1.tileSize), f);
//base.drawWhenHeld(spriteBatch, objectPosition, f);
@ -137,6 +179,7 @@ namespace Revitalize.Framework.Objects
public override void drawPlacementBounds(SpriteBatch spriteBatch, GameLocation location)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
if (!this.isPlaceable())
@ -172,7 +215,7 @@ namespace Revitalize.Framework.Objects
public virtual void pickUp()
public virtual void pickUp(Farmer who)
{
bool canPickUp = this.removeAndAddToPlayersInventory();
if (canPickUp)
@ -187,7 +230,7 @@ namespace Revitalize.Framework.Objects
ModCore.log("Got a light???");
}
}
(pair.Value as MultiTiledComponent).removeFromLocation((pair.Value as MultiTiledComponent).location, pair.Key);
(pair.Value as MultiTiledComponent).removeFromLocation(who.currentLocation, pair.Key);
}
this.location = null;
@ -209,6 +252,7 @@ namespace Revitalize.Framework.Objects
public override bool placementAction(GameLocation location, int x, int y, Farmer who = null)
{
this.updateInfo();
foreach (KeyValuePair<Vector2, StardewValley.Object> pair in this.objects)
{
/*
@ -242,7 +286,7 @@ namespace Revitalize.Framework.Objects
{
bool cleanUp = this.clicked(who);
if (cleanUp)
this.pickUp();
this.pickUp(who);
return cleanUp;
}
@ -372,5 +416,29 @@ namespace Revitalize.Framework.Objects
return 1;
}
public override void updateInfo()
{
if (this.info == null)
{
this.ItemInfo = this.text;
ModCore.log("Updated item info for container!");
return;
}
this.ItemInfo = this.text;
this.text = this.ItemInfo;
if (this.objects == null)
{
return;
}
/*
foreach(CustomObject c in this.objects.Values)
{
c.updateInfo();
}
*/
}
}
}

View File

@ -167,7 +167,7 @@ namespace Revitalize.Framework.Objects.Resources.OreVeins
}
}
public override void pickUp()
public override void pickUp(Farmer who)
{
return; //Don't pick up ore veins!
bool canPickUp = this.removeAndAddToPlayersInventory();

View File

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Revitalize.Framework.Objects;
using StardewValley;
namespace Revitalize.Framework.Utilities
{
public static class MultiplayerUtilities
{
public static string RequestGUIDMessage = "Revitalize.RequestGUIDObject";
public static string RequestGUIDMessage_Tile = "Revitalize.RequestGUIDObject_Tile";
public static string ReceieveGUIDMessage = "Revitalize.ReceieveGUIDObject";
public static string ReceieveGUIDMessage_Tile = "Revitalize.ReceieveGUIDObject_Tile";
public static void GetModMessage(object o, StardewModdingAPI.Events.ModMessageReceivedEventArgs e)
{
ModCore.log("Get a mod message: "+e.Type);
if (e.Type.Equals(RequestGUIDMessage))
{
ModCore.log("Send GUID Request");
Guid request = Guid.Parse(e.ReadAs<string>());
SendGuidObject(request);
}
if (e.Type.Equals(ReceieveGUIDMessage))
{
ModCore.log("Receieve GUID Request");
string objStr = e.ReadAs <string>();
var v=ModCore.Serializer.DeserializeFromJSONString<Item>(objStr);
if (ModCore.CustomObjects.ContainsKey((v as CustomObject).guid) == false)
{
ModCore.CustomObjects.Add((v as CustomObject).guid, (v as CustomObject));
}
else
{
ModCore.CustomObjects[(v as CustomObject).guid] = (v as CustomObject);
}
}
if(e.Type.Equals(RequestGUIDMessage_Tile))
{
ModCore.log("Send GUID Request FOR TILE");
Guid request = Guid.Parse(e.ReadAs<string>());
SendGuidObject_Tile(request);
}
if(e.Type.Equals(ReceieveGUIDMessage_Tile))
{
ModCore.log("Receieve GUID Request FOR TILE");
string objStr = e.ReadAs<string>();
var v = ModCore.Serializer.DeserializeFromJSONString<Item>(objStr);
if (ModCore.CustomObjects.ContainsKey((v as CustomObject).guid) == false)
{
ModCore.CustomObjects.Add((v as CustomObject).guid, (v as CustomObject));
}
else
{
ModCore.CustomObjects[(v as CustomObject).guid] = (v as CustomObject);
}
}
}
public static void SendGuidObject(Guid request)
{
if (ModCore.CustomObjects.ContainsKey(request))
{
ModCore.log("Send guid request!");
ModCore.ModHelper.Multiplayer.SendMessage<string>(ModCore.Serializer.ToJSONString(ModCore.CustomObjects[request]), ReceieveGUIDMessage, new string[] { Revitalize.ModCore.Manifest.UniqueID.ToString() });
}
else
{
ModCore.log("This mod doesn't have the guid object");
}
}
public static void SendGuidObject_Tile(Guid request)
{
if (ModCore.CustomObjects.ContainsKey(request))
{
ModCore.log("Send guid tile request!");
ModCore.ModHelper.Multiplayer.SendMessage<string>(ModCore.Serializer.ToJSONString( (ModCore.CustomObjects[request] as MultiTiledComponent).containerObject), ReceieveGUIDMessage_Tile , new string[] { Revitalize.ModCore.Manifest.UniqueID.ToString() });
}
else
{
ModCore.log("This mod doesn't have the guid tile");
}
}
public static void RequestGuidObject(Guid request)
{
ModCore.ModHelper.Multiplayer.SendMessage<string>(request.ToString(),RequestGUIDMessage, new string[] { ModCore.Manifest.UniqueID.ToString() });
}
public static void RequestGuidObject_Tile(Guid request)
{
ModCore.ModHelper.Multiplayer.SendMessage<string>(request.ToString(), RequestGUIDMessage_Tile, new string[] { ModCore.Manifest.UniqueID.ToString() });
}
}
}

View File

@ -24,6 +24,7 @@ namespace Revitalize.Framework.Utilities.Serialization.Converters
{
new Framework.Utilities.Serialization.Converters.RectangleConverter(),
new Framework.Utilities.Serialization.Converters.Texture2DConverter(),
//new NetFieldConverter()
},
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
@ -35,7 +36,7 @@ namespace Revitalize.Framework.Utilities.Serialization.Converters
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string convertedString = JsonConvert.SerializeObject((Item)value, this.settings);
DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver;
DefaultContractResolver resolver = serializer.ContractResolver as ContractResolvers.NetFieldContract;
writer.WriteStartObject();
writer.WritePropertyName("Type");
serializer.Serialize(writer, value.GetType().FullName.ToString());

View File

@ -231,6 +231,7 @@ namespace Revitalize
ModHelper.Events.Display.RenderedWorld += ObjectInteractionHacks.Render_RenderCustomObjectsHeldInMachines;
//ModHelper.Events.Display.Rendered += MenuHacks.EndOfDay_OnMenuChanged;
//ModHelper.Events.GameLoop.Saved += MenuHacks.EndOfDay_CleanupForNewDay;
ModHelper.Events.Multiplayer.ModMessageReceived += MultiplayerUtilities.GetModMessage;
CustomObjects = new Dictionary<Guid, CustomObject>();
//Adds in recipes to the mod.
@ -398,7 +399,7 @@ namespace Revitalize
// Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.BigTiledTest"));
//Game1.player.addItemToInventory(ObjectManager.getChair("Omegasis.Revitalize.Furniture.Chairs.OakChair"));
//Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.Revitalize.Furniture.Rugs.RugTest"));
//Game1.player.addItemToInventory(ObjectManager.getTable("Omegasis.Revitalize.Furniture.Tables.OakTable"));
Game1.player.addItemToInventory(ObjectManager.getTable("Omegasis.Revitalize.Furniture.Tables.OakTable"));
//Game1.player.addItemToInventory(ObjectManager.getLamp("Omegasis.Revitalize.Furniture.Lamps.OakLamp"));
//Game1.player.addItemToInventory(ObjectManager.getObject("Omegasis.Revitalize.Furniture.Arcade.SeasideScramble",ObjectManager.miscellaneous));

View File

@ -146,6 +146,7 @@
<Compile Include="Framework\Utilities\IntRange.cs" />
<Compile Include="Framework\Utilities\InventoryManager.cs" />
<Compile Include="Framework\Utilities\LocationUtilities.cs" />
<Compile Include="Framework\Utilities\MultiplayerUtilities.cs" />
<Compile Include="Framework\Utilities\ObjectUtilities.cs" />
<Compile Include="Framework\Utilities\PyTKHelper.cs" />
<Compile Include="Framework\Utilities\RotationUtilities.cs" />