diff --git a/Horse Isle Server/Horse Isle Server/Game/GameExceptions.cs b/Horse Isle Server/Horse Isle Server/Game/GameExceptions.cs new file mode 100644 index 0000000..e1c653d --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/GameExceptions.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HISP.Game +{ + // Inventory + class InventoryException : Exception { }; + class InventoryFullException : InventoryException { }; + class InventoryMaxStackException : InventoryException { }; +} diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs new file mode 100644 index 0000000..0bc4d06 --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + + +namespace HISP.Game +{ + + interface IInventory + { + + void Add(ItemInstance item); + void Remove(ItemInstance item); + int Count + { + get; + } + + InventoryItem[] GetItemList(); + + bool HasItem(int randomId); + bool HasItemId(int itemId); + + InventoryItem GetItemByItemId(int itemId); + + InventoryItem GetItemByRandomid(int randomId); + + + } +} diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs new file mode 100644 index 0000000..2e7e132 --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace HISP.Game +{ + class InventoryItem + { + public InventoryItem() + { + ItemInstances = new List(); + Infinite = false; + ItemId = 0; + } + + public int ItemId; + public bool Infinite; + public List ItemInstances; + } + +} diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs new file mode 100644 index 0000000..24d1df0 --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs @@ -0,0 +1,175 @@ +using System.Collections.Generic; +using System.Linq; +using HISP.Game; +using HISP.Server; + +namespace HISP.Player +{ + + class PlayerInventory : IInventory + { + + + public User BaseUser; + private List inventoryItems; + public PlayerInventory(User forUser) + { + inventoryItems = new List(); + + BaseUser = forUser; + ItemInstance[] instances = Database.GetPlayerInventory(BaseUser.Id).ToArray(); + foreach(ItemInstance instance in instances) + { + addItem(instance, false); + } + } + + public int Count + { + get + { + return inventoryItems.Count; + } + } + private void addItem(ItemInstance item, bool addToDatabase) + { + if (addToDatabase) + Database.AddItemToInventory(BaseUser.Id, item); + + foreach (InventoryItem invetoryItem in inventoryItems) + { + if (invetoryItem.ItemId == item.ItemId) + { + invetoryItem.ItemInstances.Add(item); + return; + } + } + + InventoryItem inventoryItem = new InventoryItem(); + + inventoryItem.ItemId = item.ItemId; + inventoryItem.ItemInstances.Add(item); + inventoryItems.Add(inventoryItem); + } + + + + + public InventoryItem[] GetItemList() + { + return inventoryItems.OrderBy(o => o.ItemInstances[0].GetItemInfo().SortBy).ToArray(); + } + + + + public void Remove(ItemInstance item) + { + + Database.RemoveItemFromInventory(BaseUser.Id, item); + + foreach (InventoryItem inventoryItem in inventoryItems) + { + if(item.ItemId == inventoryItem.ItemId) + { + foreach(ItemInstance instance in inventoryItem.ItemInstances) + { + if(instance.RandomId == item.RandomId) + { + inventoryItem.ItemInstances.Remove(instance); + + if (inventoryItem.ItemInstances.Count <= 0) + inventoryItems.Remove(inventoryItem); + + return; + } + } + } + } + + Logger.ErrorPrint("Tried to remove item : " + item.RandomId + " from inventory when it was not in it"); + } + + public bool HasItem(int randomId) + { + InventoryItem[] items = GetItemList(); + foreach(InventoryItem item in items) + { + ItemInstance[] instances = item.ItemInstances.ToArray(); + foreach(ItemInstance instance in instances) + { + if (instance.RandomId == randomId) + return true; + } + } + return false; + } + + public bool HasItemId(int itemId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + if (item.ItemId == itemId) + { + return true; + } + } + return false; + } + + + public InventoryItem GetItemByItemId(int itemId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + if (item.ItemId == itemId) + { + return item; + } + } + throw new KeyNotFoundException("id: " + itemId + " not found in inventory"); + } + + public InventoryItem GetItemByRandomid(int randomId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + ItemInstance[] instances = item.ItemInstances.ToArray(); + foreach (ItemInstance instance in instances) + { + if (instance.RandomId == randomId) + return item; + } + } + throw new KeyNotFoundException("random id: " + randomId + " not found in inventory"); + } + + public void AddIgnoringFull(ItemInstance item) + { + addItem(item, true); + } + public void Add(ItemInstance item) + { + // Check if has max allready + if(HasItemId(item.ItemId)) + { + InventoryItem items = GetItemByItemId(item.ItemId); + if (items.ItemInstances.Count >= ConfigReader.MAX_STACK) + { + throw new InventoryMaxStackException(); + } + else if (Count >= Messages.DefaultInventoryMax) + { + throw new InventoryFullException(); + } + } + + + addItem(item, true); + } + + + } +} diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs new file mode 100644 index 0000000..3f97ce4 --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs @@ -0,0 +1,172 @@ +using HISP.Server; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace HISP.Game +{ + class ShopInventory : IInventory + { + private Shop baseShop; + private List inventoryItems; + public int Count + { + get + { + return inventoryItems.Count; + } + } + public ShopInventory(Shop shopkeeper) + { + baseShop = shopkeeper; + + ItemInstance[] instances = Database.GetShopInventory(baseShop.Id).ToArray(); + inventoryItems = new List(); + + foreach (ItemInstance instance in instances) + { + addItem(instance, false); + } + } + + private void addItem(ItemInstance item, bool addToDatabase) + { + + + foreach (InventoryItem invetoryItem in inventoryItems) + { + if (invetoryItem.ItemId == item.ItemId) + { + if (invetoryItem.Infinite) // no need to add +1, theres allready infinite quanity. + return; + + invetoryItem.ItemInstances.Add(item); + + goto retrn; + } + } + + InventoryItem inventoryItem = new InventoryItem(); + + inventoryItem.ItemId = item.ItemId; + inventoryItem.Infinite = false; + inventoryItem.ItemInstances.Add(item); + inventoryItems.Add(inventoryItem); + + retrn: + { + if (addToDatabase) + Database.AddItemToShopInventory(baseShop.Id, item); + return; + }; + + } + + public void AddInfinity(Item.ItemInformation itemInfo) + { + InventoryItem inventoryItem = new InventoryItem(); + inventoryItem.ItemId = itemInfo.Id; + inventoryItem.Infinite = true; + + for(int i = 0; i < 25; i++) // add 25 + inventoryItem.ItemInstances.Add(new ItemInstance(inventoryItem.ItemId)); + + inventoryItems.Add(inventoryItem); + } + public void Add(ItemInstance item) + { + addItem(item, true); + } + + public InventoryItem GetItemByItemId(int itemId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + if (item.ItemId == itemId) + { + return item; + } + } + throw new KeyNotFoundException("id: " + itemId + " not found in shop inventory"); + } + + public InventoryItem GetItemByRandomid(int randomId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + ItemInstance[] instances = item.ItemInstances.ToArray(); + foreach (ItemInstance instance in instances) + { + if (instance.RandomId == randomId) + return item; + } + } + throw new KeyNotFoundException("random id: " + randomId + " not found in shop inventory"); + } + public InventoryItem[] GetItemList() + { + return inventoryItems.OrderBy(o => o.ItemInstances[0].GetItemInfo().SortBy).OrderBy(o => o.Infinite).ToArray(); + } + + public bool HasItem(int randomId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + ItemInstance[] instances = item.ItemInstances.ToArray(); + foreach (ItemInstance instance in instances) + { + if (instance.RandomId == randomId) + return true; + } + } + return false; + } + + public bool HasItemId(int itemId) + { + InventoryItem[] items = GetItemList(); + foreach (InventoryItem item in items) + { + if (item.ItemId == itemId) + { + return true; + } + } + return false; + } + + + public void Remove(ItemInstance item) + { + + foreach (InventoryItem inventoryItem in inventoryItems) + { + if (item.ItemId == inventoryItem.ItemId) + { + foreach (ItemInstance instance in inventoryItem.ItemInstances) + { + if (instance.RandomId == item.RandomId) + { + inventoryItem.ItemInstances.Remove(instance); + + if (inventoryItem.ItemInstances.Count <= 0) + inventoryItems.Remove(inventoryItem); + + + if (!inventoryItem.Infinite) // no need to bug the database. + Database.RemoveItemFromShopInventory(baseShop.Id, item); + else + inventoryItem.ItemInstances.Add(new ItemInstance(inventoryItem.ItemId)); // Gen new item in inventory to replace it. + return; + } + } + } + } + + Logger.ErrorPrint("Tried to remove item : " + item.RandomId + " from inventory when it was not in it"); + } + } +}