using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Passer.Humanoid;
// This is still limited to Photon PUN, Should implement RcpAttachHumanoid in the Humanoid Networking
#if hPHOTON2
using Photon.Pun;
#endif
namespace Passer {
///
/// Attaches additional functionality to Humanoid on a Site
///
public class HumanoidAttachments : MonoBehaviour
#if hPHOTON2
, IPunPrefabPool
#endif
{
///
/// The attachements to add to the Humanoid
///
/// Note that these should be prefab resources (this is not yet checked)
public GameObject[] attachments;
private List attachmentInstances = new List();
private void Start() {
HumanoidNetworking.OnConnectedToNetwork += ConnectedToNetwork;
HumanoidNetworking.OnNewRemoteHumanoid += NewRemoteHumanoid;
}
private void ConnectedToNetwork(HumanoidControl humanoid) {
#if hPHOTON2
defaultPrefabPool = PhotonNetwork.PrefabPool;
PhotonNetwork.PrefabPool = this;
foreach (GameObject attachment in attachments) {
GameObject attachmentObject = PhotonNetwork.Instantiate(attachment.name, this.transform.position, this.transform.rotation);
attachmentInstances.Add(attachmentObject);
PhotonView photonView = attachmentObject.GetComponent();
photonView.RPC("RpcAttachHumanoid", RpcTarget.All, (int)humanoid.nwId, humanoid.humanoidId);
}
#endif
}
private void NewRemoteHumanoid(HumanoidControl humanoid) {
#if hPHOTON2
foreach (GameObject attachment in attachmentInstances) {
PhotonView photonView = attachment.GetComponent();
photonView.RPC("RpcAttachHumanoid", RpcTarget.All, (int)humanoid.nwId, humanoid.humanoidId);
}
#endif
}
#if hPHOTON2
private IPunPrefabPool defaultPrefabPool;
GameObject IPunPrefabPool.Instantiate(string prefabId, Vector3 position, Quaternion rotation) {
for (int i = 0; i < attachments.Length; i++) {
if (prefabId == attachments[i].name) {
GameObject attachment = Instantiate(attachments[i], position, rotation);
attachment.SetActive(false);
return attachment;
}
}
return defaultPrefabPool.Instantiate(prefabId, position, rotation);
}
void IPunPrefabPool.Destroy(GameObject gameObject) {
Object.Destroy(gameObject);
}
#endif
}
}