inventory working :D
This commit is contained in:
@@ -5,180 +5,151 @@ namespace PetCompanion.Services
|
||||
{
|
||||
public class PetInventoryService
|
||||
{
|
||||
private readonly PetInventoryRepository _inventoryRepository;
|
||||
private readonly PetRepository _petRepository;
|
||||
private readonly GameItemsRepository _gameItemsRepository;
|
||||
private readonly PetInventoryRepository petInventoryRepository;
|
||||
private readonly PetRepository petRepository;
|
||||
private readonly GameItemsRepository gameItemsRepository;
|
||||
private readonly GameItemService gameItemService;
|
||||
|
||||
public PetInventoryService(
|
||||
PetInventoryRepository inventoryRepository,
|
||||
PetInventoryRepository petInventoryRepository,
|
||||
PetRepository petRepository,
|
||||
GameItemsRepository gameItemsRepository)
|
||||
GameItemsRepository gameItemsRepository,
|
||||
GameItemService gameItemService)
|
||||
{
|
||||
_inventoryRepository = inventoryRepository;
|
||||
_petRepository = petRepository;
|
||||
_gameItemsRepository = gameItemsRepository;
|
||||
this.petInventoryRepository = petInventoryRepository;
|
||||
this.petRepository = petRepository;
|
||||
this.gameItemsRepository = gameItemsRepository;
|
||||
this.gameItemService = gameItemService;
|
||||
}
|
||||
|
||||
public async Task<Inventory> GetInventory(string petId, string userId)
|
||||
public Inventory GetInventory(string petId, string userId)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
|
||||
return await _inventoryRepository.GetPetInventory(petId);
|
||||
return petInventoryRepository.GetPetInventory(petId);
|
||||
}
|
||||
|
||||
public async Task<Inventory> CreateInventory(string petId)
|
||||
public Inventory CreateInventory(string petId)
|
||||
{
|
||||
var inventory = new Inventory
|
||||
{
|
||||
PetId = petId,
|
||||
Capacity = 20,
|
||||
Items = new List<InventoryItem>()
|
||||
Items = new List<int>()
|
||||
};
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
petInventoryRepository.SavePetInventory(inventory);
|
||||
return inventory;
|
||||
}
|
||||
|
||||
public async Task<Pet> UseItem(string petId, string userId, int itemId)
|
||||
public Pet UseItem(string petId, string userId, int itemId)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
|
||||
var inventory = await _inventoryRepository.GetPetInventory(petId);
|
||||
var item = inventory.Items.FirstOrDefault(i => i.GameItemId == itemId);
|
||||
|
||||
if (item == null || item.Quantity <= 0)
|
||||
if (!pet.Inventory.Items.Any(i => i == itemId))
|
||||
throw new Exception("Item not found in inventory");
|
||||
|
||||
item.Quantity--;
|
||||
if (item.Quantity <= 0)
|
||||
inventory.Items.Remove(item);
|
||||
var gameItem = gameItemsRepository.GetById(itemId);
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
return _petRepository.UpdatePet(pet);
|
||||
gameItemService.ApplyItemEffect(pet, gameItem);
|
||||
|
||||
pet.Inventory.Items.Remove(itemId);
|
||||
|
||||
return petRepository.UpdatePet(pet);
|
||||
}
|
||||
|
||||
public async Task<Pet> EquipItem(string petId, string userId, int itemId)
|
||||
public Pet EquipItem(string petId, string userId, int itemId)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
|
||||
var inventory = await _inventoryRepository.GetPetInventory(petId);
|
||||
var item = inventory.Items.FirstOrDefault(i => i.GameItemId == itemId);
|
||||
|
||||
if (item == null || item.Quantity <= 0)
|
||||
if (!pet.Inventory.Items.Any(i => i == itemId))
|
||||
throw new Exception("Item not found in inventory");
|
||||
|
||||
if (item.GameItem.Type != ItemType.Equipment)
|
||||
var gameItem = gameItemsRepository.GetById(itemId);
|
||||
|
||||
if (gameItem.Type != ItemType.Equipment)
|
||||
throw new Exception("Item is not equipment");
|
||||
|
||||
var equippedItems = await _inventoryRepository.GetEquippedItems(petId);
|
||||
if (equippedItems.ContainsKey(item.GameItem.EquipTarget))
|
||||
// If there's already an item equipped in that slot, unequip it first
|
||||
if (pet.EquippedItems.ContainsKey(gameItem.EquipTarget))
|
||||
{
|
||||
await UnequipItem(petId, userId, item.GameItem.EquipTarget);
|
||||
UnequipItem(petId, userId, gameItem.EquipTarget);
|
||||
}
|
||||
|
||||
item.Quantity--;
|
||||
if (item.Quantity <= 0)
|
||||
inventory.Items.Remove(item);
|
||||
// Apply equipment effects
|
||||
gameItemService.ApplyItemEffect(pet, gameItem);
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
return _petRepository.UpdatePet(pet);
|
||||
// Mark item as equipped
|
||||
pet.EquippedItems[gameItem.EquipTarget] = itemId;
|
||||
|
||||
// Remove from inventory
|
||||
pet.Inventory.Items.Remove(itemId);
|
||||
|
||||
petInventoryRepository.UpdateEquippedItems(petId, pet.EquippedItems);
|
||||
|
||||
return petRepository.UpdatePet(pet);
|
||||
}
|
||||
|
||||
public async Task<Pet> UnequipItem(string petId, string userId, ItemEquipTarget equipTarget)
|
||||
public Pet UnequipItem(string petId, string userId, ItemEquipTarget equipTarget)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
|
||||
var equippedItems = await _inventoryRepository.GetEquippedItems(petId);
|
||||
if (!equippedItems.ContainsKey(equipTarget))
|
||||
return pet;
|
||||
if (!pet.EquippedItems.ContainsKey(equipTarget))
|
||||
throw new Exception("No item equipped in that slot");
|
||||
|
||||
var itemId = equippedItems[equipTarget];
|
||||
var item = _gameItemsRepository.GetById(itemId);
|
||||
var equippedItemId = pet.EquippedItems[equipTarget];
|
||||
var equippedItem = gameItemsRepository.GetById(equippedItemId);
|
||||
|
||||
if (item != null)
|
||||
if (equippedItem != null)
|
||||
{
|
||||
var inventory = await _inventoryRepository.GetPetInventory(petId);
|
||||
var inventoryItem = inventory.Items.FirstOrDefault(i => i.GameItemId == itemId);
|
||||
// Remove equipment effects
|
||||
gameItemService.RemoveItemEffect(pet, equippedItem);
|
||||
|
||||
if (inventoryItem != null)
|
||||
inventoryItem.Quantity++;
|
||||
else
|
||||
inventory.Items.Add(new InventoryItem
|
||||
{
|
||||
GameItemId = itemId,
|
||||
Quantity = 1,
|
||||
GameItem = item,
|
||||
InventoryId = pet.Id
|
||||
});
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
// Add item back to inventory
|
||||
pet.Inventory.Items.Add(equippedItemId);
|
||||
}
|
||||
|
||||
return _petRepository.UpdatePet(pet);
|
||||
pet.EquippedItems.Remove(equipTarget);
|
||||
|
||||
return petRepository.UpdatePet(pet);
|
||||
}
|
||||
|
||||
public async Task<Pet> DropItem(string petId, string userId, int itemId)
|
||||
public Pet DropItem(string petId, string userId, int itemId)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
|
||||
var inventory = await _inventoryRepository.GetPetInventory(petId);
|
||||
if (inventory == null)
|
||||
throw new Exception("Inventory not found");
|
||||
|
||||
var item = inventory.Items.FirstOrDefault(i => i.GameItemId == itemId);
|
||||
if (item == null || item.Quantity <= 0)
|
||||
if (!pet.Inventory.Items.Any(i => i == itemId))
|
||||
throw new Exception("Item not found in inventory");
|
||||
|
||||
item.Quantity--;
|
||||
if (item.Quantity <= 0)
|
||||
inventory.Items.Remove(item);
|
||||
var gameItem = gameItemsRepository.GetById(itemId);
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
return pet;
|
||||
pet.Inventory.Items.Remove(itemId);
|
||||
|
||||
return petRepository.UpdatePet(pet);
|
||||
}
|
||||
|
||||
public async Task<Pet> AddItemToPet(string petId, string userId, int itemId, int quantity)
|
||||
public Pet AddItemToPet(string petId, string userId, int itemId, int quantity)
|
||||
{
|
||||
var pet = _petRepository.GetPetById(petId, userId);
|
||||
if (pet == null)
|
||||
throw new Exception("Pet not found");
|
||||
var pet = petRepository.GetPetById(petId, userId);
|
||||
var gameItem = gameItemsRepository.GetById(itemId);
|
||||
|
||||
var gameItem = _gameItemsRepository.GetById(itemId);
|
||||
if (gameItem == null)
|
||||
throw new Exception("Item not found");
|
||||
|
||||
var inventory = await _inventoryRepository.GetPetInventory(petId);
|
||||
if (inventory == null)
|
||||
throw new Exception("Inventory not found");
|
||||
|
||||
var existingItem = inventory.Items.FirstOrDefault(i => i.GameItemId == itemId);
|
||||
if (existingItem != null)
|
||||
for (int i = 0; i < quantity; i++)
|
||||
{
|
||||
existingItem.Quantity += quantity;
|
||||
}
|
||||
else
|
||||
{
|
||||
inventory.Items.Add(new InventoryItem
|
||||
{
|
||||
GameItemId = itemId,
|
||||
Quantity = quantity,
|
||||
GameItem = gameItem,
|
||||
InventoryId = inventory.PetId
|
||||
});
|
||||
pet.Inventory.Items.Add(itemId);
|
||||
}
|
||||
|
||||
await _inventoryRepository.SaveInventory(inventory);
|
||||
return pet;
|
||||
return petRepository.UpdatePet(pet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user