From ef0e5e913e2c22f8e2cba96d54436443b573c1ed Mon Sep 17 00:00:00 2001 From: MW Date: Sun, 17 Jun 2007 14:10:19 +0000 Subject: 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. --- .../CommunicationsLocal.cs | 2 +- .../LocalBackEndServices.cs | 37 +++++- OpenSim/OpenSim.Region/OpenSim.Region.csproj | 6 + OpenSim/OpenSim.Region/OpenSim.Region.dll.build | 1 + OpenSim/OpenSim.Region/Scenes/Avatar.Update.cs | 71 ++++++---- OpenSim/OpenSim.Region/Scenes/Avatar.cs | 42 +++++- OpenSim/OpenSim.Region/Scenes/Scene.cs | 148 ++++++++++++++------- OpenSim/OpenSim.Region/Scenes/SceneBase.cs | 2 + OpenSim/OpenSim.RegionServer/ClientView.API.cs | 105 +++++++++++++-- .../ClientView.PacketHandlers.cs | 2 + .../ClientView.ProcessPackets.cs | 47 ++++--- OpenSim/OpenSim.RegionServer/ClientView.cs | 27 +--- OpenSim/OpenSim/OpenSimMain.cs | 2 +- 13 files changed, 348 insertions(+), 144 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/OpenSim.LocalCommunications/CommunicationsLocal.cs b/OpenSim/OpenSim.LocalCommunications/CommunicationsLocal.cs index 1cb5f6f..2293608 100644 --- a/OpenSim/OpenSim.LocalCommunications/CommunicationsLocal.cs +++ b/OpenSim/OpenSim.LocalCommunications/CommunicationsLocal.cs @@ -45,7 +45,7 @@ namespace OpenSim.LocalCommunications { UserServer = null; GridServer = SandManager; - InterSims = SandManager; + InterRegion = SandManager; } } } diff --git a/OpenSim/OpenSim.LocalCommunications/LocalBackEndServices.cs b/OpenSim/OpenSim.LocalCommunications/LocalBackEndServices.cs index dfc4505..46ace9c 100644 --- a/OpenSim/OpenSim.LocalCommunications/LocalBackEndServices.cs +++ b/OpenSim/OpenSim.LocalCommunications/LocalBackEndServices.cs @@ -36,11 +36,10 @@ using OpenSim.Framework; namespace OpenSim.LocalCommunications { - public class LocalBackEndServices : IGridServices, IInterRegionCommunications { protected Dictionary regions = new Dictionary(); - protected Dictionary regionHosts = new Dictionary(); + protected Dictionary regionHosts = new Dictionary(); public LocalBackEndServices() { @@ -52,14 +51,14 @@ namespace OpenSim.LocalCommunications /// /// /// - 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; @@ -111,6 +110,36 @@ namespace OpenSim.LocalCommunications } /// + /// + /// + /// + /// + /// + /// + /// + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + List mapBlocks = new List(); + 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; + } + + /// /// /// /// diff --git a/OpenSim/OpenSim.Region/OpenSim.Region.csproj b/OpenSim/OpenSim.Region/OpenSim.Region.csproj index e53a4f4..94efbed 100644 --- a/OpenSim/OpenSim.Region/OpenSim.Region.csproj +++ b/OpenSim/OpenSim.Region/OpenSim.Region.csproj @@ -86,6 +86,12 @@ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} False + + OpenSim.Caches + {1938EB12-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + OpenSim.Framework {8ACA2445-0000-0000-0000-000000000000} diff --git a/OpenSim/OpenSim.Region/OpenSim.Region.dll.build b/OpenSim/OpenSim.Region/OpenSim.Region.dll.build index 5b9ba1a..6d47576 100644 --- a/OpenSim/OpenSim.Region/OpenSim.Region.dll.build +++ b/OpenSim/OpenSim.Region/OpenSim.Region.dll.build @@ -39,6 +39,7 @@ + diff --git a/OpenSim/OpenSim.Region/Scenes/Avatar.Update.cs b/OpenSim/OpenSim.Region/Scenes/Avatar.Update.cs index d46bf0f..5d70bc1 100644 --- a/OpenSim/OpenSim.Region/Scenes/Avatar.Update.cs +++ b/OpenSim/OpenSim.Region/Scenes/Avatar.Update.cs @@ -43,36 +43,24 @@ namespace OpenSim.Region.Scenes /// 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; } - } - - 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(); - } + else if (movementflag != 0) + { + _updateCount++; + if (_updateCount > 3) + { + this.SendTerseUpdateToALLClients(); + _updateCount = 0; + } + } - if ((pos2.Y < 0) || (pos2.Y > 256)) - { - this.CrossToNewRegion(); + this.CheckBorderCrossing(); } } @@ -165,10 +153,35 @@ namespace OpenSim.Region.Scenes } - private void CrossToNewRegion() + /// + /// + /// + 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(); + } + } + + /// + /// + /// + 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); + } } diff --git a/OpenSim/OpenSim.Region/Scenes/Avatar.cs b/OpenSim/OpenSim.Region/Scenes/Avatar.cs index 98d7564..d40e213 100644 --- a/OpenSim/OpenSim.Region/Scenes/Avatar.cs +++ b/OpenSim/OpenSim.Region/Scenes/Avatar.cs @@ -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 } } - + + /// + /// + /// + /// + 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; + } + + /// + /// + /// + /// + public void Teleport(LLVector3 pos) + { + this.Pos = pos; + this.SendTerseUpdateToALLClients(); + } + /// /// /// @@ -189,7 +216,16 @@ namespace OpenSim.Region.Scenes /// 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; + } } /// diff --git a/OpenSim/OpenSim.Region/Scenes/Scene.cs b/OpenSim/OpenSim.Region/Scenes/Scene.cs index c0eebd4..eb942c2 100644 --- a/OpenSim/OpenSim.Region/Scenes/Scene.cs +++ b/OpenSim/OpenSim.Region/Scenes/Scene.cs @@ -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 /// Dictionary to contain client threads /// Region Handle for this region /// Region Name for this region - public Scene(Dictionary clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan) + public Scene(Dictionary 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; } - /// - /// - /// - protected void InformClientOfNeighbours(IClientAPI remoteClient) - { - // Console.WriteLine("informing client of neighbouring regions"); - List 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); - } - } - } - - /// - /// - /// - /// - /// - public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) - { - return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle); - } - - /// - /// - /// - /// - /// - /// - public void InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position) - { - this.commsManager.InterSims.ExpectAvatarCrossing(regionhandle, agentID, position); - } + /// /// @@ -725,9 +685,95 @@ namespace OpenSim.Region.Scenes { if (this.Avatars.ContainsKey(agentID)) { - this.Avatars[agentID].Pos = position; + this.Avatars[agentID].UpGradeAvatar(position); + } + } + } + + /// + /// + /// + protected void InformClientOfNeighbours(IClientAPI remoteClient) + { + // Console.WriteLine("informing client of neighbouring regions"); + List 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); + } + } + } + + /// + /// + /// + /// + /// + public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) + { + return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle); + } + + /// + /// + /// + /// + /// + /// + /// + public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY) + { + List mapBlocks; + mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY); + + remoteClient.SendMapBlock(mapBlocks); + } + + /// + /// + /// + /// + /// + /// + /// + /// + 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(); + } + } + + /// + /// + /// + /// + /// + /// + public void InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position) + { + this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position); } #endregion diff --git a/OpenSim/OpenSim.Region/Scenes/SceneBase.cs b/OpenSim/OpenSim.Region/Scenes/SceneBase.cs index d9d07b0..05c2aba 100644 --- a/OpenSim/OpenSim.Region/Scenes/SceneBase.cs +++ b/OpenSim/OpenSim.Region/Scenes/SceneBase.cs @@ -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 /// diff --git a/OpenSim/OpenSim.RegionServer/ClientView.API.cs b/OpenSim/OpenSim.RegionServer/ClientView.API.cs index 0ace92c..80719d6 100644 --- a/OpenSim/OpenSim.RegionServer/ClientView.API.cs +++ b/OpenSim/OpenSim.RegionServer/ClientView.API.cs @@ -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 /// /// /// - 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); } - + /// /// /// @@ -216,7 +218,7 @@ namespace OpenSim this.OutPacket(reply); } - + /// /// Send the region heightmap to the client /// @@ -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()); } } - + /// /// /// @@ -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 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); + } + + /// + /// + /// + public void SendTeleportCancel() + { + TeleportCancelPacket tpCancel = new TeleportCancelPacket(); + tpCancel.Info.SessionID = this.SessionID; + tpCancel.Info.AgentID = this.AgentID; + + OutPacket(tpCancel); + } + + /// + /// + /// + 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; diff --git a/OpenSim/OpenSim.RegionServer/ClientView.PacketHandlers.cs b/OpenSim/OpenSim.RegionServer/ClientView.PacketHandlers.cs index aaac4d0..a173c47 100644 --- a/OpenSim/OpenSim.RegionServer/ClientView.PacketHandlers.cs +++ b/OpenSim/OpenSim.RegionServer/ClientView.PacketHandlers.cs @@ -191,6 +191,8 @@ namespace OpenSim } this.OutPacket(mbReply); * */ + + } diff --git a/OpenSim/OpenSim.RegionServer/ClientView.ProcessPackets.cs b/OpenSim/OpenSim.RegionServer/ClientView.ProcessPackets.cs index 4cf6ac2..f8425da 100644 --- a/OpenSim/OpenSim.RegionServer/ClientView.ProcessPackets.cs +++ b/OpenSim/OpenSim.RegionServer/ClientView.ProcessPackets.cs @@ -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 (OnTeleportLocationRequest != null) + { + 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; - if (m_regionData.RegionHandle != tpLocReq.Info.RegionHandle) + OutPacket(tpCancel); + } + + /* if (m_regionData.RegionHandle != tpLocReq.Info.RegionHandle) { - /* m_gridServer.getRegion(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 diff --git a/OpenSim/OpenSim.RegionServer/ClientView.cs b/OpenSim/OpenSim.RegionServer/ClientView.cs index 29c871e..74dbc1a 100644 --- a/OpenSim/OpenSim.RegionServer/ClientView.cs +++ b/OpenSim/OpenSim.RegionServer/ClientView.cs @@ -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(); @@ -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); diff --git a/OpenSim/OpenSim/OpenSimMain.cs b/OpenSim/OpenSim/OpenSimMain.cs index 5915b81..fb8511d 100644 --- a/OpenSim/OpenSim/OpenSimMain.cs +++ b/OpenSim/OpenSim/OpenSimMain.cs @@ -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; -- cgit v1.1