diff --git a/ModularRex/RexNetwork/ClientViews/NaaliClientView.cs b/ModularRex/RexNetwork/ClientViews/NaaliClientView.cs index 6edcd28..3e40e05 100644 --- a/ModularRex/RexNetwork/ClientViews/NaaliClientView.cs +++ b/ModularRex/RexNetwork/ClientViews/NaaliClientView.cs @@ -119,5 +119,67 @@ public override void SendRexObjectProperties(UUID id, RexObjectProperties x) OutPacket(gmp, ThrottleOutPacketType.Task); } + + public void SendECData(ECData data) + { + GenericMessagePacket gmp = new GenericMessagePacket(); + gmp.MethodData.Method = Utils.StringToBytes("ecsync"); + + byte[] ecbytedata = GetECBytes(data); + int numlines = 0; + int i = 0; + + if (ecbytedata != null) + { + while (i <= ecbytedata.Length) + { + numlines++; + i += 200; + } + } + + gmp.ParamList = new GenericMessagePacket.ParamListBlock[1 + numlines]; + gmp.ParamList[0] = new GenericMessagePacket.ParamListBlock(); + gmp.ParamList[0].Parameter = Utils.StringToBytes(data.EntityID.ToString()); + + for (i = 0; i < numlines; i++) + { + gmp.ParamList[i + 1] = new GenericMessagePacket.ParamListBlock(); + + if ((ecbytedata.Length - i * 200) < 200) + { + gmp.ParamList[i + 1].Parameter = new byte[ecbytedata.Length - i * 200]; + Buffer.BlockCopy(ecbytedata, i * 200, gmp.ParamList[i + 1].Parameter, 0, ecbytedata.Length - i * 200); + } + else + { + gmp.ParamList[i + 1].Parameter = new byte[200]; + Buffer.BlockCopy(ecbytedata, i * 200, gmp.ParamList[i + 1].Parameter, 0, 200); + } + } + + OutPacket(gmp, ThrottleOutPacketType.Task); + } + + private byte[] GetECBytes(ECData data) + { + int size = + data.ComponentType.Length + 1 + + data.ComponentName.Length + 1 + + data.Data.Length +1; + + byte[] buffer = new byte[size]; + int idx = 0; + + Encoding.ASCII.GetBytes(data.ComponentType).CopyTo(buffer, idx); + idx += data.ComponentType.Length; + + Encoding.ASCII.GetBytes(data.ComponentName).CopyTo(buffer, idx); + idx += data.ComponentName.Length; + + data.Data.CopyTo(buffer, idx); + + return buffer; + } } } diff --git a/ModularRex/RexParts/EntityComponentModule.cs b/ModularRex/RexParts/EntityComponentModule.cs index 04d7af5..5c8f433 100644 --- a/ModularRex/RexParts/EntityComponentModule.cs +++ b/ModularRex/RexParts/EntityComponentModule.cs @@ -102,6 +102,7 @@ public void AddRegion(Scene scene) public void RemoveRegion(Scene scene) { m_scenes.Remove(scene); + scene.EventManager.OnClientConnect -= new EventManager.OnClientConnectCoreDelegate(RegisterGMHandler); } public void RegionLoaded(Scene scene) @@ -118,13 +119,13 @@ private void RegisterGMHandler(OpenSim.Framework.Client.IClientCore client) NaaliClientView naali; if (client.TryGet(out naali)) { - naali.OnBinaryGenericMessage += new OpenSim.Region.ClientStack.LindenUDP.LLClientView.BinaryGenericMessage(HandleGenericMessage); + naali.OnBinaryGenericMessage += new OpenSim.Region.ClientStack.LindenUDP.LLClientView.BinaryGenericMessage(HandleGenericBinaryMessage); naali.AddGenericPacketHandler("ecstring", HandleEcStringGenericMessage); naali.AddGenericPacketHandler("ecremove", HandleEcRemoveGenericMessage); } } - private void HandleGenericMessage(object sender, string method, byte[][] args) + private void HandleGenericBinaryMessage(object sender, string method, byte[][] args) { UUID entityId; string componentName; @@ -209,6 +210,43 @@ private void SaveLocal(ECData component) m_entity_components[component.EntityID].Components[new KeyValuePair(component.ComponentType, component.ComponentName)] = component; } + public void SendECDataToAll(ECData component) + { + foreach (Scene scene in m_scenes) + { + scene.ForEachClient( + delegate(IClientAPI client) + { + if (client is NaaliClientView) + { + ((NaaliClientView)client).SendECData(component); + } + } + ); + } + } + + public void SendECRemovedToAll(UUID entityId, string componentType, string componentName) + { + List msgArgs = new List(); + msgArgs.Add(entityId.ToString()); + msgArgs.Add(componentType); + msgArgs.Add(componentName); + + foreach (Scene scene in m_scenes) + { + scene.ForEachClient( + delegate(IClientAPI client) + { + if (client is NaaliClientView) + { + ((NaaliClientView)client).SendGenericMessage("ecremoved", msgArgs); + } + } + ); + } + } + public bool SaveECData(object sender, ECData component) { try