From 64741b55a6d68eb2853ca2f33047e6a2f459b513 Mon Sep 17 00:00:00 2001 From: MW Date: Fri, 25 May 2007 19:09:19 +0000 Subject: First part of border crossing fix. --- .../OpenSim.RegionServer/world/Avatar.Update.cs | 130 +++++++++++---------- OpenSim/OpenSim.RegionServer/world/Avatar.cs | 32 ++++- OpenSim/OpenSim.RegionServer/world/World.cs | 16 +-- OpenSim/OpenSim.RegionServer/world/WorldBase.cs | 4 +- 4 files changed, 109 insertions(+), 73 deletions(-) (limited to 'OpenSim/OpenSim.RegionServer/world') diff --git a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs index e49fab3..ed1ffc0 100644 --- a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs +++ b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs @@ -10,89 +10,93 @@ namespace OpenSim.world { public override void update() { - if (this._physActor == null) + if (!this.childAvatar) { - //HACKHACK: Note to work out why this entity does not have a physics actor - // and prehaps create one. - return; - } - libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z); - if (this.updateflag) - { - //need to send movement info - //so create the improvedterseobjectupdate packet - //use CreateTerseBlock() - ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); - ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); - terse.RegionData.RegionHandle = m_regionHandle; // FIXME - terse.RegionData.TimeDilation = 64096; - terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - terse.ObjectData[0] = terseBlock; - List avList = this.m_world.RequestAvatarList(); - foreach (Avatar client in avList) + if (this._physActor == null) { - client.SendPacketToViewer(terse); + //HACKHACK: Note to work out why this entity does not have a physics actor + // and prehaps create one. + return; } + libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z); + if (this.updateflag) + { + //need to send movement info + //so create the improvedterseobjectupdate packet + //use CreateTerseBlock() + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = m_regionHandle; // FIXME + terse.RegionData.TimeDilation = 64096; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + List avList = this.m_world.RequestAvatarList(); + foreach (Avatar client in avList) + { + client.SendPacketToViewer(terse); + } - updateflag = false; - //this._updateCount = 0; - } - else - { - - if ((pos2 != this.positionLastFrame) || (this.movementflag == 16)) + updateflag = false; + //this._updateCount = 0; + } + else { - _updateCount++; - if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (PhysicsEngineFlying) && (_updateCount > 0)) + + if ((pos2 != this.positionLastFrame) || (this.movementflag == 16)) { - //It has been a while since last update was sent so lets send one. - ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); - ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); - terse.RegionData.RegionHandle = m_regionHandle; // FIXME - terse.RegionData.TimeDilation = 64096; - terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - terse.ObjectData[0] = terseBlock; - List avList = this.m_world.RequestAvatarList(); - foreach (Avatar client in avList) + _updateCount++; + if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (PhysicsEngineFlying) && (_updateCount > 0)) { - client.SendPacketToViewer(terse); + //It has been a while since last update was sent so lets send one. + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = m_regionHandle; // FIXME + terse.RegionData.TimeDilation = 64096; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + List avList = this.m_world.RequestAvatarList(); + foreach (Avatar client in avList) + { + client.SendPacketToViewer(terse); + } + _updateCount = 0; } - _updateCount = 0; - } - if (this.movementflag == 16) - { - movementflag = 0; + if (this.movementflag == 16) + { + movementflag = 0; + } } - } - - } - this.positionLastFrame = pos2; - if (!this.ControllingClient.m_sandboxMode) - { - if (pos2.X < 0) - { - ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); } + this.positionLastFrame = pos2; - if (pos2.Y < 0) + if (!this.ControllingClient.m_sandboxMode) { - ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); - } + if (pos2.X < 0) + { + ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); + } - if (pos2.X > 255) - { - ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); - } + if (pos2.Y < 0) + { + ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); + } - if (pos2.Y > 255) - { - ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); + if (pos2.X > 255) + { + ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); + } + + if (pos2.Y > 255) + { + ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); + } } } } + public void SendUpdateToOtherClient(Avatar remoteAvatar) { ObjectUpdatePacket objupdate = CreateUpdatePacket(); diff --git a/OpenSim/OpenSim.RegionServer/world/Avatar.cs b/OpenSim/OpenSim.RegionServer/world/Avatar.cs index 680d059..2c1ccdf 100644 --- a/OpenSim/OpenSim.RegionServer/world/Avatar.cs +++ b/OpenSim/OpenSim.RegionServer/world/Avatar.cs @@ -35,7 +35,7 @@ namespace OpenSim.world private string m_regionName; private ushort m_regionWaterHeight; private bool m_regionTerraform; - //private bool childShadowAvatar = false; + private bool childAvatar = false; public Avatar(ClientView TheClient, World world, string regionName, Dictionary clientThreads, ulong regionHandle, bool regionTerraform, ushort regionWater) { @@ -72,6 +72,7 @@ namespace OpenSim.world ControllingClient.OnCompleteMovementToRegion += new ClientView.GenericCall2(this.SendInitialPosition); ControllingClient.OnAgentUpdate += new ClientView.GenericCall3(this.HandleAgentUpdate); ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack); + ControllingClient.OnChildAgentStatus += new ClientView.StatusChange(this.ChildStatusChange); } @@ -87,6 +88,35 @@ namespace OpenSim.world } } + public void ChildStatusChange(bool status) + { + this.childAvatar = status; + + if (this.childAvatar == true) + { + this._physActor.Velocity = new PhysicsVector(0, 0, 0); + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = m_regionHandle; // FIXME + terse.RegionData.TimeDilation = 64096; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + List avList = this.m_world.RequestAvatarList(); + foreach (Avatar client in avList) + { + client.SendPacketToViewer(terse); + } + } + else + { + LLVector3 startp = ControllingClient.StartPos; + lock (m_world.LockPhysicsEngine) + { + this._physActor.Position = new PhysicsVector(startp.X, startp.Y, startp.Z); + } + } + } + public override void addForces() { lock (this.forcesList) diff --git a/OpenSim/OpenSim.RegionServer/world/World.cs b/OpenSim/OpenSim.RegionServer/world/World.cs index 921da3c..2edb8e7 100644 --- a/OpenSim/OpenSim.RegionServer/world/World.cs +++ b/OpenSim/OpenSim.RegionServer/world/World.cs @@ -530,7 +530,7 @@ namespace OpenSim.world #region Add/Remove Avatar Methods - public override void AddViewerAgent(ClientView agentClient) + public override Avatar AddViewerAgent(ClientView agentClient) { //register for events agentClient.OnChatFromViewer += new ChatFromViewer(this.SimChat); @@ -549,22 +549,23 @@ namespace OpenSim.world agentClient.OnUpdatePrimRotation += new ClientView.UpdatePrimRotation(this.UpdatePrimRotation); agentClient.OnUpdatePrimScale += new ClientView.UpdatePrimVector(this.UpdatePrimScale); agentClient.OnDeRezObject += new ClientView.GenericCall4(this.DeRezObject); - + Avatar newAvatar = null; try { OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); - Avatar newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle, true, 20); + newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle, true, 20); OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs:AddViewerAgent() - Adding new avatar to world"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, "World.cs:AddViewerAgent() - Starting RegionHandshake "); newAvatar.SendRegionHandshake(this); - if (!agentClient.m_child) - { + //if (!agentClient.m_child) + //{ + PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z); lock (this.LockPhysicsEngine) { newAvatar.PhysActor = this.phyScene.AddAvatar(pVec); } - } + // } lock (Entities) { if (!Entities.ContainsKey(agentClient.AgentID)) @@ -592,6 +593,7 @@ namespace OpenSim.world { OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.MEDIUM, "World.cs: AddViewerAgent() - Failed with exception " + e.ToString()); } + return newAvatar; } public override void RemoveViewerAgent(ClientView agentClient) @@ -608,7 +610,7 @@ namespace OpenSim.world } if (agentClient.ClientAvatar.PhysActor != null) { - //this.phyScene.RemoveAvatar(agentClient.ClientAvatar.PhysActor); + this.phyScene.RemoveAvatar(agentClient.ClientAvatar.PhysActor); } } catch (Exception e) diff --git a/OpenSim/OpenSim.RegionServer/world/WorldBase.cs b/OpenSim/OpenSim.RegionServer/world/WorldBase.cs index edc5518..ea71411 100644 --- a/OpenSim/OpenSim.RegionServer/world/WorldBase.cs +++ b/OpenSim/OpenSim.RegionServer/world/WorldBase.cs @@ -148,9 +148,9 @@ namespace OpenSim.world /// Add a new Agent's avatar /// /// - public virtual void AddViewerAgent(ClientView agentClient) + public virtual Avatar AddViewerAgent(ClientView agentClient) { - + return null; } /// -- cgit v1.1