Merge branch 'master' into careminster

avinationmerge
Melanie 2011-12-18 10:49:45 +00:00
commit 759f1d2dbe
25 changed files with 303 additions and 294 deletions

View File

@ -80,6 +80,7 @@ what it is today.
* dmiles (Daxtron Labs)
* dslake (Intel)
* FredoChaplin
* Garmin Kawaguichi
* Gerhard
* Godfrey
* Grumly57

View File

@ -34,6 +34,7 @@ namespace OpenSim.Framework
string Name { get; set; }
UUID UUID { get; }
uint LocalId { get; }
Vector3 AbsolutePosition { get; }
}
}

View File

@ -33,6 +33,12 @@ namespace OpenSim.Framework
public interface ISceneObject
{
UUID UUID { get; }
/// <summary>
/// The owner of this object.
/// </summary>
UUID OwnerID { get; set; }
ISceneObject CloneForNewScene();
string ToXml2();
string ExtraToXmlString();

View File

@ -188,6 +188,18 @@ namespace OpenSim
}
}
// Hook up to the watchdog timer
Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
PrintFileToConsole("startuplogo.txt");
// For now, start at the 'root' level by default
if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it
ChangeSelectedRegion("region",
new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName});
else
ChangeSelectedRegion("region", new string[] {"change", "region", "root"});
//Run Startup Commands
if (String.IsNullOrEmpty(m_startupCommandsFile))
{
@ -206,18 +218,6 @@ namespace OpenSim
m_scriptTimer.Interval = 1200*1000;
m_scriptTimer.Elapsed += RunAutoTimerScript;
}
// Hook up to the watchdog timer
Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
PrintFileToConsole("startuplogo.txt");
// For now, start at the 'root' level by default
if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it
ChangeSelectedRegion("region",
new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName});
else
ChangeSelectedRegion("region", new string[] {"change", "region", "root"});
}
/// <summary>
@ -796,6 +796,7 @@ namespace OpenSim
break;
case "backup":
MainConsole.Instance.Output("Triggering save of pending object updates to persistent store");
m_sceneManager.BackupCurrentScene();
break;
@ -806,7 +807,7 @@ namespace OpenSim
if (m_sceneManager.TryGetScene(regRemoveName, out removeScene))
RemoveRegion(removeScene, false);
else
MainConsole.Instance.Output("no region with that name");
MainConsole.Instance.Output("No region with that name");
break;
case "delete-region":

View File

@ -10464,6 +10464,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
return true;
}
private bool HandleGroupRoleMembersRequest(IClientAPI sender, Packet Pack)
{
GroupRoleMembersRequestPacket groupRoleMembersRequest =

View File

@ -1236,7 +1236,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
AgentCircuitData agent = sp.ControllingClient.RequestClientInfo();
agent.BaseFolder = UUID.Zero;
agent.InventoryFolder = UUID.Zero;
agent.startpos = new Vector3(128, 128, 70);
agent.startpos = sp.AbsolutePosition + CalculateOffset(sp, neighbour);
agent.child = true;
agent.Appearance = sp.Appearance;
if (currentAgentCircuit != null)
@ -1329,6 +1329,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
}
}
Vector3 CalculateOffset(ScenePresence sp, GridRegion neighbour)
{
int rRegionX = (int)sp.Scene.RegionInfo.RegionLocX;
int rRegionY = (int)sp.Scene.RegionInfo.RegionLocY;
int tRegionX = neighbour.RegionLocX / (int)Constants.RegionSize;
int tRegionY = neighbour.RegionLocY / (int)Constants.RegionSize;
int shiftx = (rRegionX - tRegionX) * (int)Constants.RegionSize;
int shifty = (rRegionY - tRegionY) * (int)Constants.RegionSize;
return new Vector3(shiftx, shifty, 0f);
}
private void InformClientOfNeighbourCompleted(IAsyncResult iar)
{
InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate)iar.AsyncState;

View File

@ -123,7 +123,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID);
GridRegion real_destination = m_GatekeeperConnector.GetHyperlinkRegion(region, region.RegionID);
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: GetFinalDestination serveruri -> {0}", real_destination.ServerURI);
if (real_destination != null)
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: GetFinalDestination serveruri -> {0}", real_destination.ServerURI);
else
m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI);
return real_destination;
}
return region;

View File

@ -385,8 +385,14 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_log.Debug("[PERMISSIONS]: " + permissionCalled + " was called from " + m_scene.RegionInfo.RegionName);
}
// Checks if the given group is active and if the user is a group member
// with the powers requested (powers = 0 for no powers check)
/// <summary>
/// Checks if the given group is active and if the user is a group member
/// with the powers requested (powers = 0 for no powers check)
/// </summary>
/// <param name="groupID"></param>
/// <param name="userID"></param>
/// <param name="powers"></param>
/// <returns></returns>
protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers)
{
if (null == m_groupsModule)

View File

@ -1588,6 +1588,12 @@ namespace OpenSim.Region.Framework.Scenes
public void TriggerRequestChangeWaterHeight(float height)
{
if (height < 0)
{
// ignore negative water height
return;
}
RequestChangeWaterHeight handlerRequestChangeWaterHeight = OnRequestChangeWaterHeight;
if (handlerRequestChangeWaterHeight != null)
{

View File

@ -116,18 +116,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="remoteClient"></param>
public void RequestPrim(uint primLocalID, IClientAPI remoteClient)
{
EntityBase[] entityList = GetEntities();
foreach (EntityBase ent in entityList)
{
if (ent is SceneObjectGroup)
{
if (((SceneObjectGroup)ent).LocalId == primLocalID)
{
((SceneObjectGroup)ent).SendFullUpdateToClient(remoteClient);
return;
}
}
}
SceneObjectGroup sog = GetGroupByPrim(primLocalID);
if (sog != null)
sog.SendFullUpdateToClient(remoteClient);
}
/// <summary>
@ -137,47 +129,28 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="remoteClient"></param>
public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
{
EntityBase[] entityList = GetEntities();
foreach (EntityBase ent in entityList)
SceneObjectPart part = GetSceneObjectPart(primLocalID);
if (null == part)
return;
if (part.IsRoot)
{
if (ent is SceneObjectGroup)
SceneObjectGroup sog = part.ParentGroup;
sog.SendPropertiesToClient(remoteClient);
sog.IsSelected = true;
// A prim is only tainted if it's allowed to be edited by the person clicking it.
if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
|| Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
{
if (((SceneObjectGroup) ent).LocalId == primLocalID)
{
((SceneObjectGroup) ent).SendPropertiesToClient(remoteClient);
((SceneObjectGroup) ent).IsSelected = true;
// A prim is only tainted if it's allowed to be edited by the person clicking it.
if (Permissions.CanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId)
|| Permissions.CanMoveObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId))
{
EventManager.TriggerParcelPrimCountTainted();
}
break;
}
else
{
// We also need to check the children of this prim as they
// can be selected as well and send property information
bool foundPrim = false;
SceneObjectGroup sog = ent as SceneObjectGroup;
SceneObjectPart[] partList = sog.Parts;
foreach (SceneObjectPart part in partList)
{
if (part.LocalId == primLocalID)
{
part.SendPropertiesToClient(remoteClient);
foundPrim = true;
break;
}
}
if (foundPrim)
break;
}
EventManager.TriggerParcelPrimCountTainted();
}
}
else
{
part.SendPropertiesToClient(remoteClient);
}
}
/// <summary>
@ -250,121 +223,81 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void ProcessObjectGrab(uint localID, Vector3 offsetPos, IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs)
{
EntityBase[] EntityList = GetEntities();
SceneObjectPart part = GetSceneObjectPart(localID);
if (part == null)
return;
SceneObjectGroup obj = part.ParentGroup;
SurfaceTouchEventArgs surfaceArg = null;
if (surfaceArgs != null && surfaceArgs.Count > 0)
surfaceArg = surfaceArgs[0];
foreach (EntityBase ent in EntityList)
// Currently only grab/touch for the single prim
// the client handles rez correctly
obj.ObjectGrabHandler(localID, offsetPos, remoteClient);
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch_start) != 0)
EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
// Deliver to the root prim if the touched prim doesn't handle touches
// or if we're meant to pass on touches anyway. Don't send to root prim
// if prim touched is the root prim as we just did it
if (((part.ScriptEvents & scriptEvents.touch_start) == 0) ||
(part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
{
if (ent is SceneObjectGroup)
{
SceneObjectGroup obj = ent as SceneObjectGroup;
if (obj != null)
{
// Is this prim part of the group
if (obj.HasChildPrim(localID))
{
// Currently only grab/touch for the single prim
// the client handles rez correctly
obj.ObjectGrabHandler(localID, offsetPos, remoteClient);
SceneObjectPart part = obj.GetChildPart(localID);
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch_start) != 0)
EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
// Deliver to the root prim if the touched prim doesn't handle touches
// or if we're meant to pass on touches anyway. Don't send to root prim
// if prim touched is the root prim as we just did it
if (((part.ScriptEvents & scriptEvents.touch_start) == 0) ||
(part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
{
EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg);
}
return;
}
}
}
EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg);
}
}
public virtual void ProcessObjectGrabUpdate(UUID objectID, Vector3 offset, Vector3 pos, IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs)
public virtual void ProcessObjectGrabUpdate(
UUID objectID, Vector3 offset, Vector3 pos, IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs)
{
EntityBase[] EntityList = GetEntities();
SceneObjectPart part = GetSceneObjectPart(objectID);
if (part == null)
return;
SceneObjectGroup obj = part.ParentGroup;
SurfaceTouchEventArgs surfaceArg = null;
if (surfaceArgs != null && surfaceArgs.Count > 0)
surfaceArg = surfaceArgs[0];
foreach (EntityBase ent in EntityList)
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch) != 0)
EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
// Deliver to the root prim if the touched prim doesn't handle touches
// or if we're meant to pass on touches anyway. Don't send to root prim
// if prim touched is the root prim as we just did it
if (((part.ScriptEvents & scriptEvents.touch) == 0) ||
(part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
{
if (ent is SceneObjectGroup)
{
SceneObjectGroup obj = ent as SceneObjectGroup;
if (obj != null)
{
// Is this prim part of the group
if (obj.HasChildPrim(objectID))
{
SceneObjectPart part = obj.GetChildPart(objectID);
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch) != 0)
EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
// Deliver to the root prim if the touched prim doesn't handle touches
// or if we're meant to pass on touches anyway. Don't send to root prim
// if prim touched is the root prim as we just did it
if (((part.ScriptEvents & scriptEvents.touch) == 0) ||
(part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
{
EventManager.TriggerObjectGrabbing(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg);
}
return;
}
}
}
EventManager.TriggerObjectGrabbing(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg);
}
}
public virtual void ProcessObjectDeGrab(uint localID, IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs)
{
EntityBase[] EntityList = GetEntities();
SceneObjectPart part = GetSceneObjectPart(localID);
if (part == null)
return;
SceneObjectGroup obj = part.ParentGroup;
SurfaceTouchEventArgs surfaceArg = null;
if (surfaceArgs != null && surfaceArgs.Count > 0)
surfaceArg = surfaceArgs[0];
foreach (EntityBase ent in EntityList)
{
if (ent is SceneObjectGroup)
{
SceneObjectGroup obj = ent as SceneObjectGroup;
// Is this prim part of the group
if (obj.HasChildPrim(localID))
{
SceneObjectPart part=obj.GetChildPart(localID);
if (part != null)
{
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch_end) != 0)
EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg);
else
EventManager.TriggerObjectDeGrab(obj.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg);
return;
}
return;
}
}
}
// If the touched prim handles touches, deliver it
// If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch_end) != 0)
EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg);
else
EventManager.TriggerObjectDeGrab(obj.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg);
}
public void ProcessAvatarPickerRequest(IClientAPI client, UUID avatarID, UUID RequestID, string query)

View File

@ -2636,7 +2636,7 @@ namespace OpenSim.Region.Framework.Scenes
if (sp == null)
{
m_log.DebugFormat(
"[SCENE]: Adding new child scene presence {0} to scene {1}", client.Name, RegionInfo.RegionName);
"[SCENE]: Adding new child scene presence {0} to scene {1} at pos {2}", client.Name, RegionInfo.RegionName, client.StartPos);
m_clientManager.Add(client);
SubscribeToClientEvents(client);
@ -2900,7 +2900,6 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void SubscribeToClientParcelEvents(IClientAPI client)
{
client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate;
client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel;
client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
client.OnParcelBuy += ProcessParcelBuy;
@ -3027,7 +3026,6 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void UnSubscribeToClientParcelEvents(IClientAPI client)
{
client.OnObjectGroupRequest -= m_sceneGraph.HandleObjectGroupUpdate;
client.OnParcelReturnObjectsRequest -= LandChannel.ReturnObjectsInParcel;
client.OnParcelSetOtherCleanTime -= LandChannel.SetParcelOtherCleanTime;
client.OnParcelBuy -= ProcessParcelBuy;
@ -3386,9 +3384,9 @@ namespace OpenSim.Region.Framework.Scenes
// Don't disable this log message - it's too helpful
m_log.DebugFormat(
"[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})",
"[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6}, position {7})",
RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
agent.AgentID, agent.circuitcode, teleportFlags);
agent.AgentID, agent.circuitcode, teleportFlags, agent.startpos);
if (LoginsDisabled)
{
@ -3434,7 +3432,7 @@ namespace OpenSim.Region.Framework.Scenes
catch (Exception e)
{
m_log.ErrorFormat(
"[CONNECTION BEGIN]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
"[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
return false;
}
}
@ -3452,12 +3450,12 @@ namespace OpenSim.Region.Framework.Scenes
catch (Exception e)
{
m_log.ErrorFormat(
"[CONNECTION BEGIN]: Exception authorizing user {0}{1}", e.Message, e.StackTrace);
"[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace);
return false;
}
m_log.InfoFormat(
"[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
"[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
agent.AgentID, agent.circuitcode);

View File

@ -640,20 +640,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
protected internal void HandleObjectGroupUpdate(
IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage)
{
if (!remoteClient.IsGroupMember(GroupID))
return;
SceneObjectGroup group = GetGroupByPrim(objectLocalID);
if (group != null)
{
if (group.OwnerID == remoteClient.AgentId)
group.SetGroup(GroupID, remoteClient);
}
}
protected internal ScenePresence CreateAndAddChildScenePresence(
IClientAPI client, AvatarAppearance appearance, PresenceType type)
{

View File

@ -1724,19 +1724,23 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
// Send the parts of this SOG to a single client
// Used when the client initially connects and when client sends RequestPrim packet
/// <summary>
/// Send the parts of this SOG to a single client
/// </summary>
/// <remarks>
/// Used when the client initially connects and when client sends RequestPrim packet
/// </remarks>
/// <param name="remoteClient"></param>
public void SendFullUpdateToClient(IClientAPI remoteClient)
{
RootPart.SendFullUpdate(
remoteClient, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, RootPart.UUID));
RootPart.SendFullUpdate(remoteClient);
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (part != RootPart)
part.SendFullUpdate(remoteClient, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, part.UUID));
part.SendFullUpdate(remoteClient);
}
}
@ -2067,10 +2071,11 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Reset the UUIDs for all the prims that make up this group.
///
/// </summary>
/// <remarks>
/// This is called by methods which want to add a new group to an existing scene, in order
/// to ensure that there are no clashes with groups already present.
/// </summary>
/// </remarks>
public void ResetIDs()
{
lock (m_parts.SyncRoot)
@ -3636,6 +3641,8 @@ namespace OpenSim.Region.Framework.Scenes
part.Inventory.ChangeInventoryGroup(GroupID);
}
HasGroupChanged = true;
// Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
// for the same object with very different properties. The caller must schedule the update.
//ScheduleGroupForFullUpdate();

View File

@ -2886,8 +2886,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Send a full update to the client for the given part
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="clientFlags"></param>
protected internal void SendFullUpdate(IClientAPI remoteClient, uint clientFlags)
protected internal void SendFullUpdate(IClientAPI remoteClient)
{
if (ParentGroup == null)
return;
@ -2899,16 +2898,16 @@ namespace OpenSim.Region.Framework.Scenes
{
if (ParentGroup.IsAttachment)
{
SendFullUpdateToClient(remoteClient, AttachedPos, clientFlags);
SendFullUpdateToClient(remoteClient, AttachedPos);
}
else
{
SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags);
SendFullUpdateToClient(remoteClient, AbsolutePosition);
}
}
else
{
SendFullUpdateToClient(remoteClient, clientFlags);
SendFullUpdateToClient(remoteClient);
}
}
@ -2922,7 +2921,7 @@ namespace OpenSim.Region.Framework.Scenes
ParentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
{
SendFullUpdate(avatar.ControllingClient, avatar.GenerateClientFlags(UUID));
SendFullUpdate(avatar.ControllingClient);
});
}
@ -2930,12 +2929,9 @@ namespace OpenSim.Region.Framework.Scenes
/// Sends a full update to the client
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="clientFlags"></param>
public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientflags)
public void SendFullUpdateToClient(IClientAPI remoteClient)
{
Vector3 lPos;
lPos = OffsetPosition;
SendFullUpdateToClient(remoteClient, lPos, clientflags);
SendFullUpdateToClient(remoteClient, OffsetPosition);
}
/// <summary>
@ -2943,8 +2939,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="lPos"></param>
/// <param name="clientFlags"></param>
public void SendFullUpdateToClient(IClientAPI remoteClient, Vector3 lPos, uint clientFlags)
public void SendFullUpdateToClient(IClientAPI remoteClient, Vector3 lPos)
{
if (ParentGroup == null)
return;
@ -2961,15 +2956,10 @@ namespace OpenSim.Region.Framework.Scenes
(ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38))
return;
clientFlags &= ~(uint) PrimFlags.CreateSelected;
if (remoteClient.AgentId == OwnerID)
{
if ((Flags & PrimFlags.CreateSelected) != 0)
{
clientFlags |= (uint) PrimFlags.CreateSelected;
Flags &= ~PrimFlags.CreateSelected;
}
}
//bool isattachment = IsAttachment;
//if (LocalId != ParentGroup.RootPart.LocalId)
@ -3403,6 +3393,11 @@ namespace OpenSim.Region.Framework.Scenes
public void SetGroup(UUID groupID, IClientAPI client)
{
// Scene.AddNewPrims() calls with client == null so can't use this.
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Setting group for {0} to {1} for {2}",
// Name, groupID, OwnerID);
GroupID = groupID;
if (client != null)
SendPropertiesToClient(client);

View File

@ -289,16 +289,10 @@ namespace OpenSim.Region.Framework.Scenes
#region Properties
protected PhysicsActor m_physicsActor;
/// <summary>
/// Physical scene representation of this Avatar.
/// </summary>
public PhysicsActor PhysicsActor
{
set { m_physicsActor = value; }
get { return m_physicsActor; }
}
public PhysicsActor PhysicsActor { get; private set; }
private byte m_movementflag;
@ -512,9 +506,9 @@ namespace OpenSim.Region.Framework.Scenes
{
m_pos = PhysicsActor.Position;
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Set position {0} for {1} in {2} via getting AbsolutePosition!",
// m_pos, Name, Scene.RegionInfo.RegionName);
//m_log.DebugFormat(
// "[SCENE PRESENCE]: Set position {0} for {1} in {2} via getting AbsolutePosition!",
// m_pos, Name, Scene.RegionInfo.RegionName);
}
else
{
@ -544,7 +538,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
return m_pos;
}
set
@ -568,9 +561,9 @@ namespace OpenSim.Region.Framework.Scenes
ParentPosition = Vector3.Zero;
}
// m_log.DebugFormat(
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
// Scene.RegionInfo.RegionName, Name, m_pos);
//m_log.DebugFormat(
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
// Scene.RegionInfo.RegionName, Name, m_pos);
}
}
@ -806,7 +799,6 @@ namespace OpenSim.Region.Framework.Scenes
public void RegisterToEvents()
{
ControllingClient.OnCompleteMovementToRegion += CompleteMovement;
//ControllingClient.OnCompleteMovementToRegion += SendInitialData;
ControllingClient.OnAgentUpdate += HandleAgentUpdate;
ControllingClient.OnAgentRequestSit += HandleAgentRequestSit;
ControllingClient.OnAgentSit += HandleAgentSit;
@ -854,11 +846,6 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
public uint GenerateClientFlags(UUID ObjectID)
{
return m_scene.Permissions.GenerateClientFlags(m_uuid, ObjectID);
}
#region Status Methods
/// <summary>
@ -1049,18 +1036,19 @@ namespace OpenSim.Region.Framework.Scenes
{
if (PhysicsActor != null)
{
try
{
PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
PhysicsActor.OnOutOfBounds -= OutOfBoundsCall;
m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
PhysicsActor.UnSubscribeEvents();
PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
PhysicsActor = null;
}
catch
{ }
// PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
PhysicsActor.OnOutOfBounds -= OutOfBoundsCall;
m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
PhysicsActor.UnSubscribeEvents();
PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
PhysicsActor = null;
}
// else
// {
// m_log.ErrorFormat(
// "[SCENE PRESENCE]: Attempt to remove physics actor for {0} on {1} but this scene presence has no physics actor",
// Name, Scene.RegionInfo.RegionName);
// }
}
/// <summary>
@ -1173,13 +1161,11 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Sets avatar height in the physics plugin
/// </summary>
/// <param name="height">New height of avatar</param>
public void SetHeight(float height)
{
if (PhysicsActor != null && !IsChildAgent)
{
Vector3 SetSize = new Vector3(0.45f, 0.6f, height);
PhysicsActor.Size = SetSize;
}
PhysicsActor.Size = new Vector3(0.45f, 0.6f, height);
}
/// <summary>
@ -1945,7 +1931,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
if (PhysicsActor != null)
m_sitAvatarHeight = m_physicsActor.Size.Z;
m_sitAvatarHeight = PhysicsActor.Size.Z;
bool canSit = false;
pos = part.AbsolutePosition + offset;
@ -2592,7 +2578,10 @@ namespace OpenSim.Region.Framework.Scenes
// only send update from root agents to other clients; children are only "listening posts"
if (IsChildAgent)
{
m_log.Warn("[SCENE PRESENCE]: Attempt to send avatar data from a child agent");
m_log.WarnFormat(
"[SCENE PRESENCE]: Attempt to send avatar data from a child agent for {0} in {1}",
Name, Scene.RegionInfo.RegionName);
return;
}
@ -2650,7 +2639,10 @@ namespace OpenSim.Region.Framework.Scenes
// only send update from root agents to other clients; children are only "listening posts"
if (IsChildAgent)
{
m_log.Warn("[SCENE PRESENCE]: Attempt to send avatar data from a child agent");
m_log.WarnFormat(
"[SCENE PRESENCE]: Attempt to send avatar data from a child agent for {0} in {1}",
Name, Scene.RegionInfo.RegionName);
return;
}
@ -3032,6 +3024,7 @@ namespace OpenSim.Region.Framework.Scenes
CopyFrom(cAgentData);
}
private static Vector3 marker = new Vector3(-1f, -1f, -1f);
/// <summary>
/// This updates important decision making data about a child agent
/// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
@ -3053,7 +3046,7 @@ namespace OpenSim.Region.Framework.Scenes
// DrawDistance = cAgentData.Far;
DrawDistance = Scene.DefaultDrawDistance;
if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
if (cAgentData.Position != marker) // UGH!!
m_pos = cAgentData.Position + offset;
if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
@ -3064,8 +3057,6 @@ namespace OpenSim.Region.Framework.Scenes
CameraPosition = cAgentData.Center + offset;
//SetHeight(cAgentData.AVHeight);
if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0)
ControllingClient.SetChildAgentThrottle(cAgentData.Throttles);
@ -3274,6 +3265,13 @@ namespace OpenSim.Region.Framework.Scenes
// "[SCENE PRESENCE]: Adding physics actor for {0}, ifFlying = {1} in {2}",
// Name, isFlying, Scene.RegionInfo.RegionName);
if (PhysicsActor != null)
{
m_log.ErrorFormat(
"[SCENE PRESENCE]: Adding physics actor for {0} to {1} but this scene presence already has a physics actor",
Name, Scene.RegionInfo.RegionName);
}
if (Appearance.AvatarHeight == 0)
Appearance.SetHeight();
@ -3281,18 +3279,15 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 pVec = AbsolutePosition;
// Old bug where the height was in centimeters instead of meters
PhysicsActor = scene.AddAvatar(LocalId, Firstname + "." + Lastname, pVec,
new Vector3(0f, 0f, Appearance.AvatarHeight), isFlying);
PhysicsActor = scene.AddAvatar(
LocalId, Firstname + "." + Lastname, pVec,
new Vector3(0f, 0f, Appearance.AvatarHeight), isFlying);
scene.AddPhysicsActorTaint(PhysicsActor);
//PhysicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
PhysicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
PhysicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
PhysicsActor.SubscribeEvents(500);
PhysicsActor.LocalID = LocalId;
SetHeight(Appearance.AvatarHeight);
}
private void OutOfBoundsCall(Vector3 pos)

View File

@ -29,25 +29,18 @@ using System;
using System.Collections.Generic;
using System.Reflection;
using System.Timers;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
using OpenSim.Framework.Communications;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
{
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
@ -90,7 +83,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
// Configuration settings
private bool m_groupsEnabled = false;
private bool m_groupNoticesEnabled = true;
private bool m_debugEnabled = true;
private bool m_debugEnabled = false;
#region IRegionModuleBase Members
@ -225,6 +218,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest;
client.OnObjectGroupRequest += HandleObjectGroupUpdate;
client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest;
client.OnDirFindQuery += OnDirFindQuery;
client.OnRequestAvatarProperties += OnRequestAvatarProperties;
@ -232,7 +226,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
// Used for Notices and Group Invites/Accept/Reject
client.OnInstantMessage += OnInstantMessage;
// Send client thier groups information.
// Send client their groups information.
SendAgentGroupDataUpdate(client, client.AgentId);
}
@ -335,6 +329,35 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
remoteClient.SendGroupNameReply(GroupID, GroupName);
}
private void HandleObjectGroupUpdate(
IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage)
{
// XXX: Might be better to get rid of this special casing and have GetMembershipData return something
// reasonable for a UUID.Zero group.
if (GroupID != UUID.Zero)
{
GroupMembershipData gmd = GetMembershipData(GroupID, remoteClient.AgentId);
if (gmd == null)
{
// m_log.WarnFormat(
// "[GROUPS]: User {0} is not a member of group {1} so they can't update {2} to this group",
// remoteClient.Name, GroupID, objectLocalID);
return;
}
}
SceneObjectGroup so = ((Scene)remoteClient.Scene).GetGroupByPrim(objectLocalID);
if (so != null)
{
if (so.OwnerID == remoteClient.AgentId)
{
so.SetGroup(GroupID, remoteClient);
}
}
}
private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
{
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);

View File

@ -52,6 +52,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool m_debugEnabled = false;
public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome |
GroupPowers.Accountable |
GroupPowers.JoinChat |
@ -81,7 +83,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
private Dictionary<UUID, List<UUID>> m_groupsAgentsDroppedFromChatSession = new Dictionary<UUID, List<UUID>>();
private Dictionary<UUID, List<UUID>> m_groupsAgentsInvitedToChatSession = new Dictionary<UUID, List<UUID>>();
#region IRegionModuleBase Members
public string Name
@ -115,7 +116,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
return;
}
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Initializing {0}", this.Name);
m_log.DebugFormat("[XMLRPC-GROUPS-CONNECTOR]: Initializing {0}", this.Name);
m_groupsServerURI = groupsConfig.GetString("GroupsServerURI", string.Empty);
if ((m_groupsServerURI == null) ||
@ -142,6 +143,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout);
}
m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false);
// If we got all the config options we need, lets start'er'up
m_memoryCache = new ExpiringCache<string, XmlRpcResponse>();
m_connectorEnabled = true;
@ -150,7 +153,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
public void Close()
{
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Closing {0}", this.Name);
m_log.DebugFormat("[XMLRPC-GROUPS-CONNECTOR]: Closing {0}", this.Name);
}
public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
@ -958,6 +961,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
if (resp == null)
{
if (m_debugEnabled)
m_log.DebugFormat("[XMLRPC-GROUPS-CONNECTOR]: Cache miss for key {0}", CacheKey);
string UserService;
UUID SessionID;
GetClientGroupRequestID(requestingAgentID, out UserService, out SessionID);

View File

@ -44,8 +44,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
private bool flying;
private bool iscolliding;
public BasicActor()
public BasicActor(Vector3 size)
{
Size = size;
}
public override int PhysicsActorType

View File

@ -56,7 +56,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
}
public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
{
BasicActor act = new BasicActor();
BasicActor act = new BasicActor(size);
act.Position = position;
act.Flying = isFlying;
_actors.Add(act);

View File

@ -137,7 +137,7 @@ namespace OpenSim.Region.Physics.OdePlugin
internal IntPtr Body = IntPtr.Zero;
private OdeScene _parent_scene;
internal IntPtr Shell = IntPtr.Zero;
internal IntPtr Amotor = IntPtr.Zero;
private IntPtr Amotor = IntPtr.Zero;
private d.Mass ShellMass;
private int m_eventsubscription = 0;
@ -195,13 +195,10 @@ namespace OpenSim.Region.Physics.OdePlugin
// new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f,
// 0.5f);
for (int i = 0; i < 11; i++)
{
m_colliderarr[i] = false;
}
CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
//m_log.Info("[ODE CHARACTER]: " + CAPSULE_LENGTH.ToString());
m_tainted_CAPSULE_LENGTH = CAPSULE_LENGTH;
// We can set taint and actual to be the same here, since the entire character will be set up when the
// m_tainted_isPhysical is processed.
SetTaintedCapsuleLength(size);
CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
m_isPhysical = false; // current status: no ODE information exists
m_tainted_isPhysical = true; // new tainted status: need to create ODE information
@ -457,24 +454,28 @@ namespace OpenSim.Region.Physics.OdePlugin
get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); }
set
{
if (value.IsFinite())
{
m_pidControllerActive = true;
Vector3 SetSize = value;
m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
// m_log.Info("[ODE CHARACTER]: " + CAPSULE_LENGTH);
SetTaintedCapsuleLength(value);
// If we reset velocity here, then an avatar stalls when it crosses a border for the first time
// (as the height of the new root agent is set).
// Velocity = Vector3.Zero;
_parent_scene.AddPhysicsActorTaint(this);
}
else
{
m_log.WarnFormat("[ODE CHARACTER]: Got a NaN Size from Scene on {0}", Name);
}
_parent_scene.AddPhysicsActorTaint(this);
}
}
private void SetTaintedCapsuleLength(Vector3 size)
{
if (size.IsFinite())
{
m_pidControllerActive = true;
m_tainted_CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
// m_log.Info("[ODE CHARACTER]: " + CAPSULE_LENGTH);
}
else
{
m_log.WarnFormat("[ODE CHARACTER]: Got a NaN Size for {0} in {1}", Name, _parent_scene.Name);
}
}
@ -549,8 +550,8 @@ namespace OpenSim.Region.Physics.OdePlugin
{
get
{
float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH);
return m_density*AVvolume;
float AVvolume = (float)(Math.PI * Math.Pow(CAPSULE_RADIUS, 2) * CAPSULE_LENGTH);
return m_density * AVvolume;
}
}

View File

@ -1699,7 +1699,10 @@ namespace OpenSim.Region.Physics.OdePlugin
public override void RemoveAvatar(PhysicsActor actor)
{
//m_log.Debug("[PHYSICS]:ODELOCK");
// m_log.DebugFormat(
// "[ODE SCENE]: Removing physics character {0} {1} from physics scene {2}",
// actor.Name, actor.LocalID, Name);
((OdeCharacter) actor).Destroy();
}
@ -1709,6 +1712,10 @@ namespace OpenSim.Region.Physics.OdePlugin
{
_characters.Add(chr);
// m_log.DebugFormat(
// "[ODE SCENE]: Adding physics character {0} {1} to physics scene {2}. Count now {3}",
// chr.Name, chr.LocalID, Name, _characters.Count);
if (chr.bad)
m_log.ErrorFormat("[ODE SCENE]: Added BAD actor {0} to characters list", chr.m_uuid);
}
@ -1723,11 +1730,19 @@ namespace OpenSim.Region.Physics.OdePlugin
internal void RemoveCharacter(OdeCharacter chr)
{
if (_characters.Contains(chr))
{
_characters.Remove(chr);
// m_log.DebugFormat(
// "[ODE SCENE]: Removing physics character {0} {1} from physics scene {2}. Count now {3}",
// chr.Name, chr.LocalID, Name, _characters.Count);
}
else
{
m_log.ErrorFormat(
"[ODE SCENE]: Tried to remove character {0} {1} but they are not in the list!",
chr.Name, chr.LocalID);
}
}
private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation,
@ -1765,7 +1780,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
Vector3 size, Quaternion rotation, bool isPhysical, uint localid)
{
// m_log.DebugFormat("[ODE SCENE]: Adding physics actor to {0} {1}", primName, localid);
// m_log.DebugFormat("[ODE SCENE]: Adding physics prim {0} {1} to physics scene {2}", primName, localid, Name);
return AddPrim(primName, position, size, rotation, pbs, isPhysical, localid);
}
@ -2755,6 +2770,10 @@ namespace OpenSim.Region.Physics.OdePlugin
{
foreach (OdeCharacter actor in defects)
{
m_log.ErrorFormat(
"[ODE SCENE]: Removing physics character {0} {1} from physics scene {2} due to defect found when moving",
actor.Name, actor.LocalID, Name);
RemoveCharacter(actor);
actor.DestroyOdeStructures();
}
@ -2825,6 +2844,10 @@ namespace OpenSim.Region.Physics.OdePlugin
{
foreach (OdeCharacter actor in defects)
{
m_log.ErrorFormat(
"[ODE SCENE]: Removing physics character {0} {1} from physics scene {2} due to defect found when updating position and velocity",
actor.Name, actor.LocalID, Name);
RemoveCharacter(actor);
actor.DestroyOdeStructures();
}

View File

@ -333,7 +333,7 @@ namespace OpenSim.Region.RegionCombinerModule
//xxy
//xxx
//xxx
if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd
if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd
>= (regionConnections.X * (int)Constants.RegionSize))
&& (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd
>= (regionConnections.Y * (int)Constants.RegionSize)))

View File

@ -259,6 +259,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
}
[Obsolete]
public XmlRpcResponse GetOnlineFriends(XmlRpcRequest request, IPEndPoint remoteClient)
{
Hashtable hash = new Hashtable();

View File

@ -484,6 +484,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
return friendsOnline;
}
[Obsolete]
public List<UUID> GetOnlineFriends(UUID userID, List<string> friends)
{
Hashtable hash = new Hashtable();

View File

@ -13,7 +13,10 @@
; Change the connection string to your db details
;StorageProvider = "OpenSim.Data.MySQL.dll"
;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;"
; Uncomment this line if you are using MySQL and want to use a different database for estates
; Uncomment this line if you are using MySQL and want to use a different database for estates.
; The usual application for this is to allow estates to be spread out across multiple simulators by share the same database.
; Most people won't need to do this so only uncomment if you know what you're doing.
;EstateConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;"
; MSSQL