Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
ecf9824b63
|
@ -240,78 +240,84 @@ namespace OpenSim.Capabilities.Handlers
|
|||
|
||||
if (containingFolder != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Retrieved folder {0} {1} for agent id {2}",
|
||||
// containingFolder.Name, containingFolder.ID, agentID);
|
||||
|
||||
version = containingFolder.Version;
|
||||
|
||||
if (fetchItems)
|
||||
{
|
||||
/*
|
||||
List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>();
|
||||
|
||||
foreach (InventoryItemBase item in contents.Items)
|
||||
{
|
||||
if (item.AssetType == (int)AssetType.Link)
|
||||
{
|
||||
InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
|
||||
// Take care of genuinely broken links where the target doesn't exist
|
||||
// HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// rather than having to keep track of every folder requested in the recursion.
|
||||
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link && linkedItem.AssetType == (int)AssetType.Object)
|
||||
linkedItemsToAdd.Add(linkedItem);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
|
||||
linkedItem.Name, folderID, agentID);
|
||||
|
||||
contents.Items.Insert(0, linkedItem);
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||
// will be broken in the viewer.
|
||||
HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
|
||||
foreach (InventoryItemBase item in contents.Items)
|
||||
{
|
||||
if (item.AssetType == (int)AssetType.Link)
|
||||
{
|
||||
InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
|
||||
// Take care of genuinely broken links where the target doesn't exist
|
||||
// HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// rather than having to keep track of every folder requested in the recursion.
|
||||
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
{
|
||||
// We don't need to send the folder if source and destination of the link are in the same
|
||||
// folder.
|
||||
if (linkedItem.Folder != containingFolder.ID)
|
||||
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
|
||||
linkedItemFolderId, folderID, agentID);
|
||||
|
||||
int dummyVersion;
|
||||
InventoryCollection linkedCollection
|
||||
= Fetch(
|
||||
agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
|
||||
|
||||
contents.Folders.AddRange(linkedCollection.Folders);
|
||||
contents.Items.AddRange(linkedCollection.Items);
|
||||
}
|
||||
*/
|
||||
}
|
||||
//
|
||||
// if (fetchItems)
|
||||
// {
|
||||
// List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>();
|
||||
//
|
||||
// foreach (InventoryItemBase item in contents.Items)
|
||||
// {
|
||||
// if (item.AssetType == (int)AssetType.Link)
|
||||
// {
|
||||
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
//
|
||||
// // Take care of genuinely broken links where the target doesn't exist
|
||||
// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// // rather than having to keep track of every folder requested in the recursion.
|
||||
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
// linkedItemsToAdd.Insert(0, linkedItem);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
|
||||
// linkedItem.Name, folderID, agentID);
|
||||
//
|
||||
// contents.Items.Add(linkedItem);
|
||||
// }
|
||||
//
|
||||
// // If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||
// // will be broken in the viewer.
|
||||
// HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
|
||||
// foreach (InventoryItemBase item in contents.Items)
|
||||
// {
|
||||
// if (item.AssetType == (int)AssetType.Link)
|
||||
// {
|
||||
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
//
|
||||
// // Take care of genuinely broken links where the target doesn't exist
|
||||
// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// // rather than having to keep track of every folder requested in the recursion.
|
||||
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
// {
|
||||
// // We don't need to send the folder if source and destination of the link are in the same
|
||||
// // folder.
|
||||
// if (linkedItem.Folder != containingFolder.ID)
|
||||
// linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
|
||||
// linkedItemFolderId, folderID, agentID);
|
||||
//
|
||||
// int dummyVersion;
|
||||
// InventoryCollection linkedCollection
|
||||
// = Fetch(
|
||||
// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
|
||||
//
|
||||
// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId);
|
||||
// linkedFolder.Owner = agentID;
|
||||
// linkedFolder = m_InventoryService.GetFolder(linkedFolder);
|
||||
//
|
||||
//// contents.Folders.AddRange(linkedCollection.Folders);
|
||||
//
|
||||
// contents.Folders.Add(linkedFolder);
|
||||
// contents.Items.AddRange(linkedCollection.Items);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public interface IProfileModule
|
||||
{
|
||||
void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID);
|
||||
|
||||
}
|
||||
}
|
|
@ -56,9 +56,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
public IAssetService AssetService;
|
||||
public UUID AgentID;
|
||||
public IInventoryAccessModule InventoryAccessModule;
|
||||
public OpenJPEG.J2KLayerInfo[] Layers;
|
||||
public bool IsDecoded;
|
||||
public bool HasAsset;
|
||||
private OpenJPEG.J2KLayerInfo[] m_layers;
|
||||
public bool IsDecoded { get; private set; }
|
||||
public bool HasAsset { get; private set; }
|
||||
public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle;
|
||||
|
||||
private uint m_currentPacket;
|
||||
|
@ -170,14 +170,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
if (DiscardLevel >= 0 || m_stopPacket == 0)
|
||||
{
|
||||
// This shouldn't happen, but if it does, we really can't proceed
|
||||
if (Layers == null)
|
||||
if (m_layers == null)
|
||||
{
|
||||
m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer");
|
||||
m_currentPacket = m_stopPacket;
|
||||
return;
|
||||
}
|
||||
|
||||
int maxDiscardLevel = Math.Max(0, Layers.Length - 1);
|
||||
int maxDiscardLevel = Math.Max(0, m_layers.Length - 1);
|
||||
|
||||
// Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel
|
||||
if (DiscardLevel < 0 && m_stopPacket == 0)
|
||||
|
@ -187,9 +187,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel);
|
||||
|
||||
//Calculate the m_stopPacket
|
||||
if (Layers.Length > 0)
|
||||
if (m_layers.Length > 0)
|
||||
{
|
||||
m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End);
|
||||
m_stopPacket = (uint)GetPacketForBytePosition(m_layers[(m_layers.Length - 1) - DiscardLevel].End);
|
||||
//I don't know why, but the viewer seems to expect the final packet if the file
|
||||
//is just one packet bigger.
|
||||
if (TexturePacketCount() == m_stopPacket + 1)
|
||||
|
@ -341,7 +341,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers)
|
||||
{
|
||||
Layers = layers;
|
||||
m_layers = layers;
|
||||
IsDecoded = true;
|
||||
RunUpdate();
|
||||
}
|
||||
|
@ -385,8 +385,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
string assetServerURL = string.Empty;
|
||||
if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL))
|
||||
{
|
||||
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id);
|
||||
AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived);
|
||||
if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("="))
|
||||
assetServerURL = assetServerURL + "/";
|
||||
|
||||
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id);
|
||||
AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,9 @@ using log4net;
|
|||
|
||||
namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
/// <summary>
|
||||
/// This class handles UDP texture requests.
|
||||
/// </summary>
|
||||
public class LLImageManager
|
||||
{
|
||||
private sealed class J2KImageComparer : IComparer<J2KImage>
|
||||
|
@ -208,7 +211,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
#region Priority Queue Helpers
|
||||
|
||||
J2KImage GetHighestPriorityImage()
|
||||
private J2KImage GetHighestPriorityImage()
|
||||
{
|
||||
J2KImage image = null;
|
||||
|
||||
|
@ -223,23 +226,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
return image;
|
||||
}
|
||||
|
||||
void AddImageToQueue(J2KImage image)
|
||||
private void AddImageToQueue(J2KImage image)
|
||||
{
|
||||
image.PriorityQueueHandle = null;
|
||||
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); }
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveImageFromQueue(J2KImage image)
|
||||
private void RemoveImageFromQueue(J2KImage image)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
try { m_priorityQueue.Delete(image.PriorityQueueHandle); }
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateImageInQueue(J2KImage image)
|
||||
private void UpdateImageInQueue(J2KImage image)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
|
|
|
@ -152,6 +152,9 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
|||
/// <param name="j2kData">JPEG2000 data</param>
|
||||
private void DoJ2KDecode(UUID assetID, byte[] j2kData)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID);
|
||||
|
||||
//int DecodeTime = 0;
|
||||
//DecodeTime = Environment.TickCount;
|
||||
OpenJPEG.J2KLayerInfo[] layers;
|
||||
|
|
|
@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
IUserManagement m_uMan;
|
||||
IUserManagement UserManagementModule
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_uMan == null)
|
||||
m_uMan = m_Scenes[0].RequestModuleInterface<IUserManagement>();
|
||||
return m_uMan;
|
||||
}
|
||||
}
|
||||
|
||||
#region ISharedRegionModule
|
||||
public override string Name
|
||||
{
|
||||
|
@ -369,9 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
protected override FriendInfo[] GetFriendsFromService(IClientAPI client)
|
||||
{
|
||||
// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name);
|
||||
Boolean agentIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId);
|
||||
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, client.AgentId);
|
||||
if (account1 != null)
|
||||
if (agentIsLocal)
|
||||
return base.GetFriendsFromService(client);
|
||||
|
||||
FriendInfo[] finfos = new FriendInfo[0];
|
||||
|
@ -392,16 +405,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
|
||||
protected override bool StoreRights(UUID agentID, UUID friendID, int rights)
|
||||
{
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (account1 != null && account2 != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
return base.StoreRights(agentID, friendID, rights);
|
||||
}
|
||||
|
||||
if (account1 != null) // agent is local, friend is foreigner
|
||||
if (agentIsLocal) // agent is local, friend is foreigner
|
||||
{
|
||||
FriendInfo[] finfos = GetFriends(agentID);
|
||||
FriendInfo finfo = GetFriend(finfos, friendID);
|
||||
|
@ -412,7 +431,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
}
|
||||
}
|
||||
|
||||
if (account2 != null) // agent is foreigner, friend is local
|
||||
if (friendIsLocal) // agent is foreigner, friend is local
|
||||
{
|
||||
string agentUUI = GetUUI(friendID, agentID);
|
||||
if (agentUUI != string.Empty)
|
||||
|
@ -427,10 +446,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
|
||||
protected override void StoreBackwards(UUID friendID, UUID agentID)
|
||||
{
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (account1 != null && account2 != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
||||
|
@ -444,10 +469,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
|
||||
protected override void StoreFriendships(UUID agentID, UUID friendID)
|
||||
{
|
||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (agentAccount != null && friendAccount != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
||||
|
@ -465,13 +496,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
string agentFriendService = string.Empty;
|
||||
string friendFriendService = string.Empty;
|
||||
|
||||
if (agentClient != null)
|
||||
if (agentIsLocal)
|
||||
{
|
||||
agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode);
|
||||
agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit);
|
||||
agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString();
|
||||
}
|
||||
if (friendClient != null)
|
||||
if (friendIsLocal)
|
||||
{
|
||||
friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode);
|
||||
friendUUI = Util.ProduceUserUniversalIdentifier(friendClientCircuit);
|
||||
|
@ -484,7 +515,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
// Generate a random 8-character hex number that will sign this friendship
|
||||
string secret = UUID.Random().ToString().Substring(0, 8);
|
||||
|
||||
if (agentAccount != null) // agent is local, 'friend' is foreigner
|
||||
if (agentIsLocal) // agent is local, 'friend' is foreigner
|
||||
{
|
||||
// This may happen when the agent returned home, in which case the friend is not there
|
||||
// We need to look for its information in the friends list itself
|
||||
|
@ -520,7 +551,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
friendsConn.NewFriendship(friendID, agentUUI + ";" + secret);
|
||||
}
|
||||
}
|
||||
else if (friendAccount != null) // 'friend' is local, agent is foreigner
|
||||
else if (friendIsLocal) // 'friend' is local, agent is foreigner
|
||||
{
|
||||
// store in the local friends service a reference to the foreign agent
|
||||
FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1);
|
||||
|
@ -553,10 +584,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
|
||||
protected override bool DeleteFriendship(UUID agentID, UUID exfriendID)
|
||||
{
|
||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, exfriendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(exfriendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (agentAccount != null && friendAccount != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
return base.DeleteFriendship(agentID, exfriendID);
|
||||
|
@ -566,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
string agentUUI = string.Empty;
|
||||
string friendUUI = string.Empty;
|
||||
|
||||
if (agentAccount != null) // agent is local, 'friend' is foreigner
|
||||
if (agentIsLocal) // agent is local, 'friend' is foreigner
|
||||
{
|
||||
// We need to look for its information in the friends list itself
|
||||
FriendInfo[] finfos = GetFriends(agentID);
|
||||
|
@ -587,7 +624,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
return true;
|
||||
}
|
||||
}
|
||||
else if (friendAccount != null) // agent is foreigner, 'friend' is local
|
||||
else if (friendIsLocal) // agent is foreigner, 'friend' is local
|
||||
{
|
||||
agentUUI = GetUUI(exfriendID, agentID);
|
||||
|
||||
|
|
|
@ -180,10 +180,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
|
||||
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
|
||||
// Is the user a local user?
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID);
|
||||
string url = string.Empty;
|
||||
bool foreigner = false;
|
||||
if (account == null) // foreign user
|
||||
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(toAgentID)) // foreign user
|
||||
{
|
||||
url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI");
|
||||
foreigner = true;
|
||||
|
|
|
@ -43,7 +43,7 @@ using OpenSim.Services.Interfaces;
|
|||
namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||
{
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class BasicProfileModule : ISharedRegionModule
|
||||
public class BasicProfileModule : IProfileModule, ISharedRegionModule
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
|
@ -57,6 +57,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
|||
|
||||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
// This can be reduced later as the loader will determine
|
||||
// whether we are needed
|
||||
if (config.Configs["Profile"] != null)
|
||||
{
|
||||
if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule")
|
||||
|
@ -65,7 +67,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
|||
|
||||
m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled");
|
||||
m_Enabled = true;
|
||||
|
||||
}
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
|
@ -80,6 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
|||
m_Scenes.Add(scene);
|
||||
// Hook up events
|
||||
scene.EventManager.OnNewClient += OnNewClient;
|
||||
scene.RegisterModuleInterface<IProfileModule>(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -116,7 +118,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
|||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
get { return null; }
|
||||
get { return typeof(IProfileModule); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -676,9 +676,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
Vector3 eastCross = new Vector3(boundaryDistance, 0, 0);
|
||||
Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0);
|
||||
|
||||
// distance to edge that will trigger crossing
|
||||
|
||||
|
||||
// distance into new region to place avatar
|
||||
const float enterDistance = 0.5f;
|
||||
|
||||
|
@ -961,28 +958,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
"[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.",
|
||||
agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName);
|
||||
|
||||
pos = pos + (agent.Velocity);
|
||||
pos = pos + agent.Velocity;
|
||||
Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0);
|
||||
|
||||
agent.RemoveFromPhysicalScene();
|
||||
SetInTransit(agent.UUID);
|
||||
|
||||
AgentData cAgent = new AgentData();
|
||||
agent.CopyTo(cAgent);
|
||||
cAgent.Position = pos;
|
||||
if (isFlying)
|
||||
cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
|
||||
cAgent.CallbackURI = m_scene.RegionInfo.ServerURI +
|
||||
"agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/";
|
||||
|
||||
// We don't need the callback anymnore
|
||||
cAgent.CallbackURI = String.Empty;
|
||||
|
||||
if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
|
||||
{
|
||||
// region doesn't take it
|
||||
ReInstantiateScripts(agent);
|
||||
agent.AddToPhysicalScene(isFlying);
|
||||
ResetFromTransit(agent.UUID);
|
||||
return agent;
|
||||
}
|
||||
|
||||
// Next, let's close the child agent connections that are too far away.
|
||||
agent.CloseChildAgents(neighbourx, neighboury);
|
||||
|
||||
//AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
|
||||
agent.ControllingClient.RequestClientInfo();
|
||||
|
||||
|
@ -1003,7 +1002,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
|
||||
if (eq != null)
|
||||
{
|
||||
eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
|
||||
eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint,
|
||||
capsPath, agent.UUID, agent.ControllingClient.SessionId);
|
||||
}
|
||||
else
|
||||
|
@ -1012,32 +1011,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
capsPath);
|
||||
}
|
||||
|
||||
if (!WaitForCallback(agent.UUID))
|
||||
{
|
||||
m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent");
|
||||
ReInstantiateScripts(agent);
|
||||
ResetFromTransit(agent.UUID);
|
||||
|
||||
// Yikes! We should just have a ref to scene here.
|
||||
//agent.Scene.InformClientOfNeighbours(agent);
|
||||
EnableChildAgents(agent);
|
||||
|
||||
return agent;
|
||||
}
|
||||
|
||||
// SUCCESS!
|
||||
agent.MakeChildAgent();
|
||||
ResetFromTransit(agent.UUID);
|
||||
|
||||
// now we have a child agent in this region. Request all interesting data about other (root) agents
|
||||
agent.SendOtherAgentsAvatarDataToMe();
|
||||
agent.SendOtherAgentsAppearanceToMe();
|
||||
|
||||
// Backwards compatibility
|
||||
// Backwards compatibility. Best effort
|
||||
if (version == "Unknown" || version == string.Empty)
|
||||
{
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old neighbor, passing attachments one by one...");
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
|
||||
Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
|
||||
CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
|
||||
}
|
||||
|
||||
|
||||
// Next, let's close the child agent connections that are too far away.
|
||||
agent.CloseChildAgents(neighbourx, neighboury);
|
||||
|
||||
AgentHasMovedAway(agent, false);
|
||||
|
||||
// the user may change their profile information in other region,
|
||||
|
@ -1069,16 +1062,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
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();
|
||||
//// 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("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -1712,9 +1705,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
uint x = 0, y = 0;
|
||||
Utils.LongToUInts(newRegionHandle, out x, out y);
|
||||
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||
if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
||||
|
||||
if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
||||
{
|
||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
||||
|
||||
// We are going to move the object back to the old position so long as the old position
|
||||
// is in the region
|
||||
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.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f);
|
||||
|
||||
grp.RootPart.GroupPosition = 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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -187,8 +187,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
|
||||
|
||||
// Let's find out if this is a foreign user or a local user
|
||||
UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, id);
|
||||
if (account != null)
|
||||
IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>();
|
||||
if (uMan != null && uMan.IsLocalGridUser(id))
|
||||
{
|
||||
// local grid user
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local");
|
||||
|
@ -227,8 +227,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
|
||||
GridRegion homeGatekeeper = MakeRegion(aCircuit);
|
||||
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}:{5}",
|
||||
aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName);
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}",
|
||||
aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName);
|
||||
|
||||
DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq);
|
||||
}
|
||||
|
@ -313,8 +313,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
}
|
||||
|
||||
// Let's find out if this is a foreign user or a local user
|
||||
IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>();
|
||||
UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId);
|
||||
if (account != null)
|
||||
if (uMan != null && uMan.IsLocalGridUser(obj.AgentId))
|
||||
{
|
||||
// local grid user
|
||||
return;
|
||||
|
@ -347,6 +348,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
|
||||
region.ExternalHostName = uri.Host;
|
||||
region.HttpPort = (uint)uri.Port;
|
||||
region.ServerURI = uri.ToString();
|
||||
region.RegionName = string.Empty;
|
||||
region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0);
|
||||
return region;
|
||||
|
|
|
@ -73,7 +73,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
|
||||
public AssetBase FetchAsset(string url, UUID assetID)
|
||||
{
|
||||
AssetBase asset = m_scene.AssetService.Get(url + "/" + assetID.ToString());
|
||||
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||
url = url + "/";
|
||||
|
||||
AssetBase asset = m_scene.AssetService.Get(url + assetID.ToString());
|
||||
|
||||
if (asset != null)
|
||||
{
|
||||
|
@ -87,6 +90,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
{
|
||||
if (asset != null)
|
||||
{
|
||||
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||
url = url + "/";
|
||||
|
||||
// See long comment in AssetCache.AddAsset
|
||||
if (!asset.Temporary || asset.Local)
|
||||
{
|
||||
|
@ -99,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
Copy(asset, asset1);
|
||||
try
|
||||
{
|
||||
asset1.ID = url + "/" + asset.ID;
|
||||
asset1.ID = url + asset.ID;
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
|
|
@ -124,8 +124,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
|
||||
protected override string GenerateLandmark(ScenePresence presence, out string prefix, out string suffix)
|
||||
{
|
||||
UserAccount account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, presence.UUID);
|
||||
if (account == null)
|
||||
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(presence.UUID))
|
||||
prefix = "HG ";
|
||||
else
|
||||
prefix = string.Empty;
|
||||
|
@ -210,12 +209,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
public override bool IsForeignUser(UUID userID, out string assetServerURL)
|
||||
{
|
||||
assetServerURL = string.Empty;
|
||||
UserAccount account = null;
|
||||
if (m_Scene.UserAccountService != null)
|
||||
account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID);
|
||||
|
||||
if (account == null) // foreign
|
||||
{
|
||||
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID))
|
||||
{ // foreign
|
||||
ScenePresence sp = null;
|
||||
if (m_Scene.TryGetScenePresence(userID, out sp))
|
||||
{
|
||||
|
|
|
@ -50,6 +50,9 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
|||
public string LastName { get; set; }
|
||||
public string HomeURL { get; set; }
|
||||
public Dictionary<string, object> ServerURLs { get; set; }
|
||||
public string Title { get; set; }
|
||||
public int Flags { get; set; }
|
||||
public int Created { get; set; }
|
||||
}
|
||||
|
||||
public class UserManagementModule : ISharedRegionModule, IUserManagement
|
||||
|
@ -281,6 +284,94 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
|||
return string.Empty;
|
||||
}
|
||||
|
||||
public int GetUserFlags(UUID userID)
|
||||
{
|
||||
UserData userdata;
|
||||
lock (m_UserCache)
|
||||
m_UserCache.TryGetValue(userID, out userdata);
|
||||
|
||||
if (userdata.Flags == -1)
|
||||
GetUserInfo(userID);
|
||||
|
||||
if (userdata.Flags != -1)
|
||||
return userdata.Flags;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int GetUserCreated(UUID userID)
|
||||
{
|
||||
UserData userdata;
|
||||
lock (m_UserCache)
|
||||
m_UserCache.TryGetValue(userID, out userdata);
|
||||
|
||||
if (userdata.Flags == -1)
|
||||
GetUserInfo(userID);
|
||||
|
||||
if (userdata.Created != -1)
|
||||
return userdata.Created;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public string GetUserTitle(UUID userID)
|
||||
{
|
||||
UserData userdata;
|
||||
lock (m_UserCache)
|
||||
m_UserCache.TryGetValue(userID, out userdata);
|
||||
|
||||
if (userdata.Flags == -1)
|
||||
GetUserInfo(userID);
|
||||
|
||||
if (userdata.Created != -1)
|
||||
return userdata.Title;
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// This will cache the user data
|
||||
// Change this to return bool
|
||||
private bool GetUserInfo(UUID userID)
|
||||
{
|
||||
UserData userdata;
|
||||
lock (m_UserCache)
|
||||
m_UserCache.TryGetValue(userID, out userdata);
|
||||
|
||||
if (userdata != null)
|
||||
{
|
||||
// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Requested url type {0} for {1}", serverType, userID);
|
||||
|
||||
if (userdata.Flags >= 0)
|
||||
{
|
||||
// This is already populated
|
||||
return true;
|
||||
}
|
||||
|
||||
if (userdata.HomeURL != null && userdata.HomeURL != string.Empty)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[USER MANAGEMENT MODULE]: Requesting user flags from '{0}' for {1}",
|
||||
userdata.HomeURL, userID);
|
||||
|
||||
UserAgentServiceConnector uConn = new UserAgentServiceConnector(userdata.HomeURL);
|
||||
Dictionary<string, object> info = uConn.GetUserInfo(userID);
|
||||
|
||||
// Pull our data now
|
||||
if (info["result"].ToString() == "success")
|
||||
{
|
||||
userdata.Flags = (int)info["user_flags"];
|
||||
userdata.Created = (int)info["user_created"];
|
||||
userdata.Title = (string)info["user_title"];
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public string GetUserUUI(UUID userID)
|
||||
{
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID);
|
||||
|
@ -352,6 +443,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
|||
{
|
||||
UserData user = new UserData();
|
||||
user.Id = id;
|
||||
user.Flags = -1;
|
||||
user.Created = -1;
|
||||
|
||||
if (creatorData != null && creatorData != string.Empty)
|
||||
{
|
||||
|
@ -425,6 +518,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
|||
|
||||
//}
|
||||
|
||||
public bool IsLocalGridUser(UUID uuid)
|
||||
{
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, uuid);
|
||||
if (account == null || (account != null && !account.LocalToGrid))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion IUserManagement
|
||||
|
||||
private void HandleShowUsers(string module, string[] cmd)
|
||||
|
|
|
@ -153,10 +153,18 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
|
||||
public void SendProfileToClient(IClientAPI client, RegionLightShareData wl)
|
||||
{
|
||||
if (m_enableWindlight && m_scene.RegionInfo.WindlightSettings.valid)
|
||||
if (m_enableWindlight)
|
||||
{
|
||||
List<byte[]> param = compileWindlightSettings(wl);
|
||||
client.SendGenericMessage("Windlight", param);
|
||||
if (m_scene.RegionInfo.WindlightSettings.valid)
|
||||
{
|
||||
List<byte[]> param = compileWindlightSettings(wl);
|
||||
client.SendGenericMessage("Windlight", param);
|
||||
}
|
||||
else
|
||||
{
|
||||
List<byte[]> param = new List<byte[]>();
|
||||
client.SendGenericMessage("WindlightReset", param);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -175,8 +183,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
|
||||
private void EventManager_OnSaveNewWindlightProfile()
|
||||
{
|
||||
if (m_scene.RegionInfo.WindlightSettings.valid)
|
||||
m_scene.ForEachRootClient(SendProfileToClient);
|
||||
m_scene.ForEachRootClient(SendProfileToClient);
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
|
|
|
@ -411,8 +411,21 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
|||
}
|
||||
|
||||
Request.Timeout = HttpTimeout;
|
||||
// execute the request
|
||||
response = (HttpWebResponse) Request.GetResponse();
|
||||
try
|
||||
{
|
||||
// execute the request
|
||||
response = (HttpWebResponse) Request.GetResponse();
|
||||
}
|
||||
catch (WebException e)
|
||||
{
|
||||
if (e.Status != WebExceptionStatus.ProtocolError)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
response = (HttpWebResponse)e.Response;
|
||||
}
|
||||
|
||||
Status = (int)response.StatusCode;
|
||||
|
||||
Stream resStream = response.GetResponseStream();
|
||||
|
||||
|
@ -436,17 +449,8 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError)
|
||||
{
|
||||
HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response;
|
||||
Status = (int)webRsp.StatusCode;
|
||||
ResponseBody = webRsp.StatusDescription;
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = (int)OSHttpStatusCode.ClientErrorJoker;
|
||||
ResponseBody = e.Message;
|
||||
}
|
||||
Status = (int)OSHttpStatusCode.ClientErrorJoker;
|
||||
ResponseBody = e.Message;
|
||||
|
||||
_finished = true;
|
||||
return;
|
||||
|
@ -457,7 +461,6 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
|||
response.Close();
|
||||
}
|
||||
|
||||
Status = (int)OSHttpStatusCode.SuccessOk;
|
||||
_finished = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -382,23 +382,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
|||
return result;
|
||||
}
|
||||
|
||||
#region IHyperAssetService
|
||||
|
||||
public string GetUserAssetServer(UUID userID)
|
||||
{
|
||||
UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, userID);
|
||||
|
||||
if (account != null && account.ServiceURLs.ContainsKey("AssetServerURI") && account.ServiceURLs["AssetServerURI"] != null)
|
||||
return account.ServiceURLs["AssetServerURI"].ToString();
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public string GetSimAssetServer()
|
||||
{
|
||||
return m_LocalAssetServiceURI;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -170,6 +170,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
|||
|
||||
public AssetBase GetCached(string id)
|
||||
{
|
||||
// m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Cache request for {0}", id);
|
||||
|
||||
if (m_Cache != null)
|
||||
return m_Cache.Get(id);
|
||||
|
||||
|
|
|
@ -1,223 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
{
|
||||
public abstract class BaseInventoryConnector : IInventoryService
|
||||
{
|
||||
protected static InventoryCache m_cache;
|
||||
private static bool m_Initialized;
|
||||
|
||||
protected virtual void Init(IConfigSource source)
|
||||
{
|
||||
if (!m_Initialized)
|
||||
{
|
||||
m_cache = new InventoryCache();
|
||||
m_cache.Init(source, this);
|
||||
m_Initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create the entire inventory for a given user
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <returns></returns>
|
||||
public abstract bool CreateUserInventory(UUID user);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the skeleton of the inventory -- folders only
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public abstract List<InventoryFolderBase> GetInventorySkeleton(UUID userId);
|
||||
|
||||
/// <summary>
|
||||
/// Synchronous inventory fetch.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns></returns>
|
||||
public abstract InventoryCollection GetUserInventory(UUID userID);
|
||||
|
||||
/// <summary>
|
||||
/// Request the inventory for a user. This is an asynchronous operation that will call the callback when the
|
||||
/// inventory has been received
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="callback"></param>
|
||||
public abstract void GetUserInventory(UUID userID, InventoryReceiptCallback callback);
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve the root inventory folder for the given user.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns>null if no root folder was found</returns>
|
||||
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||
{
|
||||
// Root folder is here as system type Folder.
|
||||
return m_cache.GetFolderForType(userID, AssetType.Folder);
|
||||
}
|
||||
|
||||
public abstract Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the user folder for the given folder-type
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||
{
|
||||
return m_cache.GetFolderForType(userID, type);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets everything (folders and items) inside a folder
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="folderID"></param>
|
||||
/// <returns></returns>
|
||||
public abstract InventoryCollection GetFolderContent(UUID userID, UUID folderID);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the items inside a folder
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="folderID"></param>
|
||||
/// <returns></returns>
|
||||
public abstract List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID);
|
||||
|
||||
/// <summary>
|
||||
/// Add a new folder to the user's inventory
|
||||
/// </summary>
|
||||
/// <param name="folder"></param>
|
||||
/// <returns>true if the folder was successfully added</returns>
|
||||
public abstract bool AddFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Update a folder in the user's inventory
|
||||
/// </summary>
|
||||
/// <param name="folder"></param>
|
||||
/// <returns>true if the folder was successfully updated</returns>
|
||||
public abstract bool UpdateFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Move an inventory folder to a new location
|
||||
/// </summary>
|
||||
/// <param name="folder">A folder containing the details of the new location</param>
|
||||
/// <returns>true if the folder was successfully moved</returns>
|
||||
public abstract bool MoveFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Delete a list of inventory folders (from trash)
|
||||
/// </summary>
|
||||
public abstract bool DeleteFolders(UUID ownerID, List<UUID> folderIDs);
|
||||
|
||||
/// <summary>
|
||||
/// Purge an inventory folder of all its items and subfolders.
|
||||
/// </summary>
|
||||
/// <param name="folder"></param>
|
||||
/// <returns>true if the folder was successfully purged</returns>
|
||||
public abstract bool PurgeFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Add a new item to the user's inventory.
|
||||
/// If the given item has to parent folder, it tries to find the most
|
||||
/// suitable folder for it.
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns>true if the item was successfully added</returns>
|
||||
public bool AddItem(InventoryItemBase item)
|
||||
{
|
||||
if (item == null)
|
||||
return false;
|
||||
|
||||
if (item.Folder == UUID.Zero)
|
||||
{
|
||||
InventoryFolderBase f = GetFolderForType(item.Owner, (AssetType)item.AssetType);
|
||||
if (f != null)
|
||||
item.Folder = f.ID;
|
||||
else
|
||||
{
|
||||
f = GetRootFolder(item.Owner);
|
||||
if (f != null)
|
||||
item.Folder = f.ID;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return AddItemPlain(item);
|
||||
}
|
||||
|
||||
protected abstract bool AddItemPlain(InventoryItemBase item);
|
||||
|
||||
/// <summary>
|
||||
/// Update an item in the user's inventory
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns>true if the item was successfully updated</returns>
|
||||
public abstract bool UpdateItem(InventoryItemBase item);
|
||||
|
||||
public abstract bool MoveItems(UUID ownerID, List<InventoryItemBase> items);
|
||||
|
||||
/// <summary>
|
||||
/// Delete an item from the user's inventory
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns>true if the item was successfully deleted</returns>
|
||||
public abstract bool DeleteItems(UUID ownerID, List<UUID> itemIDs);
|
||||
|
||||
public abstract InventoryItemBase GetItem(InventoryItemBase item);
|
||||
|
||||
public abstract InventoryFolderBase GetFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Does the given user have an inventory structure?
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns></returns>
|
||||
public abstract bool HasInventoryForUser(UUID userID);
|
||||
|
||||
/// <summary>
|
||||
/// Get the active gestures of the agent.
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public abstract List<InventoryItemBase> GetActiveGestures(UUID userId);
|
||||
|
||||
public abstract int GetAssetPermissions(UUID userID, UUID assetID);
|
||||
}
|
||||
}
|
|
@ -218,9 +218,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
/// <param name="userID"></param>
|
||||
private void CacheInventoryServiceURL(UUID userID)
|
||||
{
|
||||
if (m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID) == null)
|
||||
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID))
|
||||
{
|
||||
// The user does not have a local account; let's cache its service URL
|
||||
// The user is not local; let's cache its service URL
|
||||
string inventoryURL = string.Empty;
|
||||
ScenePresence sp = null;
|
||||
foreach (Scene scene in m_Scenes)
|
||||
|
|
|
@ -1,237 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Client;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
using OpenMetaverse;
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
{
|
||||
public class InventoryCache
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected BaseInventoryConnector m_Connector;
|
||||
protected List<Scene> m_Scenes;
|
||||
|
||||
// The cache proper
|
||||
protected Dictionary<UUID, Dictionary<AssetType, InventoryFolderBase>> m_InventoryCache;
|
||||
|
||||
// A cache of userIDs --> ServiceURLs, for HGBroker only
|
||||
protected Dictionary<UUID, string> m_InventoryURLs =
|
||||
new Dictionary<UUID, string>();
|
||||
|
||||
public virtual void Init(IConfigSource source, BaseInventoryConnector connector)
|
||||
{
|
||||
m_Scenes = new List<Scene>();
|
||||
m_InventoryCache = new Dictionary<UUID, Dictionary<AssetType, InventoryFolderBase>>();
|
||||
m_Connector = connector;
|
||||
}
|
||||
|
||||
public virtual void AddRegion(Scene scene)
|
||||
{
|
||||
m_Scenes.Add(scene);
|
||||
scene.EventManager.OnMakeRootAgent += OnMakeRootAgent;
|
||||
scene.EventManager.OnClientClosed += OnClientClosed;
|
||||
}
|
||||
|
||||
public virtual void RemoveRegion(Scene scene)
|
||||
{
|
||||
if ((m_Scenes != null) && m_Scenes.Contains(scene))
|
||||
{
|
||||
m_Scenes.Remove(scene);
|
||||
}
|
||||
}
|
||||
|
||||
void OnMakeRootAgent(ScenePresence presence)
|
||||
{
|
||||
// Get system folders
|
||||
|
||||
// First check if they're here already
|
||||
lock (m_InventoryCache)
|
||||
{
|
||||
if (m_InventoryCache.ContainsKey(presence.UUID))
|
||||
{
|
||||
m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If not, go get them and place them in the cache
|
||||
Dictionary<AssetType, InventoryFolderBase> folders = CacheSystemFolders(presence.UUID);
|
||||
CacheInventoryServiceURL(presence.Scene, presence.UUID);
|
||||
|
||||
m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}",
|
||||
presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count);
|
||||
|
||||
}
|
||||
|
||||
void OnClientClosed(UUID clientID, Scene scene)
|
||||
{
|
||||
if (m_InventoryCache.ContainsKey(clientID)) // if it's still in cache
|
||||
{
|
||||
ScenePresence sp = null;
|
||||
foreach (Scene s in m_Scenes)
|
||||
{
|
||||
s.TryGetScenePresence(clientID, out sp);
|
||||
if ((sp != null) && !sp.IsChildAgent && (s != scene))
|
||||
{
|
||||
m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping system folders in cache",
|
||||
scene.RegionInfo.RegionName, clientID);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders",
|
||||
scene.RegionInfo.RegionName, clientID);
|
||||
DropCachedSystemFolders(clientID);
|
||||
DropInventoryServiceURL(clientID);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cache a user's 'system' folders.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns>Folders cached</returns>
|
||||
protected Dictionary<AssetType, InventoryFolderBase> CacheSystemFolders(UUID userID)
|
||||
{
|
||||
// If not, go get them and place them in the cache
|
||||
Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(userID);
|
||||
|
||||
if (folders.Count > 0)
|
||||
lock (m_InventoryCache)
|
||||
m_InventoryCache.Add(userID, folders);
|
||||
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Drop a user's cached 'system' folders
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
protected void DropCachedSystemFolders(UUID userID)
|
||||
{
|
||||
// Drop system folders
|
||||
lock (m_InventoryCache)
|
||||
if (m_InventoryCache.ContainsKey(userID))
|
||||
m_InventoryCache.Remove(userID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the system folder for a particular asset type
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||
{
|
||||
m_log.DebugFormat("[INVENTORY CACHE]: Getting folder for asset type {0} for user {1}", type, userID);
|
||||
|
||||
Dictionary<AssetType, InventoryFolderBase> folders = null;
|
||||
|
||||
lock (m_InventoryCache)
|
||||
{
|
||||
m_InventoryCache.TryGetValue(userID, out folders);
|
||||
|
||||
// In some situations (such as non-secured standalones), system folders can be requested without
|
||||
// the user being logged in. So we need to try caching them here if we don't already have them.
|
||||
if (null == folders)
|
||||
CacheSystemFolders(userID);
|
||||
|
||||
m_InventoryCache.TryGetValue(userID, out folders);
|
||||
}
|
||||
|
||||
if ((folders != null) && folders.ContainsKey(type))
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[INVENTORY CACHE]: Returning folder {0} as type {1} for {2}", folders[type], type, userID);
|
||||
|
||||
return folders[type];
|
||||
}
|
||||
|
||||
m_log.WarnFormat("[INVENTORY CACHE]: Could not find folder for system type {0} for {1}", type, userID);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the user's inventory URL from its serviceURLs, if the user is foreign,
|
||||
/// and sticks it in the cache
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
private void CacheInventoryServiceURL(Scene scene, UUID userID)
|
||||
{
|
||||
if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null)
|
||||
{
|
||||
// The user does not have a local account; let's cache its service URL
|
||||
string inventoryURL = string.Empty;
|
||||
ScenePresence sp = null;
|
||||
scene.TryGetScenePresence(userID, out sp);
|
||||
if (sp != null)
|
||||
{
|
||||
AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
|
||||
if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
|
||||
{
|
||||
inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
|
||||
if (inventoryURL != null && inventoryURL != string.Empty)
|
||||
{
|
||||
inventoryURL = inventoryURL.Trim(new char[] { '/' });
|
||||
m_InventoryURLs.Add(userID, inventoryURL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DropInventoryServiceURL(UUID userID)
|
||||
{
|
||||
lock (m_InventoryURLs)
|
||||
if (m_InventoryURLs.ContainsKey(userID))
|
||||
m_InventoryURLs.Remove(userID);
|
||||
}
|
||||
|
||||
public string GetInventoryServiceURL(UUID userID)
|
||||
{
|
||||
if (m_InventoryURLs.ContainsKey(userID))
|
||||
return m_InventoryURLs[userID];
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -14,6 +14,9 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
string GetUserHomeURL(UUID uuid);
|
||||
string GetUserUUI(UUID uuid);
|
||||
string GetUserServerURL(UUID uuid, string serverType);
|
||||
int GetUserFlags(UUID userID);
|
||||
int GetUserCreated(UUID userID);
|
||||
string GetUserTitle(UUID userID);
|
||||
|
||||
/// <summary>
|
||||
/// Add a user.
|
||||
|
@ -48,5 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <param name="firstName"></param>
|
||||
/// <param name="profileURL"></param>
|
||||
void AddUser(UUID uuid, string firstName, string lastName, string profileURL);
|
||||
|
||||
bool IsLocalGridUser(UUID uuid);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,7 +77,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// Controls whether physics can be applied to prims. Even if false, prims still have entries in a
|
||||
/// PhysicsScene in order to perform collision detection
|
||||
/// </summary>
|
||||
public bool m_physicalPrim;
|
||||
public bool PhysicalPrims { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controls whether prims can be collided with.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If this is set to false then prims cannot be subject to physics either.
|
||||
/// </summary>
|
||||
public bool CollidablePrims { get; private set; }
|
||||
|
||||
public float m_maxNonphys = 256;
|
||||
public float m_maxPhys = 10;
|
||||
|
@ -650,7 +658,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//Animation states
|
||||
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
|
||||
|
||||
m_physicalPrim = startupConfig.GetBoolean("physical_prim", true);
|
||||
PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
|
||||
CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
|
||||
|
||||
m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
|
||||
if (RegionInfo.NonphysPrimMax > 0)
|
||||
|
@ -701,7 +710,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (maptileRefresh != 0)
|
||||
{
|
||||
m_mapGenerationTimer.Interval = maptileRefresh * 1000;
|
||||
m_mapGenerationTimer.Elapsed += RegenerateMaptile;
|
||||
m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
|
||||
m_mapGenerationTimer.AutoReset = true;
|
||||
m_mapGenerationTimer.Start();
|
||||
}
|
||||
|
@ -1638,21 +1647,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_sceneGridService.SetScene(this);
|
||||
|
||||
//// Unfortunately this needs to be here and it can't be async.
|
||||
//// The map tile image is stored in RegionSettings, but it also needs to be
|
||||
//// stored in the GridService, because that's what the world map module uses
|
||||
//// to send the map image UUIDs (of other regions) to the viewer...
|
||||
if (m_generateMaptiles)
|
||||
RegenerateMaptile();
|
||||
|
||||
GridRegion region = new GridRegion(RegionInfo);
|
||||
string error = GridService.RegisterRegion(RegionInfo.ScopeID, region);
|
||||
if (error != String.Empty)
|
||||
{
|
||||
throw new Exception(error);
|
||||
}
|
||||
|
||||
// Generate the maptile asynchronously, because sometimes it can be very slow and we
|
||||
// don't want this to delay starting the region.
|
||||
if (m_generateMaptiles)
|
||||
{
|
||||
Util.FireAndForget(delegate {
|
||||
RegenerateMaptile(null, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -5023,13 +5028,24 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
public void RegenerateMaptile(object sender, ElapsedEventArgs e)
|
||||
private void RegenerateMaptile()
|
||||
{
|
||||
IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>();
|
||||
if (mapModule != null)
|
||||
mapModule.GenerateMaptile();
|
||||
}
|
||||
|
||||
private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
RegenerateMaptile();
|
||||
|
||||
// We need to propagate the new image UUID to the grid service
|
||||
// so that all simulators can retrieve it
|
||||
string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo));
|
||||
if (error != string.Empty)
|
||||
throw new Exception(error);
|
||||
}
|
||||
|
||||
// This method is called across the simulation connector to
|
||||
// determine if a given agent is allowed in this region
|
||||
// AS A ROOT AGENT. Returning false here will prevent them
|
||||
|
|
|
@ -333,7 +333,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (rot != null)
|
||||
sceneObject.UpdateGroupRotationR((Quaternion)rot);
|
||||
|
||||
//group.ApplyPhysics(m_physicalPrim);
|
||||
if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
|
||||
{
|
||||
sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
|
||||
|
|
|
@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </remarks>
|
||||
public bool UsesPhysics
|
||||
{
|
||||
get { return (RootPart.Flags & PrimFlags.TemporaryOnRez) != 0; }
|
||||
get { return (RootPart.Flags & PrimFlags.Physics) != 0; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -669,7 +669,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
|
||||
}
|
||||
|
||||
ApplyPhysics(m_scene.m_physicalPrim);
|
||||
ApplyPhysics();
|
||||
|
||||
// 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.
|
||||
|
@ -1239,8 +1239,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Apply physics to this group
|
||||
/// </summary>
|
||||
/// <param name="m_physicalPrim"></param>
|
||||
public void ApplyPhysics(bool m_physicalPrim)
|
||||
public void ApplyPhysics()
|
||||
{
|
||||
// Apply physics to the root prim
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
|
||||
|
|
|
@ -1473,6 +1473,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="VolumeDetectActive"></param>
|
||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
|
||||
{
|
||||
if (!ParentGroup.Scene.CollidablePrims)
|
||||
return;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}",
|
||||
// Name, LocalId, UUID, m_physicalPrim);
|
||||
|
@ -1739,7 +1742,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="isNew"></param>
|
||||
public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
|
||||
{
|
||||
if (!ParentGroup.Scene.m_physicalPrim && UsePhysics)
|
||||
if (!ParentGroup.Scene.PhysicalPrims && UsePhysics)
|
||||
return;
|
||||
|
||||
if (IsJoint())
|
||||
|
@ -4318,7 +4321,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
if (PhysActor == null)
|
||||
if (ParentGroup.Scene.CollidablePrims && PhysActor == null)
|
||||
{
|
||||
// It's not phantom anymore. So make sure the physics engine get's knowledge of it
|
||||
PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape(
|
||||
|
|
|
@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is
|
||||
/// necessary.
|
||||
/// </remarks>
|
||||
protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
|
||||
private List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
|
||||
|
||||
public Object AttachmentsSyncLock { get; private set; }
|
||||
|
||||
|
@ -550,8 +550,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
m_pos = value;
|
||||
ParentPosition = Vector3.Zero;
|
||||
// Don't update while sitting
|
||||
if (ParentID == 0)
|
||||
{
|
||||
m_pos = value;
|
||||
ParentPosition = Vector3.Zero;
|
||||
}
|
||||
|
||||
//m_log.DebugFormat(
|
||||
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
|
||||
|
@ -566,6 +570,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public Vector3 OffsetPosition
|
||||
{
|
||||
get { return m_pos; }
|
||||
// Don't remove setter. It's not currently used in core but
|
||||
// upcoming Avination code needs it.
|
||||
set
|
||||
{
|
||||
// There is no offset position when not seated
|
||||
if (ParentID == 0)
|
||||
return;
|
||||
m_pos = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1162,9 +1175,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
// DateTime startTime = DateTime.Now;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: Completing movement of {0} into region {1}",
|
||||
// client.Name, Scene.RegionInfo.RegionName);
|
||||
m_log.DebugFormat(
|
||||
"[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
|
||||
client.Name, Scene.RegionInfo.RegionName, AbsolutePosition);
|
||||
|
||||
Vector3 look = Velocity;
|
||||
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
||||
|
@ -2383,9 +2396,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_lastVelocity = Velocity;
|
||||
}
|
||||
|
||||
// followed suggestion from mic bowman. reversed the two lines below.
|
||||
if (ParentID == 0 && PhysicsActor != null || ParentID != 0) // Check that we have a physics actor or we're sitting on something
|
||||
CheckForBorderCrossing();
|
||||
CheckForBorderCrossing();
|
||||
|
||||
CheckForSignificantMovement(); // sends update to the modules.
|
||||
}
|
||||
|
@ -2738,142 +2749,145 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </remarks>
|
||||
protected void CheckForBorderCrossing()
|
||||
{
|
||||
// Check that we we are not a child
|
||||
if (IsChildAgent)
|
||||
return;
|
||||
|
||||
Vector3 pos2 = AbsolutePosition;
|
||||
Vector3 vel = Velocity;
|
||||
int neighbor = 0;
|
||||
int[] fix = new int[2];
|
||||
|
||||
float timeStep = 0.1f;
|
||||
pos2.X = pos2.X + (vel.X*timeStep);
|
||||
pos2.Y = pos2.Y + (vel.Y*timeStep);
|
||||
pos2.Z = pos2.Z + (vel.Z*timeStep);
|
||||
// If we don't have a PhysActor, we can't cross anyway
|
||||
// Also don't do this while sat, sitting avatars cross with the
|
||||
// object they sit on.
|
||||
if (ParentID != 0 || PhysicsActor == null)
|
||||
return;
|
||||
|
||||
if (!IsInTransit)
|
||||
{
|
||||
// Checks if where it's headed exists a region
|
||||
Vector3 pos2 = AbsolutePosition;
|
||||
Vector3 vel = Velocity;
|
||||
int neighbor = 0;
|
||||
int[] fix = new int[2];
|
||||
|
||||
bool needsTransit = false;
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.W))
|
||||
{
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix);
|
||||
}
|
||||
else
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix);
|
||||
}
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.E))
|
||||
{
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix);
|
||||
}
|
||||
else
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
|
||||
}
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
|
||||
}
|
||||
|
||||
// Makes sure avatar does not end up outside region
|
||||
if (neighbor <= 0)
|
||||
{
|
||||
if (needsTransit)
|
||||
{
|
||||
if (m_requestedSitTargetUUID == UUID.Zero)
|
||||
{
|
||||
bool isFlying = Flying;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Vector3 pos = AbsolutePosition;
|
||||
if (AbsolutePosition.X < 0)
|
||||
pos.X += Velocity.X * 2;
|
||||
else if (AbsolutePosition.X > Constants.RegionSize)
|
||||
pos.X -= Velocity.X * 2;
|
||||
if (AbsolutePosition.Y < 0)
|
||||
pos.Y += Velocity.Y * 2;
|
||||
else if (AbsolutePosition.Y > Constants.RegionSize)
|
||||
pos.Y -= Velocity.Y * 2;
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition);
|
||||
|
||||
AddToPhysicalScene(isFlying);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (neighbor > 0)
|
||||
{
|
||||
if (!CrossToNewRegion())
|
||||
{
|
||||
if (m_requestedSitTargetUUID == UUID.Zero)
|
||||
{
|
||||
bool isFlying = Flying;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Vector3 pos = AbsolutePosition;
|
||||
if (AbsolutePosition.X < 0)
|
||||
pos.X += Velocity.X * 2;
|
||||
else if (AbsolutePosition.X > Constants.RegionSize)
|
||||
pos.X -= Velocity.X * 2;
|
||||
if (AbsolutePosition.Y < 0)
|
||||
pos.Y += Velocity.Y * 2;
|
||||
else if (AbsolutePosition.Y > Constants.RegionSize)
|
||||
pos.Y -= Velocity.Y * 2;
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
||||
AddToPhysicalScene(isFlying);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// We must remove the agent from the physical scene if it has been placed in transit. If we don't,
|
||||
// then this method continues to be called from ScenePresence.Update() until the handover of the client between
|
||||
// regions is completed. Since this handover can take more than 1000ms (due to the 1000ms
|
||||
// event queue polling response from the server), this results in the avatar pausing on the border
|
||||
// for the handover period.
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
// This constant has been inferred from experimentation
|
||||
// I'm not sure what this value should be, so I tried a few values.
|
||||
timeStep = 0.04f;
|
||||
pos2 = AbsolutePosition;
|
||||
float timeStep = 0.1f;
|
||||
pos2.X = pos2.X + (vel.X * timeStep);
|
||||
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
||||
pos2.Z = pos2.Z + (vel.Z * timeStep);
|
||||
m_pos = pos2;
|
||||
|
||||
if (!IsInTransit)
|
||||
{
|
||||
// Checks if where it's headed exists a region
|
||||
bool needsTransit = false;
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.W))
|
||||
{
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix);
|
||||
}
|
||||
else
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix);
|
||||
}
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.E))
|
||||
{
|
||||
if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix);
|
||||
}
|
||||
else
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
|
||||
}
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.S))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
|
||||
}
|
||||
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
|
||||
{
|
||||
needsTransit = true;
|
||||
neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
|
||||
}
|
||||
|
||||
// Makes sure avatar does not end up outside region
|
||||
if (neighbor <= 0)
|
||||
{
|
||||
if (needsTransit)
|
||||
{
|
||||
if (m_requestedSitTargetUUID == UUID.Zero)
|
||||
{
|
||||
bool isFlying = Flying;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Vector3 pos = AbsolutePosition;
|
||||
if (AbsolutePosition.X < 0)
|
||||
pos.X += Velocity.X * 2;
|
||||
else if (AbsolutePosition.X > Constants.RegionSize)
|
||||
pos.X -= Velocity.X * 2;
|
||||
if (AbsolutePosition.Y < 0)
|
||||
pos.Y += Velocity.Y * 2;
|
||||
else if (AbsolutePosition.Y > Constants.RegionSize)
|
||||
pos.Y -= Velocity.Y * 2;
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition);
|
||||
|
||||
AddToPhysicalScene(isFlying);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (neighbor > 0)
|
||||
{
|
||||
if (!CrossToNewRegion())
|
||||
{
|
||||
if (m_requestedSitTargetUUID == UUID.Zero)
|
||||
{
|
||||
bool isFlying = Flying;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Vector3 pos = AbsolutePosition;
|
||||
if (AbsolutePosition.X < 0)
|
||||
pos.X += Velocity.X * 2;
|
||||
else if (AbsolutePosition.X > Constants.RegionSize)
|
||||
pos.X -= Velocity.X * 2;
|
||||
if (AbsolutePosition.Y < 0)
|
||||
pos.Y += Velocity.Y * 2;
|
||||
else if (AbsolutePosition.Y > Constants.RegionSize)
|
||||
pos.Y -= Velocity.Y * 2;
|
||||
Velocity = Vector3.Zero;
|
||||
AbsolutePosition = pos;
|
||||
|
||||
AddToPhysicalScene(isFlying);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This constant has been inferred from experimentation
|
||||
// I'm not sure what this value should be, so I tried a few values.
|
||||
timeStep = 0.04f;
|
||||
pos2 = AbsolutePosition;
|
||||
pos2.X = pos2.X + (vel.X * timeStep);
|
||||
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
||||
// Don't touch the Z
|
||||
m_pos = pos2;
|
||||
m_log.DebugFormat("[SCENE PRESENCE]: In transit m_pos={0}", m_pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3104,30 +3118,28 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
catch { }
|
||||
|
||||
// Attachment objects
|
||||
lock (m_attachments)
|
||||
List<SceneObjectGroup> attachments = GetAttachments();
|
||||
if (attachments.Count > 0)
|
||||
{
|
||||
if (m_attachments.Count > 0)
|
||||
{
|
||||
cAgent.AttachmentObjects = new List<ISceneObject>();
|
||||
cAgent.AttachmentObjectStates = new List<string>();
|
||||
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
||||
InTransitScriptStates.Clear();
|
||||
cAgent.AttachmentObjects = new List<ISceneObject>();
|
||||
cAgent.AttachmentObjectStates = new List<string>();
|
||||
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
||||
InTransitScriptStates.Clear();
|
||||
|
||||
foreach (SceneObjectGroup sog in m_attachments)
|
||||
{
|
||||
// We need to make a copy and pass that copy
|
||||
// because of transfers withn the same sim
|
||||
ISceneObject clone = sog.CloneForNewScene();
|
||||
// Attachment module assumes that GroupPosition holds the offsets...!
|
||||
((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
|
||||
((SceneObjectGroup)clone).IsAttachment = false;
|
||||
cAgent.AttachmentObjects.Add(clone);
|
||||
string state = sog.GetStateSnapshot();
|
||||
cAgent.AttachmentObjectStates.Add(state);
|
||||
InTransitScriptStates.Add(state);
|
||||
// Let's remove the scripts of the original object here
|
||||
sog.RemoveScriptInstances(true);
|
||||
}
|
||||
foreach (SceneObjectGroup sog in attachments)
|
||||
{
|
||||
// We need to make a copy and pass that copy
|
||||
// because of transfers withn the same sim
|
||||
ISceneObject clone = sog.CloneForNewScene();
|
||||
// Attachment module assumes that GroupPosition holds the offsets...!
|
||||
((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
|
||||
((SceneObjectGroup)clone).IsAttachment = false;
|
||||
cAgent.AttachmentObjects.Add(clone);
|
||||
string state = sog.GetStateSnapshot();
|
||||
cAgent.AttachmentObjectStates.Add(state);
|
||||
InTransitScriptStates.Add(state);
|
||||
// Let's remove the scripts of the original object here
|
||||
sog.RemoveScriptInstances(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3535,26 +3547,29 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="args">The arguments for the event</param>
|
||||
public void SendScriptEventToAttachments(string eventName, Object[] args)
|
||||
{
|
||||
if (m_scriptEngines.Length == 0)
|
||||
return;
|
||||
|
||||
lock (m_attachments)
|
||||
Util.FireAndForget(delegate(object x)
|
||||
{
|
||||
foreach (SceneObjectGroup grp in m_attachments)
|
||||
{
|
||||
// 16384 is CHANGED_ANIMATION
|
||||
//
|
||||
// Send this to all attachment root prims
|
||||
//
|
||||
foreach (IScriptModule m in m_scriptEngines)
|
||||
{
|
||||
if (m == null) // No script engine loaded
|
||||
continue;
|
||||
if (m_scriptEngines.Length == 0)
|
||||
return;
|
||||
|
||||
m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
|
||||
lock (m_attachments)
|
||||
{
|
||||
foreach (SceneObjectGroup grp in m_attachments)
|
||||
{
|
||||
// 16384 is CHANGED_ANIMATION
|
||||
//
|
||||
// Send this to all attachment root prims
|
||||
//
|
||||
foreach (IScriptModule m in m_scriptEngines)
|
||||
{
|
||||
if (m == null) // No script engine loaded
|
||||
continue;
|
||||
|
||||
m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
internal void PushForce(Vector3 impulse)
|
||||
|
|
|
@ -110,7 +110,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private const uint m_regionWidth = Constants.RegionSize;
|
||||
private const uint m_regionHeight = Constants.RegionSize;
|
||||
|
||||
private float ODE_STEPSIZE = 0.020f;
|
||||
private float ODE_STEPSIZE = 0.0178f;
|
||||
private float metersInSpace = 29.9f;
|
||||
private float m_timeDilation = 1.0f;
|
||||
|
||||
|
@ -456,7 +456,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f);
|
||||
mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f);
|
||||
|
||||
ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f);
|
||||
ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
|
||||
m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10);
|
||||
|
||||
avDensity = physicsconfig.GetFloat("av_density", 80f);
|
||||
|
@ -2822,6 +2822,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
m_global_contactcount = 0;
|
||||
|
||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||
|
||||
d.JointGroupEmpty(contactgroup);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
|
@ -486,6 +486,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false;
|
||||
if (m_host.ParentGroup.Scene.SimulationDataService != null)
|
||||
m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID);
|
||||
m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile();
|
||||
}
|
||||
/// <summary>
|
||||
/// Set the current Windlight scene to a target avatar
|
||||
|
|
|
@ -91,6 +91,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
|
|||
|
||||
server.AddXmlRPCHandler("status_notification", StatusNotification, false);
|
||||
server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false);
|
||||
server.AddXmlRPCHandler("get_user_info", GetUserInfo, false);
|
||||
server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false);
|
||||
|
||||
server.AddXmlRPCHandler("locate_user", LocateUser, false);
|
||||
|
@ -299,6 +300,38 @@ namespace OpenSim.Server.Handlers.Hypergrid
|
|||
|
||||
}
|
||||
|
||||
public XmlRpcResponse GetUserInfo(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||
{
|
||||
Hashtable hash = new Hashtable();
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
|
||||
// This needs checking!
|
||||
if (requestData.ContainsKey("userID"))
|
||||
{
|
||||
string userID_str = (string)requestData["userID"];
|
||||
UUID userID = UUID.Zero;
|
||||
UUID.TryParse(userID_str, out userID);
|
||||
|
||||
//int userFlags = m_HomeUsersService.GetUserFlags(userID);
|
||||
Dictionary<string,object> userInfo = m_HomeUsersService.GetUserInfo(userID);
|
||||
if (userInfo.Count > 0)
|
||||
{
|
||||
foreach (KeyValuePair<string, object> kvp in userInfo)
|
||||
{
|
||||
hash[kvp.Key] = kvp.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hash["result"] = "failure";
|
||||
}
|
||||
}
|
||||
|
||||
XmlRpcResponse response = new XmlRpcResponse();
|
||||
response.Value = hash;
|
||||
return response;
|
||||
}
|
||||
|
||||
public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||
{
|
||||
Hashtable hash = new Hashtable();
|
||||
|
|
|
@ -231,7 +231,7 @@ namespace OpenSim.Server.Handlers.UserAccounts
|
|||
|
||||
int userLevel = 0;
|
||||
if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel))
|
||||
existingAccount.UserFlags = userLevel;
|
||||
existingAccount.UserLevel = userLevel;
|
||||
|
||||
int userFlags = 0;
|
||||
if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags))
|
||||
|
|
|
@ -100,6 +100,8 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
public AssetBase Get(string id)
|
||||
{
|
||||
// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Synchronous get request for {0}", id);
|
||||
|
||||
string uri = m_ServerURI + "/assets/" + id;
|
||||
|
||||
AssetBase asset = null;
|
||||
|
@ -119,6 +121,8 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
public AssetBase GetCached(string id)
|
||||
{
|
||||
// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Cache request for {0}", id);
|
||||
|
||||
if (m_Cache != null)
|
||||
return m_Cache.Get(id);
|
||||
|
||||
|
@ -177,6 +181,8 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
public bool Get(string id, Object sender, AssetRetrieved handler)
|
||||
{
|
||||
// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Potentially asynchronous get request for {0}", id);
|
||||
|
||||
string uri = m_ServerURI + "/assets/" + id;
|
||||
|
||||
AssetBase asset = null;
|
||||
|
|
|
@ -29,7 +29,9 @@ using log4net;
|
|||
using Nini.Config;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Reflection;
|
||||
using System.Web;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Services.Connectors.Hypergrid;
|
||||
|
@ -73,11 +75,26 @@ namespace OpenSim.Services.Connectors
|
|||
if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) &&
|
||||
assetUri.Scheme == Uri.UriSchemeHttp)
|
||||
{
|
||||
url = "http://" + assetUri.Authority;
|
||||
assetID = assetUri.LocalPath.Trim(new char[] {'/'});
|
||||
// Simian
|
||||
if (assetUri.Query != string.Empty)
|
||||
{
|
||||
NameValueCollection qscoll = HttpUtility.ParseQueryString(assetUri.Query);
|
||||
assetID = qscoll["id"];
|
||||
if (assetID != null)
|
||||
url = id.Replace(assetID, ""); // Malformed again, as simian expects
|
||||
else
|
||||
url = id; // !!! best effort
|
||||
}
|
||||
else // robust
|
||||
{
|
||||
url = "http://" + assetUri.Authority;
|
||||
assetID = assetUri.LocalPath.Trim(new char[] { '/' });
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[HG ASSET SERVICE]: Malformed URL {0}", id);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,13 +47,36 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
public HeloServicesConnector(string serverURI)
|
||||
{
|
||||
m_ServerURI = serverURI.TrimEnd('/');
|
||||
if (!serverURI.EndsWith("="))
|
||||
m_ServerURI = serverURI.TrimEnd('/') + "/helo/";
|
||||
else
|
||||
{
|
||||
// Simian sends malformed urls like this:
|
||||
// http://valley.virtualportland.org/simtest/Grid/?id=
|
||||
//
|
||||
try
|
||||
{
|
||||
Uri uri = new Uri(serverURI + "xxx");
|
||||
if (uri.Query == string.Empty)
|
||||
m_ServerURI = serverURI.TrimEnd('/') + "/helo/";
|
||||
else
|
||||
{
|
||||
serverURI = serverURI + "xxx";
|
||||
m_ServerURI = serverURI.Replace(uri.Query, "");
|
||||
m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/";
|
||||
}
|
||||
}
|
||||
catch (UriFormatException e)
|
||||
{
|
||||
m_log.WarnFormat("[HELO SERVICE]: Malformed URL {0}", serverURI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public virtual string Helo()
|
||||
{
|
||||
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo");
|
||||
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI);
|
||||
// Eventually we need to switch to HEAD
|
||||
/* req.Method = "HEAD"; */
|
||||
|
||||
|
|
|
@ -334,6 +334,9 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
|||
UInt32.TryParse((string)hash["http_port"], out p);
|
||||
region.HttpPort = p;
|
||||
}
|
||||
if (hash.ContainsKey("server_uri") && hash["server_uri"] != null)
|
||||
region.ServerURI = (string)hash["server_uri"];
|
||||
|
||||
if (hash["internal_port"] != null)
|
||||
{
|
||||
int p = 0;
|
||||
|
@ -558,6 +561,60 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
|||
return online;
|
||||
}
|
||||
|
||||
public Dictionary<string,object> GetUserInfo (UUID userID)
|
||||
{
|
||||
Hashtable hash = new Hashtable();
|
||||
hash["userID"] = userID.ToString();
|
||||
|
||||
IList paramList = new ArrayList();
|
||||
paramList.Add(hash);
|
||||
|
||||
XmlRpcRequest request = new XmlRpcRequest("get_user_info", paramList);
|
||||
|
||||
Dictionary<string, object> info = new Dictionary<string, object>();
|
||||
XmlRpcResponse response = null;
|
||||
try
|
||||
{
|
||||
response = request.Send(m_ServerURL, 10000);
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetUserInfo", m_ServerURL);
|
||||
return info;
|
||||
}
|
||||
|
||||
if (response.IsFault)
|
||||
{
|
||||
m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetServerURLs returned an error: {1}", m_ServerURL, response.FaultString);
|
||||
return info;
|
||||
}
|
||||
|
||||
hash = (Hashtable)response.Value;
|
||||
try
|
||||
{
|
||||
if (hash == null)
|
||||
{
|
||||
m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetUserInfo Got null response from {0}! THIS IS BAAAAD", m_ServerURL);
|
||||
return info;
|
||||
}
|
||||
|
||||
// Here is the actual response
|
||||
foreach (object key in hash.Keys)
|
||||
{
|
||||
if (hash[key] != null)
|
||||
{
|
||||
info.Add(key.ToString(), hash[key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got exception on GetOnlineFriends response.");
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetServerURLs(UUID userID)
|
||||
{
|
||||
Hashtable hash = new Hashtable();
|
||||
|
|
|
@ -86,6 +86,8 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
|||
|
||||
public SimianAssetServiceConnector(string url)
|
||||
{
|
||||
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||
url = url + '/';
|
||||
m_serverUrl = url;
|
||||
}
|
||||
|
||||
|
|
|
@ -341,26 +341,54 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
|||
|
||||
public List<GridRegion> GetHyperlinks(UUID scopeID)
|
||||
{
|
||||
// Hypergrid/linked regions are not supported
|
||||
return new List<GridRegion>();
|
||||
List<GridRegion> foundRegions = new List<GridRegion>();
|
||||
|
||||
NameValueCollection requestArgs = new NameValueCollection
|
||||
{
|
||||
{ "RequestMethod", "GetScenes" },
|
||||
{ "HyperGrid", "true" },
|
||||
{ "Enabled", "1" }
|
||||
};
|
||||
|
||||
OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs);
|
||||
if (response["Success"].AsBoolean())
|
||||
{
|
||||
// m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name);
|
||||
|
||||
OSDArray array = response["Scenes"] as OSDArray;
|
||||
if (array != null)
|
||||
{
|
||||
for (int i = 0; i < array.Count; i++)
|
||||
{
|
||||
GridRegion region = ResponseToGridRegion(array[i] as OSDMap);
|
||||
if (region != null)
|
||||
foundRegions.Add(region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return foundRegions;
|
||||
}
|
||||
|
||||
public int GetRegionFlags(UUID scopeID, UUID regionID)
|
||||
{
|
||||
const int REGION_ONLINE = 4;
|
||||
|
||||
NameValueCollection requestArgs = new NameValueCollection
|
||||
{
|
||||
{ "RequestMethod", "GetScene" },
|
||||
{ "SceneID", regionID.ToString() }
|
||||
};
|
||||
|
||||
// m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString());
|
||||
m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString());
|
||||
|
||||
OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs);
|
||||
if (response["Success"].AsBoolean())
|
||||
{
|
||||
return response["Enabled"].AsBoolean() ? REGION_ONLINE : 0;
|
||||
OSDMap extraData = response["ExtraData"] as OSDMap;
|
||||
int enabled = response["Enabled"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.RegionOnline : 0;
|
||||
int hypergrid = extraData["HyperGrid"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.Hyperlink : 0;
|
||||
int flags = enabled | hypergrid;
|
||||
m_log.DebugFormat("[SGGC] enabled - {0} hg - {1} flags - {2}", enabled, hypergrid, flags);
|
||||
return flags;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -412,23 +440,26 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
|||
region.RegionLocX = (int)minPosition.X;
|
||||
region.RegionLocY = (int)minPosition.Y;
|
||||
|
||||
Uri httpAddress = response["Address"].AsUri();
|
||||
region.ExternalHostName = httpAddress.Host;
|
||||
region.HttpPort = (uint)httpAddress.Port;
|
||||
if ( ! extraData["HyperGrid"] ) {
|
||||
Uri httpAddress = response["Address"].AsUri();
|
||||
region.ExternalHostName = httpAddress.Host;
|
||||
region.HttpPort = (uint)httpAddress.Port;
|
||||
|
||||
region.ServerURI = extraData["ServerURI"].AsString();
|
||||
IPAddress internalAddress;
|
||||
IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress);
|
||||
if (internalAddress == null)
|
||||
internalAddress = IPAddress.Any;
|
||||
|
||||
IPAddress internalAddress;
|
||||
IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress);
|
||||
if (internalAddress == null)
|
||||
internalAddress = IPAddress.Any;
|
||||
|
||||
region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger());
|
||||
region.TerrainImage = extraData["MapTexture"].AsUUID();
|
||||
region.Access = (byte)extraData["Access"].AsInteger();
|
||||
region.RegionSecret = extraData["RegionSecret"].AsString();
|
||||
region.EstateOwner = extraData["EstateOwner"].AsUUID();
|
||||
region.Token = extraData["Token"].AsString();
|
||||
region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger());
|
||||
region.TerrainImage = extraData["MapTexture"].AsUUID();
|
||||
region.Access = (byte)extraData["Access"].AsInteger();
|
||||
region.RegionSecret = extraData["RegionSecret"].AsString();
|
||||
region.EstateOwner = extraData["EstateOwner"].AsUUID();
|
||||
region.Token = extraData["Token"].AsString();
|
||||
region.ServerURI = extraData["ServerURI"].AsString();
|
||||
} else {
|
||||
region.ServerURI = response["Address"];
|
||||
}
|
||||
|
||||
return region;
|
||||
}
|
||||
|
|
|
@ -92,7 +92,10 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
|||
|
||||
public SimianInventoryServiceConnector(string url)
|
||||
{
|
||||
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||
url = url + '/';
|
||||
m_serverUrl = url;
|
||||
|
||||
}
|
||||
|
||||
public void Initialise(IConfigSource source)
|
||||
|
|
|
@ -287,6 +287,10 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
|||
account.UserFlags = response["UserFlags"].AsInteger();
|
||||
account.UserLevel = response["AccessLevel"].AsInteger();
|
||||
account.UserTitle = response["UserTitle"].AsString();
|
||||
account.LocalToGrid = true;
|
||||
if (response.ContainsKey("LocalToGrid"))
|
||||
account.LocalToGrid = (response["LocalToGrid"].AsString() == "true" ? true : false);
|
||||
|
||||
GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName);
|
||||
|
||||
// Cache the user account info
|
||||
|
|
|
@ -102,50 +102,45 @@ namespace OpenSim.Services.GridService
|
|||
|
||||
public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db)
|
||||
{
|
||||
IConfig modulesConfig = config.Configs["Modules"];
|
||||
if (modulesConfig == null)
|
||||
return;
|
||||
IConfig gridConfig = config.Configs["GridService"];
|
||||
if (gridConfig == null)
|
||||
return;
|
||||
|
||||
if (modulesConfig.GetString("HypergridLinker", "") != "HypergridLinker")
|
||||
return;
|
||||
|
||||
m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType());
|
||||
if (!gridConfig.GetBoolean("HypergridLinker", false))
|
||||
return;
|
||||
|
||||
m_Database = db;
|
||||
m_GridService = gridService;
|
||||
m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType());
|
||||
|
||||
IConfig gridConfig = config.Configs["GridService"];
|
||||
if (gridConfig != null)
|
||||
{
|
||||
string assetService = gridConfig.GetString("AssetService", string.Empty);
|
||||
string assetService = gridConfig.GetString("AssetService", string.Empty);
|
||||
|
||||
Object[] args = new Object[] { config };
|
||||
Object[] args = new Object[] { config };
|
||||
|
||||
if (assetService != string.Empty)
|
||||
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args);
|
||||
if (assetService != string.Empty)
|
||||
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args);
|
||||
|
||||
string scope = gridConfig.GetString("ScopeID", string.Empty);
|
||||
if (scope != string.Empty)
|
||||
UUID.TryParse(scope, out m_ScopeID);
|
||||
string scope = gridConfig.GetString("ScopeID", string.Empty);
|
||||
if (scope != string.Empty)
|
||||
UUID.TryParse(scope, out m_ScopeID);
|
||||
|
||||
// m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
||||
|
||||
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
|
||||
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
|
||||
|
||||
m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty);
|
||||
try
|
||||
{
|
||||
m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper);
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper);
|
||||
}
|
||||
|
||||
m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService);
|
||||
|
||||
m_log.Debug("[HYPERGRID LINKER]: Loaded all services...");
|
||||
m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty);
|
||||
try
|
||||
{
|
||||
m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper);
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper);
|
||||
}
|
||||
|
||||
m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService);
|
||||
|
||||
m_log.Debug("[HYPERGRID LINKER]: Loaded all services...");
|
||||
|
||||
if (!string.IsNullOrEmpty(m_MapTileDirectory))
|
||||
{
|
||||
|
|
|
@ -161,6 +161,14 @@ namespace OpenSim.Services.HypergridService
|
|||
{
|
||||
m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}",
|
||||
agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI);
|
||||
|
||||
if (m_UserAccountService.GetUserAccount(UUID.Zero, agentCircuit.AgentID) == null)
|
||||
{
|
||||
m_log.WarnFormat("[USER AGENT SERVICE]: Someone attempted to lauch a foreign user from here {0} {1}", agentCircuit.firstname, agentCircuit.lastname);
|
||||
reason = "Forbidden to launch your agents from here";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
|
||||
GridRegion region = new GridRegion(gatekeeper);
|
||||
region.ServerURI = gatekeeper.ServerURI;
|
||||
|
@ -480,6 +488,31 @@ namespace OpenSim.Services.HypergridService
|
|||
return online;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetUserInfo(UUID userID)
|
||||
{
|
||||
Dictionary<string, object> info = new Dictionary<string, object>();
|
||||
|
||||
if (m_UserAccountService == null)
|
||||
{
|
||||
m_log.WarnFormat("[USER AGENT SERVICE]: Unable to get user flags because user account service is missing");
|
||||
info["result"] = "fail";
|
||||
info["message"] = "UserAccountService is missing!";
|
||||
return info;
|
||||
}
|
||||
|
||||
UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero /*!!!*/, userID);
|
||||
|
||||
if (account != null)
|
||||
{
|
||||
info.Add("user_flags", (object)account.UserFlags);
|
||||
info.Add("user_created", (object)account.Created);
|
||||
info.Add("user_title", (object)account.UserTitle);
|
||||
info.Add("result", "success");
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetServerURLs(UUID userID)
|
||||
{
|
||||
if (m_UserAccountService == null)
|
||||
|
|
|
@ -55,6 +55,7 @@ namespace OpenSim.Services.Interfaces
|
|||
void LogoutAgent(UUID userID, UUID sessionID);
|
||||
GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt);
|
||||
Dictionary<string, object> GetServerURLs(UUID userID);
|
||||
Dictionary<string,object> GetUserInfo(UUID userID);
|
||||
|
||||
string LocateUser(UUID userID);
|
||||
// Tries to get the universal user identifier for the targetUserId
|
||||
|
|
|
@ -91,6 +91,7 @@ namespace OpenSim.Services.Interfaces
|
|||
public int UserLevel;
|
||||
public int UserFlags;
|
||||
public string UserTitle;
|
||||
public Boolean LocalToGrid = true;
|
||||
|
||||
public Dictionary<string, object> ServiceURLs;
|
||||
|
||||
|
@ -119,6 +120,8 @@ namespace OpenSim.Services.Interfaces
|
|||
UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString());
|
||||
if (kvp.ContainsKey("UserTitle"))
|
||||
UserTitle = kvp["UserTitle"].ToString();
|
||||
if (kvp.ContainsKey("LocalToGrid"))
|
||||
Boolean.TryParse(kvp["LocalToGrid"].ToString(), out LocalToGrid);
|
||||
|
||||
if (kvp.ContainsKey("Created"))
|
||||
Created = Convert.ToInt32(kvp["Created"].ToString());
|
||||
|
@ -152,6 +155,7 @@ namespace OpenSim.Services.Interfaces
|
|||
result["UserLevel"] = UserLevel.ToString();
|
||||
result["UserFlags"] = UserFlags.ToString();
|
||||
result["UserTitle"] = UserTitle;
|
||||
result["LocalToGrid"] = LocalToGrid.ToString();
|
||||
|
||||
string str = string.Empty;
|
||||
foreach (KeyValuePair<string, object> kvp in ServiceURLs)
|
||||
|
|
|
@ -112,10 +112,10 @@ namespace pCampBot
|
|||
" -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" +
|
||||
" -password password for the bots\n" +
|
||||
" -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" +
|
||||
" current options are:" +
|
||||
" p (physics)" +
|
||||
" g (grab)" +
|
||||
" t (teleport)" +
|
||||
" current options are:\n" +
|
||||
" p (physics)\n" +
|
||||
" g (grab)\n" +
|
||||
" t (teleport)\n" +
|
||||
// " c (cross)" +
|
||||
" -wear set appearance folder to load from (default: no)\n" +
|
||||
" -h, -help show this message");
|
||||
|
|
Binary file not shown.
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Prebuild xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" version="1.9">
|
||||
<Solution name="Prebuild" version="2.0.4">
|
||||
<Solution name="Prebuild" version="2.0.5">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
<CompilerDefines>DEBUG;TRACE</CompilerDefines>
|
||||
|
@ -31,13 +31,15 @@
|
|||
type="Exe"
|
||||
rootNamespace="Prebuild"
|
||||
startupObject="Prebuild.Prebuild"
|
||||
version="2.0.3"
|
||||
version="2.0.5"
|
||||
frameworkVersion="v3_5"
|
||||
>
|
||||
<Author>Matthew Holmes (matthew@wildfiregames.com)</Author>
|
||||
<Author>Dan Moorehead (dan05a@gmail.com)</Author>
|
||||
<Author>Dave Hudson (jendave@yahoo.com)</Author>
|
||||
<Author>Rob Loach (http://robloach.net)</Author>
|
||||
<Author>C.J. Adams-Collier (cjac@colliertech.org)</Author>
|
||||
<Author>John Hurliman (john.hurliman@intel.com)</Author>
|
||||
<Description>The Prebuild project generator</Description>
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
|
|
|
@ -62,7 +62,11 @@ namespace Prebuild.Core.Nodes
|
|||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
Page
|
||||
Page,
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
Copy
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -245,6 +249,9 @@ namespace Prebuild.Core.Nodes
|
|||
if (subType != String.Empty)
|
||||
m_SubType = (SubType)Enum.Parse(typeof(SubType), subType);
|
||||
|
||||
Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction);
|
||||
|
||||
|
||||
m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString());
|
||||
this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString));
|
||||
if ( this.m_Link == true )
|
||||
|
|
|
@ -25,6 +25,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Xml;
|
||||
|
||||
using Prebuild.Core.Attributes;
|
||||
|
@ -49,6 +50,8 @@ namespace Prebuild.Core.Nodes
|
|||
private readonly Dictionary<string, bool> m_Links = new Dictionary<string, bool>();
|
||||
private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>();
|
||||
private readonly Dictionary<string, bool> m_PreservePaths = new Dictionary<string, bool>();
|
||||
private readonly Dictionary<string, string> m_DestinationPath = new Dictionary<string, string>();
|
||||
private readonly NameValueCollection m_CopyFiles = new NameValueCollection();
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -62,6 +65,16 @@ namespace Prebuild.Core.Nodes
|
|||
}
|
||||
}
|
||||
|
||||
public string[] Destinations
|
||||
{
|
||||
get { return m_CopyFiles.AllKeys; }
|
||||
}
|
||||
|
||||
public int CopyFiles
|
||||
{
|
||||
get { return m_CopyFiles.Count; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
|
@ -76,6 +89,20 @@ namespace Prebuild.Core.Nodes
|
|||
return m_BuildActions[file];
|
||||
}
|
||||
|
||||
public string GetDestinationPath(string file)
|
||||
{
|
||||
if( !m_DestinationPath.ContainsKey(file))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return m_DestinationPath[file];
|
||||
}
|
||||
|
||||
public string[] SourceFiles(string dest)
|
||||
{
|
||||
return m_CopyFiles.GetValues(dest);
|
||||
}
|
||||
|
||||
public CopyToOutput GetCopyToOutput(string file)
|
||||
{
|
||||
if (!m_CopyToOutputs.ContainsKey(file))
|
||||
|
@ -178,6 +205,13 @@ namespace Prebuild.Core.Nodes
|
|||
m_BuildActions[file] = GetBuildActionByFileName(file);
|
||||
else
|
||||
m_BuildActions[file] = matchNode.BuildAction.Value;
|
||||
|
||||
if (matchNode.BuildAction == BuildAction.Copy)
|
||||
{
|
||||
m_CopyFiles.Add(matchNode.DestinationPath, file);
|
||||
m_DestinationPath[file] = matchNode.DestinationPath;
|
||||
}
|
||||
|
||||
m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value;
|
||||
m_ResourceNames[ file ] = matchNode.ResourceName;
|
||||
m_PreservePaths[ file ] = matchNode.PreservePath;
|
||||
|
|
|
@ -52,6 +52,7 @@ namespace Prebuild.Core.Nodes
|
|||
private bool m_Link;
|
||||
private string m_LinkPath;
|
||||
private bool m_PreservePath;
|
||||
private string m_Destination = "";
|
||||
private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>();
|
||||
|
||||
#endregion
|
||||
|
@ -80,6 +81,13 @@ namespace Prebuild.Core.Nodes
|
|||
}
|
||||
}
|
||||
|
||||
public string DestinationPath
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Destination;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
@ -285,12 +293,14 @@ namespace Prebuild.Core.Nodes
|
|||
}
|
||||
string path = Helper.AttributeValue(node, "path", ".");
|
||||
string pattern = Helper.AttributeValue(node, "pattern", "*");
|
||||
string destination = Helper.AttributeValue(node, "destination", string.Empty);
|
||||
bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false"));
|
||||
bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false"));
|
||||
string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty);
|
||||
if (buildAction != string.Empty)
|
||||
m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction);
|
||||
|
||||
|
||||
//TODO: Figure out where the subtype node is being assigned
|
||||
//string subType = Helper.AttributeValue(node, "subType", string.Empty);
|
||||
//if (subType != String.Empty)
|
||||
|
@ -304,11 +314,12 @@ namespace Prebuild.Core.Nodes
|
|||
}
|
||||
m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) );
|
||||
|
||||
if ( buildAction == "Copy")
|
||||
m_Destination = destination;
|
||||
|
||||
if(path != null && path.Length == 0)
|
||||
{
|
||||
path = ".";//use current directory
|
||||
}
|
||||
|
||||
//throw new WarningException("Match must have a 'path' attribute");
|
||||
|
||||
if(pattern == null)
|
||||
|
|
|
@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
|
|||
/*
|
||||
* $Source$
|
||||
* $Author: jendave $
|
||||
* $Date: 2006-09-20 08:42:51 +0100 (Wed, 20 Sep 2006) $
|
||||
* $Date: 2006-09-20 03:42:51 -0400 (Wed, 20 Sep 2006) $
|
||||
* $Revision: 164 $
|
||||
*/
|
||||
#endregion
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#region BSD License
|
||||
#region BSD License
|
||||
/*
|
||||
Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com)
|
||||
|
||||
|
@ -25,6 +25,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.IO;
|
||||
using Prebuild.Core.Interfaces;
|
||||
using Prebuild.Core.Nodes;
|
||||
|
@ -42,6 +43,7 @@ namespace Prebuild.Core.Targets
|
|||
#region Fields
|
||||
|
||||
readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>();
|
||||
// NameValueCollection CopyFiles = new NameValueCollection();
|
||||
Kernel kernel;
|
||||
#endregion
|
||||
|
||||
|
@ -168,7 +170,14 @@ namespace Prebuild.Core.Targets
|
|||
#region Project File
|
||||
using (ps)
|
||||
{
|
||||
ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion));
|
||||
string targets = "";
|
||||
|
||||
if(project.Files.CopyFiles > 0)
|
||||
targets = "Build;CopyFiles";
|
||||
else
|
||||
targets = "Build";
|
||||
|
||||
ps.WriteLine("<Project DefaultTargets=\"{0}\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {1}>", targets, GetToolsVersionXml(project.FrameworkVersion));
|
||||
ps.WriteLine(" <PropertyGroup>");
|
||||
ps.WriteLine(" <ProjectType>Local</ProjectType>");
|
||||
ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion);
|
||||
|
@ -334,8 +343,14 @@ namespace Prebuild.Core.Targets
|
|||
|
||||
}
|
||||
|
||||
|
||||
foreach (string filePath in project.Files)
|
||||
{
|
||||
// Add the filePath with the destination as the key
|
||||
// will use it later to form the copy parameters with Include lists
|
||||
// for each destination
|
||||
if (project.Files.GetBuildAction(filePath) == BuildAction.Copy)
|
||||
continue;
|
||||
// if (file == "Properties\\Bind.Designer.cs")
|
||||
// {
|
||||
// Console.WriteLine("Wait a minute!");
|
||||
|
@ -446,7 +461,9 @@ namespace Prebuild.Core.Targets
|
|||
ps.WriteLine("Include=\"{0}\">", file);
|
||||
|
||||
int last_period_index = file.LastIndexOf('.');
|
||||
string short_file_name = file.Substring(0, last_period_index);
|
||||
string short_file_name = (last_period_index >= 0)
|
||||
? file.Substring(0, last_period_index)
|
||||
: file;
|
||||
string extension = Path.GetExtension(path);
|
||||
// make this upper case, so that when File.Exists tests for the
|
||||
// existence of a designer file on a case-sensitive platform,
|
||||
|
@ -501,8 +518,41 @@ namespace Prebuild.Core.Targets
|
|||
}
|
||||
}
|
||||
}
|
||||
ps.WriteLine(" </ItemGroup>");
|
||||
|
||||
/*
|
||||
* Copy Task
|
||||
*
|
||||
*/
|
||||
if ( project.Files.CopyFiles > 0 ) {
|
||||
|
||||
Dictionary<string, string> IncludeTags = new Dictionary<string, string>();
|
||||
int TagCount = 0;
|
||||
|
||||
// Handle Copy tasks
|
||||
ps.WriteLine(" <ItemGroup>");
|
||||
foreach (string destPath in project.Files.Destinations)
|
||||
{
|
||||
string tag = "FilesToCopy_" + TagCount.ToString("0000");
|
||||
|
||||
ps.WriteLine(" <{0} Include=\"{1}\" />", tag, String.Join(";", project.Files.SourceFiles(destPath)));
|
||||
IncludeTags.Add(destPath, tag);
|
||||
TagCount++;
|
||||
}
|
||||
|
||||
ps.WriteLine(" </ItemGroup>");
|
||||
|
||||
ps.WriteLine(" <Target Name=\"CopyFiles\">");
|
||||
|
||||
foreach (string destPath in project.Files.Destinations)
|
||||
{
|
||||
ps.WriteLine(" <Copy SourceFiles=\"@({0})\" DestinationFolder=\"{1}\" />",
|
||||
IncludeTags[destPath], destPath);
|
||||
}
|
||||
|
||||
ps.WriteLine(" </Target>");
|
||||
}
|
||||
|
||||
ps.WriteLine(" </ItemGroup>");
|
||||
ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />");
|
||||
ps.WriteLine(" <PropertyGroup>");
|
||||
ps.WriteLine(" <PreBuildEvent>");
|
||||
|
|
|
@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
|
|||
/*
|
||||
* $Source$
|
||||
* $Author: kunnis $
|
||||
* $Date: 2009-04-15 02:33:14 +0100 (Wed, 15 Apr 2009) $
|
||||
* $Date: 2009-04-14 21:33:14 -0400 (Tue, 14 Apr 2009) $
|
||||
* $Revision: 308 $
|
||||
*/
|
||||
#endregion
|
||||
|
|
BIN
bin/C5.dll
BIN
bin/C5.dll
Binary file not shown.
|
@ -181,6 +181,11 @@
|
|||
; ## PHYSICS
|
||||
; ##
|
||||
|
||||
; If true then prims can be collided with by avatars, other prims, etc.
|
||||
; If false then all prims are phantom, no matter whether their phantom flag is checked or unchecked.
|
||||
; Also, no prims are subject to physics.
|
||||
collidable_prim = true
|
||||
|
||||
; If true then prims can be made subject to physics (gravity, pushing, etc.).
|
||||
; If false then physics flag can be set but it is not honoured. However, prims are still solid for the purposes of collision direction
|
||||
physical_prim = true
|
||||
|
|
BIN
bin/Prebuild.exe
BIN
bin/Prebuild.exe
Binary file not shown.
|
@ -82,6 +82,8 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
|
|||
; *
|
||||
[GridService]
|
||||
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
|
||||
HypergridLinker = true
|
||||
|
||||
; Realm = "regions"
|
||||
; AllowDuplicateNames = "True"
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
LandServices = "RemoteLandServicesConnector"
|
||||
FriendsModule = "HGFriendsModule"
|
||||
MapImageService = "MapImageServiceModule"
|
||||
HypergridLinker = "HypergridLinker"
|
||||
|
||||
LandServiceInConnector = true
|
||||
NeighbourServiceInConnector = true
|
||||
|
@ -60,6 +59,7 @@
|
|||
; Needed to display non-default map tile images for linked regions
|
||||
AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
|
||||
|
||||
HypergridLinker = true
|
||||
AllowHypergridMapSearch = true
|
||||
|
||||
[LibraryService]
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
LibraryModule = false
|
||||
|
||||
AssetCaching = "FlotsamAssetCache"
|
||||
HypergridLinker = "HypergridLinker"
|
||||
|
||||
[SimulationDataStore]
|
||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
||||
|
@ -56,6 +55,7 @@
|
|||
StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
|
||||
NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector"
|
||||
|
||||
HypergridLinker = true
|
||||
AllowHypergridMapSearch = true
|
||||
|
||||
[LibraryService]
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
EntityTransferModule = "HGEntityTransferModule"
|
||||
InventoryAccessModule = "HGInventoryAccessModule"
|
||||
FriendsModule = "HGFriendsModule"
|
||||
HypergridLinker = "HypergridLinker"
|
||||
|
||||
InventoryServiceInConnector = true
|
||||
AssetServiceInConnector = true
|
||||
|
@ -84,6 +83,7 @@
|
|||
; Needed to display non-default map tile images for remote regions
|
||||
AssetService = "OpenSim.Services.AssetService.dll:AssetService"
|
||||
|
||||
HypergridLinker = true
|
||||
AllowHypergridMapSearch = true
|
||||
|
||||
[PresenceService]
|
||||
|
|
|
@ -926,6 +926,7 @@
|
|||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="System"/>
|
||||
<Reference name="System.Core"/>
|
||||
<Reference name="System.Web"/>
|
||||
<Reference name="System.Xml"/>
|
||||
<Reference name="System.Drawing"/>
|
||||
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||
|
|
Loading…
Reference in New Issue