* um, Prim crossings? Experimental.

* Backup your database just in case.
ThreadPoolClientBranch
Teravus Ovares 2008-02-11 01:43:54 +00:00
parent 44058f8ae6
commit a56664cf59
7 changed files with 157 additions and 80 deletions

View File

@ -70,7 +70,7 @@ namespace OpenSim.Framework
public virtual bool TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData) public virtual bool TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData)
{ {
if (OnExpectUser != null) if (OnExpectPrim != null)
{ {
OnExpectPrim(regionHandle, primID, objData); OnExpectPrim(regionHandle, primID, objData);
return true; return true;

View File

@ -865,40 +865,36 @@ namespace OpenSim.Region.Communications.OGS1
catch (RemotingException e) catch (RemotingException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
" " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
catch (SocketException e) catch (SocketException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
catch (InvalidCredentialException e) catch (InvalidCredentialException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + m_log.Warn("Invalid Credential Exception: Invalid Credentials : " + regionHandle);
" " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
catch (AuthenticationException e) catch (AuthenticationException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Authentication exception: Unable to connect to adjacent region: " + m_log.Warn("Authentication exception: Unable to connect to adjacent region: " + regionHandle);
regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
catch (Exception e) catch (Exception e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + m_log.Warn("Unknown exception: Unable to connect to adjacent region: " + regionHandle);
" " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
@ -1005,14 +1001,37 @@ namespace OpenSim.Region.Communications.OGS1
catch (RemotingException e) catch (RemotingException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
" " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
} }
catch catch (SocketException e)
{ {
NoteDeadRegion(regionHandle); NoteDeadRegion(regionHandle);
m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString());
return false;
}
catch (InvalidCredentialException e)
{
NoteDeadRegion(regionHandle);
m_log.Warn("Invalid Credential Exception: Invalid Credentials : " + regionHandle);
m_log.Debug(e.ToString());
return false;
}
catch (AuthenticationException e)
{
NoteDeadRegion(regionHandle);
m_log.Warn("Authentication exception: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString());
return false;
}
catch (Exception e)
{
NoteDeadRegion(regionHandle);
m_log.Warn("Unknown exception: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString());
return false; return false;
} }
} }
@ -1205,15 +1224,17 @@ namespace OpenSim.Region.Communications.OGS1
// Is this necessary? // Is this necessary?
try try
{ {
//return m_localBackend.TriggerExpectPrim(regionHandle,primID, objData); m_localBackend.TriggerExpectPrim(regionHandle, primID, objData);
return true;
//m_localBackend. //m_localBackend.
return false;
} }
catch (RemotingException e) catch (RemotingException e)
{ {
m_log.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString()); m_log.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString());
return false; return false;
} }
return false;
} }
/// <summary> /// <summary>

View File

@ -1089,50 +1089,7 @@ namespace OpenSim.Region.Environment.Scenes
if (target != null) if (target != null)
{ {
pos = target.AbsolutePosition; pos = target.AbsolutePosition;
// TODO: Raytrace here
//m_log.Info("[RAYTRACE]: " + pos.ToString());
//EntityIntersection rayTracing = null;
//ScenePresence presence = ((ScenePresence)GetScenePresence(ownerID));
//if (presence != null)
//{
//Vector3 CameraPosition = presence.CameraPosition;
//Vector3 rayEnd = new Vector3(pos.X, pos.Y, pos.Z);
//float rayMag = m_innerScene.Vector3Distance(CameraPosition, rayEnd);
//LLVector3 rayDirectionLL = Util.GetNormal(pos);
//Vector3 rayDirection = new Vector3(rayDirectionLL.X, rayDirectionLL.Y, rayDirectionLL.Z);
//Ray rezRay = new Ray(CameraPosition, rayDirection);
//Vector3 RezDirectionFromCamera = rezRay.Direction;
//rayTracing = m_innerScene.GetClosestIntersectingPrim(rezRay);
//}
//if ((rayTracing != null) && (rayTracing.HitTF))
//{
// We raytraced and found a prim in the way of the ground.. so
// We will rez the object somewhere close to the prim. Better math needed. This is a Stub
//Vector3 Newpos = new Vector3(rayTracing.obj.AbsolutePosition.X,rayTracing.obj.AbsolutePosition.Y,rayTracing.obj.AbsolutePosition.Z);
//Vector3 Newpos = rayTracing.ipoint;
//Vector3 NewScale =
//new Vector3(rayTracing.obj.Scale.X, rayTracing.obj.Scale.Y, rayTracing.obj.Scale.Z);
//Quaternion ParentRot = rayTracing.obj.ParentGroup.Rotation;
//Quaternion ParentRot = new Quaternion(primParentRot.W,primParentRot.X,primParentRot.Y,primParentRot.Z);
//LLQuaternion primLocalRot = rayTracing.obj.RotationOffset;
//Quaternion LocalRot = new Quaternion(primLocalRot.W, primLocalRot.X, primLocalRot.Y, primLocalRot.Z);
//Quaternion NewRot = LocalRot * ParentRot;
//Vector3 RezPoint = Newpos;
//m_log.Info("[REZINFO]: Possible Rez Point:" + RezPoint.ToString());
//pos = new LLVector3(RezPoint.x, RezPoint.y, RezPoint.z);
//}
return pos; return pos;
} }
else else
@ -1253,6 +1210,73 @@ namespace OpenSim.Region.Environment.Scenes
m_sceneXmlLoader.SavePrimsToXml2(fileName); m_sceneXmlLoader.SavePrimsToXml2(fileName);
} }
public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp)
{
m_log.Warn("Prim crossing: " + grp.UUID.ToString());
int thisx = (int)RegionInfo.RegionLocX;
int thisy = (int)RegionInfo.RegionLocY;
ulong newRegionHandle = 0;
LLVector3 pos = grp.AbsolutePosition;
if (position.X > 255.6f)
{
pos.X = ((pos.X - 256) + 10);
newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * 256), (uint)(thisy * 256));
// x + 1
}
else if (position.X < 0.4f)
{
pos.X = ((pos.X + 256) - 10);
newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * 256), (uint)(thisy * 256));
// x - 1
}
if (position.Y > 255.6f)
{
pos.Y = ((pos.Y - 256) + 10);
newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy + 1) * 256));
// y + 1
}
else if (position.Y < 0.4f)
{
pos.Y = ((pos.Y + 256) - 10);
newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy - 1) * 256));
// y - 1
}
// Offset the positions for the new region across the border
grp.OffsetForNewRegion(pos);
if (newRegionHandle != 0)
{
bool successYN = false;
successYN = m_sceneGridService.PrimCrossToNeighboringRegion(newRegionHandle, grp.UUID, m_sceneXmlLoader.SavePrimGroupToXML2String(grp));
if (successYN)
{
// We remove the object here
try
{
DeleteSceneObjectGroup(grp);
}
catch (System.Exception)
{
m_log.Warn("[DATABASE]: exception when trying to remove the prim that crossed the border.");
}
}
else
{
m_log.Warn("[INTERREGION]: Prim Crossing Failed!");
}
}
}
public void IncomingInterRegionPrimGroup(ulong regionHandle, LLUUID primID, string objXMLData)
{
m_log.Warn("{[INTERREGION]: OMG! A new prim arrived from a neighbor!.. Kyill eeehht! before it corrupts my entire database! AHHH! I feel so dirty now! yuck! ack! arg!");
m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData);
}
#endregion #endregion
#region Add/Remove Avatar Methods #region Add/Remove Avatar Methods
@ -1527,6 +1551,7 @@ namespace OpenSim.Region.Environment.Scenes
m_sceneGridService.OnCloseAgentConnection += CloseConnection; m_sceneGridService.OnCloseAgentConnection += CloseConnection;
m_sceneGridService.OnRegionUp += OtherRegionUp; m_sceneGridService.OnRegionUp += OtherRegionUp;
m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
m_sceneGridService.OnExpectPrim += IncomingInterRegionPrimGroup;
@ -1540,6 +1565,7 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void UnRegisterReginWithComms() public void UnRegisterReginWithComms()
{ {
m_sceneGridService.OnExpectPrim -= IncomingInterRegionPrimGroup;
m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate; m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate;
m_sceneGridService.OnRegionUp -= OtherRegionUp; m_sceneGridService.OnRegionUp -= OtherRegionUp;
m_sceneGridService.OnExpectUser -= NewUserConnection; m_sceneGridService.OnExpectUser -= NewUserConnection;

View File

@ -49,6 +49,7 @@ namespace OpenSim.Region.Environment.Scenes
public event AgentCrossing OnAvatarCrossingIntoRegion; public event AgentCrossing OnAvatarCrossingIntoRegion;
public event ExpectUserDelegate OnExpectUser; public event ExpectUserDelegate OnExpectUser;
public event ExpectPrimDelegate OnExpectPrim;
public event CloseAgentConnection OnCloseAgentConnection; public event CloseAgentConnection OnCloseAgentConnection;
public event PrimCrossing OnPrimCrossingIntoRegion; public event PrimCrossing OnPrimCrossingIntoRegion;
public event RegionUp OnRegionUp; public event RegionUp OnRegionUp;
@ -82,10 +83,9 @@ namespace OpenSim.Region.Environment.Scenes
//m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString()); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString());
regionCommsHost.debugRegionName = _debugRegionName; regionCommsHost.debugRegionName = _debugRegionName;
regionCommsHost.OnExpectPrim += IncomingPrimCrossing;
regionCommsHost.OnExpectUser += NewUserConnection; regionCommsHost.OnExpectUser += NewUserConnection;
regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing;
regionCommsHost.OnCloseAgentConnection += CloseConnection; regionCommsHost.OnCloseAgentConnection += CloseConnection;
regionCommsHost.OnRegionUp += newRegionUp; regionCommsHost.OnRegionUp += newRegionUp;
regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate;
@ -104,8 +104,8 @@ namespace OpenSim.Region.Environment.Scenes
regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate; regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate;
regionCommsHost.OnRegionUp -= newRegionUp; regionCommsHost.OnRegionUp -= newRegionUp;
regionCommsHost.OnExpectUser -= NewUserConnection; regionCommsHost.OnExpectUser -= NewUserConnection;
regionCommsHost.OnExpectPrim -= IncomingPrimCrossing;
regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing; regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing;
regionCommsHost.OnPrimCrossingIntoRegion -= PrimCrossing;
regionCommsHost.OnCloseAgentConnection -= CloseConnection; regionCommsHost.OnCloseAgentConnection -= CloseConnection;
m_commsProvider.GridService.DeregisterRegion(m_regionInfo); m_commsProvider.GridService.DeregisterRegion(m_regionInfo);
regionCommsHost = null; regionCommsHost = null;
@ -156,6 +156,15 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
protected void IncomingPrimCrossing(ulong regionHandle, LLUUID primID, String objXMLData)
{
if (OnExpectPrim != null)
{
OnExpectPrim(regionHandle, primID, objXMLData);
}
}
protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical)
{ {
if (OnPrimCrossingIntoRegion != null) if (OnPrimCrossingIntoRegion != null)
@ -535,9 +544,9 @@ namespace OpenSim.Region.Environment.Scenes
return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying); return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying);
} }
public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, LLVector3 position, bool isPhysical) public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, string objData)
{ {
return m_commsProvider.InterRegion.ExpectPrimCrossing(regionhandle, primID, position, isPhysical); return m_commsProvider.InterRegion.InformRegionOfPrimCrossing(regionhandle, primID, objData);
} }

View File

@ -126,23 +126,11 @@ namespace OpenSim.Region.Environment.Scenes
set set
{ {
LLVector3 val = value; LLVector3 val = value;
if (val.X > 255.6f) if (val.X > 255.6f || val.X < 0.4f || val.Y > 255.6f || val.Y < 0.4f)
{ {
val.X = 255.6f; m_scene.CrossPrimGroupIntoNewRegion(val, this);
}
else if (val.X < 0.4f)
{
val.X = 0.4f;
}
if (val.Y > 255.6f)
{
val.Y = 255.6f;
}
else if (val.Y < 0.4f)
{
val.Y = 0.4f;
} }
lock (m_parts) lock (m_parts)
{ {
@ -1378,6 +1366,11 @@ namespace OpenSim.Region.Environment.Scenes
ScheduleGroupForTerseUpdate(); ScheduleGroupForTerseUpdate();
} }
public void OffsetForNewRegion(LLVector3 offset)
{
m_rootPart.GroupPosition = offset;
}
#endregion #endregion
#region Rotation #region Rotation

View File

@ -123,6 +123,33 @@ namespace OpenSim.Region.Environment.Scenes
file.Close(); file.Close();
} }
public string SavePrimGroupToXML2String(SceneObjectGroup grp)
{
string returnstring = "";
returnstring += "<scene>\n";
returnstring += grp.ToXmlString2();
returnstring += "</scene>\n";
return returnstring;
}
public void LoadGroupFromXml2String(string xmlString)
{
XmlDocument doc = new XmlDocument();
XmlNode rootNode;
XmlTextReader reader = new XmlTextReader(new StringReader(xmlString));
reader.WhitespaceHandling = WhitespaceHandling.None;
doc.Load(reader);
reader.Close();
rootNode = doc.FirstChild;
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
{
CreatePrimFromXml(aPrimNode.OuterXml);
}
}
public void LoadPrimsFromXml2(string fileName) public void LoadPrimsFromXml2(string fileName)
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();

View File

@ -84,6 +84,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public OdePrim(String primName, OdeScene parent_scene, IntPtr targetSpace, PhysicsVector pos, PhysicsVector size, public OdePrim(String primName, OdeScene parent_scene, IntPtr targetSpace, PhysicsVector pos, PhysicsVector size,
Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical)
{ {
System.Threading.Thread.Sleep(20);
_velocity = new PhysicsVector(); _velocity = new PhysicsVector();
_position = pos; _position = pos;
m_taintposition = pos; m_taintposition = pos;