|  |  |  | @ -296,21 +296,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                     { | 
		
	
		
			
				|  |  |  |  |                         if (primUpdates.ContainsKey(bucketName) && primUpdates[bucketName].Count > 0) | 
		
	
		
			
				|  |  |  |  |                         { | 
		
	
		
			
				|  |  |  |  |                             /* | 
		
	
		
			
				|  |  |  |  |                             foreach (SceneObjectGroup sog in primUpdates[bucketName]) | 
		
	
		
			
				|  |  |  |  |                             { | 
		
	
		
			
				|  |  |  |  |                                  | 
		
	
		
			
				|  |  |  |  |                                 //If this is a relay node, or at least one part of the object has the last update caused by this actor, then send the update | 
		
	
		
			
				|  |  |  |  |                                 sog.UpdateTaintedBucketSyncInfo(timeStamp); | 
		
	
		
			
				|  |  |  |  |                                 if (m_isSyncRelay || (!sog.IsDeleted && CheckObjectForSendingUpdate(sog))) | 
		
	
		
			
				|  |  |  |  |                                 { | 
		
	
		
			
				|  |  |  |  |                                     //send  | 
		
	
		
			
				|  |  |  |  |                                     string sogxml = SceneObjectSerializer.ToXml2Format(sog); | 
		
	
		
			
				|  |  |  |  |                                     SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogxml); | 
		
	
		
			
				|  |  |  |  |                                     SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); | 
		
	
		
			
				|  |  |  |  |                                 } | 
		
	
		
			
				|  |  |  |  |                             } | 
		
	
		
			
				|  |  |  |  |                              * */ | 
		
	
		
			
				|  |  |  |  |                             //m_log.Debug(LogHeader + " calling update sender for bucket " + bucketName); | 
		
	
		
			
				|  |  |  |  |                             m_primUpdatesPerBucketSender[bucketName](bucketName, primUpdates[bucketName]); | 
		
	
		
			
				|  |  |  |  |                         } | 
		
	
	
		
			
				
					|  |  |  | @ -399,9 +384,23 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             //m_log.DebugFormat(LogHeader + "SendNewObject called for object {0}, {1}", sog.Name, sog.UUID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //This is a new object (newly rezzed). Send out updates for all properties. | 
		
	
		
			
				|  |  |  |  |             //For now, a complete list of object properties include properties  | 
		
	
		
			
				|  |  |  |  |             //in its xml serialization, plus the set of Physics properties as in Physics bucket | 
		
	
		
			
				|  |  |  |  |             OSDMap data = new OSDMap(); | 
		
	
		
			
				|  |  |  |  |             string sogxml = SceneObjectSerializer.ToXml2Format(sog); | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); | 
		
	
		
			
				|  |  |  |  |             SendObjectUpdateToRelevantSyncConnectors(sog, rsm); | 
		
	
		
			
				|  |  |  |  |             data["sogxml"] = OSD.FromString(sogxml); | 
		
	
		
			
				|  |  |  |  |             OSDArray partArray = new OSDArray(); | 
		
	
		
			
				|  |  |  |  |             foreach (SceneObjectPart part in sog.Parts){ | 
		
	
		
			
				|  |  |  |  |                 OSDMap partData = PhysicsBucketPropertiesEncoder(m_physicsBucketName, part); | 
		
	
		
			
				|  |  |  |  |                 partArray.Add(partData); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             data["partPhysicsProperties"] = partArray; | 
		
	
		
			
				|  |  |  |  |             //string sogxml = SceneObjectSerializer.ToXml2Format(sog); | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //SendObjectUpdateToRelevantSyncConnectors(sog, rsm); | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /// <summary> | 
		
	
	
		
			
				
					|  |  |  | @ -433,7 +432,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             data["softDelete"] = OSD.FromBoolean(softDelete); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.RemovedObject, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  |             SendObjectUpdateToRelevantSyncConnectors(sog, rsm); | 
		
	
		
			
				|  |  |  |  |             //SendObjectUpdateToRelevantSyncConnectors(sog, rsm); | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -461,13 +461,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                 string partTempID = "part"+partNum; | 
		
	
		
			
				|  |  |  |  |                 data[partTempID] = OSD.FromUUID(part.UUID); | 
		
	
		
			
				|  |  |  |  |                 partNum++; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 m_log.Debug("SendLinkObject to link " + part.ParentGroup.Name + "," + part.UUID + " with " + root.Name+","+root.UUID); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_log.Debug(LogHeader + " to SendLinkObject to link " + children.Count + " parts to " + root.Name); | 
		
	
		
			
				|  |  |  |  |             m_log.Debug("LinkedObject: "+sogxml); | 
		
	
		
			
				|  |  |  |  |             m_log.Debug(LogHeader + " to SendLinkObject to link " + children.Count + " parts to " + root.Name + "," + root.UUID); | 
		
	
		
			
				|  |  |  |  |             //m_log.Debug("LinkedObject: "+sogxml); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.LinkObject, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  |             SendObjectUpdateToRelevantSyncConnectors(linkedGroup, rsm); | 
		
	
		
			
				|  |  |  |  |             //SendObjectUpdateToRelevantSyncConnectors(linkedGroup, rsm); | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, linkedGroup); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         public void SendDeLinkObject(List<SceneObjectPart> prims, List<SceneObjectGroup> beforeDelinkGroups, List<SceneObjectGroup> afterDelinkGroups) | 
		
	
	
		
			
				
					|  |  |  | @ -718,8 +721,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private delegate void PrimUpdatePerBucketSender(string bucketName, List<SceneObjectPart> primUpdates); | 
		
	
		
			
				|  |  |  |  |         private Dictionary<string, PrimUpdatePerBucketSender> m_primUpdatesPerBucketSender = new Dictionary<string, PrimUpdatePerBucketSender>(); | 
		
	
		
			
				|  |  |  |  |         //Timestamps that record the last time each any updates have been sent out for a given bucket | 
		
	
		
			
				|  |  |  |  |         private Dictionary<string, long> m_lastUpdateSentTime = new Dictionary<string, long>(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /* | 
		
	
		
			
				|  |  |  |  |         //The functions that encode properties in each bucket. For now,  | 
		
	
		
			
				|  |  |  |  |         //general bucket works on SOG, physics bucket works on SOP, so we define | 
		
	
		
			
				|  |  |  |  |         //the arg to be of type Object to be general in the interface.  | 
		
	
		
			
				|  |  |  |  |         //TO DO: redesign the interface once the bucket encoders working on more  | 
		
	
		
			
				|  |  |  |  |         //consistent/specific arguments. | 
		
	
		
			
				|  |  |  |  |         private delegate string UpdatePerBucketEncoder(string bucketName, Object arg); | 
		
	
		
			
				|  |  |  |  |         private Dictionary<string, UpdatePerBucketEncoder> m_updatePerBucketEncoder = new Dictionary<string, UpdatePerBucketEncoder>(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         //Decoders of properties in each bucket | 
		
	
		
			
				|  |  |  |  |         private delegate void UpdatePerBucketDecoder(string bucketName, string encoding, out Object outData); | 
		
	
		
			
				|  |  |  |  |         private Dictionary<string, UpdatePerBucketDecoder> m_updatePerBucketDecoder = new Dictionary<string, UpdatePerBucketDecoder>(); | 
		
	
		
			
				|  |  |  |  |          * */  | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private object m_updateScenePresenceLock = new object(); | 
		
	
		
			
				|  |  |  |  |         private Dictionary<UUID, ScenePresence> m_presenceUpdates = new Dictionary<UUID, ScenePresence>(); | 
		
	
	
		
			
				
					|  |  |  | @ -756,8 +771,19 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             foreach (SceneObjectGroup sog in updatedObjects.Values) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 sog.UpdateTaintedBucketSyncInfo(bucketName, timeStamp); //this update the timestamp and clear the taint info of the bucket | 
		
	
		
			
				|  |  |  |  |                 string sogxml = SceneObjectSerializer.ToXml2Format(sog); | 
		
	
		
			
				|  |  |  |  |                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogxml); | 
		
	
		
			
				|  |  |  |  |                 string sogGeneralBucketEncoding = SceneObjectSerializer.ToXml2Format(sog); | 
		
	
		
			
				|  |  |  |  |                 //string sogGeneralBucketEncoding = GeneralBucketPropertiesEncoder(bucketName, sog, null); | 
		
	
		
			
				|  |  |  |  |                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogGeneralBucketEncoding); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //TEMP DEBUG | 
		
	
		
			
				|  |  |  |  |                 foreach (SceneObjectPart part in sog.Parts) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  |                     if (part.IsAttachment) | 
		
	
		
			
				|  |  |  |  |                     { | 
		
	
		
			
				|  |  |  |  |                         m_log.Debug(LogHeader + "PrimUpdatesGeneralBucketSender: part " + part.Name + "," + part.UUID + ", IsAttachment = true"); | 
		
	
		
			
				|  |  |  |  |                     } | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 lock (m_stats) m_statSOGBucketOut++; | 
		
	
		
			
				|  |  |  |  |                 SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -771,53 +797,42 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             //UpdateBucektLastSentTime(bucketName, timeStamp); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private string GeneralBucketPropertiesEncoder(string bucketName, Object sog) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (sog is SceneObjectGroup) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 SceneObjectGroup group = (SceneObjectGroup)sog; | 
		
	
		
			
				|  |  |  |  |                 return SceneObjectSerializer.ToXml2Format(group); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 return String.Empty; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void GeneralBucketPropertiesDecoder(string bucketName, string encoding, out Object sog) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             SceneObjectGroup group = SceneObjectSerializer.FromXml2Format(encoding); | 
		
	
		
			
				|  |  |  |  |             sog = (Object)group; | 
		
	
		
			
				|  |  |  |  |              | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void PrimUpdatesPhysicsBucketSender(string bucketName, List<SceneObjectPart> primUpdates) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             foreach (SceneObjectPart updatedPart in primUpdates) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 updatedPart.UpdateTaintedBucketSyncInfo(bucketName, DateTime.Now.Ticks); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 OSDMap data = new OSDMap(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 data["UUID"] = OSD.FromUUID(updatedPart.UUID); | 
		
	
		
			
				|  |  |  |  |                 //data["UUID"] = OSD.FromUUID(pa.UUID); | 
		
	
		
			
				|  |  |  |  |                 data["Bucket"] = OSD.FromString(bucketName); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 data["GroupPosition"] = OSD.FromVector3(updatedPart.GroupPosition); | 
		
	
		
			
				|  |  |  |  |                 data["OffsetPosition"] = OSD.FromVector3(updatedPart.OffsetPosition); | 
		
	
		
			
				|  |  |  |  |                 data["Scale"] = OSD.FromVector3(updatedPart.Scale); | 
		
	
		
			
				|  |  |  |  |                 data["AngularVelocity"] = OSD.FromVector3(updatedPart.AngularVelocity); | 
		
	
		
			
				|  |  |  |  |                 data["RotationOffset"] = OSD.FromQuaternion(updatedPart.RotationOffset); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 Physics.Manager.PhysicsActor pa = updatedPart.PhysActor; | 
		
	
		
			
				|  |  |  |  |                 if (pa != null) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                     data["Size"] = OSD.FromVector3(pa.Size); | 
		
	
		
			
				|  |  |  |  |                     data["Position"] = OSD.FromVector3(pa.Position); | 
		
	
		
			
				|  |  |  |  |                     data["Force"] = OSD.FromVector3(pa.Force); | 
		
	
		
			
				|  |  |  |  |                     data["Velocity"] = OSD.FromVector3(pa.Velocity); | 
		
	
		
			
				|  |  |  |  |                     data["RotationalVelocity"] = OSD.FromVector3(pa.RotationalVelocity); | 
		
	
		
			
				|  |  |  |  |                     data["PA_Acceleration"] = OSD.FromVector3(pa.Acceleration); | 
		
	
		
			
				|  |  |  |  |                     data["Torque"] = OSD.FromVector3(pa.Torque); | 
		
	
		
			
				|  |  |  |  |                     data["Orientation"] = OSD.FromQuaternion(pa.Orientation); | 
		
	
		
			
				|  |  |  |  |                     data["IsPhysical"] = OSD.FromBoolean(pa.IsPhysical); | 
		
	
		
			
				|  |  |  |  |                     data["Flying"] = OSD.FromBoolean(pa.Flying); | 
		
	
		
			
				|  |  |  |  |                     data["Kinematic"] = OSD.FromBoolean(pa.Kinematic); | 
		
	
		
			
				|  |  |  |  |                     data["Buoyancy"] = OSD.FromReal(pa.Buoyancy); | 
		
	
		
			
				|  |  |  |  |                     data["CollidingGround"] = OSD.FromBoolean(pa.CollidingGround); | 
		
	
		
			
				|  |  |  |  |                     data["IsColliding"] = OSD.FromBoolean(pa.IsColliding); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                     m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 data["LastUpdateTimeStamp"] = OSD.FromLong(updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp); | 
		
	
		
			
				|  |  |  |  |                 data["LastUpdateActorID"] = OSD.FromString(updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //m_log.Debug(LogHeader + " Send out Physics Bucket updates for " + updatedPart.Name + ","+updatedPart.UUID+ ". GroupPosition: " + updatedPart.GroupPosition.ToString()); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedBucketProperties, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  |                 //string partPhysicsBucketEncoding = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); | 
		
	
		
			
				|  |  |  |  |                 OSDMap partData = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); | 
		
	
		
			
				|  |  |  |  |                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedBucketProperties, OSDParser.SerializeJsonString(partData)); | 
		
	
		
			
				|  |  |  |  |                 //m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //TEMP DEBUG | 
		
	
		
			
				|  |  |  |  |                 if (updatedPart.IsAttachment) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  |                     m_log.Debug(LogHeader + "PrimUpdatesPhysicsBucketSender: part " + updatedPart.Name + "," + updatedPart.UUID + ", IsAttachment = true"); | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |                  | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 lock (m_stats) m_statPhysBucketOut++; | 
		
	
		
			
				|  |  |  |  |                 SendObjectUpdateToRelevantSyncConnectors(updatedPart, syncMsg); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -828,13 +843,55 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             //UpdateBucektLastSentTime(bucketName); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /* | 
		
	
		
			
				|  |  |  |  |         private void UpdateBucektLastSentTime(string bucketName) | 
		
	
		
			
				|  |  |  |  |         private OSDMap PhysicsBucketPropertiesEncoder(string bucketName, SceneObjectPart updatedPart) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             long timeStamp = DateTime.Now.Ticks; | 
		
	
		
			
				|  |  |  |  |             m_lastUpdateSentTime[bucketName] = timeStamp; | 
		
	
		
			
				|  |  |  |  |             OSDMap data = new OSDMap(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             data["UUID"] = OSD.FromUUID(updatedPart.UUID); | 
		
	
		
			
				|  |  |  |  |             //data["UUID"] = OSD.FromUUID(pa.UUID); | 
		
	
		
			
				|  |  |  |  |             data["Bucket"] = OSD.FromString(bucketName); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             data["GroupPosition"] = OSD.FromVector3(updatedPart.GroupPosition); | 
		
	
		
			
				|  |  |  |  |             data["OffsetPosition"] = OSD.FromVector3(updatedPart.OffsetPosition); | 
		
	
		
			
				|  |  |  |  |             data["Scale"] = OSD.FromVector3(updatedPart.Scale); | 
		
	
		
			
				|  |  |  |  |             data["AngularVelocity"] = OSD.FromVector3(updatedPart.AngularVelocity); | 
		
	
		
			
				|  |  |  |  |             data["RotationOffset"] = OSD.FromQuaternion(updatedPart.RotationOffset); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             Physics.Manager.PhysicsActor pa = updatedPart.PhysActor; | 
		
	
		
			
				|  |  |  |  |             if (pa != null) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 data["Size"] = OSD.FromVector3(pa.Size); | 
		
	
		
			
				|  |  |  |  |                 data["Position"] = OSD.FromVector3(pa.Position); | 
		
	
		
			
				|  |  |  |  |                 data["Force"] = OSD.FromVector3(pa.Force); | 
		
	
		
			
				|  |  |  |  |                 data["Velocity"] = OSD.FromVector3(pa.Velocity); | 
		
	
		
			
				|  |  |  |  |                 data["RotationalVelocity"] = OSD.FromVector3(pa.RotationalVelocity); | 
		
	
		
			
				|  |  |  |  |                 data["PA_Acceleration"] = OSD.FromVector3(pa.Acceleration); | 
		
	
		
			
				|  |  |  |  |                 data["Torque"] = OSD.FromVector3(pa.Torque); | 
		
	
		
			
				|  |  |  |  |                 data["Orientation"] = OSD.FromQuaternion(pa.Orientation); | 
		
	
		
			
				|  |  |  |  |                 data["IsPhysical"] = OSD.FromBoolean(pa.IsPhysical); | 
		
	
		
			
				|  |  |  |  |                 data["Flying"] = OSD.FromBoolean(pa.Flying); | 
		
	
		
			
				|  |  |  |  |                 data["Kinematic"] = OSD.FromBoolean(pa.Kinematic); | 
		
	
		
			
				|  |  |  |  |                 data["Buoyancy"] = OSD.FromReal(pa.Buoyancy); | 
		
	
		
			
				|  |  |  |  |                 data["CollidingGround"] = OSD.FromBoolean(pa.CollidingGround); | 
		
	
		
			
				|  |  |  |  |                 data["IsColliding"] = OSD.FromBoolean(pa.IsColliding); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             data["LastUpdateTimeStamp"] = OSD.FromLong(updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp); | 
		
	
		
			
				|  |  |  |  |             data["LastUpdateActorID"] = OSD.FromString(updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //m_log.Debug(LogHeader + " Send out Physics Bucket updates for " + updatedPart.Name + ","+updatedPart.UUID+ ". GroupPosition: " + updatedPart.GroupPosition.ToString()); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             return data; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void PhysicsBucketPropertiesDecoder(string bucketName, SymmetricSyncMessage msg, out Object sog) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             OSDMap data = DeserializeMessage(msg); | 
		
	
		
			
				|  |  |  |  |             sog = (Object)data; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     */  | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private bool HaveUpdatesToSendoutForSync(SceneObjectPart part, string bucketName) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
	
		
			
				
					|  |  |  | @ -863,22 +920,31 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |              * */  | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. | 
		
	
		
			
				|  |  |  |  |         private string m_generalBucketName = "General"; | 
		
	
		
			
				|  |  |  |  |         private string m_physicsBucketName = "Physics"; | 
		
	
		
			
				|  |  |  |  |         //If nothing configured in the config file, this is the default settings for grouping properties into different bucket | 
		
	
		
			
				|  |  |  |  |         private void PopulatePropertyBuketMapByDefault() | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. | 
		
	
		
			
				|  |  |  |  |             string generalBucketName = "General"; | 
		
	
		
			
				|  |  |  |  |             string physicsBucketName = "Physics"; | 
		
	
		
			
				|  |  |  |  |             m_propertyBucketNames.Add(generalBucketName); | 
		
	
		
			
				|  |  |  |  |             m_propertyBucketNames.Add(physicsBucketName); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_propertyBucketNames.Add(m_generalBucketName); | 
		
	
		
			
				|  |  |  |  |             m_propertyBucketNames.Add(m_physicsBucketName); | 
		
	
		
			
				|  |  |  |  |             m_maxNumOfPropertyBuckets = m_propertyBucketNames.Count; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //Linking each bucket with the sender function that serializes the properties in the bucket and send out sync message | 
		
	
		
			
				|  |  |  |  |             m_primUpdatesPerBucketSender.Add("General", PrimUpdatesGeneralBucketSender); | 
		
	
		
			
				|  |  |  |  |             m_primUpdatesPerBucketSender.Add("Physics", PrimUpdatesPhysicsBucketSender); | 
		
	
		
			
				|  |  |  |  |             m_primUpdatesPerBucketSender.Add(m_generalBucketName, PrimUpdatesGeneralBucketSender); | 
		
	
		
			
				|  |  |  |  |             m_primUpdatesPerBucketSender.Add(m_physicsBucketName, PrimUpdatesPhysicsBucketSender); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_lastUpdateSentTime.Add("General", 0); | 
		
	
		
			
				|  |  |  |  |             m_lastUpdateSentTime.Add("Physics", 0); | 
		
	
		
			
				|  |  |  |  |             /* | 
		
	
		
			
				|  |  |  |  |             m_updatePerBucketEncoder.Add(generalBucketName, GeneralBucketPropertiesEncoder); | 
		
	
		
			
				|  |  |  |  |             m_updatePerBucketEncoder.Add(physicsBucketName, PhysicsBucketPropertiesEncoder); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_updatePerBucketDecoder.Add(generalBucketName, GeneralBucketPropertiesDecoder); | 
		
	
		
			
				|  |  |  |  |             m_updatePerBucketDecoder.Add(physicsBucketName, PhysicsBucketPropertiesDecoder); | 
		
	
		
			
				|  |  |  |  |              * */  | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //m_lastUpdateSentTime.Add("General", 0); | 
		
	
		
			
				|  |  |  |  |             //m_lastUpdateSentTime.Add("Physics", 0); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //Mapping properties to buckets. | 
		
	
		
			
				|  |  |  |  |             foreach (SceneObjectPartProperties property in Enum.GetValues(typeof(SceneObjectPartProperties))) | 
		
	
	
		
			
				
					|  |  |  | @ -904,11 +970,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                     case SceneObjectPartProperties.Buoyancy: | 
		
	
		
			
				|  |  |  |  |                     case SceneObjectPartProperties.IsCollidingGround: | 
		
	
		
			
				|  |  |  |  |                     case SceneObjectPartProperties.IsColliding: | 
		
	
		
			
				|  |  |  |  |                         m_primPropertyBucketMap.Add(property, physicsBucketName); | 
		
	
		
			
				|  |  |  |  |                         m_primPropertyBucketMap.Add(property, m_physicsBucketName); | 
		
	
		
			
				|  |  |  |  |                         break; | 
		
	
		
			
				|  |  |  |  |                     default: | 
		
	
		
			
				|  |  |  |  |                         //all other properties belong to the "General" bucket. | 
		
	
		
			
				|  |  |  |  |                         m_primPropertyBucketMap.Add(property, generalBucketName); | 
		
	
		
			
				|  |  |  |  |                         m_primPropertyBucketMap.Add(property, m_generalBucketName); | 
		
	
		
			
				|  |  |  |  |                         break; | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
	
		
			
				
					|  |  |  | @ -980,9 +1046,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         //Events are send out right away, without being put into the connector's outQueue first.  | 
		
	
		
			
				|  |  |  |  |         //May need a better method for managing the outgoing messages (i.e. prioritizing object updates and events) | 
		
	
		
			
				|  |  |  |  |         private void SendSceneEventToRelevantSyncConnectors(string init_actorID, SymmetricSyncMessage rsm) | 
		
	
		
			
				|  |  |  |  |         private void SendSceneEventToRelevantSyncConnectors(string init_actorID, SymmetricSyncMessage rsm, SceneObjectGroup sog) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             List<SyncConnector> syncConnectors = GetSyncConnectorsForSceneEvents(init_actorID, rsm); | 
		
	
		
			
				|  |  |  |  |             //TODO: need to pick connectors based on sog position (quark it resides in) | 
		
	
		
			
				|  |  |  |  |             List<SyncConnector> syncConnectors = GetSyncConnectorsForSceneEvents(init_actorID, rsm, sog); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             foreach (SyncConnector connector in syncConnectors) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
	
		
			
				
					|  |  |  | @ -1036,6 +1103,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                 //in other parts as well, so we are sending to all connectors. | 
		
	
		
			
				|  |  |  |  |                 ForEachSyncConnector(delegate(SyncConnector connector) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  |                     //if(!connector.OtherSideActorID.Equals(sog.BucketSyncInfoUpdate[ | 
		
	
		
			
				|  |  |  |  |                     syncConnectors.Add(connector); | 
		
	
		
			
				|  |  |  |  |                 }); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
	
		
			
				
					|  |  |  | @ -1062,7 +1130,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |         /// </summary> | 
		
	
		
			
				|  |  |  |  |         /// <param name="sog"></param> | 
		
	
		
			
				|  |  |  |  |         /// <returns></returns> | 
		
	
		
			
				|  |  |  |  |         private List<SyncConnector> GetSyncConnectorsForSceneEvents(string init_actorID, SymmetricSyncMessage rsm) | 
		
	
		
			
				|  |  |  |  |         private List<SyncConnector> GetSyncConnectorsForSceneEvents(string init_actorID, SymmetricSyncMessage rsm, SceneObjectGroup sog) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             List<SyncConnector> syncConnectors = new List<SyncConnector>(); | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
	
		
			
				
					|  |  |  | @ -1559,8 +1627,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                         { | 
		
	
		
			
				|  |  |  |  |                             if (e is SceneObjectGroup) | 
		
	
		
			
				|  |  |  |  |                             { | 
		
	
		
			
				|  |  |  |  |                                 string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); | 
		
	
		
			
				|  |  |  |  |                                 SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); | 
		
	
		
			
				|  |  |  |  |                                 //string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); | 
		
	
		
			
				|  |  |  |  |                                 //SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); | 
		
	
		
			
				|  |  |  |  |                                 SceneObjectGroup sog = (SceneObjectGroup)e; | 
		
	
		
			
				|  |  |  |  |                                 SendNewObject(sog); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                                 //m_log.Debug(LogHeader + ": " + sogxml); | 
		
	
		
			
				|  |  |  |  |                             } | 
		
	
	
		
			
				
					|  |  |  | @ -1644,19 +1714,45 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void HandleAddNewObject(SymmetricSyncMessage msg, string senderActorID) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             string sogxml = Encoding.ASCII.GetString(msg.Data, 0, msg.Length); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //string sogxml = Encoding.ASCII.GetString(msg.Data, 0, msg.Length); | 
		
	
		
			
				|  |  |  |  |             //SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); | 
		
	
		
			
				|  |  |  |  |             OSDMap data = DeserializeMessage(msg); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //First, create the object group and add it to Scene | 
		
	
		
			
				|  |  |  |  |             string sogxml = data["sogxml"]; | 
		
	
		
			
				|  |  |  |  |             SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             Scene.ObjectUpdateResult updateResult = m_scene.AddOrUpdateObjectBySynchronization(sog); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forward the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg, sog); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //Second, update the physics properties of each prim in the object | 
		
	
		
			
				|  |  |  |  |             OSDArray partArray = (OSDArray)data["partPhysicsProperties"]; | 
		
	
		
			
				|  |  |  |  |             for (int i = 0; i < partArray.Count; i++) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 OSDMap partData = (OSDMap)partArray[i]; | 
		
	
		
			
				|  |  |  |  |                 UUID partUUID = partData["UUID"].AsUUID(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 string bucketName = partData["Bucket"].AsString(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //m_log.DebugFormat("{0}: HandleUpdatedBucketProperties from {1}: for {2}/{3}", LogHeader, senderActorID, partUUID.ToString(), bucketName); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); | 
		
	
		
			
				|  |  |  |  |                 rBucketSyncInfo.LastUpdateTimeStamp = partData["LastUpdateTimeStamp"].AsLong(); | 
		
	
		
			
				|  |  |  |  |                 rBucketSyncInfo.LastUpdateActorID = partData["LastUpdateActorID"].AsString(); | 
		
	
		
			
				|  |  |  |  |                 // updatedPart.BucketSyncInfoList.Add(bucketName, rBucketSyncInfo); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 m_scene.UpdateObjectPartBucketProperties(bucketName, partUUID, data, rBucketSyncInfo); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void HandleAddOrUpdateObjectBySynchronization(SymmetricSyncMessage msg, string senderActorID) | 
		
	
	
		
			
				
					|  |  |  | @ -1683,6 +1779,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 foreach (SceneObjectPart part in sog.Parts) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  |                     if (part.IsAttachment) | 
		
	
		
			
				|  |  |  |  |                     { | 
		
	
		
			
				|  |  |  |  |                         m_log.Debug(LogHeader + "HandleAddOrUpdateObjectBySynchronization: part " + part.Name + "," + part.UUID + ", IsAttachment = true"); | 
		
	
		
			
				|  |  |  |  |                     } | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 Scene.ObjectUpdateResult updateResult = m_scene.AddOrUpdateObjectBySynchronization(sog); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 //if (added) | 
		
	
	
		
			
				
					|  |  |  | @ -1721,40 +1825,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             string bucketName = data["Bucket"].AsString(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //m_log.DebugFormat("{0}: HandleUpdatedBucketProperties from {1}: for {2}/{3}", LogHeader, senderActorID, partUUID.ToString(), bucketName); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             /* Commented out since OSDMap is now passed all the way through to the unpacker. | 
		
	
		
			
				|  |  |  |  |              * Previous implementation is to create a SOP and copy the values into same and copy them out later. | 
		
	
		
			
				|  |  |  |  |             SceneObjectPart updatedPart = new SceneObjectPart(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.GroupPosition = data["GroupPosition"].AsVector3(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.OffsetPosition = data["OffsetPosition"].AsVector3(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.RotationOffset = data["RotationOffset"].AsQuaternion(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.Velocity = data["Velocity"].AsVector3(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.AngularVelocity = data["AngularVelocity"].AsVector3(); | 
		
	
		
			
				|  |  |  |  |             //Scale is a bit complex, we need to have Shape first -- not a good solution, but leave it as is so that we can move on, | 
		
	
		
			
				|  |  |  |  |             updatedPart.Shape = new PrimitiveBaseShape(); | 
		
	
		
			
				|  |  |  |  |             updatedPart.Scale = data["Scale"].AsVector3(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             Dictionary<string, Object> updatedProperties = new Dictionary<string, Object>(); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("GroupPosition", (Object)data["GroupPosition"].AsVector3()); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("OffsetPosition", (Object)data["OffsetPosition"].AsVector3()); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("RotationOffset", (Object)data["RotationOffset"].AsQuaternion()); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("Velocity", (Object)data["Velocity"].AsVector3()); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("AngularVelocity", (Object)data["AngularVelocity"].AsVector3()); | 
		
	
		
			
				|  |  |  |  |             updatedProperties.Add("Scale", (Object)data["Scale"].AsVector3()); | 
		
	
		
			
				|  |  |  |  |              */ | 
		
	
		
			
				|  |  |  |  |             //Other properties to be included | 
		
	
		
			
				|  |  |  |  |             /* | 
		
	
		
			
				|  |  |  |  |             "Position": | 
		
	
		
			
				|  |  |  |  |             "Size": | 
		
	
		
			
				|  |  |  |  |             "Force": | 
		
	
		
			
				|  |  |  |  |             "RotationalVelocity": | 
		
	
		
			
				|  |  |  |  |             "PA_Acceleration": | 
		
	
		
			
				|  |  |  |  |             "Torque": | 
		
	
		
			
				|  |  |  |  |             "Orientation": | 
		
	
		
			
				|  |  |  |  |             "IsPhysical": | 
		
	
		
			
				|  |  |  |  |             "Flying": | 
		
	
		
			
				|  |  |  |  |             "Buoyancy": | 
		
	
		
			
				|  |  |  |  |              * */ | 
		
	
		
			
				|  |  |  |  |              | 
		
	
		
			
				|  |  |  |  |             BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); | 
		
	
		
			
				|  |  |  |  |             rBucketSyncInfo.LastUpdateTimeStamp = data["LastUpdateTimeStamp"].AsLong(); | 
		
	
	
		
			
				
					|  |  |  | @ -1832,6 +1902,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             SceneObjectGroup sog = m_scene.SceneGraph.GetGroupByPrim(sogUUID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg, sog); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             if (sog != null) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 if (!softDelete) | 
		
	
	
		
			
				
					|  |  |  | @ -1846,12 +1923,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void HandleLinkObject(SymmetricSyncMessage msg, string senderActorID) | 
		
	
	
		
			
				
					|  |  |  | @ -1872,6 +1944,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             int partCount = data["partCount"].AsInteger(); | 
		
	
		
			
				|  |  |  |  |             List<UUID> childrenIDs = new List<UUID>(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg, linkedGroup); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             for (int i = 0; i < partCount; i++) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 string partTempID = "part" + i; | 
		
	
	
		
			
				
					|  |  |  | @ -1881,18 +1960,28 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             m_log.Debug(LogHeader + " received LinkObject from " + senderActorID); | 
		
	
		
			
				|  |  |  |  |             //m_log.Debug("LinkedObject: " + sogxml); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //TEMP DEBUG | 
		
	
		
			
				|  |  |  |  |             foreach (SceneObjectPart part in linkedGroup.Parts) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 if (part.IsAttachment) | 
		
	
		
			
				|  |  |  |  |                 { | 
		
	
		
			
				|  |  |  |  |                     m_log.Debug(LogHeader + "HandleLinkObject: part " + part.Name + "," + part.UUID + " IsAttachment = true in incoming sync message"); | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_scene.LinkObjectBySync(linkedGroup, rootID, childrenIDs); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private void HandleDelinkObject(SymmetricSyncMessage msg, string senderActorID) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg, null); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             OSDMap data = DeserializeMessage(msg); | 
		
	
		
			
				|  |  |  |  |             if (data == null) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
	
		
			
				
					|  |  |  | @ -1934,12 +2023,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             m_scene.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /// <summary> | 
		
	
	
		
			
				
					|  |  |  | @ -1948,6 +2031,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |         /// <param name="msg"></param> | 
		
	
		
			
				|  |  |  |  |         private void HandleRemoteEvent(SymmetricSyncMessage msg, string senderActorID) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg, null); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             OSDMap data = DeserializeMessage(msg); | 
		
	
		
			
				|  |  |  |  |             if (data == null) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
	
		
			
				
					|  |  |  | @ -1994,12 +2084,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |                     break; | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //if this is a relay node, forwards the event | 
		
	
		
			
				|  |  |  |  |             if (m_isSyncRelay) | 
		
	
		
			
				|  |  |  |  |             { | 
		
	
		
			
				|  |  |  |  |                 //SendSceneEventToRelevantSyncConnectors(init_actorID, msg); | 
		
	
		
			
				|  |  |  |  |                 SendSceneEventToRelevantSyncConnectors(senderActorID, msg); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /// <summary> | 
		
	
	
		
			
				
					|  |  |  | @ -2352,14 +2436,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  |             data["running"] = OSD.FromBoolean(isScriptRunning); | 
		
	
		
			
				|  |  |  |  |             data["assetID"] = OSD.FromUUID(newAssetID); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             /* | 
		
	
		
			
				|  |  |  |  |             data["actorID"] = OSD.FromString(m_actorID); | 
		
	
		
			
				|  |  |  |  |             data["seqNum"] = OSD.FromULong(GetNextEventSeq()); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdateScript, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  |             //send to actors who are interested in the event | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); | 
		
	
		
			
				|  |  |  |  |              * */ | 
		
	
		
			
				|  |  |  |  |             SendSceneEvent(SymmetricSyncMessage.MsgType.UpdateScript, data); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -2584,20 +2660,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             //send to actors who are interested in the event | 
		
	
		
			
				|  |  |  |  |             lock (m_stats) m_statEventOut++; | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, null); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         /* | 
		
	
		
			
				|  |  |  |  |         private void PublishSceneEvent(OSDMap data) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             data["actorID"] = OSD.FromString(m_actorID); | 
		
	
		
			
				|  |  |  |  |             data["seqNum"] = OSD.FromULong(GetNextEventSeq()); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.OnUpdateScript, OSDParser.SerializeJsonString(data)); | 
		
	
		
			
				|  |  |  |  |             SendSceneEventToRelevantSyncConnectors(m_actorID, rsm); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |          * */  | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         private ulong GetNextEventSeq() | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             return m_eventSeq++; | 
		
	
	
		
			
				
					|  |  |  | 
 |