a few more test changes and cosmetics

This commit is contained in:
UbitUmarov
2023-03-12 20:26:27 +00:00
parent 6d22429329
commit 77d8bb9968
6 changed files with 392 additions and 242 deletions

View File

@@ -26,21 +26,12 @@
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text;
using log4net;
using Nini.Config;
using Mono.Addins;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using Caps=OpenSim.Framework.Capabilities.Caps;
namespace OpenSim.Region.ClientStack.Linden
{
@@ -185,7 +176,7 @@ namespace OpenSim.Region.ClientStack.Linden
Vector3 position, uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket,
bool checkEstate, int godLevel, bool limitedToEstate)
{
osUTF8 sb = new osUTF8(512);
osUTF8 sb = new(512);
LLSDxmlEncode2.AddMap("instantmessage", sb);
LLSDxmlEncode2.AddMap("message_params", sb); //messageParams
LLSDxmlEncode2.AddElem("type", dialog, sb);
@@ -346,7 +337,7 @@ namespace OpenSim.Region.ClientStack.Linden
public void PlacesQueryReply(UUID avatarID, UUID queryID, UUID transactionID, PlacesReplyData[] replyDataArray)
{
osUTF8 sb = new osUTF8(256);
osUTF8 sb = new(256);
LLSDxmlEncode2.AddMap(sb);
LLSDxmlEncode2.AddElem("message", "PlacesReplyMessage", sb);
LLSDxmlEncode2.AddMap("QueryData[]", sb); LLSDxmlEncode2.AddArray(sb);
@@ -476,7 +467,7 @@ namespace OpenSim.Region.ClientStack.Linden
public static string KeepAliveEvent()
{
osUTF8 sb = new osUTF8(256);
osUTF8 sb = new(256);
LLSDxmlEncode2.AddMap(sb);
LLSDxmlEncode2.AddElem("message", "FAKEEVENT", sb);
LLSDxmlEncode2.AddMap("body", sb);
@@ -485,9 +476,63 @@ namespace OpenSim.Region.ClientStack.Linden
return sb.ToString();
}
public void SendLargeGenericMessage(UUID avatarID, UUID? transationID, UUID? sessionID,
string method, UUID invoice, List<string> message)
{
osUTF8 sb = StartEvent("LargeGenericMessage");
LLSDxmlEncode2.AddArrayAndMap("AgentData", sb);
LLSDxmlEncode2.AddElem("AgentID", avatarID, sb);
if (transationID.HasValue)
LLSDxmlEncode2.AddElem("TransactionID", transationID.Value, sb);
if (sessionID.HasValue)
LLSDxmlEncode2.AddElem("SessionID", sessionID.Value, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("MethodData", sb);
LLSDxmlEncode2.AddElem("Method", method, sb);
LLSDxmlEncode2.AddElem("Invoice", invoice, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("ParamList", sb);
foreach (string s in message)
LLSDxmlEncode2.AddElem("Parameter", s, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
Enqueue(EndEventToBytes(sb), avatarID);
}
public void SendLargeGenericMessage(UUID avatarID, UUID? transationID, UUID? sessionID,
string method, UUID invoice, List<byte[]> message)
{
osUTF8 sb = StartEvent("LargeGenericMessage");
LLSDxmlEncode2.AddArrayAndMap("AgentData", sb);
LLSDxmlEncode2.AddElem("AgentID", avatarID, sb);
if (transationID.HasValue)
LLSDxmlEncode2.AddElem("TransactionID", transationID.Value, sb);
if (sessionID.HasValue)
LLSDxmlEncode2.AddElem("SessionID", sessionID.Value, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("MethodData", sb);
LLSDxmlEncode2.AddElem("Method", method, sb);
LLSDxmlEncode2.AddElem("Invoice", invoice, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("ParamList", sb);
foreach (byte[] b in message)
{
LLSDxmlEncode2.AddLLSD("<key>Parameter</key><string>", sb);
sb.Append(b);
LLSDxmlEncode2.AddLLSD("</string>", sb);
}
LLSDxmlEncode2.AddEndMapAndArray(sb);
Enqueue(EndEventToBytes(sb), avatarID);
}
public byte[] BuildEvent(string eventName, OSD eventBody)
{
OSDMap llsdEvent = new OSDMap(2);
OSDMap llsdEvent = new(2);
llsdEvent.Add("message", new OSDString(eventName));
llsdEvent.Add("body", eventBody);

View File

@@ -27,6 +27,8 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime;
@@ -4767,6 +4769,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
List<EntityUpdate> compressedUpdates = null;
List<EntityUpdate> terseUpdates = null;
List<SceneObjectPart> ObjectAnimationUpdates = null;
List<SceneObjectPart> needMaterials = null;
// Check to see if this is a flush
if (maxUpdatesBytes <= 0)
@@ -4821,6 +4824,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
useCompressUpdate = false;
bool istree = false;
bool hasMaterialOverride = false;
if (update.Entity is SceneObjectPart part)
{
@@ -4965,6 +4969,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
useCompressUpdate = grp.IsViewerCachable;
istree = (part.Shape.PCode == (byte)PCode.Grass || part.Shape.PCode == (byte)PCode.NewTree || part.Shape.PCode == (byte)PCode.Tree);
if(!istree && part.Shape.RenderMaterials is not null &&
part.Shape.ReflectionProbe is null &&
part.Shape.RenderMaterials.overrides is not null &&
part.Shape.RenderMaterials.overrides.Length > 0)
hasMaterialOverride = true;
}
else if (update.Entity is ScenePresence presence)
{
@@ -5076,6 +5085,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
objectUpdates.Add(update);
}
if(hasMaterialOverride)
{
needMaterials ??= new List<SceneObjectPart>(16);
needMaterials.Add((SceneObjectPart)update.Entity);
}
}
}
@@ -5090,8 +5104,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return;
timeDilation = Utils.FloatZeroOneToushort(m_scene.TimeDilation);
if(objectUpdates is not null)
if (objectUpdates is not null)
{
//List<EntityUpdate> tau = new List<EntityUpdate>(30);
@@ -5183,71 +5196,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
/* no zero encode compressed updates
if(compressedUpdates != null)
{
List<EntityUpdate> tau = new List<EntityUpdate>(30);
UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
byte[] data = buf.Data;
Buffer.BlockCopy(CompressedObjectHeader, 0, data , 0, 7);
Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, data, 7); // 15
Utils.UInt16ToBytes(timeDilation, data, 15); // 17
int countposition = 17; // blocks count position
int pos = 18;
int lastpos = 0;
int count = 0;
foreach (EntityUpdate eu in compressedUpdates)
{
SceneObjectPart sop = (SceneObjectPart)eu.Entity;
if (sop.ParentGroup is null || sop.ParentGroup.IsDeleted)
continue;
lastpos = pos;
CreateCompressedUpdateBlock(sop, mysp, data, ref pos);
if (pos < LLUDPServer.MAXPAYLOAD)
{
tau.Add(eu);
++count;
}
else
{
// we need more packets
UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
buf.Data[countposition] = (byte)count;
buf.DataLength = lastpos;
m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
buf = newbuf;
data = buf.Data;
pos = 18;
// im lazy now, just do last again
CreateCompressedUpdateBlock(sop, mysp, data, ref pos);
tau = new List<EntityUpdate>(30);
tau.Add(eu);
count = 1;
}
}
if (count > 0)
{
buf.Data[countposition] = (byte)count;
buf.DataLength = pos;
m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
}
}
*/
if (compressedUpdates is not null)
{
//List<EntityUpdate> tau = new List<EntityUpdate>(30);
@@ -5545,6 +5493,70 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
if (needMaterials is not null && eq is not null)
{
Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out uint regionX, out uint regionY);
foreach (SceneObjectPart sop in needMaterials)
{
Primitive.RenderMaterials.RenderMaterialOverrideEntry[] overrides = sop.Shape.RenderMaterials.overrides;
/*
osUTF8 sbinner = LLSDxmlEncode2.Start();
LLSDxmlEncode2.AddArray(sbinner);
LLSDxmlEncode2.AddMap(sbinner);
LLSDxmlEncode2.AddElem("object_id", sop.UUID, sbinner);
LLSDxmlEncode2.AddElem("region_handle_low", (int)regionX, sbinner);
LLSDxmlEncode2.AddElem("region_handle_high", (int)regionY, sbinner);
LLSDxmlEncode2.AddArray("sides", sbinner);
foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides)
LLSDxmlEncode2.AddElem(ovr.te_index, sbinner);
LLSDxmlEncode2.AddEndArray(sbinner);
LLSDxmlEncode2.AddArray("gltf_json", sbinner);
foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides)
{
LLSDxmlEncode2.AddElem(ovr.data, sbinner);
}
LLSDxmlEncode2.AddEndArray(sbinner);
LLSDxmlEncode2.AddEndMapAndArray(sbinner);
LLSDxmlEncode2.AddEnd(sbinner);
*/
OSDMap data = new OSDMap();
data["object_id"] = sop.UUID;
//data["region_handle_low"]= (int)regionX;
//data["region_handle_high"]= (int)regionY;
OSDArray sides = new OSDArray();
foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides)
sides.Add(ovr.te_index);
data["sides"] = sides;
OSDArray gltf = new OSDArray();
foreach (Primitive.RenderMaterials.RenderMaterialOverrideEntry ovr in overrides)
gltf.Add(ovr.data);
data["gltf_json"] = gltf;
string inner = OSDParser.SerializeLLSDNotationFull(data);
osUTF8 sb = eq.StartEvent("LargeGenericMessage");
LLSDxmlEncode2.AddArrayAndMap("AgentData", sb);
LLSDxmlEncode2.AddElem("AgentID", AgentId, sb);
//LLSDxmlEncode2.AddElem("TransactionID", transationID.Value, sb);
//LLSDxmlEncode2.AddElem("SessionID", sessionID.Value, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("MethodData", sb);
LLSDxmlEncode2.AddElem("Method", "GLTFMaterialOverride", sb);
LLSDxmlEncode2.AddElem("Invoice", UUID.Zero, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
LLSDxmlEncode2.AddArrayAndMap("ParamList", sb);
//LLSDxmlEncode2.AddElem("Parameter", sbinner, sb);
LLSDxmlEncode2.AddElem("Parameter", inner, sb);
LLSDxmlEncode2.AddEndMapAndArray(sb);
//OSUTF8Cached.Release(sbinner);
eq.Enqueue(eq.EndEventToBytes(sb), AgentId);
}
}
#endregion Packet Sending
#region Handle deleted objects