using Cyber.Console; using Cyber.Items; using Cyber.Networking; using Cyber.Networking.Serverside; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; namespace Cyber.Entities.SyncBases { /// /// The Inventory component, used for managing the inventory of a . /// public class Inventory : SyncBase { /// /// Refrence of the actual . /// public Drive Drive; /// /// This entity's s. /// public Equipped Equipped; /// /// Creates the Inventory-component for a game object. /// public Inventory() { Drive = new Drive(10f); Equipped = new Equipped(); if (Server.IsRunning()) { Drive.AddItem(ItemDB.Singleton.Get(0)); Drive.AddItem(ItemDB.Singleton.Get(1)); } } /// /// Generates a checksum for the inventory /// /// A checksum of the IDs of the items public override int GenerateChecksum() { var Items = Drive.GetItems().ToArray(); int Checksum = 0; for (int i = 0; i < Items.Length; i++) { Checksum ^= Items[i].ID; } var EquippedItems = Equipped.GetEquippedList().ToArray(); for (int i = 0; i < EquippedItems.Length; i++) { Checksum ^= EquippedItems[i].ID; } return Checksum; } /// /// Returns the sync handletype indicating how the inventory should be synced. /// /// public override SyncHandletype GetSyncHandletype() { return new SyncHandletype(true, 10); } /// /// Deserializes the ID's and creates them in the . /// /// public override void Deserialize(NetworkReader reader) { Debug.Log("Deserializing inventory!"); byte[][] ByteArray = new byte[4][]; ByteArray[0] = reader.ReadBytesAndSize(); ByteArray[1] = reader.ReadBytesAndSize(); ByteArray[2] = reader.ReadBytesAndSize(); ByteArray[3] = reader.ReadBytesAndSize(); int[] IDs = NetworkHelper.DeserializeIntArray(ByteArray); Drive.Clear(); foreach (int id in IDs) { Drive.AddItem(ItemDB.Singleton.Get(id)); } bool ReceivedSlots = reader.ReadBoolean(); if (!ReceivedSlots) { Equipped.ClearAllEquipped(); return; } byte[] Slots = reader.ReadBytesAndSize(); Debug.Log(Slots); byte[][] EquippedIdsBytes = new byte[4][]; EquippedIdsBytes[0] = reader.ReadBytesAndSize(); EquippedIdsBytes[1] = reader.ReadBytesAndSize(); EquippedIdsBytes[2] = reader.ReadBytesAndSize(); EquippedIdsBytes[3] = reader.ReadBytesAndSize(); int[] EquippedIds = NetworkHelper.DeserializeIntArray(EquippedIdsBytes); Equipped.ClearAllEquipped(); for (int i = 0; i < Slots.Length; i++) { Equipped.SetSlot((EquipSlot) Slots[i], ItemDB.Singleton.Get(EquippedIds[i])); } } /// /// Serializes only the 's item IDs. /// /// public override void Serialize(NetworkWriter writer) { var Items = Drive.GetItems(); int[] IDs = new int[Items.Count]; for (int i = 0; i < Items.Count; i++) { IDs[i] = Items[i].ID; } byte[][] ByteArray = NetworkHelper.SerializeIntArray(IDs); writer.WriteBytesFull(ByteArray[0]); writer.WriteBytesFull(ByteArray[1]); writer.WriteBytesFull(ByteArray[2]); writer.WriteBytesFull(ByteArray[3]); var slotList = new List(Equipped.GetEquippedDict().Keys).ConvertAll(x => (byte) x); if (slotList.Count > 0) { writer.Write(true); } else { writer.Write(false); } slotList.Sort((a, b) => { return b - a; }); var idList = new List(); slotList.ForEach(x => { idList.Add(Equipped.GetItem((EquipSlot) x).ID); }); writer.WriteBytesFull(slotList.ToArray()); byte[][] EquippedByteArray = NetworkHelper.SerializeIntArray(idList.ToArray()); writer.WriteBytesFull(EquippedByteArray[0]); writer.WriteBytesFull(EquippedByteArray[1]); writer.WriteBytesFull(EquippedByteArray[2]); writer.WriteBytesFull(EquippedByteArray[3]); } } }