using MiniJSON; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Item : MonoBehaviour { public int PlayerID; public int ItemID; public GameObject ItemRoot; public string Type = ""; public bool DeleteOnDisconnect = false; public bool SwapOnDisconnect = true; public bool ManualDelete = false; public Dictionary<string, object> Details = new Dictionary<string, object>(); public string Key { get { return PlayerID + "_" + ItemID; } } public void DestroyItem() { if (netHost != null) netHost.DestroyItem(this); } private NetHost netHost; public NetHost GetNetHost() { return netHost; } // Start is called before the first frame update void Awake() { netHost = FindObjectOfType<NetHost>(); } private Vector3 lastPos; void Start() { UpdateLastAutoProps(); } private void UpdateLastAutoProps() { lastPos = RootTransform.position; } public bool IsLocal { get { return netHost == null || PlayerID == netHost.LocalPlayerID; } } // Update is called once per frame void Update() { CheckAutoProps(); } private void CheckAutoProps() { if (netHost != null && lastPos != RootTransform.position) { netHost.SendItemUpdate(this); } UpdateLastAutoProps(); } public Transform RootTransform { get { return ItemRoot == null ? transform.root : ItemRoot.transform; } } public Action OnRemoteUpdated; public void UpdateFromData(Dictionary<string, object> itemData) { Details = itemData; if (itemData.ContainsKey("x") && itemData.ContainsKey("y") && itemData.ContainsKey("z")) { RootTransform.position = new Vector3( itemData.Key("x", Convert.ToSingle), itemData.Key("y", Convert.ToSingle), itemData.Key("z", Convert.ToSingle) ); } if (OnRemoteUpdated != null) OnRemoteUpdated(); } public void SendUpdate() { if (IsLocal && netHost != null) { netHost.SendItemUpdate(this); } } public Dictionary<string, object> GetItemData() { Dictionary<string, object> ret = new Dictionary<string, object>(Details); ret["x"] = RootTransform.position.x; ret["y"] = RootTransform.position.y; ret["z"] = RootTransform.position.z; ret["item_id"] = ItemID; ret["type"] = Type; if (DeleteOnDisconnect) { ret["delete_on_disconnect"] = true; } if (SwapOnDisconnect) { ret["swap_on_disconnect"] = true; } return ret; } }