Mantis #7934 and related: landing points and telehubs for gods. Added a new configuration variable LandingPointBehavior that can switch between what we're used to in OpenSim and the behavior in SL.
parent
1065a4c1e4
commit
b522f0916a
|
@ -462,6 +462,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </value>
|
/// </value>
|
||||||
private IScriptModule[] m_scriptEngines;
|
private IScriptModule[] m_scriptEngines;
|
||||||
|
|
||||||
|
private enum LandingPointBehavior
|
||||||
|
{
|
||||||
|
OS = 1,
|
||||||
|
SL = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
private LandingPointBehavior m_LandingPointBehavior = LandingPointBehavior.OS;
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1051,6 +1059,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Appearance = appearance;
|
Appearance = appearance;
|
||||||
|
|
||||||
m_stateMachine = new ScenePresenceStateMachine(this);
|
m_stateMachine = new ScenePresenceStateMachine(this);
|
||||||
|
|
||||||
|
IConfig sconfig = m_scene.Config.Configs["EntityTransfer"];
|
||||||
|
if (sconfig != null)
|
||||||
|
{
|
||||||
|
string lpb = sconfig.GetString("LandingPointBehavior", "LandingPointBehavior_OS");
|
||||||
|
if (lpb == "LandingPointBehavior_SL")
|
||||||
|
m_LandingPointBehavior = LandingPointBehavior.SL;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RegionHeartbeatEnd(Scene scene)
|
private void RegionHeartbeatEnd(Scene scene)
|
||||||
|
@ -1208,10 +1225,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (ParentID == 0)
|
if (ParentID == 0)
|
||||||
{
|
{
|
||||||
bool positionChanged = false;
|
bool positionChanged = false;
|
||||||
if(!CheckAndAdjustLandingPoint(ref pos, ref lookat, ref positionChanged ))
|
bool success = true;
|
||||||
{
|
if (m_LandingPointBehavior == LandingPointBehavior.OS)
|
||||||
m_log.DebugFormat("[SCENE PRESENCE MakeRootAgent]: houston we have a problem.. {0}({1} got here banned",Name, UUID);
|
success = CheckAndAdjustLandingPoint_OS(ref pos, ref lookat, ref positionChanged);
|
||||||
}
|
else
|
||||||
|
success = CheckAndAdjustLandingPoint_SL(ref pos, ref lookat, ref positionChanged);
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
m_log.DebugFormat("[SCENE PRESENCE MakeRootAgent]: houston we have a problem.. {0} ({1} got banned)", Name, UUID);
|
||||||
|
|
||||||
if (pos.X < 0f || pos.Y < 0f
|
if (pos.X < 0f || pos.Y < 0f
|
||||||
|| pos.X >= m_scene.RegionInfo.RegionSizeX
|
|| pos.X >= m_scene.RegionInfo.RegionSizeX
|
||||||
|
@ -5788,8 +5809,63 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
const TeleportFlags adicionalLandPointFlags = TeleportFlags.ViaLandmark |
|
const TeleportFlags adicionalLandPointFlags = TeleportFlags.ViaLandmark |
|
||||||
TeleportFlags.ViaLocation | TeleportFlags.ViaHGLogin;
|
TeleportFlags.ViaLocation | TeleportFlags.ViaHGLogin;
|
||||||
|
|
||||||
// Modify landing point based on telehubs or parcel restrictions.
|
// Modify landing point based on possible banning, telehubs or parcel restrictions.
|
||||||
private bool CheckAndAdjustLandingPoint(ref Vector3 pos, ref Vector3 lookat, ref bool positionChanged)
|
// This is the behavior in OpenSim for a very long time, different from SL
|
||||||
|
private bool CheckAndAdjustLandingPoint_OS(ref Vector3 pos, ref Vector3 lookat, ref bool positionChanged)
|
||||||
|
{
|
||||||
|
string reason;
|
||||||
|
|
||||||
|
// Honor bans
|
||||||
|
if (!m_scene.TestLandRestrictions(UUID, out reason, ref pos.X, ref pos.Y))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SceneObjectGroup telehub = null;
|
||||||
|
if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null)
|
||||||
|
{
|
||||||
|
if (!m_scene.RegionInfo.EstateSettings.AllowDirectTeleport)
|
||||||
|
{
|
||||||
|
CheckAndAdjustTelehub(telehub, ref pos, ref positionChanged);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
|
||||||
|
if (land != null)
|
||||||
|
{
|
||||||
|
if (Scene.DebugTeleporting)
|
||||||
|
TeleportFlagsDebug();
|
||||||
|
|
||||||
|
// If we come in via login, landmark or map, we want to
|
||||||
|
// honor landing points. If we come in via Lure, we want
|
||||||
|
// to ignore them.
|
||||||
|
if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) ==
|
||||||
|
(TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) ||
|
||||||
|
(m_teleportFlags & adicionalLandPointFlags) != 0)
|
||||||
|
{
|
||||||
|
// Don't restrict gods, estate managers, or land owners to
|
||||||
|
// the TP point. This behaviour mimics agni.
|
||||||
|
if (land.LandData.LandingType == (byte)LandingType.LandingPoint &&
|
||||||
|
land.LandData.UserLocation != Vector3.Zero &&
|
||||||
|
GodLevel < 200 &&
|
||||||
|
((land.LandData.OwnerID != m_uuid &&
|
||||||
|
!m_scene.Permissions.IsGod(m_uuid) &&
|
||||||
|
!m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) ||
|
||||||
|
(m_teleportFlags & TeleportFlags.ViaLocation) != 0 ||
|
||||||
|
(m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0))
|
||||||
|
{
|
||||||
|
pos = land.LandData.UserLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
land.SendLandUpdateToClient(ControllingClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify landing point based on telehubs or parcel restrictions.
|
||||||
|
// This is a behavior coming from AVN, somewhat mimicking SL
|
||||||
|
private bool CheckAndAdjustLandingPoint_SL(ref Vector3 pos, ref Vector3 lookat, ref bool positionChanged)
|
||||||
{
|
{
|
||||||
string reason;
|
string reason;
|
||||||
|
|
||||||
|
|
|
@ -653,6 +653,11 @@
|
||||||
;; Disabling cancellation can be okay in small closed grids where all teleports are highly likely to suceed.
|
;; Disabling cancellation can be okay in small closed grids where all teleports are highly likely to suceed.
|
||||||
;DisableInterRegionTeleportCancellation = false
|
;DisableInterRegionTeleportCancellation = false
|
||||||
|
|
||||||
|
;# {LandingPointBehavior} {} {How to honor landing points and telehubs for gods.} {LandingPointBehavior_OS LandingPointBehavior_SL} LandingPointBehavior_OS
|
||||||
|
;; This option exists to control the behavior of teleporting gods into places that have landing points
|
||||||
|
;; and telehubs. Historically, there has been a difference: OpenSim (OS) has honored landing points and telehubs even for
|
||||||
|
;; avatars with god permissions; SL lets gods land wherever they want.
|
||||||
|
;LandingPointBehavior = LandingPointBehavior_OS
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
;# {OfflineMessageModule} {} {Module to use for offline message storage} {OfflineMessageModule "Offline Message Module V2" *}
|
;# {OfflineMessageModule} {} {Module to use for offline message storage} {OfflineMessageModule "Offline Message Module V2" *}
|
||||||
|
|
|
@ -808,6 +808,11 @@
|
||||||
; Disabling cancellation can be okay in small closed grids where all teleports are highly likely to suceed.
|
; Disabling cancellation can be okay in small closed grids where all teleports are highly likely to suceed.
|
||||||
DisableInterRegionTeleportCancellation = false
|
DisableInterRegionTeleportCancellation = false
|
||||||
|
|
||||||
|
;; This option exists to control the behavior of teleporting gods into places that have landing points
|
||||||
|
;; and telehubs. Historically, there has been a difference: OpenSim (OS) has honored landing points and telehubs even for
|
||||||
|
;; avatars with god permissions; SL lets gods land wherever they want.
|
||||||
|
LandingPointBehavior = LandingPointBehavior_OS
|
||||||
|
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
; Control which region module is used for instant messaging.
|
; Control which region module is used for instant messaging.
|
||||||
|
|
Loading…
Reference in New Issue