public AmmunitionData ConsumeAmmunition(AmmunitionType ammunitionType) { AmmunitionData ammunitionData = new AmmunitionData(); foreach (ItemSlot itemSlot in ItemSlots) { AmmunitionItem ammunitionItem = itemSlot.item as AmmunitionItem; if (ammunitionItem == null) { continue; } if (ammunitionItem.AmmunitionType != ammunitionType) { continue; } ammunitionData.ammunitionPrefab = ammunitionItem.AmmunitionPrefab; RemoveItem(itemSlot.item); break; } return(ammunitionData); }
public void FireArrow() { //Make sure the player has the required ammunition. if (!playerInventory.ItemHolder.HasAmmunition(ammunitionType)) { return; } //Use this default target position in case we don't hit the raycast. Vector3 targetPos = mainCameraTransform.position + mainCameraTransform.forward * 1000f; //Check if we are aiming at something. if (Physics.Raycast(mainCameraTransform.position, mainCameraTransform.forward, out RaycastHit hit, 1000f, layerMask)) { //If we are aiming at something then set that point to be our target position. targetPos = hit.point; } //Get back data about the ammunition we are using. AmmunitionData ammunitionData = playerInventory.ItemHolder.ConsumeAmmunition(ammunitionType); //Spawn the projectile at the correct position relative to the bow. GameObject arrowInstance = Instantiate(ammunitionData.ammunitionPrefab, arrowSpawnTransform.position, Quaternion.Euler(arrowSpawnTransform.forward)); //Initialise the projectile's rigidbody with velocity in the target's direction. arrowInstance.GetComponent <Rigidbody>().velocity = (targetPos - arrowInstance.transform.position).normalized * arrowLaunchForce; }
public AmmunitionData GetAmmunition(int id) { if (!_ammunitionMap.TryGetValue(id, out var item)) { _ammunitionMap.Add(id, null); _ammunitionMap[id] = item = AmmunitionData.Deserialize(_jsonDatabase.GetAmmunition(id), this); } if (item == null) { throw new DatabaseException(CircularDependencyText + "Ammunition_" + id); } return(item); }