From b7bccf994a9b5059d0ef5acd313e43bbcec95ce2 Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Fri, 3 Oct 2025 15:37:27 +0700
Subject: [PATCH] Update EC_ManMatter.cs
---
.../Scripts/Managers/EC_ManMatter.cs | 151 ++++++++++++++++++
1 file changed, 151 insertions(+)
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();
}
}
}