diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_ManMatter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_ManMatter.cs index 3d56c6e4af..f128d154b4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_ManMatter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_ManMatter.cs @@ -8,6 +8,7 @@ using PerfectWorld.Scripts.Player; using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Runtime.InteropServices; using TMPro; using UnityEngine; @@ -17,10 +18,34 @@ namespace PerfectWorld.Scripts.Managers { namespace BrewMonster.Managers { + /// + /// Matter Manager - Handles matter data storage and provides access to other classes + /// + /// Usage Examples: + /// // Get matter manager instance + /// var matterManager = EC_ManMessageMono.Instance.GetECManMatter; + /// + /// // Get specific matter data + /// var matterData = matterManager.GetMatterData(12345); + /// + /// // Get individual fields + /// int? mid = matterManager.GetMatterId(12345); + /// int? tid = matterManager.GetMatterTid(12345); + /// A3DVECTOR3? pos = matterManager.GetMatterPosition(12345); + /// byte? state = matterManager.GetMatterState(12345); + /// + /// // Find matters by criteria + /// int[] mattersByTid = matterManager.FindMattersByTid(100); + /// int[] mattersByState = matterManager.FindMattersByState(1); + /// int[] nearbyMatters = matterManager.FindMattersNearPosition(new A3DVECTOR3(0,0,0), 10.0f); + /// [Serializable] public class EC_ManMatter : IMsgHandler { public int HandlerId => (int)MANAGER_INDEX.MAN_MATTER; + + // Storage for matter data that players can access later + private Dictionary matterDataStorage = new Dictionary(); public bool ProcessMessage(ECMSG Msg) { /*if (Msg.iSubID == 0) @@ -50,6 +75,132 @@ namespace PerfectWorld.Scripts.Managers { byte[] data = (byte[])Msg.dwParam1; + try + { + // Parse the byte array into info_matter structure + info_matter matterInfo = CSNetwork.GPDataType.GPDataTypeHelper.FromBytes(data); + + // Store the matter data for later player access + matterDataStorage[matterInfo.mid] = matterInfo; + + Debug.Log($"Matter entered world - ID: {matterInfo.mid}, TID: {matterInfo.tid}, Position: {matterInfo.pos}, State: {matterInfo.state}"); + + // Notify pickupItem to create cube for this matter + NotifyPickupItem(matterInfo.mid); + } + catch (Exception ex) + { + Debug.LogError($"Failed to parse matter data: {ex.Message}"); + } + } + + private void NotifyPickupItem(int matterId) + { + // Find the pickupItem component in the scene and update cubes + pickupItem pickupScript = UnityEngine.Object.FindFirstObjectByType(); + if (pickupScript != null) + { + pickupScript.UpdateMatterCubes(); + } + } + + // Public methods for players to access matter data + public info_matter? GetMatterData(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data : null; + } + + public Dictionary GetAllMatterData() + { + return new Dictionary(matterDataStorage); + } + + public bool HasMatterData(int matterId) + { + return matterDataStorage.ContainsKey(matterId); + } + + public void RemoveMatterData(int matterId) + { + if (matterDataStorage.ContainsKey(matterId)) + { + matterDataStorage.Remove(matterId); + Debug.Log($"Removed matter data for ID: {matterId}"); + } + } + + public int GetMatterCount() + { + return matterDataStorage.Count; + } + + // Convenience methods to get specific fields from matter data + public int? GetMatterId(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.mid : null; + } + + public int? GetMatterTid(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.tid : null; + } + + public A3DVECTOR3? GetMatterPosition(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.pos : null; + } + + public byte? GetMatterDir0(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.dir0 : null; + } + + public byte? GetMatterDir1(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.dir1 : null; + } + + public byte? GetMatterRadius(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.rad : null; + } + + public byte? GetMatterState(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.state : null; + } + + public byte? GetMatterValue(int matterId) + { + return matterDataStorage.TryGetValue(matterId, out info_matter data) ? data.value : null; + } + + // Get all matter IDs + public int[] GetAllMatterIds() + { + return matterDataStorage.Keys.ToArray(); + } + + // Find matters by template ID (tid) + public int[] FindMattersByTid(int tid) + { + return matterDataStorage.Where(kvp => kvp.Value.tid == tid).Select(kvp => kvp.Key).ToArray(); + } + + // Find matters by state + public int[] FindMattersByState(byte state) + { + return matterDataStorage.Where(kvp => kvp.Value.state == state).Select(kvp => kvp.Key).ToArray(); + } + + // Get matters within a certain distance from a position + public int[] FindMattersNearPosition(A3DVECTOR3 position, float maxDistance) + { + return matterDataStorage.Where(kvp => + { + float distance = (kvp.Value.pos - position).Magnitude(); + return distance <= maxDistance; + }).Select(kvp => kvp.Key).ToArray(); } } }