mirror of
https://github.com/opensim/opensim.git
synced 2026-08-08 10:15:33 +08:00
Very Preliminary local teleporting added (currently only can teleport within the current region).
Now need to add teleporting between regions and use of the dynamic texture for the terrain.
This commit is contained in:
@@ -45,7 +45,7 @@ namespace OpenSim.LocalCommunications
|
||||
{
|
||||
UserServer = null;
|
||||
GridServer = SandManager;
|
||||
InterSims = SandManager;
|
||||
InterRegion = SandManager;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,11 +36,10 @@ using OpenSim.Framework;
|
||||
namespace OpenSim.LocalCommunications
|
||||
{
|
||||
|
||||
|
||||
public class LocalBackEndServices : IGridServices, IInterRegionCommunications
|
||||
{
|
||||
protected Dictionary<ulong, RegionInfo> regions = new Dictionary<ulong, RegionInfo>();
|
||||
protected Dictionary<ulong, RegionCommsHostBase> regionHosts = new Dictionary<ulong, RegionCommsHostBase>();
|
||||
protected Dictionary<ulong, RegionCommsListener> regionHosts = new Dictionary<ulong, RegionCommsListener>();
|
||||
|
||||
public LocalBackEndServices()
|
||||
{
|
||||
@@ -52,14 +51,14 @@ namespace OpenSim.LocalCommunications
|
||||
/// </summary>
|
||||
/// <param name="regionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public RegionCommsHostBase RegisterRegion(RegionInfo regionInfo)
|
||||
public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
|
||||
{
|
||||
//Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering");
|
||||
if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle))
|
||||
{
|
||||
//Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle );
|
||||
this.regions.Add(regionInfo.RegionHandle, regionInfo);
|
||||
RegionCommsHostBase regionHost = new RegionCommsHostBase();
|
||||
RegionCommsListener regionHost = new RegionCommsListener();
|
||||
this.regionHosts.Add(regionInfo.RegionHandle, regionHost);
|
||||
|
||||
return regionHost;
|
||||
@@ -110,6 +109,36 @@ namespace OpenSim.LocalCommunications
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="minX"></param>
|
||||
/// <param name="minY"></param>
|
||||
/// <param name="maxX"></param>
|
||||
/// <param name="maxY"></param>
|
||||
/// <returns></returns>
|
||||
public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
|
||||
{
|
||||
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||
foreach(RegionInfo regInfo in this.regions.Values)
|
||||
{
|
||||
if (((regInfo.RegionLocX > minX) && (regInfo.RegionLocX < maxX)) && ((regInfo.RegionLocY > minY) && (regInfo.RegionLocY < maxY)))
|
||||
{
|
||||
MapBlockData map = new MapBlockData();
|
||||
map.Name = regInfo.RegionName;
|
||||
map.X = (ushort)regInfo.RegionLocX;
|
||||
map.Y = (ushort)regInfo.RegionLocY;
|
||||
map.WaterHeight =(byte) regInfo.estateSettings.waterHeight;
|
||||
map.MapImageId = new LLUUID("00000000-0000-0000-9999-000000000007");
|
||||
map.Agents = 1;
|
||||
map.RegionFlags = 72458694;
|
||||
map.Access = 13;
|
||||
mapBlocks.Add(map);
|
||||
}
|
||||
}
|
||||
return mapBlocks;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
/// <param name="regionHandle"></param>
|
||||
|
||||
@@ -86,6 +86,12 @@
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\OpenSim.Caches\OpenSim.Caches.csproj">
|
||||
<Name>OpenSim.Caches</Name>
|
||||
<Project>{1938EB12-0000-0000-0000-000000000000}</Project>
|
||||
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Common\OpenSim.Framework\OpenSim.Framework.csproj">
|
||||
<Name>OpenSim.Framework</Name>
|
||||
<Project>{8ACA2445-0000-0000-0000-000000000000}</Project>
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
<include name="../../bin/Db4objects.Db4o.dll" />
|
||||
<include name="../../bin/libsecondlife.dll" />
|
||||
<include name="../../bin/OpenGrid.Framework.Communications.dll" />
|
||||
<include name="../../bin/OpenSim.Caches.dll" />
|
||||
<include name="../../bin/OpenSim.Framework.dll" />
|
||||
<include name="../../bin/OpenSim.Framework.Console.dll" />
|
||||
<include name="../../bin/OpenSim.GenericConfig.Xml.dll" />
|
||||
|
||||
@@ -43,36 +43,24 @@ namespace OpenSim.Region.Scenes
|
||||
/// </summary>
|
||||
public override void update()
|
||||
{
|
||||
if (this.newForce)
|
||||
if (this.childAvatar == false)
|
||||
{
|
||||
this.SendTerseUpdateToALLClients();
|
||||
_updateCount = 0;
|
||||
}
|
||||
else if (movementflag != 0)
|
||||
{
|
||||
_updateCount++;
|
||||
if (_updateCount > 3)
|
||||
if (this.newForce)
|
||||
{
|
||||
this.SendTerseUpdateToALLClients();
|
||||
_updateCount = 0;
|
||||
}
|
||||
}
|
||||
else if (movementflag != 0)
|
||||
{
|
||||
_updateCount++;
|
||||
if (_updateCount > 3)
|
||||
{
|
||||
this.SendTerseUpdateToALLClients();
|
||||
_updateCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
LLVector3 pos2 = this.Pos;
|
||||
LLVector3 vel = this.Velocity;
|
||||
|
||||
float timeStep = 0.3f;
|
||||
pos2.X = pos2.X + (vel.X * timeStep);
|
||||
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
||||
pos2.Z = pos2.Z + (vel.Z * timeStep);
|
||||
if ((pos2.X < 0) || (pos2.X > 256))
|
||||
{
|
||||
this.CrossToNewRegion();
|
||||
}
|
||||
|
||||
if ((pos2.Y < 0) || (pos2.Y > 256))
|
||||
{
|
||||
this.CrossToNewRegion();
|
||||
this.CheckBorderCrossing();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,10 +153,35 @@ namespace OpenSim.Region.Scenes
|
||||
|
||||
}
|
||||
|
||||
private void CrossToNewRegion()
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
protected void CheckBorderCrossing()
|
||||
{
|
||||
LLVector3 pos2 = this.Pos;
|
||||
LLVector3 vel = this.Velocity;
|
||||
|
||||
float timeStep = 0.3f;
|
||||
pos2.X = pos2.X + (vel.X * timeStep);
|
||||
pos2.Y = pos2.Y + (vel.Y * timeStep);
|
||||
pos2.Z = pos2.Z + (vel.Z * timeStep);
|
||||
|
||||
if ((pos2.X < 0) || (pos2.X > 256))
|
||||
{
|
||||
this.CrossToNewRegion();
|
||||
}
|
||||
|
||||
if ((pos2.Y < 0) || (pos2.Y > 256))
|
||||
{
|
||||
this.CrossToNewRegion();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
protected void CrossToNewRegion()
|
||||
{
|
||||
|
||||
// Console.WriteLine("crossing to new region from region " + this.m_regionInfo.RegionLocX + " , "+ this.m_regionInfo.RegionLocY);
|
||||
LLVector3 pos = this.Pos;
|
||||
LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z);
|
||||
uint neighbourx = this.m_regionInfo.RegionLocX;
|
||||
@@ -196,14 +209,14 @@ namespace OpenSim.Region.Scenes
|
||||
}
|
||||
|
||||
LLVector3 vel = this.velocity;
|
||||
// Console.WriteLine("new region should be " + neighbourx + " , " + neighboury);
|
||||
ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury* 256));
|
||||
RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle);
|
||||
if (neighbourRegion != null)
|
||||
{
|
||||
// Console.WriteLine("current region port is "+ this.m_regionInfo.IPListenPort + " now crossing to new region with port " + neighbourRegion.IPListenPort);
|
||||
this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos);
|
||||
this.DownGradeAvatar();
|
||||
this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, System.Net.IPAddress.Parse(neighbourRegion.IPListenAddr), (ushort)neighbourRegion.IPListenPort);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace OpenSim.Region.Scenes
|
||||
ControllingClient.OnCompleteMovementToRegion += new GenericCall2(this.SendInitialPosition);
|
||||
ControllingClient.OnAgentUpdate += new UpdateAgent(this.HandleAgentUpdate);
|
||||
// ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
|
||||
ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
|
||||
// ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
|
||||
//ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
|
||||
|
||||
}
|
||||
@@ -138,7 +138,34 @@ namespace OpenSim.Region.Scenes
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
public void UpGradeAvatar(LLVector3 pos)
|
||||
{
|
||||
//this.childAvatar = false;
|
||||
this.Pos = pos;
|
||||
}
|
||||
|
||||
protected void DownGradeAvatar()
|
||||
{
|
||||
this.Velocity = new LLVector3(0, 0, 0);
|
||||
this.Pos = new LLVector3(128, 128, 70);
|
||||
this.childAvatar = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
public void Teleport(LLVector3 pos)
|
||||
{
|
||||
this.Pos = pos;
|
||||
this.SendTerseUpdateToALLClients();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -189,7 +216,16 @@ namespace OpenSim.Region.Scenes
|
||||
/// </summary>
|
||||
public void CompleteMovement()
|
||||
{
|
||||
this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos);
|
||||
LLVector3 look = this.Velocity;
|
||||
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
||||
{
|
||||
look = new LLVector3(0.99f, 0.042f, 0);
|
||||
}
|
||||
this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look);
|
||||
if (this.childAvatar)
|
||||
{
|
||||
this.childAvatar = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -42,7 +42,7 @@ using OpenSim.Framework;
|
||||
using OpenSim.Region.Scripting;
|
||||
using OpenSim.Terrain;
|
||||
using OpenGrid.Framework.Communications;
|
||||
|
||||
using OpenSim.Caches;
|
||||
|
||||
namespace OpenSim.Region.Scenes
|
||||
{
|
||||
@@ -64,8 +64,9 @@ namespace OpenSim.Region.Scenes
|
||||
private Mutex updateLock;
|
||||
public string m_datastore;
|
||||
protected AuthenticateSessionsBase authenticateHandler;
|
||||
protected RegionCommsHostBase regionCommsHost;
|
||||
protected RegionCommsListener regionCommsHost;
|
||||
protected CommunicationsManager commsManager;
|
||||
|
||||
|
||||
public ParcelManager parcelManager;
|
||||
public EstateManager estateManager;
|
||||
@@ -95,13 +96,14 @@ namespace OpenSim.Region.Scenes
|
||||
/// <param name="clientThreads">Dictionary to contain client threads</param>
|
||||
/// <param name="regionHandle">Region Handle for this region</param>
|
||||
/// <param name="regionName">Region Name for this region</param>
|
||||
public Scene(Dictionary<uint, IClientAPI> clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan)
|
||||
public Scene(Dictionary<uint, IClientAPI> clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach)
|
||||
{
|
||||
try
|
||||
{
|
||||
updateLock = new Mutex(false);
|
||||
this.authenticateHandler = authen;
|
||||
this.commsManager = commsMan;
|
||||
this.assetCache = assetCach;
|
||||
m_clientThreads = clientThreads;
|
||||
m_regInfo = regInfo;
|
||||
m_regionHandle = m_regInfo.RegionHandle;
|
||||
@@ -507,8 +509,10 @@ namespace OpenSim.Region.Scenes
|
||||
remoteClient.OnRequestWearables += new GenericCall(this.InformClientOfNeighbours);
|
||||
remoteClient.OnAddPrim += new GenericCall4(this.AddNewPrim);
|
||||
remoteClient.OnUpdatePrimPosition += new UpdatePrimVector(this.UpdatePrimPosition);
|
||||
|
||||
/* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
|
||||
remoteClient.OnRequestMapBlocks += new RequestMapBlocks(this.RequestMapBlocks);
|
||||
remoteClient.OnTeleportLocationRequest += new TeleportLocationRequest(this.RequestTeleportLocation);
|
||||
|
||||
/* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
|
||||
remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
|
||||
remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
|
||||
remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
|
||||
@@ -562,51 +566,7 @@ namespace OpenSim.Region.Scenes
|
||||
return;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
protected void InformClientOfNeighbours(IClientAPI remoteClient)
|
||||
{
|
||||
// Console.WriteLine("informing client of neighbouring regions");
|
||||
List<RegionInfo> neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
|
||||
|
||||
//Console.WriteLine("we have " + neighbours.Count + " neighbouring regions");
|
||||
if (neighbours != null)
|
||||
{
|
||||
for (int i = 0; i < neighbours.Count; i++)
|
||||
{
|
||||
// Console.WriteLine("sending neighbours data");
|
||||
AgentCircuitData agent = remoteClient.RequestClientInfo();
|
||||
agent.BaseFolder = LLUUID.Zero;
|
||||
agent.InventoryFolder = LLUUID.Zero;
|
||||
agent.startpos = new LLVector3(128, 128, 70);
|
||||
agent.child = true;
|
||||
this.commsManager.InterSims.InformNeighbourOfChildAgent(neighbours[i].RegionHandle, agent);
|
||||
remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, System.Net.IPAddress.Parse(neighbours[i].IPListenAddr), (ushort)neighbours[i].IPListenPort);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="regionHandle"></param>
|
||||
/// <returns></returns>
|
||||
public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
|
||||
{
|
||||
return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="regionhandle"></param>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="position"></param>
|
||||
public void InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
|
||||
{
|
||||
this.commsManager.InterSims.ExpectAvatarCrossing(regionhandle, agentID, position);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
@@ -725,11 +685,97 @@ namespace OpenSim.Region.Scenes
|
||||
{
|
||||
if (this.Avatars.ContainsKey(agentID))
|
||||
{
|
||||
this.Avatars[agentID].Pos = position;
|
||||
this.Avatars[agentID].UpGradeAvatar(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
protected void InformClientOfNeighbours(IClientAPI remoteClient)
|
||||
{
|
||||
// Console.WriteLine("informing client of neighbouring regions");
|
||||
List<RegionInfo> neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
|
||||
|
||||
//Console.WriteLine("we have " + neighbours.Count + " neighbouring regions");
|
||||
if (neighbours != null)
|
||||
{
|
||||
for (int i = 0; i < neighbours.Count; i++)
|
||||
{
|
||||
// Console.WriteLine("sending neighbours data");
|
||||
AgentCircuitData agent = remoteClient.RequestClientInfo();
|
||||
agent.BaseFolder = LLUUID.Zero;
|
||||
agent.InventoryFolder = LLUUID.Zero;
|
||||
agent.startpos = new LLVector3(128, 128, 70);
|
||||
agent.child = true;
|
||||
this.commsManager.InterRegion.InformNeighbourOfChildAgent(neighbours[i].RegionHandle, agent);
|
||||
remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, System.Net.IPAddress.Parse(neighbours[i].IPListenAddr), (ushort)neighbours[i].IPListenPort);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="regionHandle"></param>
|
||||
/// <returns></returns>
|
||||
public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
|
||||
{
|
||||
return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="minX"></param>
|
||||
/// <param name="minY"></param>
|
||||
/// <param name="maxX"></param>
|
||||
/// <param name="maxY"></param>
|
||||
public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
|
||||
{
|
||||
List<MapBlockData> mapBlocks;
|
||||
mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
|
||||
|
||||
remoteClient.SendMapBlock(mapBlocks);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="RegionHandle"></param>
|
||||
/// <param name="position"></param>
|
||||
/// <param name="lookAt"></param>
|
||||
/// <param name="flags"></param>
|
||||
public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
|
||||
{
|
||||
if (regionHandle == this.m_regionHandle)
|
||||
{
|
||||
if (this.Avatars.ContainsKey(remoteClient.AgentId))
|
||||
{
|
||||
remoteClient.SendTeleportLocationStart();
|
||||
remoteClient.SendLocalTeleport(position, lookAt, flags);
|
||||
this.Avatars[remoteClient.AgentId].Teleport(position);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
remoteClient.SendTeleportCancel();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="regionhandle"></param>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="position"></param>
|
||||
public void InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
|
||||
{
|
||||
this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -39,6 +39,7 @@ using OpenSim.Framework.Types;
|
||||
using OpenSim.Framework.Inventory;
|
||||
using OpenSim.Region.Scripting;
|
||||
using OpenSim.Terrain;
|
||||
using OpenSim.Caches;
|
||||
|
||||
namespace OpenSim.Region.Scenes
|
||||
{
|
||||
@@ -54,6 +55,7 @@ namespace OpenSim.Region.Scenes
|
||||
protected libsecondlife.TerrainManager TerrainManager; // To be referenced via TerrainEngine
|
||||
protected object m_syncRoot = new object();
|
||||
private uint m_nextLocalId = 8880000;
|
||||
protected AssetCache assetCache;
|
||||
|
||||
#region Update Methods
|
||||
/// <summary>
|
||||
|
||||
@@ -63,6 +63,8 @@ namespace OpenSim
|
||||
public event GenericCall2 OnStopMovement;
|
||||
public event NewAvatar OnNewAvatar;
|
||||
public event GenericCall6 OnRemoveAvatar;
|
||||
public event RequestMapBlocks OnRequestMapBlocks;
|
||||
public event TeleportLocationRequest OnTeleportLocationRequest;
|
||||
|
||||
public event ParcelPropertiesRequest OnParcelPropertiesRequest;
|
||||
public event ParcelDivideRequest OnParcelDivideRequest;
|
||||
@@ -155,7 +157,7 @@ namespace OpenSim
|
||||
handshake.RegionInfo.TerrainBase3 = regionInfo.estateSettings.terrainBase3;
|
||||
handshake.RegionInfo.TerrainDetail0 = regionInfo.estateSettings.terrainDetail0;
|
||||
handshake.RegionInfo.TerrainDetail1 = regionInfo.estateSettings.terrainDetail1;
|
||||
handshake.RegionInfo.TerrainDetail2 =regionInfo.estateSettings.terrainDetail2;
|
||||
handshake.RegionInfo.TerrainDetail2 = regionInfo.estateSettings.terrainDetail2;
|
||||
handshake.RegionInfo.TerrainDetail3 = regionInfo.estateSettings.terrainDetail3;
|
||||
handshake.RegionInfo.CacheID = LLUUID.Random(); //I guess this is for the client to remember an old setting?
|
||||
|
||||
@@ -166,7 +168,7 @@ namespace OpenSim
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="regInfo"></param>
|
||||
public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos)
|
||||
public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look)
|
||||
{
|
||||
AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
|
||||
mov.AgentData.SessionID = this.SessionID;
|
||||
@@ -182,16 +184,16 @@ namespace OpenSim
|
||||
{
|
||||
mov.Data.Position = this.startpos;
|
||||
}
|
||||
mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0);
|
||||
mov.Data.LookAt = look;
|
||||
|
||||
OutPacket(mov);
|
||||
}
|
||||
|
||||
public void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
|
||||
{
|
||||
SendChatMessage( Helpers.StringToField( message ), type, fromPos, fromName, fromAgentID);
|
||||
SendChatMessage(Helpers.StringToField(message), type, fromPos, fromName, fromAgentID);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -216,7 +218,7 @@ namespace OpenSim
|
||||
this.OutPacket(reply);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Send the region heightmap to the client
|
||||
/// </summary>
|
||||
@@ -272,7 +274,7 @@ namespace OpenSim
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -314,8 +316,8 @@ namespace OpenSim
|
||||
|
||||
public void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, System.Net.IPAddress newRegionIP, ushort newRegionPort)
|
||||
{
|
||||
LLVector3 look = new LLVector3(lookAt.X *10, lookAt.Y *10, lookAt.Z *10);
|
||||
|
||||
LLVector3 look = new LLVector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
|
||||
|
||||
CrossedRegionPacket newSimPack = new CrossedRegionPacket();
|
||||
newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
|
||||
newSimPack.AgentData.AgentID = this.AgentID;
|
||||
@@ -334,7 +336,86 @@ namespace OpenSim
|
||||
newSimPack.RegionData.SeedCapability = new byte[0];
|
||||
|
||||
this.OutPacket(newSimPack);
|
||||
this.DowngradeClient();
|
||||
//this.DowngradeClient();
|
||||
}
|
||||
|
||||
public void SendMapBlock(List<MapBlockData> mapBlocks)
|
||||
{
|
||||
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||
|
||||
MapBlockReplyPacket mapReply = new MapBlockReplyPacket();
|
||||
mapReply.AgentData.AgentID = this.AgentID;
|
||||
mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count];
|
||||
mapReply.AgentData.Flags = 0;
|
||||
|
||||
for (int i = 0; i < mapBlocks.Count; i++)
|
||||
{
|
||||
mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
|
||||
mapReply.Data[i].MapImageID = mapBlocks[i].MapImageId;
|
||||
mapReply.Data[i].X = mapBlocks[i].X;
|
||||
mapReply.Data[i].Y = mapBlocks[i].Y;
|
||||
mapReply.Data[i].WaterHeight = mapBlocks[i].WaterHeight;
|
||||
mapReply.Data[i].Name = _enc.GetBytes(mapBlocks[i].Name);
|
||||
mapReply.Data[i].RegionFlags = mapBlocks[i].RegionFlags;
|
||||
mapReply.Data[i].Access = mapBlocks[i].Access;
|
||||
mapReply.Data[i].Agents = mapBlocks[i].Agents;
|
||||
}
|
||||
this.OutPacket(mapReply);
|
||||
}
|
||||
|
||||
public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags)
|
||||
{
|
||||
TeleportLocalPacket tpLocal2 = new TeleportLocalPacket();
|
||||
tpLocal2.Info.AgentID = this.AgentID;
|
||||
tpLocal2.Info.TeleportFlags = flags;
|
||||
tpLocal2.Info.LocationID = 2;
|
||||
tpLocal2.Info.LookAt = lookAt;
|
||||
tpLocal2.Info.Position = position;
|
||||
OutPacket(tpLocal2);
|
||||
}
|
||||
|
||||
public void SendRegionTeleport(ulong regionHandle, byte simAccess, string ipAddress, ushort ipPort, uint locationID, uint flags)
|
||||
{
|
||||
TeleportFinishPacket Teleport = new TeleportFinishPacket();
|
||||
Teleport.Info.AgentID = this.AgentID;
|
||||
Teleport.Info.RegionHandle = regionHandle;
|
||||
Teleport.Info.SimAccess = simAccess;
|
||||
Teleport.Info.SeedCapability = new byte[0];
|
||||
|
||||
System.Net.IPAddress oIP = System.Net.IPAddress.Parse(ipAddress);
|
||||
byte[] byteIP = oIP.GetAddressBytes();
|
||||
uint ip = (uint)byteIP[3] << 24;
|
||||
ip += (uint)byteIP[2] << 16;
|
||||
ip += (uint)byteIP[1] << 8;
|
||||
ip += (uint)byteIP[0];
|
||||
|
||||
Teleport.Info.SimIP = ip;
|
||||
Teleport.Info.SimPort = ipPort;
|
||||
Teleport.Info.LocationID = 4;
|
||||
Teleport.Info.TeleportFlags = 1 << 4;
|
||||
OutPacket(Teleport);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void SendTeleportCancel()
|
||||
{
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
tpCancel.Info.SessionID = this.SessionID;
|
||||
tpCancel.Info.AgentID = this.AgentID;
|
||||
|
||||
OutPacket(tpCancel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void SendTeleportLocationStart()
|
||||
{
|
||||
TeleportStartPacket tpStart = new TeleportStartPacket();
|
||||
tpStart.Info.TeleportFlags = 16; // Teleport via location
|
||||
OutPacket(tpStart);
|
||||
}
|
||||
|
||||
#region Appearance/ Wearables Methods
|
||||
@@ -511,7 +592,7 @@ namespace OpenSim
|
||||
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID);
|
||||
outPacket.ObjectData[0].ID = localID;
|
||||
outPacket.ObjectData[0].FullID = primData.FullID;
|
||||
outPacket.ObjectData[0].FullID = primData.FullID;
|
||||
byte[] pb = pos.GetBytes();
|
||||
Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
|
||||
|
||||
@@ -570,7 +651,7 @@ namespace OpenSim
|
||||
ushort InternVelocityY;
|
||||
ushort InternVelocityZ;
|
||||
Axiom.MathLib.Vector3 internDirec = new Axiom.MathLib.Vector3(0, 0, 0);
|
||||
|
||||
|
||||
internDirec = new Axiom.MathLib.Vector3(velocity.X, velocity.Y, velocity.Z);
|
||||
|
||||
internDirec = internDirec / 128.0f;
|
||||
|
||||
@@ -191,6 +191,8 @@ namespace OpenSim
|
||||
}
|
||||
this.OutPacket(mbReply);
|
||||
* */
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -158,7 +158,6 @@ namespace OpenSim
|
||||
}
|
||||
break;
|
||||
case PacketType.CompleteAgentMovement:
|
||||
if (this.m_child) this.UpgradeClient();
|
||||
if (OnCompleteMovementToRegion != null)
|
||||
{
|
||||
OnCompleteMovementToRegion();
|
||||
@@ -396,8 +395,11 @@ namespace OpenSim
|
||||
break;
|
||||
case PacketType.MapBlockRequest:
|
||||
MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
|
||||
|
||||
this.RequestMapBlocks(MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
|
||||
if (OnRequestMapBlocks != null)
|
||||
{
|
||||
OnRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
|
||||
}
|
||||
//this.RequestMapBlocks(MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
|
||||
break;
|
||||
case PacketType.TeleportLandmarkRequest:
|
||||
TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
|
||||
@@ -449,16 +451,25 @@ namespace OpenSim
|
||||
break;
|
||||
case PacketType.TeleportLocationRequest:
|
||||
TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
|
||||
Console.WriteLine(tpLocReq.ToString());
|
||||
// Console.WriteLine(tpLocReq.ToString());
|
||||
|
||||
tpStart = new TeleportStartPacket();
|
||||
tpStart.Info.TeleportFlags = 16; // Teleport via location
|
||||
Console.WriteLine(tpStart.ToString());
|
||||
OutPacket(tpStart);
|
||||
|
||||
if (m_regionData.RegionHandle != tpLocReq.Info.RegionHandle)
|
||||
if (OnTeleportLocationRequest != null)
|
||||
{
|
||||
/* m_gridServer.getRegion(tpLocReq.Info.RegionHandle); */
|
||||
OnTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position, tpLocReq.Info.LookAt, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
//no event handler so cancel request
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
|
||||
tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
|
||||
|
||||
OutPacket(tpCancel);
|
||||
}
|
||||
|
||||
/* if (m_regionData.RegionHandle != tpLocReq.Info.RegionHandle)
|
||||
{
|
||||
// m_gridServer.getRegion(tpLocReq.Info.RegionHandle);
|
||||
Console.WriteLine("Inter-sim teleport not yet implemented");
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
|
||||
@@ -469,15 +480,15 @@ namespace OpenSim
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Local teleport");
|
||||
TeleportLocalPacket tpLocal = new TeleportLocalPacket();
|
||||
tpLocal.Info.AgentID = tpLocReq.AgentData.AgentID;
|
||||
tpLocal.Info.TeleportFlags = tpStart.Info.TeleportFlags;
|
||||
tpLocal.Info.LocationID = 2;
|
||||
tpLocal.Info.LookAt = tpLocReq.Info.LookAt;
|
||||
tpLocal.Info.Position = tpLocReq.Info.Position;
|
||||
OutPacket(tpLocal);
|
||||
TeleportLocalPacket tpLocal2 = new TeleportLocalPacket();
|
||||
tpLocal2.Info.AgentID = tpLocReq.AgentData.AgentID;
|
||||
tpLocal2.Info.TeleportFlags = tpStart.Info.TeleportFlags;
|
||||
tpLocal2.Info.LocationID = 2;
|
||||
tpLocal2.Info.LookAt = tpLocReq.Info.LookAt;
|
||||
tpLocal2.Info.Position = tpLocReq.Info.Position;
|
||||
OutPacket(tpLocal2);
|
||||
|
||||
}
|
||||
}*/
|
||||
break;
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace OpenSim
|
||||
cirpack = initialcirpack;
|
||||
userEP = remoteEP;
|
||||
|
||||
this.m_child = m_authenticateSessionsHandler.GetAgentChildStatus(initialcirpack.CircuitCode.Code);
|
||||
//this.m_child = m_authenticateSessionsHandler.GetAgentChildStatus(initialcirpack.CircuitCode.Code);
|
||||
this.startpos = m_authenticateSessionsHandler.GetPosition(initialcirpack.CircuitCode.Code);
|
||||
|
||||
PacketQueue = new BlockingQueue<QueItem>();
|
||||
@@ -113,27 +113,6 @@ namespace OpenSim
|
||||
}
|
||||
|
||||
# region Client Methods
|
||||
public void UpgradeClient()
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "SimClient.cs:UpgradeClient() - upgrading child to full agent");
|
||||
this.m_child = false;
|
||||
//this.startpos = m_authenticateSessionsHandler.GetPosition(CircuitCode);
|
||||
m_authenticateSessionsHandler.UpdateAgentChildStatus(CircuitCode, false);
|
||||
if (OnChildAgentStatus != null)
|
||||
{
|
||||
OnChildAgentStatus(this.m_child);
|
||||
}
|
||||
}
|
||||
|
||||
public void DowngradeClient()
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "SimClient.cs:UpgradeClient() - changing full agent to child");
|
||||
this.m_child = true;
|
||||
if (OnChildAgentStatus != null)
|
||||
{
|
||||
OnChildAgentStatus(this.m_child);
|
||||
}
|
||||
}
|
||||
|
||||
public void KillClient()
|
||||
{
|
||||
@@ -147,9 +126,7 @@ namespace OpenSim
|
||||
}
|
||||
|
||||
this.m_inventoryCache.ClientLeaving(this.AgentID, null);
|
||||
|
||||
|
||||
// m_world.RemoveViewerAgent(this);
|
||||
m_world.RemoveAvatar(this.AgentId);
|
||||
|
||||
m_clientThreads.Remove(this.CircuitCode);
|
||||
m_networkServer.RemoveClientCircuit(this.CircuitCode);
|
||||
|
||||
@@ -236,7 +236,7 @@ namespace OpenSim
|
||||
m_console.componentname = "Region " + regionData.RegionName;
|
||||
*/
|
||||
|
||||
LocalWorld = new Scene(udpServer.PacketServer.ClientAPIs, regionDat, authenBase, commsManager);
|
||||
LocalWorld = new Scene(udpServer.PacketServer.ClientAPIs, regionDat, authenBase, commsManager, this.AssetCache);
|
||||
this.m_localWorld.Add(LocalWorld);
|
||||
//LocalWorld.InventoryCache = InventoryCache;
|
||||
//LocalWorld.AssetCache = AssetCache;
|
||||
|
||||
Reference in New Issue
Block a user