Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
ecf9824b63
|
@ -240,78 +240,84 @@ namespace OpenSim.Capabilities.Handlers
|
||||||
|
|
||||||
if (containingFolder != null)
|
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;
|
version = containingFolder.Version;
|
||||||
|
//
|
||||||
if (fetchItems)
|
// if (fetchItems)
|
||||||
{
|
// {
|
||||||
/*
|
// List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>();
|
||||||
List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>();
|
//
|
||||||
|
// foreach (InventoryItemBase item in contents.Items)
|
||||||
foreach (InventoryItemBase item in contents.Items)
|
// {
|
||||||
{
|
// if (item.AssetType == (int)AssetType.Link)
|
||||||
if (item.AssetType == (int)AssetType.Link)
|
// {
|
||||||
{
|
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||||
InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
//
|
||||||
|
// // Take care of genuinely broken links where the target doesn't exist
|
||||||
// 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,
|
||||||
// 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
|
||||||
// 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.
|
||||||
// rather than having to keep track of every folder requested in the recursion.
|
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||||
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link && linkedItem.AssetType == (int)AssetType.Object)
|
// linkedItemsToAdd.Insert(0, linkedItem);
|
||||||
linkedItemsToAdd.Add(linkedItem);
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//
|
||||||
|
// foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
|
||||||
foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
|
// {
|
||||||
{
|
// m_log.DebugFormat(
|
||||||
m_log.DebugFormat(
|
// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
|
||||||
"[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
|
// linkedItem.Name, folderID, agentID);
|
||||||
linkedItem.Name, folderID, agentID);
|
//
|
||||||
|
// contents.Items.Add(linkedItem);
|
||||||
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>();
|
||||||
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
// foreach (InventoryItemBase item in contents.Items)
|
||||||
// will be broken in the viewer.
|
// {
|
||||||
HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
|
// if (item.AssetType == (int)AssetType.Link)
|
||||||
foreach (InventoryItemBase item in contents.Items)
|
// {
|
||||||
{
|
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||||
if (item.AssetType == (int)AssetType.Link)
|
//
|
||||||
{
|
// // Take care of genuinely broken links where the target doesn't exist
|
||||||
InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
// // 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
|
||||||
// Take care of genuinely broken links where the target doesn't exist
|
// // rather than having to keep track of every folder requested in the recursion.
|
||||||
// HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||||
// 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.
|
// // We don't need to send the folder if source and destination of the link are in the same
|
||||||
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
// // folder.
|
||||||
{
|
// if (linkedItem.Folder != containingFolder.ID)
|
||||||
// We don't need to send the folder if source and destination of the link are in the same
|
// linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||||
// folder.
|
// }
|
||||||
if (linkedItem.Folder != containingFolder.ID)
|
// }
|
||||||
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
// }
|
||||||
}
|
//
|
||||||
}
|
// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||||
}
|
// {
|
||||||
|
// m_log.DebugFormat(
|
||||||
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
|
||||||
{
|
// linkedItemFolderId, folderID, agentID);
|
||||||
m_log.DebugFormat(
|
//
|
||||||
"[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
|
// int dummyVersion;
|
||||||
linkedItemFolderId, folderID, agentID);
|
// InventoryCollection linkedCollection
|
||||||
|
// = Fetch(
|
||||||
int dummyVersion;
|
// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
|
||||||
InventoryCollection linkedCollection
|
//
|
||||||
= Fetch(
|
// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId);
|
||||||
agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
|
// linkedFolder.Owner = agentID;
|
||||||
|
// linkedFolder = m_InventoryService.GetFolder(linkedFolder);
|
||||||
contents.Folders.AddRange(linkedCollection.Folders);
|
//
|
||||||
contents.Items.AddRange(linkedCollection.Items);
|
//// contents.Folders.AddRange(linkedCollection.Folders);
|
||||||
}
|
//
|
||||||
*/
|
// contents.Folders.Add(linkedFolder);
|
||||||
}
|
// contents.Items.AddRange(linkedCollection.Items);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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 IAssetService AssetService;
|
||||||
public UUID AgentID;
|
public UUID AgentID;
|
||||||
public IInventoryAccessModule InventoryAccessModule;
|
public IInventoryAccessModule InventoryAccessModule;
|
||||||
public OpenJPEG.J2KLayerInfo[] Layers;
|
private OpenJPEG.J2KLayerInfo[] m_layers;
|
||||||
public bool IsDecoded;
|
public bool IsDecoded { get; private set; }
|
||||||
public bool HasAsset;
|
public bool HasAsset { get; private set; }
|
||||||
public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle;
|
public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle;
|
||||||
|
|
||||||
private uint m_currentPacket;
|
private uint m_currentPacket;
|
||||||
|
@ -170,14 +170,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
if (DiscardLevel >= 0 || m_stopPacket == 0)
|
if (DiscardLevel >= 0 || m_stopPacket == 0)
|
||||||
{
|
{
|
||||||
// This shouldn't happen, but if it does, we really can't proceed
|
// 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_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer");
|
||||||
m_currentPacket = m_stopPacket;
|
m_currentPacket = m_stopPacket;
|
||||||
return;
|
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
|
// Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel
|
||||||
if (DiscardLevel < 0 && m_stopPacket == 0)
|
if (DiscardLevel < 0 && m_stopPacket == 0)
|
||||||
|
@ -187,9 +187,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel);
|
DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel);
|
||||||
|
|
||||||
//Calculate the m_stopPacket
|
//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
|
//I don't know why, but the viewer seems to expect the final packet if the file
|
||||||
//is just one packet bigger.
|
//is just one packet bigger.
|
||||||
if (TexturePacketCount() == m_stopPacket + 1)
|
if (TexturePacketCount() == m_stopPacket + 1)
|
||||||
|
@ -341,7 +341,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers)
|
private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers)
|
||||||
{
|
{
|
||||||
Layers = layers;
|
m_layers = layers;
|
||||||
IsDecoded = true;
|
IsDecoded = true;
|
||||||
RunUpdate();
|
RunUpdate();
|
||||||
}
|
}
|
||||||
|
@ -385,8 +385,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
string assetServerURL = string.Empty;
|
string assetServerURL = string.Empty;
|
||||||
if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL))
|
if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id);
|
if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("="))
|
||||||
AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,9 @@ using log4net;
|
||||||
|
|
||||||
namespace OpenSim.Region.ClientStack.LindenUDP
|
namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This class handles UDP texture requests.
|
||||||
|
/// </summary>
|
||||||
public class LLImageManager
|
public class LLImageManager
|
||||||
{
|
{
|
||||||
private sealed class J2KImageComparer : IComparer<J2KImage>
|
private sealed class J2KImageComparer : IComparer<J2KImage>
|
||||||
|
@ -208,7 +211,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
#region Priority Queue Helpers
|
#region Priority Queue Helpers
|
||||||
|
|
||||||
J2KImage GetHighestPriorityImage()
|
private J2KImage GetHighestPriorityImage()
|
||||||
{
|
{
|
||||||
J2KImage image = null;
|
J2KImage image = null;
|
||||||
|
|
||||||
|
@ -223,23 +226,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddImageToQueue(J2KImage image)
|
private void AddImageToQueue(J2KImage image)
|
||||||
{
|
{
|
||||||
image.PriorityQueueHandle = null;
|
image.PriorityQueueHandle = null;
|
||||||
|
|
||||||
lock (m_syncRoot)
|
lock (m_syncRoot)
|
||||||
|
{
|
||||||
try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); }
|
try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); }
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveImageFromQueue(J2KImage image)
|
private void RemoveImageFromQueue(J2KImage image)
|
||||||
{
|
{
|
||||||
lock (m_syncRoot)
|
lock (m_syncRoot)
|
||||||
|
{
|
||||||
try { m_priorityQueue.Delete(image.PriorityQueueHandle); }
|
try { m_priorityQueue.Delete(image.PriorityQueueHandle); }
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateImageInQueue(J2KImage image)
|
private void UpdateImageInQueue(J2KImage image)
|
||||||
{
|
{
|
||||||
lock (m_syncRoot)
|
lock (m_syncRoot)
|
||||||
{
|
{
|
||||||
|
|
|
@ -152,6 +152,9 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||||
/// <param name="j2kData">JPEG2000 data</param>
|
/// <param name="j2kData">JPEG2000 data</param>
|
||||||
private void DoJ2KDecode(UUID assetID, byte[] j2kData)
|
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;
|
//int DecodeTime = 0;
|
||||||
//DecodeTime = Environment.TickCount;
|
//DecodeTime = Environment.TickCount;
|
||||||
OpenJPEG.J2KLayerInfo[] layers;
|
OpenJPEG.J2KLayerInfo[] layers;
|
||||||
|
|
|
@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
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
|
#region ISharedRegionModule
|
||||||
public override string Name
|
public override string Name
|
||||||
{
|
{
|
||||||
|
@ -369,9 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
protected override FriendInfo[] GetFriendsFromService(IClientAPI client)
|
protected override FriendInfo[] GetFriendsFromService(IClientAPI client)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name);
|
// 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 (agentIsLocal)
|
||||||
if (account1 != null)
|
|
||||||
return base.GetFriendsFromService(client);
|
return base.GetFriendsFromService(client);
|
||||||
|
|
||||||
FriendInfo[] finfos = new FriendInfo[0];
|
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)
|
protected override bool StoreRights(UUID agentID, UUID friendID, int rights)
|
||||||
{
|
{
|
||||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
Boolean agentIsLocal = true;
|
||||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
Boolean friendIsLocal = true;
|
||||||
|
if (UserManagementModule != null)
|
||||||
|
{
|
||||||
|
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||||
|
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||||
|
}
|
||||||
|
|
||||||
// Are they both local users?
|
// Are they both local users?
|
||||||
if (account1 != null && account2 != null)
|
if (agentIsLocal && friendIsLocal)
|
||||||
{
|
{
|
||||||
// local grid users
|
// local grid users
|
||||||
return base.StoreRights(agentID, friendID, rights);
|
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[] finfos = GetFriends(agentID);
|
||||||
FriendInfo finfo = GetFriend(finfos, friendID);
|
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);
|
string agentUUI = GetUUI(friendID, agentID);
|
||||||
if (agentUUI != string.Empty)
|
if (agentUUI != string.Empty)
|
||||||
|
@ -427,10 +446,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
|
|
||||||
protected override void StoreBackwards(UUID friendID, UUID agentID)
|
protected override void StoreBackwards(UUID friendID, UUID agentID)
|
||||||
{
|
{
|
||||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
Boolean agentIsLocal = true;
|
||||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
Boolean friendIsLocal = true;
|
||||||
|
if (UserManagementModule != null)
|
||||||
|
{
|
||||||
|
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||||
|
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||||
|
}
|
||||||
|
|
||||||
// Are they both local users?
|
// Are they both local users?
|
||||||
if (account1 != null && account2 != null)
|
if (agentIsLocal && friendIsLocal)
|
||||||
{
|
{
|
||||||
// local grid users
|
// local grid users
|
||||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
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)
|
protected override void StoreFriendships(UUID agentID, UUID friendID)
|
||||||
{
|
{
|
||||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
Boolean agentIsLocal = true;
|
||||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
Boolean friendIsLocal = true;
|
||||||
|
if (UserManagementModule != null)
|
||||||
|
{
|
||||||
|
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||||
|
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||||
|
}
|
||||||
|
|
||||||
// Are they both local users?
|
// Are they both local users?
|
||||||
if (agentAccount != null && friendAccount != null)
|
if (agentIsLocal && friendIsLocal)
|
||||||
{
|
{
|
||||||
// local grid users
|
// local grid users
|
||||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
||||||
|
@ -465,13 +496,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
string agentFriendService = string.Empty;
|
string agentFriendService = string.Empty;
|
||||||
string friendFriendService = string.Empty;
|
string friendFriendService = string.Empty;
|
||||||
|
|
||||||
if (agentClient != null)
|
if (agentIsLocal)
|
||||||
{
|
{
|
||||||
agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode);
|
agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode);
|
||||||
agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit);
|
agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit);
|
||||||
agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString();
|
agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString();
|
||||||
}
|
}
|
||||||
if (friendClient != null)
|
if (friendIsLocal)
|
||||||
{
|
{
|
||||||
friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode);
|
friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode);
|
||||||
friendUUI = Util.ProduceUserUniversalIdentifier(friendClientCircuit);
|
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
|
// Generate a random 8-character hex number that will sign this friendship
|
||||||
string secret = UUID.Random().ToString().Substring(0, 8);
|
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
|
// 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
|
// 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);
|
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
|
// store in the local friends service a reference to the foreign agent
|
||||||
FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1);
|
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)
|
protected override bool DeleteFriendship(UUID agentID, UUID exfriendID)
|
||||||
{
|
{
|
||||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
Boolean agentIsLocal = true;
|
||||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, exfriendID);
|
Boolean friendIsLocal = true;
|
||||||
|
if (UserManagementModule != null)
|
||||||
|
{
|
||||||
|
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||||
|
friendIsLocal = UserManagementModule.IsLocalGridUser(exfriendID);
|
||||||
|
}
|
||||||
|
|
||||||
// Are they both local users?
|
// Are they both local users?
|
||||||
if (agentAccount != null && friendAccount != null)
|
if (agentIsLocal && friendIsLocal)
|
||||||
{
|
{
|
||||||
// local grid users
|
// local grid users
|
||||||
return base.DeleteFriendship(agentID, exfriendID);
|
return base.DeleteFriendship(agentID, exfriendID);
|
||||||
|
@ -566,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
string agentUUI = string.Empty;
|
string agentUUI = string.Empty;
|
||||||
string friendUUI = 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
|
// We need to look for its information in the friends list itself
|
||||||
FriendInfo[] finfos = GetFriends(agentID);
|
FriendInfo[] finfos = GetFriends(agentID);
|
||||||
|
@ -587,7 +624,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
return true;
|
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);
|
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);
|
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
|
||||||
// Is the user a local user?
|
// Is the user a local user?
|
||||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID);
|
|
||||||
string url = string.Empty;
|
string url = string.Empty;
|
||||||
bool foreigner = false;
|
bool foreigner = false;
|
||||||
if (account == null) // foreign user
|
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(toAgentID)) // foreign user
|
||||||
{
|
{
|
||||||
url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI");
|
url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI");
|
||||||
foreigner = true;
|
foreigner = true;
|
||||||
|
|
|
@ -43,7 +43,7 @@ using OpenSim.Services.Interfaces;
|
||||||
namespace OpenSim.Region.CoreModules.Avatar.Profile
|
namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||||
{
|
{
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
[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);
|
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)
|
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"] != null)
|
||||||
{
|
{
|
||||||
if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule")
|
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_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled");
|
||||||
m_Enabled = true;
|
m_Enabled = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRegion(Scene scene)
|
public void AddRegion(Scene scene)
|
||||||
|
@ -80,6 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||||
m_Scenes.Add(scene);
|
m_Scenes.Add(scene);
|
||||||
// Hook up events
|
// Hook up events
|
||||||
scene.EventManager.OnNewClient += OnNewClient;
|
scene.EventManager.OnNewClient += OnNewClient;
|
||||||
|
scene.RegisterModuleInterface<IProfileModule>(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +118,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||||
|
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
{
|
{
|
||||||
get { return null; }
|
get { return typeof(IProfileModule); }
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -676,9 +676,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
Vector3 eastCross = new Vector3(boundaryDistance, 0, 0);
|
Vector3 eastCross = new Vector3(boundaryDistance, 0, 0);
|
||||||
Vector3 westCross = new Vector3(-1 * 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
|
// distance into new region to place avatar
|
||||||
const float enterDistance = 0.5f;
|
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.",
|
"[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);
|
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);
|
SetInTransit(agent.UUID);
|
||||||
|
|
||||||
AgentData cAgent = new AgentData();
|
AgentData cAgent = new AgentData();
|
||||||
agent.CopyTo(cAgent);
|
agent.CopyTo(cAgent);
|
||||||
cAgent.Position = pos;
|
cAgent.Position = pos;
|
||||||
if (isFlying)
|
if (isFlying)
|
||||||
cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
|
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))
|
if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
|
||||||
{
|
{
|
||||||
// region doesn't take it
|
// region doesn't take it
|
||||||
ReInstantiateScripts(agent);
|
ReInstantiateScripts(agent);
|
||||||
|
agent.AddToPhysicalScene(isFlying);
|
||||||
ResetFromTransit(agent.UUID);
|
ResetFromTransit(agent.UUID);
|
||||||
return agent;
|
return agent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next, let's close the child agent connections that are too far away.
|
|
||||||
agent.CloseChildAgents(neighbourx, neighboury);
|
|
||||||
|
|
||||||
//AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
|
//AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
|
||||||
agent.ControllingClient.RequestClientInfo();
|
agent.ControllingClient.RequestClientInfo();
|
||||||
|
|
||||||
|
@ -1003,7 +1002,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
|
IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
|
||||||
if (eq != null)
|
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);
|
capsPath, agent.UUID, agent.ControllingClient.SessionId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1012,32 +1011,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
capsPath);
|
capsPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WaitForCallback(agent.UUID))
|
// SUCCESS!
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
agent.MakeChildAgent();
|
agent.MakeChildAgent();
|
||||||
|
ResetFromTransit(agent.UUID);
|
||||||
|
|
||||||
// now we have a child agent in this region. Request all interesting data about other (root) agents
|
// now we have a child agent in this region. Request all interesting data about other (root) agents
|
||||||
agent.SendOtherAgentsAvatarDataToMe();
|
agent.SendOtherAgentsAvatarDataToMe();
|
||||||
agent.SendOtherAgentsAppearanceToMe();
|
agent.SendOtherAgentsAppearanceToMe();
|
||||||
|
|
||||||
// Backwards compatibility
|
// Backwards compatibility. Best effort
|
||||||
if (version == "Unknown" || version == string.Empty)
|
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);
|
CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Next, let's close the child agent connections that are too far away.
|
||||||
|
agent.CloseChildAgents(neighbourx, neighboury);
|
||||||
|
|
||||||
AgentHasMovedAway(agent, false);
|
AgentHasMovedAway(agent, false);
|
||||||
|
|
||||||
// the user may change their profile information in other region,
|
// 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;
|
CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState;
|
||||||
ScenePresence agent = icon.EndInvoke(iar);
|
ScenePresence agent = icon.EndInvoke(iar);
|
||||||
|
|
||||||
// If the cross was successful, this agent is a child agent
|
//// If the cross was successful, this agent is a child agent
|
||||||
if (agent.IsChildAgent)
|
//if (agent.IsChildAgent)
|
||||||
agent.Reset();
|
// agent.Reset();
|
||||||
else // Not successful
|
//else // Not successful
|
||||||
agent.RestoreInCurrentScene();
|
// agent.RestoreInCurrentScene();
|
||||||
|
|
||||||
// In any case
|
// In any case
|
||||||
agent.IsInTransit = false;
|
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
|
#endregion
|
||||||
|
@ -1712,9 +1705,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
uint x = 0, y = 0;
|
uint x = 0, y = 0;
|
||||||
Utils.LongToUInts(newRegionHandle, out x, out y);
|
Utils.LongToUInts(newRegionHandle, out x, out y);
|
||||||
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)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;
|
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();
|
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);
|
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
|
// 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);
|
IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>();
|
||||||
if (account != null)
|
if (uMan != null && uMan.IsLocalGridUser(id))
|
||||||
{
|
{
|
||||||
// local grid user
|
// local grid user
|
||||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local");
|
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>();
|
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
|
||||||
GridRegion homeGatekeeper = MakeRegion(aCircuit);
|
GridRegion homeGatekeeper = MakeRegion(aCircuit);
|
||||||
|
|
||||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}:{5}",
|
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}",
|
||||||
aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName);
|
aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName);
|
||||||
|
|
||||||
DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq);
|
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
|
// 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);
|
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
|
// local grid user
|
||||||
return;
|
return;
|
||||||
|
@ -347,6 +348,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
region.ExternalHostName = uri.Host;
|
region.ExternalHostName = uri.Host;
|
||||||
region.HttpPort = (uint)uri.Port;
|
region.HttpPort = (uint)uri.Port;
|
||||||
|
region.ServerURI = uri.ToString();
|
||||||
region.RegionName = string.Empty;
|
region.RegionName = string.Empty;
|
||||||
region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0);
|
region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0);
|
||||||
return region;
|
return region;
|
||||||
|
|
|
@ -73,7 +73,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
public AssetBase FetchAsset(string url, UUID assetID)
|
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)
|
if (asset != null)
|
||||||
{
|
{
|
||||||
|
@ -87,6 +90,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
{
|
{
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
{
|
{
|
||||||
|
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||||
|
url = url + "/";
|
||||||
|
|
||||||
// See long comment in AssetCache.AddAsset
|
// See long comment in AssetCache.AddAsset
|
||||||
if (!asset.Temporary || asset.Local)
|
if (!asset.Temporary || asset.Local)
|
||||||
{
|
{
|
||||||
|
@ -99,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
Copy(asset, asset1);
|
Copy(asset, asset1);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
asset1.ID = url + "/" + asset.ID;
|
asset1.ID = url + asset.ID;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
|
@ -124,8 +124,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
protected override string GenerateLandmark(ScenePresence presence, out string prefix, out string suffix)
|
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 (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(presence.UUID))
|
||||||
if (account == null)
|
|
||||||
prefix = "HG ";
|
prefix = "HG ";
|
||||||
else
|
else
|
||||||
prefix = string.Empty;
|
prefix = string.Empty;
|
||||||
|
@ -210,12 +209,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
public override bool IsForeignUser(UUID userID, out string assetServerURL)
|
public override bool IsForeignUser(UUID userID, out string assetServerURL)
|
||||||
{
|
{
|
||||||
assetServerURL = string.Empty;
|
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;
|
ScenePresence sp = null;
|
||||||
if (m_Scene.TryGetScenePresence(userID, out sp))
|
if (m_Scene.TryGetScenePresence(userID, out sp))
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,6 +50,9 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||||
public string LastName { get; set; }
|
public string LastName { get; set; }
|
||||||
public string HomeURL { get; set; }
|
public string HomeURL { get; set; }
|
||||||
public Dictionary<string, object> ServerURLs { 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
|
public class UserManagementModule : ISharedRegionModule, IUserManagement
|
||||||
|
@ -281,6 +284,94 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||||
return string.Empty;
|
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)
|
public string GetUserUUI(UUID userID)
|
||||||
{
|
{
|
||||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, 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();
|
UserData user = new UserData();
|
||||||
user.Id = id;
|
user.Id = id;
|
||||||
|
user.Flags = -1;
|
||||||
|
user.Created = -1;
|
||||||
|
|
||||||
if (creatorData != null && creatorData != string.Empty)
|
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
|
#endregion IUserManagement
|
||||||
|
|
||||||
private void HandleShowUsers(string module, string[] cmd)
|
private void HandleShowUsers(string module, string[] cmd)
|
||||||
|
|
|
@ -153,10 +153,18 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
||||||
|
|
||||||
public void SendProfileToClient(IClientAPI client, RegionLightShareData wl)
|
public void SendProfileToClient(IClientAPI client, RegionLightShareData wl)
|
||||||
{
|
{
|
||||||
if (m_enableWindlight && m_scene.RegionInfo.WindlightSettings.valid)
|
if (m_enableWindlight)
|
||||||
{
|
{
|
||||||
List<byte[]> param = compileWindlightSettings(wl);
|
if (m_scene.RegionInfo.WindlightSettings.valid)
|
||||||
client.SendGenericMessage("Windlight", param);
|
{
|
||||||
|
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()
|
private void EventManager_OnSaveNewWindlightProfile()
|
||||||
{
|
{
|
||||||
if (m_scene.RegionInfo.WindlightSettings.valid)
|
m_scene.ForEachRootClient(SendProfileToClient);
|
||||||
m_scene.ForEachRootClient(SendProfileToClient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PostInitialise()
|
public void PostInitialise()
|
||||||
|
|
|
@ -411,8 +411,21 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
Request.Timeout = HttpTimeout;
|
Request.Timeout = HttpTimeout;
|
||||||
// execute the request
|
try
|
||||||
response = (HttpWebResponse) Request.GetResponse();
|
{
|
||||||
|
// 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();
|
Stream resStream = response.GetResponseStream();
|
||||||
|
|
||||||
|
@ -436,17 +449,8 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError)
|
Status = (int)OSHttpStatusCode.ClientErrorJoker;
|
||||||
{
|
ResponseBody = e.Message;
|
||||||
HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response;
|
|
||||||
Status = (int)webRsp.StatusCode;
|
|
||||||
ResponseBody = webRsp.StatusDescription;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = (int)OSHttpStatusCode.ClientErrorJoker;
|
|
||||||
ResponseBody = e.Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
_finished = true;
|
_finished = true;
|
||||||
return;
|
return;
|
||||||
|
@ -457,7 +461,6 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
||||||
response.Close();
|
response.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = (int)OSHttpStatusCode.SuccessOk;
|
|
||||||
_finished = true;
|
_finished = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -382,23 +382,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
return result;
|
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)
|
public AssetBase GetCached(string id)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Cache request for {0}", id);
|
||||||
|
|
||||||
if (m_Cache != null)
|
if (m_Cache != null)
|
||||||
return m_Cache.Get(id);
|
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>
|
/// <param name="userID"></param>
|
||||||
private void CacheInventoryServiceURL(UUID userID)
|
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;
|
string inventoryURL = string.Empty;
|
||||||
ScenePresence sp = null;
|
ScenePresence sp = null;
|
||||||
foreach (Scene scene in m_Scenes)
|
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 GetUserHomeURL(UUID uuid);
|
||||||
string GetUserUUI(UUID uuid);
|
string GetUserUUI(UUID uuid);
|
||||||
string GetUserServerURL(UUID uuid, string serverType);
|
string GetUserServerURL(UUID uuid, string serverType);
|
||||||
|
int GetUserFlags(UUID userID);
|
||||||
|
int GetUserCreated(UUID userID);
|
||||||
|
string GetUserTitle(UUID userID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add a user.
|
/// Add a user.
|
||||||
|
@ -48,5 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// <param name="firstName"></param>
|
/// <param name="firstName"></param>
|
||||||
/// <param name="profileURL"></param>
|
/// <param name="profileURL"></param>
|
||||||
void AddUser(UUID uuid, string firstName, string lastName, string profileURL);
|
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
|
/// Controls whether physics can be applied to prims. Even if false, prims still have entries in a
|
||||||
/// PhysicsScene in order to perform collision detection
|
/// PhysicsScene in order to perform collision detection
|
||||||
/// </summary>
|
/// </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_maxNonphys = 256;
|
||||||
public float m_maxPhys = 10;
|
public float m_maxPhys = 10;
|
||||||
|
@ -650,7 +658,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
//Animation states
|
//Animation states
|
||||||
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
|
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);
|
m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
|
||||||
if (RegionInfo.NonphysPrimMax > 0)
|
if (RegionInfo.NonphysPrimMax > 0)
|
||||||
|
@ -701,7 +710,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (maptileRefresh != 0)
|
if (maptileRefresh != 0)
|
||||||
{
|
{
|
||||||
m_mapGenerationTimer.Interval = maptileRefresh * 1000;
|
m_mapGenerationTimer.Interval = maptileRefresh * 1000;
|
||||||
m_mapGenerationTimer.Elapsed += RegenerateMaptile;
|
m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
|
||||||
m_mapGenerationTimer.AutoReset = true;
|
m_mapGenerationTimer.AutoReset = true;
|
||||||
m_mapGenerationTimer.Start();
|
m_mapGenerationTimer.Start();
|
||||||
}
|
}
|
||||||
|
@ -1638,21 +1647,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_sceneGridService.SetScene(this);
|
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);
|
GridRegion region = new GridRegion(RegionInfo);
|
||||||
string error = GridService.RegisterRegion(RegionInfo.ScopeID, region);
|
string error = GridService.RegisterRegion(RegionInfo.ScopeID, region);
|
||||||
if (error != String.Empty)
|
if (error != String.Empty)
|
||||||
{
|
|
||||||
throw new Exception(error);
|
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
|
#endregion
|
||||||
|
@ -5023,13 +5028,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
public void RegenerateMaptile(object sender, ElapsedEventArgs e)
|
private void RegenerateMaptile()
|
||||||
{
|
{
|
||||||
IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>();
|
IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>();
|
||||||
if (mapModule != null)
|
if (mapModule != null)
|
||||||
mapModule.GenerateMaptile();
|
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
|
// This method is called across the simulation connector to
|
||||||
// determine if a given agent is allowed in this region
|
// determine if a given agent is allowed in this region
|
||||||
// AS A ROOT AGENT. Returning false here will prevent them
|
// AS A ROOT AGENT. Returning false here will prevent them
|
||||||
|
|
|
@ -333,7 +333,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (rot != null)
|
if (rot != null)
|
||||||
sceneObject.UpdateGroupRotationR((Quaternion)rot);
|
sceneObject.UpdateGroupRotationR((Quaternion)rot);
|
||||||
|
|
||||||
//group.ApplyPhysics(m_physicalPrim);
|
|
||||||
if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
|
if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
|
||||||
{
|
{
|
||||||
sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
|
sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
|
||||||
|
|
|
@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool UsesPhysics
|
public bool UsesPhysics
|
||||||
{
|
{
|
||||||
get { return (RootPart.Flags & PrimFlags.TemporaryOnRez) != 0; }
|
get { return (RootPart.Flags & PrimFlags.Physics) != 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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);
|
//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
|
// 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.
|
// for the same object with very different properties. The caller must schedule the update.
|
||||||
|
@ -1239,8 +1239,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Apply physics to this group
|
/// Apply physics to this group
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="m_physicalPrim"></param>
|
public void ApplyPhysics()
|
||||||
public void ApplyPhysics(bool m_physicalPrim)
|
|
||||||
{
|
{
|
||||||
// Apply physics to the root prim
|
// Apply physics to the root prim
|
||||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
|
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
|
||||||
|
|
|
@ -1473,6 +1473,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="VolumeDetectActive"></param>
|
/// <param name="VolumeDetectActive"></param>
|
||||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
|
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
|
||||||
{
|
{
|
||||||
|
if (!ParentGroup.Scene.CollidablePrims)
|
||||||
|
return;
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}",
|
// "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}",
|
||||||
// Name, LocalId, UUID, m_physicalPrim);
|
// Name, LocalId, UUID, m_physicalPrim);
|
||||||
|
@ -1739,7 +1742,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="isNew"></param>
|
/// <param name="isNew"></param>
|
||||||
public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
|
public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
|
||||||
{
|
{
|
||||||
if (!ParentGroup.Scene.m_physicalPrim && UsePhysics)
|
if (!ParentGroup.Scene.PhysicalPrims && UsePhysics)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (IsJoint())
|
if (IsJoint())
|
||||||
|
@ -4318,7 +4321,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (ParentGroup.Scene == null)
|
if (ParentGroup.Scene == null)
|
||||||
return;
|
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
|
// It's not phantom anymore. So make sure the physics engine get's knowledge of it
|
||||||
PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape(
|
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
|
/// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is
|
||||||
/// necessary.
|
/// necessary.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
|
private List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
public Object AttachmentsSyncLock { get; private set; }
|
public Object AttachmentsSyncLock { get; private set; }
|
||||||
|
|
||||||
|
@ -550,8 +550,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pos = value;
|
// Don't update while sitting
|
||||||
ParentPosition = Vector3.Zero;
|
if (ParentID == 0)
|
||||||
|
{
|
||||||
|
m_pos = value;
|
||||||
|
ParentPosition = Vector3.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
//m_log.DebugFormat(
|
//m_log.DebugFormat(
|
||||||
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
|
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
|
||||||
|
@ -566,6 +570,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public Vector3 OffsetPosition
|
public Vector3 OffsetPosition
|
||||||
{
|
{
|
||||||
get { return m_pos; }
|
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>
|
/// <summary>
|
||||||
|
@ -1162,9 +1175,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
// DateTime startTime = DateTime.Now;
|
// DateTime startTime = DateTime.Now;
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
// "[SCENE PRESENCE]: Completing movement of {0} into region {1}",
|
"[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
|
||||||
// client.Name, Scene.RegionInfo.RegionName);
|
client.Name, Scene.RegionInfo.RegionName, AbsolutePosition);
|
||||||
|
|
||||||
Vector3 look = Velocity;
|
Vector3 look = Velocity;
|
||||||
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
||||||
|
@ -2383,9 +2396,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_lastVelocity = Velocity;
|
m_lastVelocity = Velocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
// followed suggestion from mic bowman. reversed the two lines below.
|
CheckForBorderCrossing();
|
||||||
if (ParentID == 0 && PhysicsActor != null || ParentID != 0) // Check that we have a physics actor or we're sitting on something
|
|
||||||
CheckForBorderCrossing();
|
|
||||||
|
|
||||||
CheckForSignificantMovement(); // sends update to the modules.
|
CheckForSignificantMovement(); // sends update to the modules.
|
||||||
}
|
}
|
||||||
|
@ -2738,142 +2749,145 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected void CheckForBorderCrossing()
|
protected void CheckForBorderCrossing()
|
||||||
{
|
{
|
||||||
|
// Check that we we are not a child
|
||||||
if (IsChildAgent)
|
if (IsChildAgent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Vector3 pos2 = AbsolutePosition;
|
// If we don't have a PhysActor, we can't cross anyway
|
||||||
Vector3 vel = Velocity;
|
// Also don't do this while sat, sitting avatars cross with the
|
||||||
int neighbor = 0;
|
// object they sit on.
|
||||||
int[] fix = new int[2];
|
if (ParentID != 0 || PhysicsActor == null)
|
||||||
|
return;
|
||||||
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 (!IsInTransit)
|
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;
|
float timeStep = 0.1f;
|
||||||
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;
|
|
||||||
pos2.X = pos2.X + (vel.X * timeStep);
|
pos2.X = pos2.X + (vel.X * timeStep);
|
||||||
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
||||||
pos2.Z = pos2.Z + (vel.Z * 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 { }
|
catch { }
|
||||||
|
|
||||||
// Attachment objects
|
// 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>();
|
||||||
cAgent.AttachmentObjects = new List<ISceneObject>();
|
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
||||||
cAgent.AttachmentObjectStates = new List<string>();
|
InTransitScriptStates.Clear();
|
||||||
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
|
||||||
InTransitScriptStates.Clear();
|
|
||||||
|
|
||||||
foreach (SceneObjectGroup sog in m_attachments)
|
foreach (SceneObjectGroup sog in attachments)
|
||||||
{
|
{
|
||||||
// We need to make a copy and pass that copy
|
// We need to make a copy and pass that copy
|
||||||
// because of transfers withn the same sim
|
// because of transfers withn the same sim
|
||||||
ISceneObject clone = sog.CloneForNewScene();
|
ISceneObject clone = sog.CloneForNewScene();
|
||||||
// Attachment module assumes that GroupPosition holds the offsets...!
|
// Attachment module assumes that GroupPosition holds the offsets...!
|
||||||
((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
|
((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
|
||||||
((SceneObjectGroup)clone).IsAttachment = false;
|
((SceneObjectGroup)clone).IsAttachment = false;
|
||||||
cAgent.AttachmentObjects.Add(clone);
|
cAgent.AttachmentObjects.Add(clone);
|
||||||
string state = sog.GetStateSnapshot();
|
string state = sog.GetStateSnapshot();
|
||||||
cAgent.AttachmentObjectStates.Add(state);
|
cAgent.AttachmentObjectStates.Add(state);
|
||||||
InTransitScriptStates.Add(state);
|
InTransitScriptStates.Add(state);
|
||||||
// Let's remove the scripts of the original object here
|
// Let's remove the scripts of the original object here
|
||||||
sog.RemoveScriptInstances(true);
|
sog.RemoveScriptInstances(true);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3535,26 +3547,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="args">The arguments for the event</param>
|
/// <param name="args">The arguments for the event</param>
|
||||||
public void SendScriptEventToAttachments(string eventName, Object[] args)
|
public void SendScriptEventToAttachments(string eventName, Object[] args)
|
||||||
{
|
{
|
||||||
if (m_scriptEngines.Length == 0)
|
Util.FireAndForget(delegate(object x)
|
||||||
return;
|
|
||||||
|
|
||||||
lock (m_attachments)
|
|
||||||
{
|
{
|
||||||
foreach (SceneObjectGroup grp in m_attachments)
|
if (m_scriptEngines.Length == 0)
|
||||||
{
|
return;
|
||||||
// 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 });
|
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)
|
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_regionWidth = Constants.RegionSize;
|
||||||
private const uint m_regionHeight = 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 metersInSpace = 29.9f;
|
||||||
private float m_timeDilation = 1.0f;
|
private float m_timeDilation = 1.0f;
|
||||||
|
|
||||||
|
@ -456,7 +456,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f);
|
mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f);
|
||||||
mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f);
|
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);
|
m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10);
|
||||||
|
|
||||||
avDensity = physicsconfig.GetFloat("av_density", 80f);
|
avDensity = physicsconfig.GetFloat("av_density", 80f);
|
||||||
|
@ -2822,6 +2822,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_global_contactcount = 0;
|
m_global_contactcount = 0;
|
||||||
|
|
||||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||||
|
|
||||||
d.JointGroupEmpty(contactgroup);
|
d.JointGroupEmpty(contactgroup);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -486,6 +486,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false;
|
m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false;
|
||||||
if (m_host.ParentGroup.Scene.SimulationDataService != null)
|
if (m_host.ParentGroup.Scene.SimulationDataService != null)
|
||||||
m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID);
|
m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID);
|
||||||
|
m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile();
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the current Windlight scene to a target avatar
|
/// 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("status_notification", StatusNotification, false);
|
||||||
server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false);
|
server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false);
|
||||||
|
server.AddXmlRPCHandler("get_user_info", GetUserInfo, false);
|
||||||
server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false);
|
server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false);
|
||||||
|
|
||||||
server.AddXmlRPCHandler("locate_user", LocateUser, 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)
|
public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||||
{
|
{
|
||||||
Hashtable hash = new Hashtable();
|
Hashtable hash = new Hashtable();
|
||||||
|
|
|
@ -231,7 +231,7 @@ namespace OpenSim.Server.Handlers.UserAccounts
|
||||||
|
|
||||||
int userLevel = 0;
|
int userLevel = 0;
|
||||||
if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel))
|
if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel))
|
||||||
existingAccount.UserFlags = userLevel;
|
existingAccount.UserLevel = userLevel;
|
||||||
|
|
||||||
int userFlags = 0;
|
int userFlags = 0;
|
||||||
if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags))
|
if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags))
|
||||||
|
|
|
@ -100,6 +100,8 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
public AssetBase Get(string id)
|
public AssetBase Get(string id)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Synchronous get request for {0}", id);
|
||||||
|
|
||||||
string uri = m_ServerURI + "/assets/" + id;
|
string uri = m_ServerURI + "/assets/" + id;
|
||||||
|
|
||||||
AssetBase asset = null;
|
AssetBase asset = null;
|
||||||
|
@ -119,6 +121,8 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
public AssetBase GetCached(string id)
|
public AssetBase GetCached(string id)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Cache request for {0}", id);
|
||||||
|
|
||||||
if (m_Cache != null)
|
if (m_Cache != null)
|
||||||
return m_Cache.Get(id);
|
return m_Cache.Get(id);
|
||||||
|
|
||||||
|
@ -177,6 +181,8 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
public bool Get(string id, Object sender, AssetRetrieved handler)
|
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;
|
string uri = m_ServerURI + "/assets/" + id;
|
||||||
|
|
||||||
AssetBase asset = null;
|
AssetBase asset = null;
|
||||||
|
|
|
@ -29,7 +29,9 @@ using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Web;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Services.Connectors.Hypergrid;
|
using OpenSim.Services.Connectors.Hypergrid;
|
||||||
|
@ -73,11 +75,26 @@ namespace OpenSim.Services.Connectors
|
||||||
if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) &&
|
if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) &&
|
||||||
assetUri.Scheme == Uri.UriSchemeHttp)
|
assetUri.Scheme == Uri.UriSchemeHttp)
|
||||||
{
|
{
|
||||||
url = "http://" + assetUri.Authority;
|
// Simian
|
||||||
assetID = assetUri.LocalPath.Trim(new char[] {'/'});
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("[HG ASSET SERVICE]: Malformed URL {0}", id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,13 +47,36 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
public HeloServicesConnector(string serverURI)
|
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()
|
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
|
// Eventually we need to switch to HEAD
|
||||||
/* req.Method = "HEAD"; */
|
/* req.Method = "HEAD"; */
|
||||||
|
|
||||||
|
|
|
@ -334,6 +334,9 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
||||||
UInt32.TryParse((string)hash["http_port"], out p);
|
UInt32.TryParse((string)hash["http_port"], out p);
|
||||||
region.HttpPort = p;
|
region.HttpPort = p;
|
||||||
}
|
}
|
||||||
|
if (hash.ContainsKey("server_uri") && hash["server_uri"] != null)
|
||||||
|
region.ServerURI = (string)hash["server_uri"];
|
||||||
|
|
||||||
if (hash["internal_port"] != null)
|
if (hash["internal_port"] != null)
|
||||||
{
|
{
|
||||||
int p = 0;
|
int p = 0;
|
||||||
|
@ -558,6 +561,60 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
||||||
return online;
|
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)
|
public Dictionary<string, object> GetServerURLs(UUID userID)
|
||||||
{
|
{
|
||||||
Hashtable hash = new Hashtable();
|
Hashtable hash = new Hashtable();
|
||||||
|
|
|
@ -86,6 +86,8 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
|
|
||||||
public SimianAssetServiceConnector(string url)
|
public SimianAssetServiceConnector(string url)
|
||||||
{
|
{
|
||||||
|
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||||
|
url = url + '/';
|
||||||
m_serverUrl = url;
|
m_serverUrl = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -341,26 +341,54 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
|
|
||||||
public List<GridRegion> GetHyperlinks(UUID scopeID)
|
public List<GridRegion> GetHyperlinks(UUID scopeID)
|
||||||
{
|
{
|
||||||
// Hypergrid/linked regions are not supported
|
List<GridRegion> foundRegions = new List<GridRegion>();
|
||||||
return 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)
|
public int GetRegionFlags(UUID scopeID, UUID regionID)
|
||||||
{
|
{
|
||||||
const int REGION_ONLINE = 4;
|
|
||||||
|
|
||||||
NameValueCollection requestArgs = new NameValueCollection
|
NameValueCollection requestArgs = new NameValueCollection
|
||||||
{
|
{
|
||||||
{ "RequestMethod", "GetScene" },
|
{ "RequestMethod", "GetScene" },
|
||||||
{ "SceneID", regionID.ToString() }
|
{ "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);
|
OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs);
|
||||||
if (response["Success"].AsBoolean())
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -412,23 +440,26 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
region.RegionLocX = (int)minPosition.X;
|
region.RegionLocX = (int)minPosition.X;
|
||||||
region.RegionLocY = (int)minPosition.Y;
|
region.RegionLocY = (int)minPosition.Y;
|
||||||
|
|
||||||
Uri httpAddress = response["Address"].AsUri();
|
if ( ! extraData["HyperGrid"] ) {
|
||||||
region.ExternalHostName = httpAddress.Host;
|
Uri httpAddress = response["Address"].AsUri();
|
||||||
region.HttpPort = (uint)httpAddress.Port;
|
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;
|
region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger());
|
||||||
IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress);
|
region.TerrainImage = extraData["MapTexture"].AsUUID();
|
||||||
if (internalAddress == null)
|
region.Access = (byte)extraData["Access"].AsInteger();
|
||||||
internalAddress = IPAddress.Any;
|
region.RegionSecret = extraData["RegionSecret"].AsString();
|
||||||
|
region.EstateOwner = extraData["EstateOwner"].AsUUID();
|
||||||
region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger());
|
region.Token = extraData["Token"].AsString();
|
||||||
region.TerrainImage = extraData["MapTexture"].AsUUID();
|
region.ServerURI = extraData["ServerURI"].AsString();
|
||||||
region.Access = (byte)extraData["Access"].AsInteger();
|
} else {
|
||||||
region.RegionSecret = extraData["RegionSecret"].AsString();
|
region.ServerURI = response["Address"];
|
||||||
region.EstateOwner = extraData["EstateOwner"].AsUUID();
|
}
|
||||||
region.Token = extraData["Token"].AsString();
|
|
||||||
|
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,10 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
|
|
||||||
public SimianInventoryServiceConnector(string url)
|
public SimianInventoryServiceConnector(string url)
|
||||||
{
|
{
|
||||||
|
if (!url.EndsWith("/") && !url.EndsWith("="))
|
||||||
|
url = url + '/';
|
||||||
m_serverUrl = url;
|
m_serverUrl = url;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialise(IConfigSource source)
|
public void Initialise(IConfigSource source)
|
||||||
|
|
|
@ -287,6 +287,10 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
account.UserFlags = response["UserFlags"].AsInteger();
|
account.UserFlags = response["UserFlags"].AsInteger();
|
||||||
account.UserLevel = response["AccessLevel"].AsInteger();
|
account.UserLevel = response["AccessLevel"].AsInteger();
|
||||||
account.UserTitle = response["UserTitle"].AsString();
|
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);
|
GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName);
|
||||||
|
|
||||||
// Cache the user account info
|
// Cache the user account info
|
||||||
|
|
|
@ -102,50 +102,45 @@ namespace OpenSim.Services.GridService
|
||||||
|
|
||||||
public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db)
|
public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db)
|
||||||
{
|
{
|
||||||
IConfig modulesConfig = config.Configs["Modules"];
|
IConfig gridConfig = config.Configs["GridService"];
|
||||||
if (modulesConfig == null)
|
if (gridConfig == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (modulesConfig.GetString("HypergridLinker", "") != "HypergridLinker")
|
if (!gridConfig.GetBoolean("HypergridLinker", false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType());
|
|
||||||
|
|
||||||
m_Database = db;
|
m_Database = db;
|
||||||
m_GridService = gridService;
|
m_GridService = gridService;
|
||||||
|
m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType());
|
||||||
|
|
||||||
IConfig gridConfig = config.Configs["GridService"];
|
string assetService = gridConfig.GetString("AssetService", string.Empty);
|
||||||
if (gridConfig != null)
|
|
||||||
{
|
|
||||||
string assetService = gridConfig.GetString("AssetService", string.Empty);
|
|
||||||
|
|
||||||
Object[] args = new Object[] { config };
|
Object[] args = new Object[] { config };
|
||||||
|
|
||||||
if (assetService != string.Empty)
|
if (assetService != string.Empty)
|
||||||
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args);
|
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args);
|
||||||
|
|
||||||
string scope = gridConfig.GetString("ScopeID", string.Empty);
|
string scope = gridConfig.GetString("ScopeID", string.Empty);
|
||||||
if (scope != string.Empty)
|
if (scope != string.Empty)
|
||||||
UUID.TryParse(scope, out m_ScopeID);
|
UUID.TryParse(scope, out m_ScopeID);
|
||||||
|
|
||||||
// m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
// 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);
|
m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper);
|
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...");
|
|
||||||
}
|
}
|
||||||
|
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))
|
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}",
|
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);
|
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
|
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
|
||||||
GridRegion region = new GridRegion(gatekeeper);
|
GridRegion region = new GridRegion(gatekeeper);
|
||||||
region.ServerURI = gatekeeper.ServerURI;
|
region.ServerURI = gatekeeper.ServerURI;
|
||||||
|
@ -480,6 +488,31 @@ namespace OpenSim.Services.HypergridService
|
||||||
return online;
|
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)
|
public Dictionary<string, object> GetServerURLs(UUID userID)
|
||||||
{
|
{
|
||||||
if (m_UserAccountService == null)
|
if (m_UserAccountService == null)
|
||||||
|
|
|
@ -55,6 +55,7 @@ namespace OpenSim.Services.Interfaces
|
||||||
void LogoutAgent(UUID userID, UUID sessionID);
|
void LogoutAgent(UUID userID, UUID sessionID);
|
||||||
GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt);
|
GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt);
|
||||||
Dictionary<string, object> GetServerURLs(UUID userID);
|
Dictionary<string, object> GetServerURLs(UUID userID);
|
||||||
|
Dictionary<string,object> GetUserInfo(UUID userID);
|
||||||
|
|
||||||
string LocateUser(UUID userID);
|
string LocateUser(UUID userID);
|
||||||
// Tries to get the universal user identifier for the targetUserId
|
// Tries to get the universal user identifier for the targetUserId
|
||||||
|
|
|
@ -91,6 +91,7 @@ namespace OpenSim.Services.Interfaces
|
||||||
public int UserLevel;
|
public int UserLevel;
|
||||||
public int UserFlags;
|
public int UserFlags;
|
||||||
public string UserTitle;
|
public string UserTitle;
|
||||||
|
public Boolean LocalToGrid = true;
|
||||||
|
|
||||||
public Dictionary<string, object> ServiceURLs;
|
public Dictionary<string, object> ServiceURLs;
|
||||||
|
|
||||||
|
@ -119,6 +120,8 @@ namespace OpenSim.Services.Interfaces
|
||||||
UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString());
|
UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString());
|
||||||
if (kvp.ContainsKey("UserTitle"))
|
if (kvp.ContainsKey("UserTitle"))
|
||||||
UserTitle = kvp["UserTitle"].ToString();
|
UserTitle = kvp["UserTitle"].ToString();
|
||||||
|
if (kvp.ContainsKey("LocalToGrid"))
|
||||||
|
Boolean.TryParse(kvp["LocalToGrid"].ToString(), out LocalToGrid);
|
||||||
|
|
||||||
if (kvp.ContainsKey("Created"))
|
if (kvp.ContainsKey("Created"))
|
||||||
Created = Convert.ToInt32(kvp["Created"].ToString());
|
Created = Convert.ToInt32(kvp["Created"].ToString());
|
||||||
|
@ -152,6 +155,7 @@ namespace OpenSim.Services.Interfaces
|
||||||
result["UserLevel"] = UserLevel.ToString();
|
result["UserLevel"] = UserLevel.ToString();
|
||||||
result["UserFlags"] = UserFlags.ToString();
|
result["UserFlags"] = UserFlags.ToString();
|
||||||
result["UserTitle"] = UserTitle;
|
result["UserTitle"] = UserTitle;
|
||||||
|
result["LocalToGrid"] = LocalToGrid.ToString();
|
||||||
|
|
||||||
string str = string.Empty;
|
string str = string.Empty;
|
||||||
foreach (KeyValuePair<string, object> kvp in ServiceURLs)
|
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" +
|
" -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" +
|
||||||
" -password password for the bots\n" +
|
" -password password for the bots\n" +
|
||||||
" -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" +
|
" -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" +
|
||||||
" current options are:" +
|
" current options are:\n" +
|
||||||
" p (physics)" +
|
" p (physics)\n" +
|
||||||
" g (grab)" +
|
" g (grab)\n" +
|
||||||
" t (teleport)" +
|
" t (teleport)\n" +
|
||||||
// " c (cross)" +
|
// " c (cross)" +
|
||||||
" -wear set appearance folder to load from (default: no)\n" +
|
" -wear set appearance folder to load from (default: no)\n" +
|
||||||
" -h, -help show this message");
|
" -h, -help show this message");
|
||||||
|
|
Binary file not shown.
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<Prebuild xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" version="1.9">
|
<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">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
<CompilerDefines>DEBUG;TRACE</CompilerDefines>
|
<CompilerDefines>DEBUG;TRACE</CompilerDefines>
|
||||||
|
@ -31,13 +31,15 @@
|
||||||
type="Exe"
|
type="Exe"
|
||||||
rootNamespace="Prebuild"
|
rootNamespace="Prebuild"
|
||||||
startupObject="Prebuild.Prebuild"
|
startupObject="Prebuild.Prebuild"
|
||||||
version="2.0.3"
|
version="2.0.5"
|
||||||
|
frameworkVersion="v3_5"
|
||||||
>
|
>
|
||||||
<Author>Matthew Holmes (matthew@wildfiregames.com)</Author>
|
<Author>Matthew Holmes (matthew@wildfiregames.com)</Author>
|
||||||
<Author>Dan Moorehead (dan05a@gmail.com)</Author>
|
<Author>Dan Moorehead (dan05a@gmail.com)</Author>
|
||||||
<Author>Dave Hudson (jendave@yahoo.com)</Author>
|
<Author>Dave Hudson (jendave@yahoo.com)</Author>
|
||||||
<Author>Rob Loach (http://robloach.net)</Author>
|
<Author>Rob Loach (http://robloach.net)</Author>
|
||||||
<Author>C.J. Adams-Collier (cjac@colliertech.org)</Author>
|
<Author>C.J. Adams-Collier (cjac@colliertech.org)</Author>
|
||||||
|
<Author>John Hurliman (john.hurliman@intel.com)</Author>
|
||||||
<Description>The Prebuild project generator</Description>
|
<Description>The Prebuild project generator</Description>
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
|
|
@ -62,7 +62,11 @@ namespace Prebuild.Core.Nodes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Page
|
Page,
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
Copy
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -245,6 +249,9 @@ namespace Prebuild.Core.Nodes
|
||||||
if (subType != String.Empty)
|
if (subType != String.Empty)
|
||||||
m_SubType = (SubType)Enum.Parse(typeof(SubType), subType);
|
m_SubType = (SubType)Enum.Parse(typeof(SubType), subType);
|
||||||
|
|
||||||
|
Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction);
|
||||||
|
|
||||||
|
|
||||||
m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString());
|
m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString());
|
||||||
this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString));
|
this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString));
|
||||||
if ( this.m_Link == true )
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
|
|
||||||
using Prebuild.Core.Attributes;
|
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, bool> m_Links = new Dictionary<string, bool>();
|
||||||
private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>();
|
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, 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
|
#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
|
#endregion
|
||||||
|
|
||||||
#region Public Methods
|
#region Public Methods
|
||||||
|
@ -76,6 +89,20 @@ namespace Prebuild.Core.Nodes
|
||||||
return m_BuildActions[file];
|
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)
|
public CopyToOutput GetCopyToOutput(string file)
|
||||||
{
|
{
|
||||||
if (!m_CopyToOutputs.ContainsKey(file))
|
if (!m_CopyToOutputs.ContainsKey(file))
|
||||||
|
@ -178,6 +205,13 @@ namespace Prebuild.Core.Nodes
|
||||||
m_BuildActions[file] = GetBuildActionByFileName(file);
|
m_BuildActions[file] = GetBuildActionByFileName(file);
|
||||||
else
|
else
|
||||||
m_BuildActions[file] = matchNode.BuildAction.Value;
|
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_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value;
|
||||||
m_ResourceNames[ file ] = matchNode.ResourceName;
|
m_ResourceNames[ file ] = matchNode.ResourceName;
|
||||||
m_PreservePaths[ file ] = matchNode.PreservePath;
|
m_PreservePaths[ file ] = matchNode.PreservePath;
|
||||||
|
|
|
@ -52,6 +52,7 @@ namespace Prebuild.Core.Nodes
|
||||||
private bool m_Link;
|
private bool m_Link;
|
||||||
private string m_LinkPath;
|
private string m_LinkPath;
|
||||||
private bool m_PreservePath;
|
private bool m_PreservePath;
|
||||||
|
private string m_Destination = "";
|
||||||
private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>();
|
private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -80,6 +81,13 @@ namespace Prebuild.Core.Nodes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string DestinationPath
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_Destination;
|
||||||
|
}
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -285,12 +293,14 @@ namespace Prebuild.Core.Nodes
|
||||||
}
|
}
|
||||||
string path = Helper.AttributeValue(node, "path", ".");
|
string path = Helper.AttributeValue(node, "path", ".");
|
||||||
string pattern = Helper.AttributeValue(node, "pattern", "*");
|
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 recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false"));
|
||||||
bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false"));
|
bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false"));
|
||||||
string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty);
|
string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty);
|
||||||
if (buildAction != string.Empty)
|
if (buildAction != string.Empty)
|
||||||
m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction);
|
m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction);
|
||||||
|
|
||||||
|
|
||||||
//TODO: Figure out where the subtype node is being assigned
|
//TODO: Figure out where the subtype node is being assigned
|
||||||
//string subType = Helper.AttributeValue(node, "subType", string.Empty);
|
//string subType = Helper.AttributeValue(node, "subType", string.Empty);
|
||||||
//if (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 ) );
|
m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) );
|
||||||
|
|
||||||
|
if ( buildAction == "Copy")
|
||||||
|
m_Destination = destination;
|
||||||
|
|
||||||
if(path != null && path.Length == 0)
|
if(path != null && path.Length == 0)
|
||||||
{
|
|
||||||
path = ".";//use current directory
|
path = ".";//use current directory
|
||||||
}
|
|
||||||
//throw new WarningException("Match must have a 'path' attribute");
|
//throw new WarningException("Match must have a 'path' attribute");
|
||||||
|
|
||||||
if(pattern == null)
|
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$
|
* $Source$
|
||||||
* $Author: jendave $
|
* $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 $
|
* $Revision: 164 $
|
||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#region BSD License
|
#region BSD License
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com)
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Prebuild.Core.Interfaces;
|
using Prebuild.Core.Interfaces;
|
||||||
using Prebuild.Core.Nodes;
|
using Prebuild.Core.Nodes;
|
||||||
|
@ -42,6 +43,7 @@ namespace Prebuild.Core.Targets
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>();
|
readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>();
|
||||||
|
// NameValueCollection CopyFiles = new NameValueCollection();
|
||||||
Kernel kernel;
|
Kernel kernel;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -168,7 +170,14 @@ namespace Prebuild.Core.Targets
|
||||||
#region Project File
|
#region Project File
|
||||||
using (ps)
|
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(" <PropertyGroup>");
|
||||||
ps.WriteLine(" <ProjectType>Local</ProjectType>");
|
ps.WriteLine(" <ProjectType>Local</ProjectType>");
|
||||||
ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion);
|
ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion);
|
||||||
|
@ -334,8 +343,14 @@ namespace Prebuild.Core.Targets
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach (string filePath in project.Files)
|
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")
|
// if (file == "Properties\\Bind.Designer.cs")
|
||||||
// {
|
// {
|
||||||
// Console.WriteLine("Wait a minute!");
|
// Console.WriteLine("Wait a minute!");
|
||||||
|
@ -446,7 +461,9 @@ namespace Prebuild.Core.Targets
|
||||||
ps.WriteLine("Include=\"{0}\">", file);
|
ps.WriteLine("Include=\"{0}\">", file);
|
||||||
|
|
||||||
int last_period_index = file.LastIndexOf('.');
|
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);
|
string extension = Path.GetExtension(path);
|
||||||
// make this upper case, so that when File.Exists tests for the
|
// make this upper case, so that when File.Exists tests for the
|
||||||
// existence of a designer file on a case-sensitive platform,
|
// 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(" <Import Project=\"" + toolInfo.ImportProject + "\" />");
|
||||||
ps.WriteLine(" <PropertyGroup>");
|
ps.WriteLine(" <PropertyGroup>");
|
||||||
ps.WriteLine(" <PreBuildEvent>");
|
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$
|
* $Source$
|
||||||
* $Author: kunnis $
|
* $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 $
|
* $Revision: 308 $
|
||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
BIN
bin/C5.dll
BIN
bin/C5.dll
Binary file not shown.
|
@ -181,6 +181,11 @@
|
||||||
; ## PHYSICS
|
; ## 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 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
|
; 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
|
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]
|
[GridService]
|
||||||
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
|
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
|
||||||
|
HypergridLinker = true
|
||||||
|
|
||||||
; Realm = "regions"
|
; Realm = "regions"
|
||||||
; AllowDuplicateNames = "True"
|
; AllowDuplicateNames = "True"
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
LandServices = "RemoteLandServicesConnector"
|
LandServices = "RemoteLandServicesConnector"
|
||||||
FriendsModule = "HGFriendsModule"
|
FriendsModule = "HGFriendsModule"
|
||||||
MapImageService = "MapImageServiceModule"
|
MapImageService = "MapImageServiceModule"
|
||||||
HypergridLinker = "HypergridLinker"
|
|
||||||
|
|
||||||
LandServiceInConnector = true
|
LandServiceInConnector = true
|
||||||
NeighbourServiceInConnector = true
|
NeighbourServiceInConnector = true
|
||||||
|
@ -60,6 +59,7 @@
|
||||||
; Needed to display non-default map tile images for linked regions
|
; Needed to display non-default map tile images for linked regions
|
||||||
AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
|
AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
|
||||||
|
|
||||||
|
HypergridLinker = true
|
||||||
AllowHypergridMapSearch = true
|
AllowHypergridMapSearch = true
|
||||||
|
|
||||||
[LibraryService]
|
[LibraryService]
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
LibraryModule = false
|
LibraryModule = false
|
||||||
|
|
||||||
AssetCaching = "FlotsamAssetCache"
|
AssetCaching = "FlotsamAssetCache"
|
||||||
HypergridLinker = "HypergridLinker"
|
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
||||||
|
@ -56,6 +55,7 @@
|
||||||
StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
|
StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
|
||||||
NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector"
|
NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector"
|
||||||
|
|
||||||
|
HypergridLinker = true
|
||||||
AllowHypergridMapSearch = true
|
AllowHypergridMapSearch = true
|
||||||
|
|
||||||
[LibraryService]
|
[LibraryService]
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
EntityTransferModule = "HGEntityTransferModule"
|
EntityTransferModule = "HGEntityTransferModule"
|
||||||
InventoryAccessModule = "HGInventoryAccessModule"
|
InventoryAccessModule = "HGInventoryAccessModule"
|
||||||
FriendsModule = "HGFriendsModule"
|
FriendsModule = "HGFriendsModule"
|
||||||
HypergridLinker = "HypergridLinker"
|
|
||||||
|
|
||||||
InventoryServiceInConnector = true
|
InventoryServiceInConnector = true
|
||||||
AssetServiceInConnector = true
|
AssetServiceInConnector = true
|
||||||
|
@ -84,6 +83,7 @@
|
||||||
; Needed to display non-default map tile images for remote regions
|
; Needed to display non-default map tile images for remote regions
|
||||||
AssetService = "OpenSim.Services.AssetService.dll:AssetService"
|
AssetService = "OpenSim.Services.AssetService.dll:AssetService"
|
||||||
|
|
||||||
|
HypergridLinker = true
|
||||||
AllowHypergridMapSearch = true
|
AllowHypergridMapSearch = true
|
||||||
|
|
||||||
[PresenceService]
|
[PresenceService]
|
||||||
|
|
|
@ -926,6 +926,7 @@
|
||||||
<ReferencePath>../../../bin/</ReferencePath>
|
<ReferencePath>../../../bin/</ReferencePath>
|
||||||
<Reference name="System"/>
|
<Reference name="System"/>
|
||||||
<Reference name="System.Core"/>
|
<Reference name="System.Core"/>
|
||||||
|
<Reference name="System.Web"/>
|
||||||
<Reference name="System.Xml"/>
|
<Reference name="System.Xml"/>
|
||||||
<Reference name="System.Drawing"/>
|
<Reference name="System.Drawing"/>
|
||||||
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||||
|
|
Loading…
Reference in New Issue