816 lines
23 KiB
C#
816 lines
23 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using System.Linq;
|
|||
|
using RPGCreationKit;
|
|||
|
|
|||
|
namespace RPGCreationKit
|
|||
|
{
|
|||
|
public enum EquipmentSlots
|
|||
|
{
|
|||
|
Head = 0,
|
|||
|
Upperbody = 1,
|
|||
|
Lowerbody = 2,
|
|||
|
Hands = 3,
|
|||
|
Feets = 4,
|
|||
|
RHand = 5,
|
|||
|
LHand = 6,
|
|||
|
RRing = 7,
|
|||
|
LRing = 8,
|
|||
|
Amulet = 9,
|
|||
|
Ammo = 10
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Class for keeping Equipment both for Player & NPCs
|
|||
|
/// </summary>
|
|||
|
[RequireComponent(typeof(Inventory))]
|
|||
|
public class Equipment : MonoBehaviour
|
|||
|
{
|
|||
|
public readonly static int equipmentSlotsLength = 11;
|
|||
|
|
|||
|
[Header("PLAYER")]
|
|||
|
public SkinnedMeshRenderer FP_Arms;
|
|||
|
|
|||
|
[Space(10)]
|
|||
|
|
|||
|
public BodyData characterModel;
|
|||
|
|
|||
|
public static Equipment PlayerEquipment;
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
// Find the player inventory and set reference
|
|||
|
if (!PlayerEquipment)
|
|||
|
if (gameObject.CompareTag("Player") && gameObject.GetComponent<Equipment>() != null)
|
|||
|
PlayerEquipment = this;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// References
|
|||
|
[SerializeField] private Inventory inv;
|
|||
|
|
|||
|
// To instatiate meshes of armors
|
|||
|
private List<ItemInInventory> armorsEquipped = new List<ItemInInventory>();
|
|||
|
private List<GameObject> armorsMeshes = new List<GameObject>();
|
|||
|
|
|||
|
[Header("Equipment")]
|
|||
|
public ItemInInventory[] itemsEquipped = new ItemInInventory[Equipment.equipmentSlotsLength];
|
|||
|
|
|||
|
|
|||
|
[Space(5)]
|
|||
|
[Header("Stats")]
|
|||
|
public float MeleeDamageOutput = 0;
|
|||
|
public float RangedDamageOutput = 0;
|
|||
|
public float ArmorRate = 0;
|
|||
|
public bool isUsingShield = false;
|
|||
|
public bool doingOneHWeaponSwap = false;
|
|||
|
|
|||
|
|
|||
|
public WeaponItem currentWeapon;
|
|||
|
public GameObject currentWeaponObject;
|
|||
|
public GameObject currentWeaponOnHip;
|
|||
|
public Animator currentWeaponAnimator;
|
|||
|
|
|||
|
|
|||
|
public AmmoItem currentAmmo;
|
|||
|
public GameObject currentAmmoObject;
|
|||
|
|
|||
|
public ArmorItem currentShield;
|
|||
|
public GameObject currentShieldObject;
|
|||
|
|
|||
|
public bool Equip(string itemID)
|
|||
|
{
|
|||
|
ItemInInventory itemToEquip;
|
|||
|
// Check if item exists in inventory
|
|||
|
if ((itemToEquip = inv.GetItem(itemID)) != null)
|
|||
|
{
|
|||
|
return Equip(itemToEquip.item);
|
|||
|
}
|
|||
|
else
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public bool Equip(Item itemToEquip)
|
|||
|
{
|
|||
|
var itemInSubInv = inv.GetItem(itemToEquip);
|
|||
|
|
|||
|
if (itemInSubInv != null)
|
|||
|
return Equip(itemInSubInv);
|
|||
|
else
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns true if the new item was successfully equipped.
|
|||
|
/// </summary>
|
|||
|
/// <param name="_item"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool Equip(ItemInInventory _item) /// @schaken
|
|||
|
{
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
{
|
|||
|
if (PlayerCombat.instance.isAttacking)
|
|||
|
{
|
|||
|
AlertMessage.instance.InitAlertMessage("You cannot change weapons and armor while attacking.", AlertMessage.DEFAULT_MESSAGE_DURATION_SHORT);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (_item != null && _item.item == null)
|
|||
|
return false;
|
|||
|
|
|||
|
if (_item.item.itemType == ItemTypes.ArmorItem)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)_item.item;
|
|||
|
|
|||
|
for(int i = 0; i < item.Bipeds.Length; i++)
|
|||
|
{
|
|||
|
switch (item.Bipeds[i])
|
|||
|
{
|
|||
|
case BipedObject.Head:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Head] != null)
|
|||
|
Unequip(EquipmentSlots.Head);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Head] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.UpperBody:
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Upperbody] != null)
|
|||
|
Unequip(EquipmentSlots.Upperbody);
|
|||
|
|
|||
|
// Disable default upperbody
|
|||
|
if (characterModel.defaultUpperbody != null)
|
|||
|
characterModel.defaultUpperbody.gameObject.SetActive(false);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Upperbody] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.LowerBody:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Lowerbody] != null)
|
|||
|
Unequip(EquipmentSlots.Lowerbody);
|
|||
|
|
|||
|
if (characterModel.defaultLowerbody != null)
|
|||
|
characterModel.defaultLowerbody.gameObject.SetActive(false);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Lowerbody] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Hand:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Hands] != null)
|
|||
|
Unequip(EquipmentSlots.Hands);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Hands] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Foot:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Feets] != null)
|
|||
|
Unequip(EquipmentSlots.Feets);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Feets] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
case BipedObject.RightRing:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.RRing] != null)
|
|||
|
Unequip(EquipmentSlots.RRing);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.RRing] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.LeftRing:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.LRing] != null)
|
|||
|
Unequip(EquipmentSlots.LRing);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.LRing] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Amulet:
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Amulet] != null)
|
|||
|
Unequip(EquipmentSlots.Amulet);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Amulet] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
case BipedObject.Shield:
|
|||
|
|
|||
|
if (CompareTag("RPG Creation Kit/PlayerInInventory") && (itemsEquipped[(int)EquipmentSlots.RHand]) != null)
|
|||
|
currentWeapon = (WeaponItem)(itemsEquipped[(int)EquipmentSlots.RHand].item);
|
|||
|
|
|||
|
if (currentWeapon != null &&
|
|||
|
(currentWeapon.weaponType == WeaponType.BladeOneHand || currentWeapon.weaponType == WeaponType.BluntOneHand ||
|
|||
|
currentWeapon.weaponType == WeaponType.DaggerOneHand))
|
|||
|
{
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.LHand] != null)
|
|||
|
Unequip(EquipmentSlots.LHand);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.LHand] = _item;
|
|||
|
armorsEquipped.Add(_item);
|
|||
|
|
|||
|
currentShield = (ArmorItem)_item.item;
|
|||
|
|
|||
|
}
|
|||
|
else if (PlayerEquipment == this)
|
|||
|
AlertMessage.instance.InitAlertMessage("You can't use a shield\n with the current weapon.", AlertMessage.DEFAULT_MESSAGE_DURATION_MEDIUM, false);
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Hide body parts if we have to
|
|||
|
if (characterModel != null)
|
|||
|
{
|
|||
|
if (item.HideHair && characterModel.hair != null)
|
|||
|
characterModel.hair.gameObject.SetActive(false);
|
|||
|
if (item.hideHead)
|
|||
|
characterModel.head.gameObject.SetActive(false);
|
|||
|
if (item.hideUpperbody)
|
|||
|
characterModel.upperbody.gameObject.SetActive(false);
|
|||
|
if (item.hideArms)
|
|||
|
characterModel.arms.gameObject.SetActive(false);
|
|||
|
if (item.hideHands)
|
|||
|
characterModel.hands.gameObject.SetActive(false);
|
|||
|
if (item.hideLegs)
|
|||
|
characterModel.lowerbody.gameObject.SetActive(false);
|
|||
|
if (item.hideFeet)
|
|||
|
characterModel.feet.gameObject.SetActive(false);
|
|||
|
|
|||
|
if (PlayerEquipment == this && item.hideArms)
|
|||
|
PlayerCombat.instance.fpsArms.arms.gameObject.SetActive(false);
|
|||
|
|
|||
|
if (PlayerEquipment == this && item.hideHands)
|
|||
|
PlayerCombat.instance.fpsArms.hands.gameObject.SetActive(false);
|
|||
|
}
|
|||
|
}
|
|||
|
else if(_item.item.itemType == ItemTypes.AmmoItem)
|
|||
|
{
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Ammo] != null)
|
|||
|
Unequip(EquipmentSlots.Ammo);
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Ammo] = _item;
|
|||
|
}
|
|||
|
else if(_item.item.itemType == ItemTypes.WeaponItem)
|
|||
|
{
|
|||
|
WeaponItem item = (WeaponItem)_item.item;
|
|||
|
|
|||
|
if(itemsEquipped[(int)EquipmentSlots.RHand] != null)
|
|||
|
{
|
|||
|
if (item.weaponType == WeaponType.BladeOneHand ||
|
|||
|
item.weaponType == WeaponType.BluntOneHand)
|
|||
|
doingOneHWeaponSwap = true;
|
|||
|
|
|||
|
Unequip(EquipmentSlots.RHand);
|
|||
|
|
|||
|
doingOneHWeaponSwap = false;
|
|||
|
}
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.LHand] != null)
|
|||
|
{
|
|||
|
if (item.weaponType == WeaponType.BladeTwoHands ||
|
|||
|
item.weaponType == WeaponType.BluntTwoHands ||
|
|||
|
item.weaponType == WeaponType.Bow)
|
|||
|
Unequip(EquipmentSlots.LHand);
|
|||
|
}
|
|||
|
|
|||
|
_item.isEquipped = true;
|
|||
|
itemsEquipped[(int)EquipmentSlots.RHand] = _item;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Remove duplicates armorsEquipped
|
|||
|
armorsEquipped = armorsEquipped.Distinct().ToList();
|
|||
|
|
|||
|
CalculateStats();
|
|||
|
SpawnArmorsMeshes();
|
|||
|
OnEquipmentChanges();
|
|||
|
|
|||
|
if (PlayerEquipment == this)
|
|||
|
PlayerCombat.instance.SetWeaponUI();
|
|||
|
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
// Broadcast to PlayerInInventory
|
|||
|
PlayerInInventory.instance.equipment.Equip(_item);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool Unequip(ItemInInventory _item) // @Schaken
|
|||
|
{
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
{
|
|||
|
// TOCHANGE IF ENTITY IS ATTACKING.
|
|||
|
if (PlayerCombat.instance.isAttacking)
|
|||
|
{
|
|||
|
AlertMessage.instance.InitAlertMessage("You cannot change weapons and armor while attacking.", AlertMessage.DEFAULT_MESSAGE_DURATION_SHORT);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (_item != null && _item.item == null)
|
|||
|
return false;
|
|||
|
|
|||
|
if (_item.item.itemType == ItemTypes.ArmorItem)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)_item.item;
|
|||
|
|
|||
|
for (int i = 0; i < item.Bipeds.Length; i++)
|
|||
|
{
|
|||
|
switch (item.Bipeds[i])
|
|||
|
{
|
|||
|
case BipedObject.Head:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Head] = null;
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.UpperBody:
|
|||
|
|
|||
|
// Enable default upperbody
|
|||
|
if (characterModel.defaultUpperbody != null)
|
|||
|
characterModel.defaultUpperbody.gameObject.SetActive(true);
|
|||
|
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Upperbody] = null;
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.LowerBody:
|
|||
|
|
|||
|
// Enable default upperbody
|
|||
|
if (characterModel.defaultLowerbody != null)
|
|||
|
characterModel.defaultLowerbody.gameObject.SetActive(true);
|
|||
|
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Lowerbody] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Hand:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Hands] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Foot:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Feets] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.RightRing:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.RRing] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.LeftRing:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.LRing] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case BipedObject.Amulet:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.Amulet] = null;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
case BipedObject.Shield:
|
|||
|
_item.isEquipped = false;
|
|||
|
armorsEquipped.Remove(_item);
|
|||
|
itemsEquipped[(int)EquipmentSlots.LHand] = null;
|
|||
|
currentShield = (ArmorItem)_item.item;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Hide body parts if we have to
|
|||
|
if (characterModel != null)
|
|||
|
{
|
|||
|
if (item.HideHair && characterModel.hair != null)
|
|||
|
characterModel.hair.gameObject.SetActive(true);
|
|||
|
if (item.hideHead)
|
|||
|
characterModel.head.gameObject.SetActive(true);
|
|||
|
if (item.hideUpperbody)
|
|||
|
characterModel.upperbody.gameObject.SetActive(true);
|
|||
|
if (item.hideArms)
|
|||
|
characterModel.arms.gameObject.SetActive(true);
|
|||
|
if (item.hideHands)
|
|||
|
characterModel.hands.gameObject.SetActive(true);
|
|||
|
if (item.hideLegs)
|
|||
|
characterModel.lowerbody.gameObject.SetActive(true);
|
|||
|
if (item.hideFeet)
|
|||
|
characterModel.feet.gameObject.SetActive(true);
|
|||
|
|
|||
|
if (PlayerEquipment == this && item.hideArms)
|
|||
|
PlayerCombat.instance.fpsArms.arms.gameObject.SetActive(true);
|
|||
|
|
|||
|
if (PlayerEquipment == this && item.hideHands)
|
|||
|
PlayerCombat.instance.fpsArms.hands.gameObject.SetActive(true);
|
|||
|
}
|
|||
|
}
|
|||
|
else if(_item.item.itemType == ItemTypes.AmmoItem)
|
|||
|
{
|
|||
|
_item.isEquipped = false;
|
|||
|
itemsEquipped[(int)EquipmentSlots.Ammo] = null;
|
|||
|
}
|
|||
|
else if(_item.item.itemType == ItemTypes.WeaponItem)
|
|||
|
{
|
|||
|
_item.isEquipped = false;
|
|||
|
itemsEquipped[(int)EquipmentSlots.RHand] = null;
|
|||
|
}
|
|||
|
|
|||
|
// Remove duplicates armorsEquipped
|
|||
|
armorsEquipped = armorsEquipped.Distinct().ToList();
|
|||
|
|
|||
|
CalculateStats();
|
|||
|
SpawnArmorsMeshes();
|
|||
|
OnEquipmentChanges();
|
|||
|
|
|||
|
if (PlayerEquipment == this)
|
|||
|
PlayerCombat.instance.SetWeaponUI();
|
|||
|
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
PlayerInInventory.instance.equipment.Unequip(_item);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
[ContextMenu("OnEquipmentChanges")]
|
|||
|
public void OnEquipmentChanges()
|
|||
|
{
|
|||
|
// Broadcast to PlayerInInventory
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
PlayerInInventory.instance.equipment.OnEquipmentChanges();
|
|||
|
|
|||
|
// Check for L hand
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.LHand] != null && itemsEquipped[(int)EquipmentSlots.LHand].item != null)
|
|||
|
{
|
|||
|
if(itemsEquipped[(int)EquipmentSlots.LHand].item.itemType == ItemTypes.ArmorItem)
|
|||
|
{
|
|||
|
ArmorItem armorItem = (ArmorItem)itemsEquipped[(int)EquipmentSlots.LHand].item;
|
|||
|
|
|||
|
isUsingShield = (armorItem.Bipeds.Contains(BipedObject.Shield));
|
|||
|
|
|||
|
if (isUsingShield) // If we're using a shield we must have a one handed weapon equipped
|
|||
|
{
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.RHand] != null && itemsEquipped[(int)EquipmentSlots.RHand].item != null)
|
|||
|
{
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.RHand].item.itemType == ItemTypes.WeaponItem)
|
|||
|
{
|
|||
|
WeaponItem currentWeap = (WeaponItem)itemsEquipped[(int)EquipmentSlots.RHand].item;
|
|||
|
|
|||
|
// If we're using an one handed weapon
|
|||
|
if (currentWeap.weaponType == WeaponType.BladeOneHand || currentWeap.weaponType == WeaponType.BluntOneHand || currentWeap.weaponType == WeaponType.DaggerOneHand)
|
|||
|
{
|
|||
|
// ALL GOOD
|
|||
|
if (PlayerEquipment == this)
|
|||
|
{
|
|||
|
PlayerCombat.instance.fpcAnim.SetBool("isUsingShield", isUsingShield);
|
|||
|
Player.ThirdPersonPlayer.instance.m_Animator.SetBool("isUsingShield", isUsingShield);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Animator anim = GetComponent<Animator>();
|
|||
|
if (anim != null)
|
|||
|
anim.SetBool("isUsingShield", isUsingShield);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if(!doingOneHWeaponSwap)
|
|||
|
{
|
|||
|
// Unequip the shield
|
|||
|
Unequip(EquipmentSlots.LHand);
|
|||
|
|
|||
|
if(PlayerEquipment == this)
|
|||
|
AlertMessage.instance.InitAlertMessage("You can't equip a shield without an\none-handed weapon.", AlertMessage.DEFAULT_MESSAGE_DURATION_SHORT);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else
|
|||
|
{
|
|||
|
isUsingShield = false;
|
|||
|
|
|||
|
if (PlayerEquipment == this)
|
|||
|
{
|
|||
|
PlayerCombat.instance.fpcAnim.SetBool("isUsingShield", isUsingShield);
|
|||
|
Player.ThirdPersonPlayer.instance.m_Animator.SetBool("isUsingShield", isUsingShield);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Animator anim = GetComponent<Animator>();
|
|||
|
if(anim != null)
|
|||
|
anim.SetBool("isUsingShield", isUsingShield);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.RHand] == null && currentWeapon != null && currentWeapon.weaponType != WeaponType.Unarmed)
|
|||
|
{
|
|||
|
// Unequip = destroy previous equipped weapon
|
|||
|
Destroy(currentWeaponObject);
|
|||
|
Destroy(currentWeaponOnHip);
|
|||
|
|
|||
|
currentWeapon = null;
|
|||
|
}
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Ammo] == null && currentAmmo != null)
|
|||
|
{
|
|||
|
// Unequip = destroy previous equipped weapon
|
|||
|
Destroy(currentAmmoObject);
|
|||
|
|
|||
|
itemsEquipped[(int)EquipmentSlots.Ammo] = null;
|
|||
|
}
|
|||
|
|
|||
|
// Broadcast to PlayerInInventory
|
|||
|
if (PlayerEquipment != null && PlayerEquipment == this)
|
|||
|
{
|
|||
|
if (Player.RckPlayer.instance.isInThirdPerson)
|
|||
|
Player.RckPlayer.instance.SwitchToThirdPerson();
|
|||
|
else
|
|||
|
Player.RckPlayer.instance.SwitchToFirstPerson();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Calculate Armor rate, meele damage output and ranged damage output in base of our gear.
|
|||
|
/// </summary>
|
|||
|
private void CalculateStats() // @Schaken
|
|||
|
{
|
|||
|
// Reset Stats
|
|||
|
ArmorRate = 0;
|
|||
|
MeleeDamageOutput = 0;
|
|||
|
RangedDamageOutput = 0;
|
|||
|
|
|||
|
// A single armor can be present (can occupy slots) in different parts of the body
|
|||
|
// But we need to calculate the stats only once
|
|||
|
List<ItemInInventory> ArmorsEquippedItems = new List<ItemInInventory>();
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Head] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.Head]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.Head]);
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Upperbody] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.Upperbody]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.Upperbody]);
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Lowerbody] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.Lowerbody]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.Lowerbody]);
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Hands] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.Hands]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.Hands]);
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Feets] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.Feets]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.Feets]);
|
|||
|
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.LHand] != null)
|
|||
|
if (!ArmorsEquippedItems.Contains(itemsEquipped[(int)EquipmentSlots.LHand]))
|
|||
|
ArmorsEquippedItems.Add(itemsEquipped[(int)EquipmentSlots.LHand]);
|
|||
|
|
|||
|
/* Debug of ArmorsEquipped
|
|||
|
Debug.LogWarning("-----------");
|
|||
|
for (int i = 0; i < ArmorsEquippedItems.Count; i++)
|
|||
|
{
|
|||
|
Debug.Log(ArmorsEquippedItems[i].item);
|
|||
|
}
|
|||
|
Debug.LogWarning("-----------");
|
|||
|
*/
|
|||
|
|
|||
|
// Calculate armor stats
|
|||
|
for (int i = 0; i < ArmorsEquippedItems.Count; i++)
|
|||
|
{
|
|||
|
if (ArmorsEquippedItems[i].item != null)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)ArmorsEquippedItems[i].item;
|
|||
|
ArmorRate += item.ArmorRating;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Calculate Melee Damage Output
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.RHand] != null && itemsEquipped[(int)EquipmentSlots.RHand].item != null)
|
|||
|
{
|
|||
|
WeaponItem item = (WeaponItem)itemsEquipped[(int)EquipmentSlots.RHand].item;
|
|||
|
|
|||
|
if (item.weaponType != WeaponType.Bow)
|
|||
|
MeleeDamageOutput += item.Damage;
|
|||
|
else
|
|||
|
RangedDamageOutput += item.Damage;
|
|||
|
|
|||
|
// You can add here other buffs, like character strenght, dexterity etc
|
|||
|
}
|
|||
|
|
|||
|
// Calculate Ranged Damage Output
|
|||
|
if (itemsEquipped[(int)EquipmentSlots.Ammo] != null && itemsEquipped[(int)EquipmentSlots.Ammo].item != null)
|
|||
|
{
|
|||
|
// If we've got a bow equipped
|
|||
|
if (RangedDamageOutput >= 0.1)
|
|||
|
{
|
|||
|
// Add ammo damage
|
|||
|
AmmoItem item = (AmmoItem)itemsEquipped[(int)EquipmentSlots.Ammo].item;
|
|||
|
RangedDamageOutput += item.Damage;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void SpawnArmorsMeshes()
|
|||
|
{
|
|||
|
for (int i = 0; i < armorsMeshes.Count; i++)
|
|||
|
{
|
|||
|
#if UNITY_EDITOR
|
|||
|
if(!Application.isPlaying)
|
|||
|
DestroyImmediate(armorsMeshes[i].gameObject);
|
|||
|
else
|
|||
|
Destroy(armorsMeshes[i].gameObject);
|
|||
|
#else
|
|||
|
Destroy(armorsMeshes[i].gameObject);
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
armorsMeshes.Clear();
|
|||
|
|
|||
|
for(int i = 0; i < armorsEquipped.Count; i++)
|
|||
|
{
|
|||
|
ArmorItem armorItem = (ArmorItem)armorsEquipped[i].item;
|
|||
|
|
|||
|
if (!armorItem.isStaticObject)
|
|||
|
{
|
|||
|
if (armorsEquipped[i].item.useMesh)
|
|||
|
{
|
|||
|
armorsMeshes.Add(AttachToMesh(armorsEquipped[i].item).gameObject);
|
|||
|
|
|||
|
if (PlayerEquipment == this)
|
|||
|
{
|
|||
|
if ((armorItem).Bipeds.Contains(BipedObject.Hand) ||
|
|||
|
(armorItem).Bipeds.Contains(BipedObject.UpperBody))
|
|||
|
armorsMeshes.Add(AttachToFPMesh(armorsEquipped[i].item).gameObject);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(armorItem.Bipeds.Contains(BipedObject.Shield)) //shieldadd
|
|||
|
{
|
|||
|
// Spawn the shield model
|
|||
|
GameObject shield = SpawnStaticObject(armorsEquipped[i].item, StaticObjectSlot.LeftHand);
|
|||
|
armorsMeshes.Add(shield);
|
|||
|
currentShieldObject = shield;
|
|||
|
|
|||
|
if(PlayerEquipment == this)
|
|||
|
armorsMeshes.Add(SpawnStaticFPObject(armorsEquipped[i].item, StaticObjectSlot.LeftHand));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Hide body parts if we have to
|
|||
|
if (characterModel != null)
|
|||
|
{
|
|||
|
if (armorItem.hideHead)
|
|||
|
characterModel.head.gameObject.SetActive(false);
|
|||
|
if (armorItem.hideUpperbody)
|
|||
|
characterModel.upperbody.gameObject.SetActive(false);
|
|||
|
if (armorItem.hideArms)
|
|||
|
characterModel.arms.gameObject.SetActive(false);
|
|||
|
if (armorItem.hideHands)
|
|||
|
characterModel.hands.gameObject.SetActive(false);
|
|||
|
if (armorItem.hideLegs)
|
|||
|
characterModel.lowerbody.gameObject.SetActive(false);
|
|||
|
if (armorItem.hideFeet)
|
|||
|
characterModel.feet.gameObject.SetActive(false);
|
|||
|
|
|||
|
if (PlayerEquipment == this && armorItem.hideArms)
|
|||
|
PlayerCombat.instance.fpsArms.arms.gameObject.SetActive(false);
|
|||
|
|
|||
|
if (PlayerEquipment == this && armorItem.hideHands)
|
|||
|
PlayerCombat.instance.fpsArms.hands.gameObject.SetActive(false);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public SkinnedMeshRenderer AttachToMesh(Item _item)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)_item;
|
|||
|
|
|||
|
SkinnedMeshRenderer getMesh = characterModel.isMale ? item.MaleBipedModel : item.FemaleBipedModel;
|
|||
|
|
|||
|
SkinnedMeshRenderer newMesh = Instantiate(getMesh) as SkinnedMeshRenderer;
|
|||
|
newMesh.transform.parent = characterModel.upperbody.transform.parent;
|
|||
|
|
|||
|
newMesh.rootBone = characterModel.upperbody.rootBone;
|
|||
|
newMesh.bones = characterModel.upperbody.bones;
|
|||
|
|
|||
|
Mesh m = characterModel.head.sharedMesh;
|
|||
|
|
|||
|
for (int k = 0; k < m.blendShapeCount; k++)
|
|||
|
{
|
|||
|
if (characterModel.head.GetBlendShapeWeight(k) != 0) {
|
|||
|
newMesh.SetBlendShapeWeight(k, characterModel.head.GetBlendShapeWeight(k));
|
|||
|
}
|
|||
|
}
|
|||
|
return newMesh;
|
|||
|
}
|
|||
|
|
|||
|
public SkinnedMeshRenderer AttachToFPMesh(Item _item)
|
|||
|
{
|
|||
|
if (this != Equipment.PlayerEquipment)
|
|||
|
return null;
|
|||
|
|
|||
|
ArmorItem item = (ArmorItem)_item;
|
|||
|
|
|||
|
SkinnedMeshRenderer getMesh = (item.useFirstPersonModel) ? item.fpMaleModel : item.MaleBipedModel;
|
|||
|
|
|||
|
SkinnedMeshRenderer newMesh = Instantiate(getMesh) as SkinnedMeshRenderer;
|
|||
|
newMesh.updateWhenOffscreen = true;
|
|||
|
newMesh.gameObject.layer = LayerMask.NameToLayer("FirstPerson");
|
|||
|
newMesh.transform.parent = FP_Arms.transform.parent;
|
|||
|
|
|||
|
newMesh.rootBone = FP_Arms.rootBone;
|
|||
|
newMesh.bones = FP_Arms.bones;
|
|||
|
|
|||
|
return newMesh;
|
|||
|
}
|
|||
|
|
|||
|
public GameObject SpawnStaticObject(Item _item, StaticObjectSlot _slot)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)_item;
|
|||
|
|
|||
|
GameObject newObject = Instantiate(item.maleStaticObject, (_slot == StaticObjectSlot.LeftHand) ? characterModel.lHand : characterModel.rHand);
|
|||
|
|
|||
|
return newObject;
|
|||
|
}
|
|||
|
|
|||
|
public GameObject SpawnStaticFPObject(Item _item, StaticObjectSlot _slot)
|
|||
|
{
|
|||
|
ArmorItem item = (ArmorItem)_item;
|
|||
|
|
|||
|
GameObject newObject = Instantiate(item.maleStaticObject, (_slot == StaticObjectSlot.LeftHand) ? PlayerCombat.instance.fpsArms.lHand : PlayerCombat.instance.fpsArms.rHand);
|
|||
|
newObject.SetLayer(RCKLayers.FirstPerson, true);
|
|||
|
return newObject;
|
|||
|
}
|
|||
|
|
|||
|
public bool Unequip(EquipmentSlots slot)
|
|||
|
{
|
|||
|
return Unequip(itemsEquipped[(int)slot]);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public bool IsEquipped(string _itemID)
|
|||
|
{
|
|||
|
for(int i = 0; i < itemsEquipped.Length; i++)
|
|||
|
{
|
|||
|
if (itemsEquipped[i] != null && itemsEquipped[i].item != null)
|
|||
|
{
|
|||
|
if (itemsEquipped[i].item.ItemID == _itemID)
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|