Merge branch 'master' of ssh://melanie@3dhosting.de/var/git/careminster into careminster
commit
7be9ba5564
|
@ -308,6 +308,8 @@ namespace OpenSim.Framework
|
||||||
public Animation[] Anims;
|
public Animation[] Anims;
|
||||||
|
|
||||||
public UUID GranterID;
|
public UUID GranterID;
|
||||||
|
public UUID ParentPart;
|
||||||
|
public Vector3 SitOffset;
|
||||||
|
|
||||||
// Appearance
|
// Appearance
|
||||||
public AvatarAppearance Appearance;
|
public AvatarAppearance Appearance;
|
||||||
|
@ -468,6 +470,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
args["attach_objects"] = attObjs;
|
args["attach_objects"] = attObjs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
args["parent_part"] = OSD.FromUUID(ParentPart);
|
||||||
|
args["sit_offset"] = OSD.FromString(SitOffset.ToString());
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -675,6 +681,11 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (args["parent_part"] != null)
|
||||||
|
ParentPart = args["parent_part"].AsUUID();
|
||||||
|
if (args["sit_offset"] != null)
|
||||||
|
Vector3.TryParse(args["sit_offset"].AsString(), out SitOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AgentData()
|
public AgentData()
|
||||||
|
|
|
@ -1549,7 +1549,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
public void SendKillObject(ulong regionHandle, List<uint> localIDs)
|
public void SendKillObject(ulong regionHandle, List<uint> localIDs)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle);
|
// foreach (uint id in localIDs)
|
||||||
|
// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
|
||||||
|
|
||||||
KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
|
KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
|
||||||
// TODO: don't create new blocks if recycling an old packet
|
// TODO: don't create new blocks if recycling an old packet
|
||||||
|
|
|
@ -681,11 +681,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
#region Agent Crossings
|
#region Agent Crossings
|
||||||
|
|
||||||
public bool Cross(ScenePresence agent, bool isFlying)
|
public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos)
|
||||||
{
|
{
|
||||||
Scene scene = agent.Scene;
|
version = String.Empty;
|
||||||
Vector3 pos = agent.AbsolutePosition;
|
newpos = new Vector3(pos.X, pos.Y, pos.Z);
|
||||||
Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z);
|
|
||||||
uint neighbourx = scene.RegionInfo.RegionLocX;
|
uint neighbourx = scene.RegionInfo.RegionLocX;
|
||||||
uint neighboury = scene.RegionInfo.RegionLocY;
|
uint neighboury = scene.RegionInfo.RegionLocY;
|
||||||
const float boundaryDistance = 1.7f;
|
const float boundaryDistance = 1.7f;
|
||||||
|
@ -706,53 +705,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
}
|
}
|
||||||
else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
|
neighboury--;
|
||||||
if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
|
newpos.Y = Constants.RegionSize - enterDistance;
|
||||||
{
|
|
||||||
neighboury--;
|
|
||||||
newpos.Y = Constants.RegionSize - enterDistance;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
agent.IsInTransit = true;
|
|
||||||
|
|
||||||
neighboury = b.TriggerRegionY;
|
|
||||||
neighbourx = b.TriggerRegionX;
|
|
||||||
|
|
||||||
Vector3 newposition = pos;
|
|
||||||
newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
|
|
||||||
newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
|
|
||||||
agent.ControllingClient.SendAgentAlertMessage(
|
|
||||||
String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
|
|
||||||
InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W);
|
neighbourx--;
|
||||||
if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
|
newpos.X = Constants.RegionSize - enterDistance;
|
||||||
{
|
|
||||||
neighbourx--;
|
|
||||||
newpos.X = Constants.RegionSize - enterDistance;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
agent.IsInTransit = true;
|
|
||||||
|
|
||||||
neighboury = ba.TriggerRegionY;
|
|
||||||
neighbourx = ba.TriggerRegionX;
|
|
||||||
|
|
||||||
|
|
||||||
Vector3 newposition = pos;
|
|
||||||
newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
|
|
||||||
newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
|
|
||||||
agent.ControllingClient.SendAgentAlertMessage(
|
|
||||||
String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
|
|
||||||
InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (scene.TestBorderCross(pos + eastCross, Cardinals.E))
|
else if (scene.TestBorderCross(pos + eastCross, Cardinals.E))
|
||||||
|
@ -763,26 +721,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
|
neighboury--;
|
||||||
if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
|
newpos.Y = Constants.RegionSize - enterDistance;
|
||||||
{
|
|
||||||
neighboury--;
|
|
||||||
newpos.Y = Constants.RegionSize - enterDistance;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
agent.IsInTransit = true;
|
|
||||||
|
|
||||||
neighboury = ba.TriggerRegionY;
|
|
||||||
neighbourx = ba.TriggerRegionX;
|
|
||||||
Vector3 newposition = pos;
|
|
||||||
newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
|
|
||||||
newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
|
|
||||||
agent.ControllingClient.SendAgentAlertMessage(
|
|
||||||
String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
|
|
||||||
InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
|
else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
|
||||||
{
|
{
|
||||||
|
@ -790,35 +730,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
|
neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
newpos.Y = enterDistance;
|
newpos.Y = enterDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
|
Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
|
||||||
if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
|
neighboury--;
|
||||||
{
|
newpos.Y = Constants.RegionSize - enterDistance;
|
||||||
neighboury--;
|
|
||||||
newpos.Y = Constants.RegionSize - enterDistance;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
agent.IsInTransit = true;
|
|
||||||
|
|
||||||
neighboury = b.TriggerRegionY;
|
|
||||||
neighbourx = b.TriggerRegionX;
|
|
||||||
Vector3 newposition = pos;
|
|
||||||
newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
|
|
||||||
newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
|
|
||||||
agent.ControllingClient.SendAgentAlertMessage(
|
|
||||||
String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
|
|
||||||
InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
|
else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
|
||||||
{
|
{
|
||||||
|
|
||||||
Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
|
Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
|
||||||
neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
|
neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
newpos.Y = enterDistance;
|
newpos.Y = enterDistance;
|
||||||
|
@ -849,19 +769,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
|
xDest = neighbourx;
|
||||||
|
yDest = neighboury;
|
||||||
|
|
||||||
int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize);
|
int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize);
|
||||||
|
|
||||||
|
ulong neighbourHandle = Utils.UIntsToLong((uint)x, (uint)y);
|
||||||
|
|
||||||
ExpiringCache<ulong, DateTime> r;
|
ExpiringCache<ulong, DateTime> r;
|
||||||
DateTime banUntil;
|
DateTime banUntil;
|
||||||
|
|
||||||
if (m_bannedRegions.TryGetValue(agent.ControllingClient.AgentId, out r))
|
if (m_bannedRegions.TryGetValue(agentID, out r))
|
||||||
{
|
{
|
||||||
if (r.TryGetValue(neighbourHandle, out banUntil))
|
if (r.TryGetValue(neighbourHandle, out banUntil))
|
||||||
{
|
{
|
||||||
if (DateTime.Now < banUntil)
|
if (DateTime.Now < banUntil)
|
||||||
return false;
|
return null;
|
||||||
r.Remove(neighbourHandle);
|
r.Remove(neighbourHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -873,28 +796,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||||
|
|
||||||
string reason;
|
string reason;
|
||||||
string version;
|
if (!scene.SimulationService.QueryAccess(neighbourRegion, agentID, newpos, out version, out reason))
|
||||||
if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out version, out reason))
|
|
||||||
{
|
{
|
||||||
agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
|
|
||||||
if (r == null)
|
if (r == null)
|
||||||
{
|
{
|
||||||
r = new ExpiringCache<ulong, DateTime>();
|
r = new ExpiringCache<ulong, DateTime>();
|
||||||
r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
|
r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
|
||||||
|
|
||||||
m_bannedRegions.Add(agent.ControllingClient.AgentId, r, TimeSpan.FromSeconds(45));
|
m_bannedRegions.Add(agentID, r, TimeSpan.FromSeconds(45));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
|
r.Add(neighbourHandle, DateTime.Now + TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return neighbourRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Cross(ScenePresence agent, bool isFlying)
|
||||||
|
{
|
||||||
|
uint x;
|
||||||
|
uint y;
|
||||||
|
Vector3 newpos;
|
||||||
|
string version;
|
||||||
|
|
||||||
|
GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, out x, out y, out version, out newpos);
|
||||||
|
if (neighbourRegion == null)
|
||||||
|
{
|
||||||
|
agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
agent.IsInTransit = true;
|
agent.IsInTransit = true;
|
||||||
|
|
||||||
CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
|
CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
|
||||||
d.BeginInvoke(agent, newpos, neighbourx, neighboury, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
|
d.BeginInvoke(agent, newpos, x, y, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -951,13 +889,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
icon.EndInvoke(iar);
|
icon.EndInvoke(iar);
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This Closes child agents on neighbouring regions
|
/// This Closes child agents on neighbouring regions
|
||||||
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
|
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected ScenePresence CrossAgentToNewRegionAsync(
|
public ScenePresence CrossAgentToNewRegionAsync(
|
||||||
ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion,
|
ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion,
|
||||||
bool isFlying, string version)
|
bool isFlying, string version)
|
||||||
{
|
{
|
||||||
|
@ -1731,17 +1667,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
||||||
|
|
||||||
|
// Need to turn off the physics flags, otherwise the object will continue to attempt to
|
||||||
|
// move out of the region creating an infinite loop of failed attempts to cross
|
||||||
|
grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
|
||||||
|
|
||||||
// We are going to move the object back to the old position so long as the old position
|
// We are going to move the object back to the old position so long as the old position
|
||||||
// is in the region
|
// is in the region
|
||||||
oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1);
|
oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1);
|
||||||
oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1);
|
oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1);
|
||||||
oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f);
|
oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f);
|
||||||
|
|
||||||
grp.RootPart.GroupPosition = oldGroupPosition;
|
grp.AbsolutePosition = oldGroupPosition;
|
||||||
|
|
||||||
// Need to turn off the physics flags, otherwise the object will continue to attempt to
|
|
||||||
// move out of the region creating an infinite loop of failed attempts to cross
|
|
||||||
grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
|
|
||||||
|
|
||||||
grp.ScheduleGroupForFullUpdate();
|
grp.ScheduleGroupForFullUpdate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@ using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
namespace OpenSim.Region.Framework.Interfaces
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
|
public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version);
|
||||||
|
|
||||||
public interface IEntityTransferModule
|
public interface IEntityTransferModule
|
||||||
{
|
{
|
||||||
void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position,
|
void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position,
|
||||||
|
@ -53,7 +55,12 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
|
|
||||||
void EnableChildAgent(ScenePresence agent, GridRegion region);
|
void EnableChildAgent(ScenePresence agent, GridRegion region);
|
||||||
|
|
||||||
|
GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out uint xDest, out uint yDest, out string version, out Vector3 newpos);
|
||||||
|
|
||||||
void Cross(SceneObjectGroup sog, Vector3 position, bool silent);
|
void Cross(SceneObjectGroup sog, Vector3 position, bool silent);
|
||||||
|
|
||||||
|
ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IUserAgentVerificationModule
|
public interface IUserAgentVerificationModule
|
||||||
|
|
|
@ -465,7 +465,77 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|| Scene.TestBorderCross(val - Vector3.UnitY, Cardinals.N) || Scene.TestBorderCross(val + Vector3.UnitY, Cardinals.S))
|
|| Scene.TestBorderCross(val - Vector3.UnitY, Cardinals.N) || Scene.TestBorderCross(val + Vector3.UnitY, Cardinals.S))
|
||||||
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
||||||
{
|
{
|
||||||
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
|
IEntityTransferModule entityTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
||||||
|
uint x = 0;
|
||||||
|
uint y = 0;
|
||||||
|
string version = String.Empty;
|
||||||
|
Vector3 newpos = Vector3.Zero;
|
||||||
|
OpenSim.Services.Interfaces.GridRegion destination = null;
|
||||||
|
|
||||||
|
bool canCross = true;
|
||||||
|
foreach (ScenePresence av in m_linkedAvatars)
|
||||||
|
{
|
||||||
|
// We need to cross these agents. First, let's find
|
||||||
|
// out if any of them can't cross for some reason.
|
||||||
|
// We have to deny the crossing entirely if any
|
||||||
|
// of them are banned. Alternatively, we could
|
||||||
|
// unsit banned agents....
|
||||||
|
|
||||||
|
|
||||||
|
// We set the avatar position as being the object
|
||||||
|
// position to get the region to send to
|
||||||
|
if ((destination = entityTransfer.GetDestination(m_scene, av.UUID, val, out x, out y, out version, out newpos)) == null)
|
||||||
|
{
|
||||||
|
canCross = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("[SCENE OBJECT]: Avatar {0} needs to be crossed to {1}", av.Name, destination.RegionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canCross)
|
||||||
|
{
|
||||||
|
// We unparent the SP quietly so that it won't
|
||||||
|
// be made to stand up
|
||||||
|
foreach (ScenePresence av in m_linkedAvatars)
|
||||||
|
{
|
||||||
|
SceneObjectPart parentPart = m_scene.GetSceneObjectPart(av.ParentID);
|
||||||
|
if (parentPart != null)
|
||||||
|
av.ParentUUID = parentPart.UUID;
|
||||||
|
|
||||||
|
av.ParentID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
|
||||||
|
|
||||||
|
// Normalize
|
||||||
|
if (val.X >= Constants.RegionSize)
|
||||||
|
val.X -= Constants.RegionSize;
|
||||||
|
if (val.Y >= Constants.RegionSize)
|
||||||
|
val.Y -= Constants.RegionSize;
|
||||||
|
if (val.X < 0)
|
||||||
|
val.X += Constants.RegionSize;
|
||||||
|
if (val.Y < 0)
|
||||||
|
val.Y += Constants.RegionSize;
|
||||||
|
|
||||||
|
// If it's deleted, crossing was successful
|
||||||
|
if (IsDeleted)
|
||||||
|
{
|
||||||
|
foreach (ScenePresence av in m_linkedAvatars)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar {0} to {1}", av.Name, val);
|
||||||
|
|
||||||
|
av.IsInTransit = true;
|
||||||
|
|
||||||
|
CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync;
|
||||||
|
d.BeginInvoke(av, val, x, y, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val = AbsolutePosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,6 +594,23 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CrossAgentToNewRegionCompleted(IAsyncResult iar)
|
||||||
|
{
|
||||||
|
CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState;
|
||||||
|
ScenePresence agent = icon.EndInvoke(iar);
|
||||||
|
|
||||||
|
//// If the cross was successful, this agent is a child agent
|
||||||
|
//if (agent.IsChildAgent)
|
||||||
|
// agent.Reset();
|
||||||
|
//else // Not successful
|
||||||
|
// agent.RestoreInCurrentScene();
|
||||||
|
|
||||||
|
// In any case
|
||||||
|
agent.IsInTransit = false;
|
||||||
|
|
||||||
|
m_log.DebugFormat("[SCENE OBJECT]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
|
||||||
|
}
|
||||||
|
|
||||||
public override uint LocalId
|
public override uint LocalId
|
||||||
{
|
{
|
||||||
get { return m_rootPart.LocalId; }
|
get { return m_rootPart.LocalId; }
|
||||||
|
|
|
@ -233,6 +233,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private bool m_collisionEventFlag = false;
|
private bool m_collisionEventFlag = false;
|
||||||
private object m_collisionEventLock = new Object();
|
private object m_collisionEventLock = new Object();
|
||||||
|
|
||||||
|
private Vector3 m_prevSitOffset;
|
||||||
|
|
||||||
protected AvatarAppearance m_appearance;
|
protected AvatarAppearance m_appearance;
|
||||||
|
|
||||||
public AvatarAppearance Appearance
|
public AvatarAppearance Appearance
|
||||||
|
@ -644,6 +646,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
private uint m_parentID;
|
private uint m_parentID;
|
||||||
|
|
||||||
|
public UUID ParentUUID
|
||||||
|
{
|
||||||
|
get { return m_parentUUID; }
|
||||||
|
set { m_parentUUID = value; }
|
||||||
|
}
|
||||||
|
private UUID m_parentUUID = UUID.Zero;
|
||||||
|
|
||||||
public float Health
|
public float Health
|
||||||
{
|
{
|
||||||
get { return m_health; }
|
get { return m_health; }
|
||||||
|
@ -865,7 +874,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
"[SCENE]: Upgrading child to root agent for {0} in {1}",
|
"[SCENE]: Upgrading child to root agent for {0} in {1}",
|
||||||
Name, m_scene.RegionInfo.RegionName);
|
Name, m_scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
//m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
|
if (ParentUUID != UUID.Zero)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[SCENE PRESENCE]: Sitting avatar back on prim {0}", ParentUUID);
|
||||||
|
SceneObjectPart part = m_scene.GetSceneObjectPart(ParentUUID);
|
||||||
|
if (part == null)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[SCENE PRESENCE]: Can't find prim {0} to sit on", ParentUUID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
part.ParentGroup.AddAvatar(UUID);
|
||||||
|
if (part.SitTargetPosition != Vector3.Zero)
|
||||||
|
part.SitTargetAvatar = UUID;
|
||||||
|
ParentPosition = part.GetWorldPosition();
|
||||||
|
ParentID = part.LocalId;
|
||||||
|
m_pos = m_prevSitOffset;
|
||||||
|
pos = ParentPosition;
|
||||||
|
}
|
||||||
|
ParentUUID = UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
bool wasChild = IsChildAgent;
|
bool wasChild = IsChildAgent;
|
||||||
IsChildAgent = false;
|
IsChildAgent = false;
|
||||||
|
@ -878,62 +906,64 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene);
|
m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene);
|
||||||
|
|
||||||
// Moved this from SendInitialData to ensure that Appearance is initialized
|
if (ParentID == 0)
|
||||||
// before the inventory is processed in MakeRootAgent. This fixes a race condition
|
|
||||||
// related to the handling of attachments
|
|
||||||
//m_scene.GetAvatarAppearance(ControllingClient, out Appearance);
|
|
||||||
if (m_scene.TestBorderCross(pos, Cardinals.E))
|
|
||||||
{
|
{
|
||||||
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
|
// Moved this from SendInitialData to ensure that Appearance is initialized
|
||||||
pos.X = crossedBorder.BorderLine.Z - 1;
|
// before the inventory is processed in MakeRootAgent. This fixes a race condition
|
||||||
|
// related to the handling of attachments
|
||||||
|
//m_scene.GetAvatarAppearance(ControllingClient, out Appearance);
|
||||||
|
if (m_scene.TestBorderCross(pos, Cardinals.E))
|
||||||
|
{
|
||||||
|
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
|
||||||
|
pos.X = crossedBorder.BorderLine.Z - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_scene.TestBorderCross(pos, Cardinals.N))
|
||||||
|
{
|
||||||
|
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
|
||||||
|
pos.Y = crossedBorder.BorderLine.Z - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckAndAdjustLandingPoint(ref pos);
|
||||||
|
|
||||||
|
if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
|
||||||
|
pos, Name, UUID);
|
||||||
|
|
||||||
|
if (pos.X < 0f) pos.X = 0f;
|
||||||
|
if (pos.Y < 0f) pos.Y = 0f;
|
||||||
|
if (pos.Z < 0f) pos.Z = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
float localAVHeight = 1.56f;
|
||||||
|
if (Appearance.AvatarHeight > 0)
|
||||||
|
localAVHeight = Appearance.AvatarHeight;
|
||||||
|
|
||||||
|
float posZLimit = 0;
|
||||||
|
|
||||||
|
if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
|
||||||
|
posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
|
||||||
|
|
||||||
|
float newPosZ = posZLimit + localAVHeight / 2;
|
||||||
|
if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
|
||||||
|
{
|
||||||
|
pos.Z = newPosZ;
|
||||||
|
}
|
||||||
|
AbsolutePosition = pos;
|
||||||
|
|
||||||
|
AddToPhysicalScene(isFlying);
|
||||||
|
|
||||||
|
if (ForceFly)
|
||||||
|
{
|
||||||
|
Flying = true;
|
||||||
|
}
|
||||||
|
else if (FlyDisabled)
|
||||||
|
{
|
||||||
|
Flying = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_scene.TestBorderCross(pos, Cardinals.N))
|
|
||||||
{
|
|
||||||
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
|
|
||||||
pos.Y = crossedBorder.BorderLine.Z - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckAndAdjustLandingPoint(ref pos);
|
|
||||||
|
|
||||||
if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
|
|
||||||
pos, Name, UUID);
|
|
||||||
|
|
||||||
if (pos.X < 0f) pos.X = 0f;
|
|
||||||
if (pos.Y < 0f) pos.Y = 0f;
|
|
||||||
if (pos.Z < 0f) pos.Z = 0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float localAVHeight = 1.56f;
|
|
||||||
if (Appearance.AvatarHeight > 0)
|
|
||||||
localAVHeight = Appearance.AvatarHeight;
|
|
||||||
|
|
||||||
float posZLimit = 0;
|
|
||||||
|
|
||||||
if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
|
|
||||||
posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
|
|
||||||
|
|
||||||
float newPosZ = posZLimit + localAVHeight / 2;
|
|
||||||
if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
|
|
||||||
{
|
|
||||||
pos.Z = newPosZ;
|
|
||||||
}
|
|
||||||
AbsolutePosition = pos;
|
|
||||||
|
|
||||||
AddToPhysicalScene(isFlying);
|
|
||||||
|
|
||||||
if (ForceFly)
|
|
||||||
{
|
|
||||||
Flying = true;
|
|
||||||
}
|
|
||||||
else if (FlyDisabled)
|
|
||||||
{
|
|
||||||
Flying = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
|
// Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
|
||||||
// avatar to return to the standing position in mid-air. On login it looks like this is being sent
|
// avatar to return to the standing position in mid-air. On login it looks like this is being sent
|
||||||
// elsewhere anyway
|
// elsewhere anyway
|
||||||
|
@ -951,11 +981,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments...");
|
m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments...");
|
||||||
// Resume scripts
|
// Resume scripts
|
||||||
foreach (SceneObjectGroup sog in m_attachments)
|
Util.FireAndForget(delegate(object x) {
|
||||||
{
|
foreach (SceneObjectGroup sog in m_attachments)
|
||||||
sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
|
{
|
||||||
sog.ResumeScripts();
|
sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
|
||||||
}
|
sog.ResumeScripts();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3110,6 +3142,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
cAgent.Appearance = new AvatarAppearance(Appearance);
|
cAgent.Appearance = new AvatarAppearance(Appearance);
|
||||||
|
|
||||||
|
cAgent.ParentPart = ParentUUID;
|
||||||
|
cAgent.SitOffset = m_pos;
|
||||||
|
|
||||||
lock (scriptedcontrols)
|
lock (scriptedcontrols)
|
||||||
{
|
{
|
||||||
ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
|
ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
|
||||||
|
@ -3168,6 +3203,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
CameraAtAxis = cAgent.AtAxis;
|
CameraAtAxis = cAgent.AtAxis;
|
||||||
CameraLeftAxis = cAgent.LeftAxis;
|
CameraLeftAxis = cAgent.LeftAxis;
|
||||||
m_CameraUpAxis = cAgent.UpAxis;
|
m_CameraUpAxis = cAgent.UpAxis;
|
||||||
|
ParentUUID = cAgent.ParentPart;
|
||||||
|
m_prevSitOffset = cAgent.SitOffset;
|
||||||
|
|
||||||
// When we get to the point of re-computing neighbors everytime this
|
// When we get to the point of re-computing neighbors everytime this
|
||||||
// changes, then start using the agent's drawdistance rather than the
|
// changes, then start using the agent's drawdistance rather than the
|
||||||
|
|
|
@ -2188,7 +2188,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (part.ParentGroup.RootPart == part)
|
if (part.ParentGroup.RootPart == part)
|
||||||
{
|
{
|
||||||
SceneObjectGroup parent = part.ParentGroup;
|
SceneObjectGroup parent = part.ParentGroup;
|
||||||
parent.UpdateGroupPosition(new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z));
|
Util.FireAndForget(delegate(object x) {
|
||||||
|
parent.UpdateGroupPosition(new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -7973,7 +7975,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (part.ParentGroup.RootPart == part)
|
if (part.ParentGroup.RootPart == part)
|
||||||
{
|
{
|
||||||
SceneObjectGroup parent = part.ParentGroup;
|
SceneObjectGroup parent = part.ParentGroup;
|
||||||
parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
|
Util.FireAndForget(delegate(object x) {
|
||||||
|
parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -7990,7 +7994,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (part.ParentGroup.RootPart == part)
|
if (part.ParentGroup.RootPart == part)
|
||||||
{
|
{
|
||||||
SceneObjectGroup parent = part.ParentGroup;
|
SceneObjectGroup parent = part.ParentGroup;
|
||||||
parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
|
Util.FireAndForget(delegate(object x) {
|
||||||
|
parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -433,11 +433,14 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
args["destination_name"] = OSD.FromString(destination.RegionName);
|
args["destination_name"] = OSD.FromString(destination.RegionName);
|
||||||
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
||||||
|
|
||||||
WebUtil.PostToService(uri, args, 40000);
|
OSDMap response = WebUtil.PostToService(uri, args, 40000);
|
||||||
|
if (response["Success"] == "False")
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString());
|
m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue