Merge branch 'master' of ssh://opensimulator.org/var/git/opensim

viewer-2-initial-appearance
Diva Canto 2010-12-13 21:36:08 -08:00
commit 4bdba0a487
22 changed files with 376 additions and 256 deletions

View File

@ -174,9 +174,10 @@ namespace OpenSim.Framework
public delegate void ParcelAccessListRequest( public delegate void ParcelAccessListRequest(
UUID agentID, UUID sessionID, uint flags, int sequenceID, int landLocalID, IClientAPI remote_client); UUID agentID, UUID sessionID, uint flags, int sequenceID, int landLocalID, IClientAPI remote_client);
public delegate void ParcelAccessListUpdateRequest( public delegate void ParcelAccessListUpdateRequest(UUID agentID, uint flags,
UUID agentID, UUID sessionID, uint flags, int landLocalID, List<ParcelManager.ParcelAccessEntry> entries, int landLocalID, UUID transactionID, int sequenceID,
IClientAPI remote_client); int sections, List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client);
public delegate void ParcelPropertiesRequest( public delegate void ParcelPropertiesRequest(
int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client); int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client);

View File

@ -8239,7 +8239,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
entry.AgentID = block.ID; entry.AgentID = block.ID;
entry.Flags = (AccessList)block.Flags; entry.Flags = (AccessList)block.Flags;
entry.Time = new DateTime(); entry.Time = Util.ToDateTime(block.Time);
entries.Add(entry); entries.Add(entry);
} }
@ -8247,8 +8247,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (handlerParcelAccessListUpdateRequest != null) if (handlerParcelAccessListUpdateRequest != null)
{ {
handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID, handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
updatePacket.AgentData.SessionID, updatePacket.Data.Flags, updatePacket.Data.Flags,
updatePacket.Data.LocalID, entries, this); updatePacket.Data.LocalID,
updatePacket.Data.TransactionID,
updatePacket.Data.SequenceID,
updatePacket.Data.Sections,
entries, this);
} }
return true; return true;
} }

View File

@ -484,6 +484,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
} }
} }
public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos)
{
// First we save the
// attachment point information, then we update the relative
// positioning. Then we have to mark the object as NOT an
// attachment. This is necessary in order to correctly save
// and retrieve GroupPosition information for the attachment.
// Finally, we restore the object's attachment status.
byte attachmentPoint = sog.GetAttachmentPoint();
sog.UpdateGroupPosition(pos);
sog.RootPart.IsAttachment = false;
sog.AbsolutePosition = sog.RootPart.AttachedPos;
sog.SetAttachmentPoint(attachmentPoint);
sog.HasGroupChanged = true;
}
/// <summary> /// <summary>
/// Update the attachment asset for the new sog details if they have changed. /// Update the attachment asset for the new sog details if they have changed.
/// </summary> /// </summary>

View File

@ -159,7 +159,7 @@ namespace OpenSim.Region.CoreModules.World.Land
client.OnParcelSelectObjects += ClientOnParcelSelectObjects; client.OnParcelSelectObjects += ClientOnParcelSelectObjects;
client.OnParcelObjectOwnerRequest += ClientOnParcelObjectOwnerRequest; client.OnParcelObjectOwnerRequest += ClientOnParcelObjectOwnerRequest;
client.OnParcelAccessListRequest += ClientOnParcelAccessListRequest; client.OnParcelAccessListRequest += ClientOnParcelAccessListRequest;
client.OnParcelAccessListUpdateRequest += ClientOnParcelAccessUpdateListRequest; client.OnParcelAccessListUpdateRequest += ClientOnParcelAccessListUpdateRequest;
client.OnParcelAbandonRequest += ClientOnParcelAbandonRequest; client.OnParcelAbandonRequest += ClientOnParcelAbandonRequest;
client.OnParcelGodForceOwner += ClientOnParcelGodForceOwner; client.OnParcelGodForceOwner += ClientOnParcelGodForceOwner;
client.OnParcelReclaim += ClientOnParcelReclaim; client.OnParcelReclaim += ClientOnParcelReclaim;
@ -508,14 +508,22 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null) if (land != null)
{ {
m_landList[landLocalID].SendAccessList(agentID, sessionID, flags, sequenceID, remote_client); land.SendAccessList(agentID, sessionID, flags, sequenceID, remote_client);
} }
} }
public void ClientOnParcelAccessUpdateListRequest(UUID agentID, UUID sessionID, uint flags, int landLocalID, public void ClientOnParcelAccessListUpdateRequest(UUID agentID,
List<ParcelManager.ParcelAccessEntry> entries, uint flags, int landLocalID, UUID transactionID, int sequenceID,
IClientAPI remote_client) int sections, List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client)
{ {
// Flags is the list to update, it can mean either the ban or
// the access list (WTH is a pass list? Mentioned in ParcelFlags)
//
// There may be multiple packets, because these can get LONG.
// Use transactionID to determine a new chain of packets since
// packets may have come in out of sequence and that would be
// a big mess if using the sequenceID
ILandObject land; ILandObject land;
lock (m_landList) lock (m_landList)
{ {
@ -524,9 +532,15 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null) if (land != null)
{ {
if (agentID == land.LandData.OwnerID) GroupPowers requiredPowers = GroupPowers.LandManageAllowed;
if (flags == (uint)AccessList.Ban)
requiredPowers = GroupPowers.LandManageBanned;
if (m_scene.Permissions.CanEditParcelProperties(agentID,
land, requiredPowers))
{ {
land.UpdateAccessList(flags, entries, remote_client); land.UpdateAccessList(flags, transactionID, sequenceID,
sections, entries, remote_client);
} }
} }
else else
@ -854,7 +868,7 @@ namespace OpenSim.Region.CoreModules.World.Land
//If we are still here, then they are subdividing within one piece of land //If we are still here, then they are subdividing within one piece of land
//Check owner //Check owner
if (!m_scene.Permissions.CanEditParcel(attempting_user_id, startLandObject)) if (!m_scene.Permissions.CanEditParcelProperties(attempting_user_id, startLandObject, GroupPowers.LandDivideJoin))
{ {
return; return;
} }
@ -922,7 +936,7 @@ namespace OpenSim.Region.CoreModules.World.Land
{ {
return; return;
} }
if (!m_scene.Permissions.CanEditParcel(attempting_user_id, masterLandObject)) if (!m_scene.Permissions.CanEditParcelProperties(attempting_user_id, masterLandObject, GroupPowers.LandDivideJoin))
{ {
return; return;
} }
@ -1570,7 +1584,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land == null) return; if (land == null) return;
if (!m_scene.Permissions.CanEditParcel(remoteClient.AgentId, land)) if (!m_scene.Permissions.CanEditParcelProperties(remoteClient.AgentId, land, GroupPowers.LandOptions))
return; return;
land.LandData.OtherCleanTime = otherCleanTime; land.LandData.OtherCleanTime = otherCleanTime;

View File

@ -54,6 +54,7 @@ namespace OpenSim.Region.CoreModules.World.Land
protected LandData m_landData = new LandData(); protected LandData m_landData = new LandData();
protected Scene m_scene; protected Scene m_scene;
protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
public bool[,] LandBitmap public bool[,] LandBitmap
{ {
@ -199,36 +200,81 @@ namespace OpenSim.Region.CoreModules.World.Land
public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client) public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId,this)) //Needs later group support
{ bool snap_selection = false;
//Needs later group support LandData newData = LandData.Copy();
bool snap_selection = false;
LandData newData = LandData.Copy();
if (args.AuthBuyerID != newData.AuthBuyerID || args.SalePrice != newData.SalePrice) uint allowedDelta = 0;
// These two are always blocked as no client can set them anyway
// ParcelFlags.ForSaleObjects
// ParcelFlags.LindenHome
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{
allowedDelta |= (uint)(ParcelFlags.AllowLandmark |
ParcelFlags.AllowTerraform |
ParcelFlags.AllowDamage |
ParcelFlags.CreateObjects |
ParcelFlags.RestrictPushObject |
ParcelFlags.AllowGroupScripts |
ParcelFlags.CreateGroupObjects |
ParcelFlags.AllowAPrimitiveEntry |
ParcelFlags.AllowGroupObjectEntry);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandSetSale))
{
if (args.AuthBuyerID != newData.AuthBuyerID ||
args.SalePrice != newData.SalePrice)
{ {
if (m_scene.Permissions.CanSellParcel(remote_client.AgentId, this)) snap_selection = true;
{
newData.AuthBuyerID = args.AuthBuyerID;
newData.SalePrice = args.SalePrice;
snap_selection = true;
}
} }
newData.AuthBuyerID = args.AuthBuyerID;
newData.SalePrice = args.SalePrice;
if (!LandData.IsGroupOwned)
{
newData.GroupID = args.GroupID;
allowedDelta |= (uint)(ParcelFlags.AllowDeedToGroup |
ParcelFlags.ContributeWithDeed |
ParcelFlags.SellParcelObjects);
}
allowedDelta |= (uint)ParcelFlags.ForSale;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.FindPlaces))
{
newData.Category = args.Category; newData.Category = args.Category;
allowedDelta |= (uint)(ParcelFlags.ShowDirectory |
ParcelFlags.AllowPublish |
ParcelFlags.MaturePublish);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandChangeIdentity))
{
newData.Description = args.Desc; newData.Description = args.Desc;
newData.GroupID = args.GroupID; newData.Name = args.Name;
newData.SnapshotID = args.SnapshotID;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.SetLandingPoint))
{
newData.LandingType = args.LandingType; newData.LandingType = args.LandingType;
newData.UserLocation = args.UserLocation;
newData.UserLookAt = args.UserLookAt;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.ChangeMedia))
{
newData.MediaAutoScale = args.MediaAutoScale; newData.MediaAutoScale = args.MediaAutoScale;
newData.MediaID = args.MediaID; newData.MediaID = args.MediaID;
newData.MediaURL = args.MediaURL; newData.MediaURL = args.MediaURL;
newData.MusicURL = args.MusicURL; newData.MusicURL = args.MusicURL;
newData.Name = args.Name;
newData.Flags = args.ParcelFlags;
newData.PassHours = args.PassHours;
newData.PassPrice = args.PassPrice;
newData.SnapshotID = args.SnapshotID;
newData.UserLocation = args.UserLocation;
newData.UserLookAt = args.UserLookAt;
newData.MediaType = args.MediaType; newData.MediaType = args.MediaType;
newData.MediaDescription = args.MediaDescription; newData.MediaDescription = args.MediaDescription;
newData.MediaWidth = args.MediaWidth; newData.MediaWidth = args.MediaWidth;
@ -237,10 +283,40 @@ namespace OpenSim.Region.CoreModules.World.Land
newData.ObscureMusic = args.ObscureMusic; newData.ObscureMusic = args.ObscureMusic;
newData.ObscureMedia = args.ObscureMedia; newData.ObscureMedia = args.ObscureMedia;
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData); allowedDelta |= (uint)(ParcelFlags.SoundLocal |
ParcelFlags.UrlWebPage |
SendLandUpdateToAvatarsOverMe(snap_selection); ParcelFlags.UrlRawHtml |
ParcelFlags.AllowVoiceChat |
ParcelFlags.UseEstateVoiceChan);
} }
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandManagePasses))
{
newData.PassHours = args.PassHours;
newData.PassPrice = args.PassPrice;
allowedDelta |= (uint)ParcelFlags.UsePassList;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandManageAllowed))
{
allowedDelta |= (uint)(ParcelFlags.UseAccessGroup |
ParcelFlags.UseAccessList);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandManageBanned))
{
allowedDelta |= (uint)(ParcelFlags.UseBanList |
ParcelFlags.DenyAnonymous |
ParcelFlags.DenyAgeUnverified);
}
uint preserve = LandData.Flags & ~allowedDelta;
newData.Flags = preserve | (args.ParcelFlags & allowedDelta);
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData);
SendLandUpdateToAvatarsOverMe(snap_selection);
} }
public void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area) public void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area)
@ -295,14 +371,14 @@ namespace OpenSim.Region.CoreModules.World.Land
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); if (LandData.ParcelAccessList.FindIndex(
entry.AgentID = avatar; delegate(ParcelManager.ParcelAccessEntry e)
entry.Flags = AccessList.Ban; {
entry.Time = new DateTime(); if (e.AgentID == avatar && e.Flags == AccessList.Ban)
//See if they are on the list, but make sure the owner isn't banned return true;
if (LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) return false;
}) != -1 && LandData.OwnerID != avatar)
{ {
//They are banned, so lets send them a notice about this parcel
return true; return true;
} }
} }
@ -316,15 +392,14 @@ namespace OpenSim.Region.CoreModules.World.Land
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); if (LandData.ParcelAccessList.FindIndex(
entry.AgentID = avatar; delegate(ParcelManager.ParcelAccessEntry e)
entry.Flags = AccessList.Access; {
entry.Time = new DateTime(); if (e.AgentID == avatar && e.Flags == AccessList.Access)
return true;
//If they are not on the access list and are not the owner return false;
if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) }) == -1 && LandData.OwnerID != avatar)
{ {
//They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
return true; return true;
} }
} }
@ -421,39 +496,52 @@ namespace OpenSim.Region.CoreModules.World.Land
} }
} }
public void UpdateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client) public void UpdateAccessList(uint flags, UUID transactionID,
int sequenceID, int sections,
List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client)
{ {
LandData newData = LandData.Copy(); LandData newData = LandData.Copy();
if (entries.Count == 1 && entries[0].AgentID == UUID.Zero) if ((!m_listTransactions.ContainsKey(flags)) ||
m_listTransactions[flags] != transactionID)
{ {
entries.Clear(); m_listTransactions[flags] = transactionID;
}
List<ParcelManager.ParcelAccessEntry> toRemove = new List<ParcelManager.ParcelAccessEntry>(); List<ParcelManager.ParcelAccessEntry> toRemove =
foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList) new List<ParcelManager.ParcelAccessEntry>();
{
if (entry.Flags == (AccessList)flags) foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList)
{ {
toRemove.Add(entry); if (entry.Flags == (AccessList)flags)
toRemove.Add(entry);
}
foreach (ParcelManager.ParcelAccessEntry entry in toRemove)
{
newData.ParcelAccessList.Remove(entry);
}
// Checked here because this will always be the first
// and only packet in a transaction
if (entries.Count == 1 && entries[0].AgentID == UUID.Zero)
{
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData);
return;
} }
} }
foreach (ParcelManager.ParcelAccessEntry entry in toRemove)
{
newData.ParcelAccessList.Remove(entry);
}
foreach (ParcelManager.ParcelAccessEntry entry in entries) foreach (ParcelManager.ParcelAccessEntry entry in entries)
{ {
ParcelManager.ParcelAccessEntry temp = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry temp =
new ParcelManager.ParcelAccessEntry();
temp.AgentID = entry.AgentID; temp.AgentID = entry.AgentID;
temp.Time = new DateTime(); //Pointless? Yes. temp.Time = entry.Time;
temp.Flags = (AccessList)flags; temp.Flags = (AccessList)flags;
if (!newData.ParcelAccessList.Contains(temp)) newData.ParcelAccessList.Add(temp);
{
newData.ParcelAccessList.Add(temp);
}
} }
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData); m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData);
@ -711,7 +799,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client) public void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId, this)) if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{ {
List<uint> resultLocalIDs = new List<uint>(); List<uint> resultLocalIDs = new List<uint>();
try try
@ -761,7 +849,7 @@ namespace OpenSim.Region.CoreModules.World.Land
/// </param> /// </param>
public void SendLandObjectOwners(IClientAPI remote_client) public void SendLandObjectOwners(IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId, this)) if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{ {
Dictionary<UUID, int> primCount = new Dictionary<UUID, int>(); Dictionary<UUID, int> primCount = new Dictionary<UUID, int>();
List<UUID> groups = new List<UUID>(); List<UUID> groups = new List<UUID>();

View File

@ -37,56 +37,6 @@ using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
// Temporary fix of wrong GroupPowers constants in OpenMetaverse library
enum GroupPowers : long
{
None = 0,
LandEjectAndFreeze = 1,
Invite = 2,
ReturnGroupSet = 2,
Eject = 4,
ReturnNonGroup = 4,
ChangeOptions = 8,
LandGardening = 8,
CreateRole = 16,
DeedObject = 16,
ModerateChat = 32,
DeleteRole = 32,
RoleProperties = 64,
ObjectManipulate = 64,
ObjectSetForSale = 128,
AssignMemberLimited = 128,
AssignMember = 256,
Accountable = 256,
RemoveMember = 512,
SendNotices = 1024,
ChangeActions = 1024,
ChangeIdentity = 2048,
ReceiveNotices = 2048,
StartProposal = 4096,
LandDeed = 4096,
VoteOnProposal = 8192,
LandRelease = 8192,
LandSetSale = 16384,
LandDivideJoin = 32768,
ReturnGroupOwned = 65536,
JoinChat = 65536,
FindPlaces = 131072,
LandChangeIdentity = 262144,
SetLandingPoint = 524288,
ChangeMedia = 1048576,
LandEdit = 2097152,
LandOptions = 4194304,
AllowEditLand = 8388608,
AllowFly = 16777216,
AllowRez = 33554432,
AllowLandmark = 67108864,
AllowVoiceChat = 134217728,
AllowSetHome = 268435456,
LandManageAllowed = 536870912,
LandManageBanned = 1073741824
}
namespace OpenSim.Region.CoreModules.World.Permissions namespace OpenSim.Region.CoreModules.World.Permissions
{ {
public class PermissionsModule : IRegionModule public class PermissionsModule : IRegionModule
@ -214,7 +164,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; m_scene.Permissions.OnDuplicateObject += CanDuplicateObject;
m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnEditObject += CanEditObject; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnEditObject += CanEditObject; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnEditParcel += CanEditParcel; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnEditParcelProperties += CanEditParcelProperties; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnInstantMessage += CanInstantMessage; m_scene.Permissions.OnInstantMessage += CanInstantMessage;
m_scene.Permissions.OnInventoryTransfer += CanInventoryTransfer; //NOT YET IMPLEMENTED m_scene.Permissions.OnInventoryTransfer += CanInventoryTransfer; //NOT YET IMPLEMENTED
m_scene.Permissions.OnIssueEstateCommand += CanIssueEstateCommand; //FULLY IMPLEMENTED m_scene.Permissions.OnIssueEstateCommand += CanIssueEstateCommand; //FULLY IMPLEMENTED
@ -1005,12 +955,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return GenericObjectPermission(editorID, objectID, false); return GenericObjectPermission(editorID, objectID, false);
} }
private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) private bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers p, Scene scene)
{ {
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
if (m_bypassPermissions) return m_bypassPermissionsValue; if (m_bypassPermissions) return m_bypassPermissionsValue;
return GenericParcelOwnerPermission(user, parcel, (ulong)GroupPowers.LandDivideJoin); return GenericParcelOwnerPermission(user, parcel, (ulong)p);
} }
/// <summary> /// <summary>

View File

@ -113,14 +113,17 @@ namespace OpenSim.Region.Framework.Interfaces
/// <summary> /// <summary>
/// Update the user inventory to show a detach. /// Update the user inventory to show a detach.
/// </summary> /// </summary>
/// <param name="itemID"> /// <param name="itemID">/param>
/// A <see cref="UUID"/> /// <param name="remoteClient"></param>
/// </param>
/// <param name="remoteClient">
/// A <see cref="IClientAPI"/>
/// </param>
void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient);
/// <summary>
/// Update the position of an attachment.
/// </summary>
/// <param name="sog"></param>
/// <param name="pos"></param>
void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos);
/// <summary> /// <summary>
/// Update the user inventory with a changed attachment /// Update the user inventory with a changed attachment
/// </summary> /// </summary>

View File

@ -57,7 +57,7 @@ namespace OpenSim.Region.Framework.Interfaces
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
List<UUID> CreateAccessListArrayByFlag(AccessList flag); List<UUID> CreateAccessListArrayByFlag(AccessList flag);
void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client); void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
void UpdateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client); void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
void UpdateLandBitmapByteArray(); void UpdateLandBitmapByteArray();
void SetLandBitmapFromByteArray(); void SetLandBitmapFromByteArray();
bool[,] GetLandBitmap(); bool[,] GetLandBitmap();

View File

@ -68,6 +68,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool IsGodHandler(UUID user, Scene requestFromScene); public delegate bool IsGodHandler(UUID user, Scene requestFromScene);
public delegate bool IsAdministratorHandler(UUID user); public delegate bool IsAdministratorHandler(UUID user);
public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene); public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene);
public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene);
public delegate bool SellParcelHandler(UUID user, ILandObject parcel, Scene scene); public delegate bool SellParcelHandler(UUID user, ILandObject parcel, Scene scene);
public delegate bool AbandonParcelHandler(UUID user, ILandObject parcel, Scene scene); public delegate bool AbandonParcelHandler(UUID user, ILandObject parcel, Scene scene);
public delegate bool ReclaimParcelHandler(UUID user, ILandObject parcel, Scene scene); public delegate bool ReclaimParcelHandler(UUID user, ILandObject parcel, Scene scene);
@ -131,6 +132,7 @@ namespace OpenSim.Region.Framework.Scenes
public event IsGodHandler OnIsGod; public event IsGodHandler OnIsGod;
public event IsAdministratorHandler OnIsAdministrator; public event IsAdministratorHandler OnIsAdministrator;
public event EditParcelHandler OnEditParcel; public event EditParcelHandler OnEditParcel;
public event EditParcelPropertiesHandler OnEditParcelProperties;
public event SellParcelHandler OnSellParcel; public event SellParcelHandler OnSellParcel;
public event AbandonParcelHandler OnAbandonParcel; public event AbandonParcelHandler OnAbandonParcel;
public event ReclaimParcelHandler OnReclaimParcel; public event ReclaimParcelHandler OnReclaimParcel;
@ -720,15 +722,16 @@ namespace OpenSim.Region.Framework.Scenes
#endregion #endregion
#region EDIT PARCEL #region EDIT PARCEL
public bool CanEditParcel(UUID user, ILandObject parcel)
public bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers p)
{ {
EditParcelHandler handler = OnEditParcel; EditParcelPropertiesHandler handler = OnEditParcelProperties;
if (handler != null) if (handler != null)
{ {
Delegate[] list = handler.GetInvocationList(); Delegate[] list = handler.GetInvocationList();
foreach (EditParcelHandler h in list) foreach (EditParcelPropertiesHandler h in list)
{ {
if (h(user, parcel, m_scene) == false) if (h(user, parcel, p, m_scene) == false)
return false; return false;
} }
} }

View File

@ -1281,13 +1281,8 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0)) if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0))
{ {
// Set the new attachment point data in the object if (m_parentScene.AttachmentsModule != null)
byte attachmentPoint = group.GetAttachmentPoint(); m_parentScene.AttachmentsModule.UpdateAttachmentPosition(group, pos);
group.UpdateGroupPosition(pos);
group.RootPart.IsAttachment = false;
group.AbsolutePosition = group.RootPart.AttachedPos;
group.SetAttachmentPoint(attachmentPoint);
group.HasGroupChanged = true;
} }
else else
{ {

View File

@ -1001,7 +1001,7 @@ namespace OpenSim.Region.RegionCombinerModule
VirtualRegion.Permissions.OnDuplicateObject += BigRegion.PermissionModule.CanDuplicateObject; VirtualRegion.Permissions.OnDuplicateObject += BigRegion.PermissionModule.CanDuplicateObject;
VirtualRegion.Permissions.OnDeleteObject += BigRegion.PermissionModule.CanDeleteObject; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnDeleteObject += BigRegion.PermissionModule.CanDeleteObject; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnEditObject += BigRegion.PermissionModule.CanEditObject; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnEditObject += BigRegion.PermissionModule.CanEditObject; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnEditParcel += BigRegion.PermissionModule.CanEditParcel; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnEditParcelProperties += BigRegion.PermissionModule.CanEditParcelProperties; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnInstantMessage += BigRegion.PermissionModule.CanInstantMessage; VirtualRegion.Permissions.OnInstantMessage += BigRegion.PermissionModule.CanInstantMessage;
VirtualRegion.Permissions.OnInventoryTransfer += BigRegion.PermissionModule.CanInventoryTransfer; //NOT YET IMPLEMENTED VirtualRegion.Permissions.OnInventoryTransfer += BigRegion.PermissionModule.CanInventoryTransfer; //NOT YET IMPLEMENTED
VirtualRegion.Permissions.OnIssueEstateCommand += BigRegion.PermissionModule.CanIssueEstateCommand; //FULLY IMPLEMENTED VirtualRegion.Permissions.OnIssueEstateCommand += BigRegion.PermissionModule.CanIssueEstateCommand; //FULLY IMPLEMENTED

View File

@ -105,9 +105,9 @@ namespace OpenSim.Region.RegionCombinerModule
return m_rootScene.Permissions.CanEditObject(objectid, editorid); return m_rootScene.Permissions.CanEditObject(objectid, editorid);
} }
public bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) public bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers g, Scene scene)
{ {
return m_rootScene.Permissions.CanEditParcel(user, parcel); return m_rootScene.Permissions.CanEditParcelProperties(user, parcel, g);
} }
public bool CanInstantMessage(UUID user, UUID target, Scene startscene) public bool CanInstantMessage(UUID user, UUID target, Scene startscene)

View File

@ -6287,16 +6287,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
entry.AgentID = key; if (land.LandData.ParcelAccessList.FindIndex(
entry.Flags = AccessList.Access; delegate(ParcelManager.ParcelAccessEntry e)
entry.Time = DateTime.Now.AddHours(hours); {
land.ParcelAccessList.Add(entry); if (e.AgentID == key && e.Flags == AccessList.Access)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Access;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9023,7 +9032,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// according to the docs, this command only works if script owner and land owner are the same // according to the docs, this command only works if script owner and land owner are the same
// lets add estate owners and gods, too, and use the generic permission check. // lets add estate owners and gods, too, and use the generic permission check.
ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (!World.Permissions.CanEditParcel(m_host.OwnerID, landObject)) return; if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, landObject, GroupPowers.ChangeMedia)) return;
bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)? bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)?
byte loop = 0; byte loop = 0;
@ -9466,16 +9475,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
entry.AgentID = key; if (land.LandData.ParcelAccessList.FindIndex(
entry.Flags = AccessList.Ban; delegate(ParcelManager.ParcelAccessEntry e)
entry.Time = DateTime.Now.AddHours(hours); {
land.ParcelAccessList.Add(entry); if (e.AgentID == key && e.Flags == AccessList.Ban)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Ban;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9485,19 +9503,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
{ {
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) int idx = land.LandData.ParcelAccessList.FindIndex(
{ delegate(ParcelManager.ParcelAccessEntry e)
if (entry.AgentID == key && entry.Flags == AccessList.Access) {
{ if (e.AgentID == key && e.Flags == AccessList.Access)
land.ParcelAccessList.Remove(entry); return true;
break; return false;
} });
}
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9507,19 +9527,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{ {
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) int idx = land.LandData.ParcelAccessList.FindIndex(
{ delegate(ParcelManager.ParcelAccessEntry e)
if (entry.AgentID == key && entry.Flags == AccessList.Ban) {
{ if (e.AgentID == key && e.Flags == AccessList.Ban)
land.ParcelAccessList.Remove(entry); return true;
break; return false;
} });
}
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
} }
} }
ScriptSleep(100); ScriptSleep(100);

View File

@ -1335,7 +1335,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
} }
if (! World.Permissions.CanEditParcel(m_host.OwnerID, startLandObject)) if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, startLandObject, GroupPowers.LandOptions))
{ {
OSSLShoutError("You do not have permission to modify the parcel"); OSSLShoutError("You do not have permission to modify the parcel");
return; return;

View File

@ -29,6 +29,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
using OpenSim.Framework; using OpenSim.Framework;
@ -48,7 +49,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static UUID m_HGMapImage = new UUID("00000000-0000-1111-9999-000000000013"); private static UUID m_HGMapImage = new UUID("00000000-0000-1111-9999-000000000013");
private IAssetService m_AssetService; private IAssetService m_AssetService;
@ -143,24 +144,25 @@ namespace OpenSim.Services.Connectors.Hypergrid
return true; return true;
} }
UUID m_MissingTexture = new UUID("5748decc-f629-461c-9a36-a35a221fe21f"); public UUID GetMapImage(UUID regionID, string imageURL, string storagePath)
public UUID GetMapImage(UUID regionID, string imageURL)
{ {
if (m_AssetService == null) if (m_AssetService == null)
return m_MissingTexture; return m_HGMapImage;
UUID mapTile = m_HGMapImage;
string filename = string.Empty;
Bitmap bitmap = null;
try try
{ {
WebClient c = new WebClient(); WebClient c = new WebClient();
//m_log.Debug("JPEG: " + imageURL); //m_log.Debug("JPEG: " + imageURL);
string filename = regionID.ToString(); string name = regionID.ToString();
c.DownloadFile(imageURL, filename + ".jpg"); filename = Path.Combine(storagePath, name + ".jpg");
Bitmap m = new Bitmap(filename + ".jpg"); c.DownloadFile(imageURL, filename);
bitmap = new Bitmap(filename);
//m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width);
byte[] imageData = OpenJPEG.EncodeFromImage(m, true); byte[] imageData = OpenJPEG.EncodeFromImage(bitmap, true);
AssetBase ass = new AssetBase(UUID.Random(), "region " + filename, (sbyte)AssetType.Texture, regionID.ToString()); AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString());
// !!! for now // !!! for now
//info.RegionSettings.TerrainImageID = ass.FullID; //info.RegionSettings.TerrainImageID = ass.FullID;
@ -172,14 +174,13 @@ namespace OpenSim.Services.Connectors.Hypergrid
m_AssetService.Store(ass); m_AssetService.Store(ass);
// finally // finally
return ass.FullID; mapTile = ass.FullID;
} }
catch // LEGIT: Catching problems caused by OpenJPEG p/invoke catch // LEGIT: Catching problems caused by OpenJPEG p/invoke
{ {
m_log.Warn("[GATEKEEPER SERVICE CONNECTOR]: Failed getting/storing map image, because it is probably already in the cache"); m_log.Info("[GATEKEEPER SERVICE CONNECTOR]: Failed getting/storing map image, because it is probably already in the cache");
} }
return UUID.Zero; return mapTile;
} }
public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID) public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID)

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
@ -52,8 +53,6 @@ namespace OpenSim.Services.GridService
LogManager.GetLogger( LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType); MethodBase.GetCurrentMethod().DeclaringType);
private static UUID m_HGMapImage = new UUID("00000000-0000-1111-9999-000000000013");
private static uint m_autoMappingX = 0; private static uint m_autoMappingX = 0;
private static uint m_autoMappingY = 0; private static uint m_autoMappingY = 0;
private static bool m_enableAutoMapping = false; private static bool m_enableAutoMapping = false;
@ -65,6 +64,7 @@ namespace OpenSim.Services.GridService
protected UUID m_ScopeID = UUID.Zero; protected UUID m_ScopeID = UUID.Zero;
protected bool m_Check4096 = true; protected bool m_Check4096 = true;
protected string m_MapTileDirectory = string.Empty;
// Hyperlink regions are hyperlinks on the map // Hyperlink regions are hyperlinks on the map
public readonly Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>(); public readonly Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>();
@ -121,9 +121,24 @@ namespace OpenSim.Services.GridService
m_Check4096 = gridConfig.GetBoolean("Check4096", true); m_Check4096 = gridConfig.GetBoolean("Check4096", true);
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", string.Empty);
m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService);
m_log.DebugFormat("[HYPERGRID LINKER]: Loaded all services..."); m_log.Debug("[HYPERGRID LINKER]: Loaded all services...");
}
if (!string.IsNullOrEmpty(m_MapTileDirectory))
{
try
{
Directory.CreateDirectory(m_MapTileDirectory);
}
catch (Exception e)
{
m_log.WarnFormat("[HYPERGRID LINKER]: Could not create map tile storage directory {0}: {1}", m_MapTileDirectory, e);
m_MapTileDirectory = string.Empty;
}
} }
if (MainConsole.Instance != null) if (MainConsole.Instance != null)
@ -271,42 +286,22 @@ namespace OpenSim.Services.GridService
if (!m_GatekeeperConnector.LinkRegion(regInfo, out regionID, out handle, out externalName, out imageURL, out reason)) if (!m_GatekeeperConnector.LinkRegion(regInfo, out regionID, out handle, out externalName, out imageURL, out reason))
return false; return false;
if (regionID != UUID.Zero) if (regionID == UUID.Zero)
{
region = m_GridService.GetRegionByUUID(scopeID, regionID);
if (region != null)
{
m_log.DebugFormat("[HYPERGRID LINKER]: Region already exists in coordinates {0} {1}",
region.RegionLocX / Constants.RegionSize, region.RegionLocY / Constants.RegionSize);
regInfo = region;
return true;
}
regInfo.RegionID = regionID;
if ( externalName == string.Empty )
regInfo.RegionName = regInfo.ServerURI;
else
regInfo.RegionName = externalName;
m_log.Debug("[HYPERGRID LINKER]: naming linked region " + regInfo.RegionName);
// Try get the map image
//regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL);
// I need a texture that works for this... the one I tried doesn't seem to be working
regInfo.TerrainImage = m_HGMapImage;
AddHyperlinkRegion(regInfo, handle);
m_log.Info("[HYPERGRID LINKER]: Successfully linked to region_uuid " + regInfo.RegionID);
}
else
{ {
m_log.Warn("[HYPERGRID LINKER]: Unable to link region"); m_log.Warn("[HYPERGRID LINKER]: Unable to link region");
reason = "Remote region could not be found"; reason = "Remote region could not be found";
return false; return false;
} }
region = m_GridService.GetRegionByUUID(scopeID, regionID);
if (region != null)
{
m_log.DebugFormat("[HYPERGRID LINKER]: Region already exists in coordinates {0} {1}",
region.RegionLocX / Constants.RegionSize, region.RegionLocY / Constants.RegionSize);
regInfo = region;
return true;
}
uint x, y; uint x, y;
if (m_Check4096 && !Check4096(handle, out x, out y)) if (m_Check4096 && !Check4096(handle, out x, out y))
{ {
@ -316,7 +311,20 @@ namespace OpenSim.Services.GridService
return false; return false;
} }
m_log.Debug("[HYPERGRID LINKER]: link region succeeded"); regInfo.RegionID = regionID;
if ( externalName == string.Empty )
regInfo.RegionName = regInfo.ServerURI;
else
regInfo.RegionName = externalName;
m_log.Debug("[HYPERGRID LINKER]: naming linked region " + regInfo.RegionName);
// Get the map image
regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL, m_MapTileDirectory);
AddHyperlinkRegion(regInfo, handle);
m_log.Info("[HYPERGRID LINKER]: Successfully linked to region_uuid " + regInfo.RegionID);
return true; return true;
} }

View File

@ -123,42 +123,39 @@ namespace OpenSim.Services.HypergridService
externalName = m_ExternalName + ((regionName != string.Empty) ? " " + regionName : ""); externalName = m_ExternalName + ((regionName != string.Empty) ? " " + regionName : "");
imageURL = string.Empty; imageURL = string.Empty;
reason = string.Empty; reason = string.Empty;
GridRegion region = null;
m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to link to {0}", (regionName == string.Empty)? "default region" : regionName); m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to link to {0}", (regionName == string.Empty)? "default region" : regionName);
if (!m_AllowTeleportsToAnyRegion || regionName == string.Empty) if (!m_AllowTeleportsToAnyRegion || regionName == string.Empty)
{ {
List<GridRegion> defs = m_GridService.GetDefaultRegions(m_ScopeID); List<GridRegion> defs = m_GridService.GetDefaultRegions(m_ScopeID);
if (defs != null && defs.Count > 0) if (defs != null && defs.Count > 0)
m_DefaultGatewayRegion = defs[0];
try
{ {
regionID = m_DefaultGatewayRegion.RegionID; region = defs[0];
regionHandle = m_DefaultGatewayRegion.RegionHandle; m_DefaultGatewayRegion = region;
} }
catch else
{ {
reason = "Grid setup problem. Try specifying a particular region here."; reason = "Grid setup problem. Try specifying a particular region here.";
m_log.DebugFormat("[GATEKEEPER SERVICE]: Unable to send information. Please specify a default region for this grid!"); m_log.DebugFormat("[GATEKEEPER SERVICE]: Unable to send information. Please specify a default region for this grid!");
return false; return false;
} }
return true;
} }
else
GridRegion region = m_GridService.GetRegionByName(m_ScopeID, regionName);
if (region == null)
{ {
reason = "Region not found"; region = m_GridService.GetRegionByName(m_ScopeID, regionName);
return false; if (region == null)
{
reason = "Region not found";
return false;
}
} }
regionID = region.RegionID; regionID = region.RegionID;
regionHandle = region.RegionHandle; regionHandle = region.RegionHandle;
string regionimage = "regionImage" + region.RegionID.ToString();
regionimage = regionimage.Replace("-", "");
string regionimage = "regionImage" + regionID.ToString();
regionimage = regionimage.Replace("-", "");
imageURL = region.ServerURI + "index.php?method=" + regionimage; imageURL = region.ServerURI + "index.php?method=" + regionimage;
return true; return true;

View File

@ -68,6 +68,12 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
;; Perform distance check for the creation of a linked region ;; Perform distance check for the creation of a linked region
; Check4096 = "True" ; Check4096 = "True"
;; Needed to display non-default map tile images for linked regions
AssetService = "OpenSim.Services.AssetService.dll:AssetService"
;; Directory for map tile images of linked regions
; MapTileDirectory = "./"
;; Next, we can specify properties of regions, including default and fallback regions ;; Next, we can specify properties of regions, including default and fallback regions
;; The syntax is: Region_<RegionName> = "<flags>" ;; The syntax is: Region_<RegionName> = "<flags>"
;; or: Region_<RegionID> = "<flags>" ;; or: Region_<RegionID> = "<flags>"

View File

@ -42,6 +42,9 @@
GridServerURI = "http://mygridserver.com:8003" GridServerURI = "http://mygridserver.com:8003"
;AllowHypergridMapSearch = true ;AllowHypergridMapSearch = true
;; Directory for map tile images of linked regions
; MapTileDirectory = "./"
[AvatarService] [AvatarService]
; ;
; change this to your grid-wide grid server ; change this to your grid-wide grid server

View File

@ -44,12 +44,15 @@
LocalGridInventoryService = "OpenSim.Region.CoreModules.dll:RemoteXInventoryServicesConnector" LocalGridInventoryService = "OpenSim.Region.CoreModules.dll:RemoteXInventoryServicesConnector"
[GridService] [GridService]
; RemoteGridServicesConnector instantiates a LocalGridServicesConnector, ; RemoteGridServicesConnector instantiates a LocalGridServicesConnector,
; which in turn uses this ; which in turn uses this
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
AllowHypergridMapSearch = true ; Needed to display non-default map tile images for linked regions
AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
AllowHypergridMapSearch = true
[LibraryService] [LibraryService]
LocalServiceModule = "OpenSim.Services.InventoryService.dll:LibraryService" LocalServiceModule = "OpenSim.Services.InventoryService.dll:LibraryService"

View File

@ -65,6 +65,9 @@
;; With hypergrid, perform distance check for the creation of a linked region ;; With hypergrid, perform distance check for the creation of a linked region
; Check4096 = true ; Check4096 = true
;; Directory for map tile images of remote regions
; MapTileDirectory = "./"
;; Next, we can specify properties of regions, including default and fallback regions ;; Next, we can specify properties of regions, including default and fallback regions
;; The syntax is: Region_<RegioName> = "<flags>" ;; The syntax is: Region_<RegioName> = "<flags>"
;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut ;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut

View File

@ -65,12 +65,15 @@
LocalServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService" LocalServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
[GridService] [GridService]
; LocalGridServicesConnector needs this ; LocalGridServicesConnector needs this
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
Realm = "regions" Realm = "regions"
StorageProvider = "OpenSim.Data.Null.dll" StorageProvider = "OpenSim.Data.Null.dll"
AllowHypergridMapSearch = true ; Needed to display non-default map tile images for remote regions
AssetService = "OpenSim.Services.AssetService.dll:AssetService"
AllowHypergridMapSearch = true
[PresenceService] [PresenceService]
LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService" LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService"