Merge branch 'dev' into dsg

dsg
Dan Lake 2011-06-30 11:03:59 -07:00
commit 7127910b3d
4 changed files with 337 additions and 221 deletions

View File

@ -217,7 +217,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
Hashtable msgdata = new Hashtable(); Hashtable msgdata = new Hashtable();
msgdata["avatarID"] = avatarID.ToString(); msgdata["avatarID"] = avatarID.ToString();
msgdata["objectName"] = objectName; msgdata["objectName"] = objectName;
msgdata["objectID"] = objectID.ToString(); msgdata["objectID"] = objectID.ToString();
msgdata["ownerID"] = ownerID.ToString(); msgdata["ownerID"] = ownerID.ToString();
msgdata["ownerFirstName"] = ownerFirstName; msgdata["ownerFirstName"] = ownerFirstName;
msgdata["ownerLastName"] = ownerLastName; msgdata["ownerLastName"] = ownerLastName;

View File

@ -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)

View File

@ -1390,6 +1390,7 @@ namespace OpenSim.Region.Physics.OdePlugin
_position.Z = m_taintPosition.Z; _position.Z = m_taintPosition.Z;
} }
} }
ChangingActorID = RegionSyncServerModule.ActorID;
this.RequestPhysicsterseUpdate(); this.RequestPhysicsterseUpdate();
} }

View File

@ -595,7 +595,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
if (part == null) if (part == null)
{ {
m_log.Error("[Script] SceneObjectPart unavailable. Script NOT started."); m_log.Error("[Script] SceneObjectPart unavailable. Script NOT started."+" localID = "+localID);
m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n";
m_ScriptFailCount++; m_ScriptFailCount++;
return false; return false;