|
|
@ -391,6 +391,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
data["partCount"] = OSD.FromInteger(children.Count);
|
|
|
|
data["partCount"] = OSD.FromInteger(children.Count);
|
|
|
|
data["actorID"] = OSD.FromString(m_actorID);
|
|
|
|
data["actorID"] = OSD.FromString(m_actorID);
|
|
|
|
int partNum = 0;
|
|
|
|
int partNum = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string debugString = "";
|
|
|
|
foreach (SceneObjectPart part in children)
|
|
|
|
foreach (SceneObjectPart part in children)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
string partTempID = "part" + partNum;
|
|
|
|
string partTempID = "part" + partNum;
|
|
|
@ -398,8 +400,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
partNum++;
|
|
|
|
partNum++;
|
|
|
|
|
|
|
|
|
|
|
|
//m_log.DebugFormat("{0}: SendLinkObject to link {1},{2} with {3}, {4}", part.Name, part.UUID, root.Name, root.UUID);
|
|
|
|
//m_log.DebugFormat("{0}: SendLinkObject to link {1},{2} with {3}, {4}", part.Name, part.UUID, root.Name, root.UUID);
|
|
|
|
|
|
|
|
debugString += part.UUID + ", ";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_log.DebugFormat("SyncLinkObject: SendLinkObject to link parts {0} with {1}, {2}", debugString, root.Name, root.UUID);
|
|
|
|
|
|
|
|
|
|
|
|
SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.LinkObject, OSDParser.SerializeJsonString(data));
|
|
|
|
SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.LinkObject, OSDParser.SerializeJsonString(data));
|
|
|
|
SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, linkedGroup, rsm);
|
|
|
|
SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, linkedGroup, rsm);
|
|
|
|
//SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, linkedGroup);
|
|
|
|
//SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, linkedGroup);
|
|
|
@ -1102,7 +1107,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
m_log.WarnFormat("SyncStateReport {0} -- Object count: {1}, Prim Count {2} ", m_scene.RegionInfo.RegionName, sogList.Count, primCount);
|
|
|
|
m_log.WarnFormat("SyncStateReport {0} -- Object count: {1}, Prim Count {2} ", m_scene.RegionInfo.RegionName, sogList.Count, primCount);
|
|
|
|
foreach (SceneObjectGroup sog in sogList)
|
|
|
|
foreach (SceneObjectGroup sog in sogList)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_log.WarnFormat("SyncStateReport -- SOG: name {0}, UUID {1}, position {2}", sog.Name, sog.UUID, sog.AbsolutePosition);
|
|
|
|
m_log.WarnFormat("\n\n SyncStateReport -- SOG: name {0}, UUID {1}, position {2}", sog.Name, sog.UUID, sog.AbsolutePosition);
|
|
|
|
|
|
|
|
|
|
|
|
foreach (SceneObjectPart part in sog.Parts)
|
|
|
|
foreach (SceneObjectPart part in sog.Parts)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Vector3 pos = Vector3.Zero;
|
|
|
|
Vector3 pos = Vector3.Zero;
|
|
|
@ -1110,7 +1116,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
pos = part.PhysActor.Position;
|
|
|
|
pos = part.PhysActor.Position;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
string debugMsg = "Part " + part.Name + "," + part.UUID+", LocalID "+part.LocalId;
|
|
|
|
string debugMsg = "\nPart " + part.Name + "," + part.UUID+", LocalID "+part.LocalId + "ProfileShape "+part.Shape.ProfileShape;
|
|
|
|
|
|
|
|
if (part.TaskInventory.Count > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
debugMsg += ", has " + part.TaskInventory.Count + " inventory items";
|
|
|
|
|
|
|
|
}
|
|
|
|
if (part.ParentGroup.RootPart.UUID == part.UUID)
|
|
|
|
if (part.ParentGroup.RootPart.UUID == part.UUID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
debugMsg += ", RootPart, ";
|
|
|
|
debugMsg += ", RootPart, ";
|
|
|
@ -1137,8 +1147,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
debugMsg += ", attached avatar's localID = "+sp.LocalId;
|
|
|
|
debugMsg += ", attached avatar's localID = "+sp.LocalId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_log.WarnFormat(debugMsg);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
m_log.WarnFormat(debugMsg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1185,7 +1196,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
estimateBytes += 4; //propertySyncInfo.LastUpdateSource, enum
|
|
|
|
estimateBytes += 4; //propertySyncInfo.LastUpdateSource, enum
|
|
|
|
estimateBytes += propertySyncInfo.LastUpdateSyncID.Length;
|
|
|
|
estimateBytes += propertySyncInfo.LastUpdateSyncID.Length;
|
|
|
|
|
|
|
|
|
|
|
|
if (valPair.Key == SceneObjectPartSyncProperties.Shape || valPair.Key == SceneObjectPartSyncProperties.TaskInventory)
|
|
|
|
if (valPair.Key == SceneObjectPartSyncProperties.Shape)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//The value is only a reference to SOP.Shape, shouldn't use too many bytes in memory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//estimateBytes += propertySyncInfo.LastUpdateValue
|
|
|
|
|
|
|
|
estimateBytes += ((String)propertySyncInfo.LastUpdateValueHash).Length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (valPair.Key == SceneObjectPartSyncProperties.TaskInventory)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
estimateBytes += ((String)propertySyncInfo.LastUpdateValue).Length;
|
|
|
|
estimateBytes += ((String)propertySyncInfo.LastUpdateValue).Length;
|
|
|
|
estimateBytes += ((String)propertySyncInfo.LastUpdateValueHash).Length;
|
|
|
|
estimateBytes += ((String)propertySyncInfo.LastUpdateValueHash).Length;
|
|
|
@ -1551,6 +1569,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool connected = false;
|
|
|
|
foreach (RegionSyncListenerInfo remoteListener in m_remoteSyncListeners)
|
|
|
|
foreach (RegionSyncListenerInfo remoteListener in m_remoteSyncListeners)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SyncConnector syncConnector = new SyncConnector(m_syncConnectorNum++, remoteListener, this);
|
|
|
|
SyncConnector syncConnector = new SyncConnector(m_syncConnectorNum++, remoteListener, this);
|
|
|
@ -1559,10 +1578,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
syncConnector.StartCommThreads();
|
|
|
|
syncConnector.StartCommThreads();
|
|
|
|
AddSyncConnector(syncConnector);
|
|
|
|
AddSyncConnector(syncConnector);
|
|
|
|
m_synced = true;
|
|
|
|
m_synced = true;
|
|
|
|
|
|
|
|
connected = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return connected;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//To be called when a SyncConnector needs to be created by that the local listener receives a connection request
|
|
|
|
//To be called when a SyncConnector needs to be created by that the local listener receives a connection request
|
|
|
@ -1848,14 +1868,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
primUUID = data["primUUID"].AsUUID();
|
|
|
|
primUUID = data["primUUID"].AsUUID();
|
|
|
|
SceneObjectPart sop = m_scene.GetSceneObjectPart(primUUID);
|
|
|
|
SceneObjectPart sop = m_scene.GetSceneObjectPart(primUUID);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
propertiesSyncInfo = m_primSyncInfoManager.DecodePrimProperties(data);
|
|
|
|
|
|
|
|
|
|
|
|
if (sop == null || sop.ParentGroup.IsDeleted)
|
|
|
|
if (sop == null || sop.ParentGroup.IsDeleted)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_log.WarnFormat("{0}: HandleUpdatedPrimProperties -- prim {1} no longer in local SceneGraph. SOP == NULL? ({2}), Sender is {3}",
|
|
|
|
bool shape = false;
|
|
|
|
LogHeader, primUUID, sop == null, senderActorID);
|
|
|
|
foreach (PropertySyncInfo p in propertiesSyncInfo)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// pString += p.Property.ToString() + " ";
|
|
|
|
|
|
|
|
if (p.Property == SceneObjectPartSyncProperties.Shape){
|
|
|
|
|
|
|
|
shape = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
m_log.WarnFormat("{0}: HandleUpdatedPrimProperties -- prim {1} not in local SceneGraph. SOP == NULL? ({2}), Sender is {3}, property == Shape? {4}",
|
|
|
|
|
|
|
|
LogHeader, primUUID, sop == null, senderActorID, shape);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
propertiesSyncInfo = m_primSyncInfoManager.DecodePrimProperties(data);
|
|
|
|
//propertiesSyncInfo = m_primSyncInfoManager.DecodePrimProperties(data);
|
|
|
|
|
|
|
|
|
|
|
|
if (propertiesSyncInfo.Count>0)
|
|
|
|
if (propertiesSyncInfo.Count>0)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1867,14 +1897,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
pString += p.Property.ToString() + " ";
|
|
|
|
pString += p.Property.ToString() + " ";
|
|
|
|
if (p.Property == SceneObjectPartSyncProperties.Shape)
|
|
|
|
if (p.Property == SceneObjectPartSyncProperties.Shape)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape((String)p.LastUpdateValue);
|
|
|
|
//PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape((String)p.LastUpdateValue);
|
|
|
|
|
|
|
|
PrimitiveBaseShape shape = (PrimitiveBaseShape)p.LastUpdateValue;
|
|
|
|
m_log.DebugFormat("Shape to be changed on SOP {0}, {1} to ProfileShape {2}", sop.Name, sop.UUID, shape.ProfileShape);
|
|
|
|
m_log.DebugFormat("Shape to be changed on SOP {0}, {1} to ProfileShape {2}", sop.Name, sop.UUID, shape.ProfileShape);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
m_log.DebugFormat("ms {0}: HandleUpdatedPrimProperties, for prim {1},{2} with updated properties -- {3}", DateTime.Now.Millisecond, sop.Name, sop.UUID, pString);
|
|
|
|
//m_log.DebugFormat("ms {0}: HandleUpdatedPrimProperties, for prim {1},{2} with updated properties -- {3}", DateTime.Now.Millisecond, sop.Name, sop.UUID, pString);
|
|
|
|
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo);
|
|
|
|
List<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo);
|
|
|
|
|
|
|
|
|
|
|
@ -1884,13 +1914,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_log.DebugFormat("AggregateScriptEvents updated: " + sop.AggregateScriptEvents);
|
|
|
|
m_log.DebugFormat("AggregateScriptEvents updated: " + sop.AggregateScriptEvents);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (propertiesUpdated.Contains(SceneObjectPartSyncProperties.Shape))
|
|
|
|
if (propertiesUpdated.Contains(SceneObjectPartSyncProperties.Shape))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
String hashedShape = Util.Md5Hash((PropertySerializer.SerializeShape(sop)));
|
|
|
|
string sopHashedShape = PropertySerializer.GetPropertyHashValue(PropertySerializer.SerializeShape(sop));
|
|
|
|
m_log.DebugFormat("HandleUpdatedPrimProperties -- SOP {0},{1}, Shape updated, ProfileShape {2}, hashed value in SOP:{3}, in PrinSyncInfoManager: {4}",
|
|
|
|
m_log.DebugFormat("HandleUpdatedPrimProperties -- SOP {0},{1}, Shape updated, ProfileShape {2}, hashed value for SOP.Shape:{3}, hashed value in PrinSyncInfoManager: {4}",
|
|
|
|
sop.Name, sop.UUID, sop.Shape.ProfileShape, hashedShape, m_primSyncInfoManager.GetPrimSyncInfo(sop.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash);
|
|
|
|
sop.Name, sop.UUID, sop.Shape.ProfileShape, sopHashedShape,
|
|
|
|
|
|
|
|
m_primSyncInfoManager.GetPrimSyncInfo(sop.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
* */
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (propertiesUpdated.Count > 0)
|
|
|
|
if (propertiesUpdated.Count > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -2223,7 +2257,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
//break;
|
|
|
|
//break;
|
|
|
|
case SymmetricSyncMessage.MsgType.ChatBroadcast:
|
|
|
|
case SymmetricSyncMessage.MsgType.ChatBroadcast:
|
|
|
|
//HandleRemoteEvent_OnChatBroadcast(init_actorID, evSeqNum, data);
|
|
|
|
//HandleRemoteEvent_OnChatBroadcast(init_actorID, evSeqNum, data);
|
|
|
|
HandleRemoveEvent_OnChatEvents(msg.Type, init_actorID, evSeqNum, data);
|
|
|
|
HandleRemoteEvent_OnChatEvents(msg.Type, init_actorID, evSeqNum, data);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case SymmetricSyncMessage.MsgType.ObjectGrab:
|
|
|
|
case SymmetricSyncMessage.MsgType.ObjectGrab:
|
|
|
|
HandleRemoteEvent_OnObjectGrab(init_actorID, evSeqNum, data);
|
|
|
|
HandleRemoteEvent_OnObjectGrab(init_actorID, evSeqNum, data);
|
|
|
@ -2335,7 +2369,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
/// <param name="actorID"></param>
|
|
|
|
/// <param name="actorID"></param>
|
|
|
|
/// <param name="evSeqNum"></param>
|
|
|
|
/// <param name="evSeqNum"></param>
|
|
|
|
/// <param name="data">The args of the event</param>
|
|
|
|
/// <param name="data">The args of the event</param>
|
|
|
|
private void HandleRemoveEvent_OnChatEvents(SymmetricSyncMessage.MsgType msgType, string actorID, ulong evSeqNum, OSDMap data)
|
|
|
|
private void HandleRemoteEvent_OnChatEvents(SymmetricSyncMessage.MsgType msgType, string actorID, ulong evSeqNum, OSDMap data)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OSChatMessage args = new OSChatMessage();
|
|
|
|
OSChatMessage args = new OSChatMessage();
|
|
|
|
args.Channel = data["channel"].AsInteger();
|
|
|
|
args.Channel = data["channel"].AsInteger();
|
|
|
@ -3367,8 +3401,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
HashSet<SceneObjectPartSyncProperties> updatedProperties = updatedPrimProperties.Value;
|
|
|
|
HashSet<SceneObjectPartSyncProperties> updatedProperties = updatedPrimProperties.Value;
|
|
|
|
|
|
|
|
|
|
|
|
//Sync the SOP data and cached property values in PrimSyncInfoManager again
|
|
|
|
//Sync the SOP data and cached property values in PrimSyncInfoManager again
|
|
|
|
HashSet<SceneObjectPartSyncProperties> propertiesWithSyncInfoUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoByLocal(sop, new List<SceneObjectPartSyncProperties>(updatedProperties));
|
|
|
|
//HashSet<SceneObjectPartSyncProperties> propertiesWithSyncInfoUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoByLocal(sop, new List<SceneObjectPartSyncProperties>(updatedProperties));
|
|
|
|
updatedProperties.UnionWith(propertiesWithSyncInfoUpdated);
|
|
|
|
//updatedProperties.UnionWith(propertiesWithSyncInfoUpdated);
|
|
|
|
SendPrimPropertyUpdates(sop, updatedProperties);
|
|
|
|
SendPrimPropertyUpdates(sop, updatedProperties);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -3385,7 +3419,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
|
|
|
|
|
|
|
|
private void SendPrimPropertyUpdates(SceneObjectPart sop, HashSet<SceneObjectPartSyncProperties> updatedProperties)
|
|
|
|
private void SendPrimPropertyUpdates(SceneObjectPart sop, HashSet<SceneObjectPartSyncProperties> updatedProperties)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OSDMap syncData = m_primSyncInfoManager.EncodePrimProperties(sop, updatedProperties);
|
|
|
|
OSDMap syncData;
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
syncData = m_primSyncInfoManager.EncodePrimProperties(sop, updatedProperties);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_log.ErrorFormat("Error in EncodePrimProperties for SOP {0}, {1}, ErrorMessage -- {2}", sop.Name, sop.UUID, e.Message);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (syncData.Count > 0)
|
|
|
|
if (syncData.Count > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -3409,7 +3453,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_log.DebugFormat("SendPrimPropertyUpdates -- prim {0}: Position: {1} ", sop.Name, sop.PhysActor.Position);
|
|
|
|
m_log.DebugFormat("SendPrimPropertyUpdates -- prim {0}: Position: {1} ", sop.Name, sop.PhysActor.Position);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
String hashedShape = Util.Md5Hash((PropertySerializer.SerializeShape(sop)));
|
|
|
|
|
|
|
|
m_log.DebugFormat("SendPrimPropertyUpdates -- SOP {0},{1}, Shape updated, ProfileShape {2}, hashed value in SOP:{3}, in PrinSyncInfoManager: {4}",
|
|
|
|
|
|
|
|
sop.Name, sop.UUID, sop.Shape.ProfileShape, hashedShape, m_primSyncInfoManager.GetPrimSyncInfo(sop.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedPrimProperties, OSDParser.SerializeJsonString(syncData));
|
|
|
|
SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedPrimProperties, OSDParser.SerializeJsonString(syncData));
|
|
|
|
SendPrimUpdateToRelevantSyncConnectors(sop.UUID, syncMsg);
|
|
|
|
SendPrimUpdateToRelevantSyncConnectors(sop.UUID, syncMsg);
|
|
|
@ -3488,7 +3540,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//DSG DEBUG
|
|
|
|
//DSG DEBUG
|
|
|
|
//m_log.DebugFormat("calling AddNewSceneObjectByDecoding for SOG {0}, {1}", group.Name, group.UUID);
|
|
|
|
m_log.DebugFormat("calling AddNewSceneObjectByDecoding for SOG {0}, {1}", group.Name, group.UUID);
|
|
|
|
|
|
|
|
|
|
|
|
//Add the list of PrimSyncInfo to PrimSyncInfoManager's record.
|
|
|
|
//Add the list of PrimSyncInfo to PrimSyncInfoManager's record.
|
|
|
|
m_primSyncInfoManager.InsertMultiPrimSyncInfo(primsSyncInfo);
|
|
|
|
m_primSyncInfoManager.InsertMultiPrimSyncInfo(primsSyncInfo);
|
|
|
@ -3796,8 +3848,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
switch (m_property)
|
|
|
|
switch (m_property)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
|
|
|
|
string shapeString = PropertySerializer.SerializeShape((PrimitiveBaseShape)pSyncInfo.LastUpdateValue);
|
|
|
|
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue(shapeString);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
m_lastUpdateValueHash = GetPropertyHashValue((string)pSyncInfo.LastUpdateValue);
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue((string)pSyncInfo.LastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -3813,8 +3868,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
switch (property)
|
|
|
|
switch (property)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
|
|
|
|
string shapeString = PropertySerializer.SerializeShape((PrimitiveBaseShape)initValue);
|
|
|
|
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue(shapeString);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
m_lastUpdateValueHash = GetPropertyHashValue((string)initValue);
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue((string)initValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -3918,13 +3976,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
switch (m_property)
|
|
|
|
switch (m_property)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
|
|
|
|
string shapeString = PropertySerializer.SerializeShape((PrimitiveBaseShape)m_lastUpdateValue);
|
|
|
|
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue(shapeString);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
m_lastUpdateValueHash = GetPropertyHashValue((string)m_lastUpdateValue);
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue((string)m_lastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public bool IsHashValueEqual(string hashValue)
|
|
|
|
public bool IsHashValueEqual(string hashValue)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return m_lastUpdateValueHash.Equals(hashValue);
|
|
|
|
return m_lastUpdateValueHash.Equals(hashValue);
|
|
|
@ -3943,201 +4005,207 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
public OSDMap ToOSDMap()
|
|
|
|
public OSDMap ToOSDMap()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OSDMap propertyData = new OSDMap();
|
|
|
|
OSDMap propertyData = new OSDMap();
|
|
|
|
propertyData["LastUpdateTimeStamp"] = LastUpdateTimeStamp;
|
|
|
|
lock (m_syncInfoLock)
|
|
|
|
propertyData["LastUpdateSyncID"] = LastUpdateSyncID;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (m_property)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
///////////////////////////////////////
|
|
|
|
propertyData["LastUpdateTimeStamp"] = LastUpdateTimeStamp;
|
|
|
|
//SOP properties with complex structure
|
|
|
|
propertyData["LastUpdateSyncID"] = LastUpdateSyncID;
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromString((string)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
switch (m_property)
|
|
|
|
//SOP properties, enum types
|
|
|
|
{
|
|
|
|
////////////////////////////
|
|
|
|
///////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.AggregateScriptEvents:
|
|
|
|
//SOP properties with complex structure
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)((scriptEvents)LastUpdateValue));
|
|
|
|
///////////////////////////////////////
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Flags:
|
|
|
|
string shapeString = PropertySerializer.SerializeShape((PrimitiveBaseShape)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.LocalFlags:
|
|
|
|
propertyData["Value"] = OSD.FromString(shapeString);
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)((PrimFlags)LastUpdateValue));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
////////////////////////////
|
|
|
|
propertyData["Value"] = OSD.FromString((string)LastUpdateValue);
|
|
|
|
//SOP properties, bool types
|
|
|
|
break;
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.AllowedDrop:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.IsAttachment:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.PassTouches:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.VolumeDetectActive:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, Vector3 types
|
|
|
|
//SOP properties, enum types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.AngularVelocity:
|
|
|
|
case SceneObjectPartSyncProperties.AggregateScriptEvents:
|
|
|
|
case SceneObjectPartSyncProperties.AttachedPos:
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)((scriptEvents)LastUpdateValue));
|
|
|
|
case SceneObjectPartSyncProperties.GroupPosition:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.OffsetPosition:
|
|
|
|
case SceneObjectPartSyncProperties.Flags:
|
|
|
|
case SceneObjectPartSyncProperties.Scale:
|
|
|
|
case SceneObjectPartSyncProperties.LocalFlags:
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetPosition:
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)((PrimFlags)LastUpdateValue));
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetPositionLL:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.SOP_Acceleration:
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Velocity:
|
|
|
|
//SOP properties, bool types
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
////////////////////////////
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.AllowedDrop:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.IsAttachment:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.PassTouches:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.VolumeDetectActive:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, UUID types
|
|
|
|
//SOP properties, Vector3 types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.AttachedAvatar:
|
|
|
|
case SceneObjectPartSyncProperties.AngularVelocity:
|
|
|
|
case SceneObjectPartSyncProperties.CollisionSound:
|
|
|
|
case SceneObjectPartSyncProperties.AttachedPos:
|
|
|
|
case SceneObjectPartSyncProperties.CreatorID:
|
|
|
|
case SceneObjectPartSyncProperties.GroupPosition:
|
|
|
|
case SceneObjectPartSyncProperties.FolderID:
|
|
|
|
case SceneObjectPartSyncProperties.OffsetPosition:
|
|
|
|
case SceneObjectPartSyncProperties.GroupID:
|
|
|
|
case SceneObjectPartSyncProperties.Scale:
|
|
|
|
case SceneObjectPartSyncProperties.LastOwnerID:
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetPosition:
|
|
|
|
case SceneObjectPartSyncProperties.OwnerID:
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetPositionLL:
|
|
|
|
case SceneObjectPartSyncProperties.Sound:
|
|
|
|
case SceneObjectPartSyncProperties.SOP_Acceleration:
|
|
|
|
propertyData["Value"] = OSD.FromUUID((UUID)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.Velocity:
|
|
|
|
break;
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
//case SceneObjectPartProperties.AttachedPos:
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, UUID types
|
|
|
|
//SOP properties, uint types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.AttachedAvatar:
|
|
|
|
case SceneObjectPartSyncProperties.AttachmentPoint:
|
|
|
|
case SceneObjectPartSyncProperties.CollisionSound:
|
|
|
|
case SceneObjectPartSyncProperties.BaseMask:
|
|
|
|
case SceneObjectPartSyncProperties.CreatorID:
|
|
|
|
case SceneObjectPartSyncProperties.Category:
|
|
|
|
case SceneObjectPartSyncProperties.FolderID:
|
|
|
|
case SceneObjectPartSyncProperties.EveryoneMask:
|
|
|
|
case SceneObjectPartSyncProperties.GroupID:
|
|
|
|
case SceneObjectPartSyncProperties.GroupMask:
|
|
|
|
case SceneObjectPartSyncProperties.LastOwnerID:
|
|
|
|
case SceneObjectPartSyncProperties.InventorySerial:
|
|
|
|
case SceneObjectPartSyncProperties.OwnerID:
|
|
|
|
case SceneObjectPartSyncProperties.NextOwnerMask:
|
|
|
|
case SceneObjectPartSyncProperties.Sound:
|
|
|
|
case SceneObjectPartSyncProperties.OwnerMask:
|
|
|
|
propertyData["Value"] = OSD.FromUUID((UUID)LastUpdateValue);
|
|
|
|
propertyData["Value"] = OSD.FromUInteger((uint)LastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//case SceneObjectPartProperties.BaseMask:
|
|
|
|
//case SceneObjectPartProperties.AttachedPos:
|
|
|
|
//case SceneObjectPartProperties.Category:
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
//SOP properties, uint types
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.AttachmentPoint:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.BaseMask:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Category:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.EveryoneMask:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.GroupMask:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.InventorySerial:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.NextOwnerMask:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.OwnerMask:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromUInteger((uint)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
//case SceneObjectPartProperties.BaseMask:
|
|
|
|
//SOP properties, byte types
|
|
|
|
//case SceneObjectPartProperties.Category:
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.ClickAction:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Material:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.ObjectSaleType:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.UpdateFlag:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromInteger((byte)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
//case SceneObjectPartProperties.CollisionSound:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, float types
|
|
|
|
//SOP properties, byte types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.CollisionSoundVolume:
|
|
|
|
case SceneObjectPartSyncProperties.ClickAction:
|
|
|
|
propertyData["Value"] = OSD.FromReal((float)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.Material:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.ObjectSaleType:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.UpdateFlag:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromInteger((byte)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
//case SceneObjectPartProperties.CollisionSound:
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, Color(struct type)
|
|
|
|
//SOP properties, float types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Color:
|
|
|
|
case SceneObjectPartSyncProperties.CollisionSoundVolume:
|
|
|
|
propertyData["Value"] = OSD.FromString(PropertySerializer.SerializeColor((System.Drawing.Color)LastUpdateValue));
|
|
|
|
propertyData["Value"] = OSD.FromReal((float)LastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, int types
|
|
|
|
//SOP properties, Color(struct type)
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.CreationDate:
|
|
|
|
case SceneObjectPartSyncProperties.Color:
|
|
|
|
case SceneObjectPartSyncProperties.LinkNum:
|
|
|
|
propertyData["Value"] = OSD.FromString(PropertySerializer.SerializeColor((System.Drawing.Color)LastUpdateValue));
|
|
|
|
case SceneObjectPartSyncProperties.OwnershipCost:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.SalePrice:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.ScriptAccessPin:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, string types
|
|
|
|
//SOP properties, int types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.CreatorData:
|
|
|
|
case SceneObjectPartSyncProperties.CreationDate:
|
|
|
|
case SceneObjectPartSyncProperties.Description:
|
|
|
|
case SceneObjectPartSyncProperties.LinkNum:
|
|
|
|
case SceneObjectPartSyncProperties.MediaUrl:
|
|
|
|
case SceneObjectPartSyncProperties.OwnershipCost:
|
|
|
|
case SceneObjectPartSyncProperties.Name:
|
|
|
|
case SceneObjectPartSyncProperties.SalePrice:
|
|
|
|
case SceneObjectPartSyncProperties.SitName:
|
|
|
|
case SceneObjectPartSyncProperties.ScriptAccessPin:
|
|
|
|
case SceneObjectPartSyncProperties.Text:
|
|
|
|
propertyData["Value"] = OSD.FromInteger((int)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.TouchName:
|
|
|
|
break;
|
|
|
|
propertyData["Value"] = OSD.FromString((string)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
//SOP properties, byte[] types
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.ParticleSystem:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.TextureAnimation:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBinary((byte[])LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//SOP properties, Quaternion types
|
|
|
|
//SOP properties, string types
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.RotationOffset:
|
|
|
|
case SceneObjectPartSyncProperties.CreatorData:
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetOrientation:
|
|
|
|
case SceneObjectPartSyncProperties.Description:
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetOrientationLL:
|
|
|
|
case SceneObjectPartSyncProperties.MediaUrl:
|
|
|
|
propertyData["Value"] = OSD.FromQuaternion((Quaternion)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.Name:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.SitName:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Text:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.TouchName:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromString((string)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
//SOP properties, byte[] types
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.ParticleSystem:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.TextureAnimation:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBinary((byte[])LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
//PhysActor properties, float type
|
|
|
|
//SOP properties, Quaternion types
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Buoyancy:
|
|
|
|
case SceneObjectPartSyncProperties.RotationOffset:
|
|
|
|
propertyData["Value"] = OSD.FromReal((float)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetOrientation:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.SitTargetOrientationLL:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromQuaternion((Quaternion)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
//PhysActor properties, bool type
|
|
|
|
//PhysActor properties, float type
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Flying:
|
|
|
|
case SceneObjectPartSyncProperties.Buoyancy:
|
|
|
|
case SceneObjectPartSyncProperties.IsColliding:
|
|
|
|
propertyData["Value"] = OSD.FromReal((float)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.CollidingGround:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.IsPhysical:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Kinematic:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
//PhysActor properties, Vector3 type
|
|
|
|
//PhysActor properties, bool type
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Force:
|
|
|
|
case SceneObjectPartSyncProperties.Flying:
|
|
|
|
case SceneObjectPartSyncProperties.PA_Acceleration:
|
|
|
|
case SceneObjectPartSyncProperties.IsColliding:
|
|
|
|
case SceneObjectPartSyncProperties.Position:
|
|
|
|
case SceneObjectPartSyncProperties.CollidingGround:
|
|
|
|
case SceneObjectPartSyncProperties.RotationalVelocity:
|
|
|
|
case SceneObjectPartSyncProperties.IsPhysical:
|
|
|
|
case SceneObjectPartSyncProperties.Size:
|
|
|
|
case SceneObjectPartSyncProperties.Kinematic:
|
|
|
|
case SceneObjectPartSyncProperties.Torque:
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
//PhysActor properties, Quaternion type
|
|
|
|
//PhysActor properties, Vector3 type
|
|
|
|
////////////////////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Orientation:
|
|
|
|
case SceneObjectPartSyncProperties.Force:
|
|
|
|
propertyData["Value"] = OSD.FromQuaternion((Quaternion)LastUpdateValue);
|
|
|
|
case SceneObjectPartSyncProperties.PA_Acceleration:
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.Position:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.RotationalVelocity:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Size:
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.Torque:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
//SOG properties
|
|
|
|
//PhysActor properties, Quaternion type
|
|
|
|
///////////////////////
|
|
|
|
////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.AbsolutePosition:
|
|
|
|
case SceneObjectPartSyncProperties.Orientation:
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
propertyData["Value"] = OSD.FromQuaternion((Quaternion)LastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.IsSelected:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
///////////////////////
|
|
|
|
DebugLog.WarnFormat("PrimSynInfo.PropertyToOSD -- no handler for property {0} ", m_property);
|
|
|
|
//SOG properties
|
|
|
|
break;
|
|
|
|
///////////////////////
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.AbsolutePosition:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromVector3((Vector3)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SceneObjectPartSyncProperties.IsSelected:
|
|
|
|
|
|
|
|
propertyData["Value"] = OSD.FromBoolean((bool)LastUpdateValue);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
DebugLog.WarnFormat("PrimSynInfo.PropertyToOSD -- no handler for property {0} ", m_property);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return propertyData;
|
|
|
|
return propertyData;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -4178,9 +4246,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
//SOP properties with complex structure
|
|
|
|
//SOP properties with complex structure
|
|
|
|
///////////////////////////////////////
|
|
|
|
///////////////////////////////////////
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
|
|
|
|
string shapeString = propertyData["Value"].AsString();
|
|
|
|
|
|
|
|
PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape(shapeString);
|
|
|
|
|
|
|
|
m_lastUpdateValue = (Object)shape;
|
|
|
|
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue(shapeString);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
m_lastUpdateValue = (Object)propertyData["Value"].AsString();
|
|
|
|
m_lastUpdateValue = (Object)propertyData["Value"].AsString();
|
|
|
|
m_lastUpdateValueHash = Util.Md5Hash((string)m_lastUpdateValue);
|
|
|
|
m_lastUpdateValueHash = PropertySerializer.GetPropertyHashValue((string)m_lastUpdateValue);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
|
|
////////////////////////////
|
|
|
@ -4393,17 +4466,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string GetPropertyHashValue(string initValue)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return Util.Md5Hash(initValue);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class PropertySerializer
|
|
|
|
public class PropertySerializer
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//TO BE TESTED
|
|
|
|
//TO BE TESTED
|
|
|
|
|
|
|
|
public static string GetPropertyHashValue(string initValue)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return Util.Md5Hash(initValue);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static string SerializeShape(SceneObjectPart part)
|
|
|
|
public static string SerializeShape(SceneObjectPart part)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -4419,6 +4490,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
return serializedShape;
|
|
|
|
return serializedShape;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static string SerializeShape(PrimitiveBaseShape shape)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
string serializedShape;
|
|
|
|
|
|
|
|
using (StringWriter sw = new StringWriter())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
using (XmlTextWriter writer = new XmlTextWriter(sw))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
SceneObjectSerializer.WriteShape(writer, shape, new Dictionary<string, object>());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
serializedShape = sw.ToString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return serializedShape;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static PrimitiveBaseShape DeSerializeShape(string shapeString)
|
|
|
|
public static PrimitiveBaseShape DeSerializeShape(string shapeString)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (shapeString == null || shapeString == String.Empty || shapeString == "")
|
|
|
|
if (shapeString == null || shapeString == String.Empty || shapeString == "")
|
|
|
@ -4429,7 +4514,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
XmlTextReader reader = new XmlTextReader(sr);
|
|
|
|
XmlTextReader reader = new XmlTextReader(sr);
|
|
|
|
PrimitiveBaseShape shapeValue;
|
|
|
|
PrimitiveBaseShape shapeValue;
|
|
|
|
try
|
|
|
|
try
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bool errors = false;
|
|
|
|
bool errors = false;
|
|
|
|
shapeValue = SceneObjectSerializer.ReadShape(reader, "Shape", out errors);
|
|
|
|
shapeValue = SceneObjectSerializer.ReadShape(reader, "Shape", out errors);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -4955,7 +5040,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
string primShapeString = PropertySerializer.SerializeShape(part);
|
|
|
|
string primShapeString = PropertySerializer.SerializeShape(part);
|
|
|
|
string primShapeStringHash = Util.Md5Hash(primShapeString);
|
|
|
|
string primShapeStringHash = PropertySerializer.GetPropertyHashValue(primShapeString);
|
|
|
|
|
|
|
|
|
|
|
|
if (!m_propertiesSyncInfo[property].IsHashValueEqual(primShapeStringHash))
|
|
|
|
if (!m_propertiesSyncInfo[property].IsHashValueEqual(primShapeStringHash))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -4964,7 +5049,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
//value by copying that from PrimSyncInfoManager
|
|
|
|
//value by copying that from PrimSyncInfoManager
|
|
|
|
if (lastUpdateTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp)
|
|
|
|
if (lastUpdateTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UpdatePropertyWithHashByLocal(property, lastUpdateTS, syncID, (Object)primShapeString, primShapeStringHash);
|
|
|
|
//UpdatePropertyWithHashByLocal(property, lastUpdateTS, syncID, (Object)primShapeString, primShapeStringHash);
|
|
|
|
|
|
|
|
UpdatePropertyWithHashByLocal(property, lastUpdateTS, syncID, part.Shape, primShapeStringHash);
|
|
|
|
|
|
|
|
|
|
|
|
//DSG DEBUG
|
|
|
|
//DSG DEBUG
|
|
|
|
//DebugLog.DebugFormat("CompareHashedValue_UpdateByLocal - Shape of {0}, {1} updated to ProfileShape {2}: SOP hashed shape: {3}, cached hash {4}",
|
|
|
|
//DebugLog.DebugFormat("CompareHashedValue_UpdateByLocal - Shape of {0}, {1} updated to ProfileShape {2}: SOP hashed shape: {3}, cached hash {4}",
|
|
|
@ -6129,7 +6215,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
switch (property)
|
|
|
|
switch (property)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
return (Object)PropertySerializer.SerializeShape(part);
|
|
|
|
//return (Object)PropertySerializer.SerializeShape(part);
|
|
|
|
|
|
|
|
return (Object)part.Shape;
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
case SceneObjectPartSyncProperties.TaskInventory:
|
|
|
|
return (Object)PropertySerializer.SerializeTaskInventory(part);
|
|
|
|
return (Object)PropertySerializer.SerializeTaskInventory(part);
|
|
|
|
|
|
|
|
|
|
|
@ -6350,7 +6437,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
switch (property)
|
|
|
|
switch (property)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
case SceneObjectPartSyncProperties.Shape:
|
|
|
|
PrimitiveBaseShape shapeVal = PropertySerializer.DeSerializeShape((string)pSyncInfo.LastUpdateValue);
|
|
|
|
//PrimitiveBaseShape shapeVal = PropertySerializer.DeSerializeShape((string)pSyncInfo.LastUpdateValue);
|
|
|
|
|
|
|
|
PrimitiveBaseShape shapeVal = (PrimitiveBaseShape)pSyncInfo.LastUpdateValue;
|
|
|
|
if (shapeVal != null)
|
|
|
|
if (shapeVal != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
part.Shape = shapeVal;
|
|
|
|
part.Shape = shapeVal;
|
|
|
@ -7077,18 +7165,23 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if (m_primsInSync.ContainsKey(primUUID))
|
|
|
|
if (m_primsInSync.ContainsKey(primUUID))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_primsInSync[primUUID] = primSyncInfo;
|
|
|
|
m_primsInSync[primUUID] = primSyncInfo;
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
//copy the items from the old list and insert the new record
|
|
|
|
//copy the items from the old list and insert the new record
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
newPrimsInSync.Add(primUUID, primSyncInfo);
|
|
|
|
newPrimsInSync.Add(primUUID, primSyncInfo);
|
|
|
|
|
|
|
|
|
|
|
|
//replace the old list
|
|
|
|
//replace the old list
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_primsInSync.Add(primUUID, primSyncInfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -7113,10 +7206,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
m_primsInSync[part.UUID] = primSyncInfo;
|
|
|
|
m_primsInSync[part.UUID] = primSyncInfo;
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
newPrimsInSync.Add(part.UUID, primSyncInfo);
|
|
|
|
newPrimsInSync.Add(part.UUID, primSyncInfo);
|
|
|
|
|
|
|
|
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
m_primsInSync.Add(part.UUID, primSyncInfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -7126,6 +7222,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//copy the old list, update the copied list
|
|
|
|
//copy the old list, update the copied list
|
|
|
|
|
|
|
|
/*
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
foreach (KeyValuePair<UUID, PrimSyncInfo> valPair in multiPrimsSyncInfo)
|
|
|
|
foreach (KeyValuePair<UUID, PrimSyncInfo> valPair in multiPrimsSyncInfo)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -7141,6 +7238,19 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
|
|
|
|
|
|
|
|
//replace the old list
|
|
|
|
//replace the old list
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (KeyValuePair<UUID, PrimSyncInfo> valPair in multiPrimsSyncInfo)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
UUID primUUID = valPair.Key;
|
|
|
|
|
|
|
|
PrimSyncInfo primSyncInfo = valPair.Value;
|
|
|
|
|
|
|
|
if (m_primsInSync.ContainsKey(primUUID))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_primsInSync[primUUID] = primSyncInfo;
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
m_primsInSync.Add(primUUID, primSyncInfo);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -7152,22 +7262,27 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
/*
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
Dictionary<UUID, PrimSyncInfo> newPrimsInSync = new Dictionary<UUID, PrimSyncInfo>(m_primsInSync);
|
|
|
|
newPrimsInSync.Remove(part.UUID);
|
|
|
|
newPrimsInSync.Remove(part.UUID);
|
|
|
|
|
|
|
|
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
m_primsInSync = newPrimsInSync;
|
|
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
m_primsInSync.Remove(part.UUID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public PrimSyncInfo GetPrimSyncInfo(UUID primUUID)
|
|
|
|
public PrimSyncInfo GetPrimSyncInfo(UUID primUUID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (m_primsInSync.ContainsKey(primUUID))
|
|
|
|
lock (m_primsInSyncLock)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return m_primsInSync[primUUID];
|
|
|
|
if (m_primsInSync.ContainsKey(primUUID))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return m_primsInSync[primUUID];
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return null;
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool SetSOPPhyscActorProperties(SceneObjectPart part)
|
|
|
|
public bool SetSOPPhyscActorProperties(SceneObjectPart part)
|
|
|
|