133 lines
4.2 KiB
C#
133 lines
4.2 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using SHINT.UI;
|
|
using SHINT.MQTT;
|
|
using System.Linq;
|
|
using WI;
|
|
using System;
|
|
using Best.MQTT;
|
|
using Best.MQTT.Packets;
|
|
using System.Text;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace SHINT
|
|
{
|
|
public class FacilityManager : MonoBehaviour, ISingle
|
|
{
|
|
public Facility[] facilities;
|
|
UI_FacilityInfo[] facilityUIs;
|
|
public Dictionary<string, Facility> facilityTable = new();
|
|
public Dictionary<string, UI_FacilityInfo> uiTable = new();
|
|
|
|
FacilityInfo[] allFacilityInfos;
|
|
public List<Facility> assemblyFacilities;
|
|
public List<Facility> injectionFacilities;
|
|
public event Action<FacilityManager> onInitEnd;
|
|
Dictionary<string, Facility> topicTable = new();
|
|
public void Subscribe(MQTTClient client)
|
|
{
|
|
foreach(var f in facilities)
|
|
{
|
|
if (f.info.topic == "")
|
|
continue;
|
|
using (new PacketBufferHelper(client))
|
|
{
|
|
//client.AddTopicAlias(f.info.topic);
|
|
client.CreateSubscriptionBuilder(f.info.topic)
|
|
.WithMessageCallback(OnMessage)
|
|
.WithMaximumQoS(QoSLevels.ExactlyOnceDelivery)
|
|
.BeginSubscribe();
|
|
|
|
topicTable.Add(f.info.topic, f);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnMessage(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
|
|
{
|
|
var payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
|
|
//Debug.Log(payload.Length);
|
|
//if (payload.Last() != ']')
|
|
//{
|
|
// Debug.Log($"Crash Packet!");
|
|
// return;
|
|
//}
|
|
var data = JsonConvert.DeserializeObject<List<TopicContainer>>(payload);
|
|
foreach(var d in data)
|
|
{
|
|
d.name = d.name.ToUpper();
|
|
}
|
|
topicTable[topicName].RefreshTopicData(data);
|
|
}
|
|
|
|
public override void AfterAwake()
|
|
{
|
|
facilities = FindObjectsOfType<Facility>();
|
|
facilityUIs = GetComponentsInChildren<UI_FacilityInfo>();
|
|
foreach(var f in facilities)
|
|
{
|
|
f.Initialize();
|
|
if (!facilityTable.TryAdd(f.name, f))
|
|
{
|
|
Debug.LogError($"Same Name Facility! {f.name}");
|
|
}
|
|
}
|
|
|
|
foreach(var f in facilityUIs)
|
|
{
|
|
f.gameObject.SetActive(false);
|
|
if (!uiTable.TryAdd(f.name, f))
|
|
{
|
|
Debug.LogError($"Same Name FacilityUI! {f.name}");
|
|
}
|
|
}
|
|
FacilitySetting();
|
|
}
|
|
|
|
public override void AfterStart()
|
|
{
|
|
onInitEnd(this);
|
|
}
|
|
|
|
public void FacilitySetting()
|
|
{
|
|
allFacilityInfos = Resources.LoadAll<FacilityInfo>("FacilityInfos");
|
|
foreach(var fi in allFacilityInfos)
|
|
{
|
|
var infoID = fi.name;
|
|
if (facilityTable.TryGetValue(infoID, out var facility))
|
|
{
|
|
facility.SetInfo(fi);
|
|
|
|
if (facility.info.buildingType == BuildingType.Injection)
|
|
{
|
|
injectionFacilities.Add(facility);
|
|
}
|
|
else if (facility.info.buildingType == BuildingType.Assembly)
|
|
{
|
|
assemblyFacilities.Add(facility);
|
|
}
|
|
|
|
if (uiTable.TryGetValue(infoID, out var ui))
|
|
{
|
|
facility.SetUI(ui);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError($"Not Found FacilityUI! {infoID}");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError($"Not Found Facility! {infoID}");
|
|
}
|
|
}
|
|
}
|
|
|
|
public List<Facility> FacilityList()
|
|
{
|
|
return facilities.ToList();
|
|
}
|
|
}
|
|
}
|