From f9b7cc53deb93fc3528929385d3f76519083c927 Mon Sep 17 00:00:00 2001 From: gareth Date: Sun, 15 Apr 2007 02:31:34 +0000 Subject: [PATCH] W00t! multiple sims! Misc bugfixes Child agents!!!!!! General sexy stuff --- OpenGridServices.GridServer/SimProfiles.cs | 4 +- OpenSim.Framework/IGridServer.cs | 3 +- OpenSim.Framework/RemoteGridBase.cs | 10 +++ .../Remote/RemoteAssetServer.cs | 2 +- .../Remote/RemoteGridServer.cs | 22 ++++++- OpenSim.RegionServer/OpenSimMain.cs | 61 +++++++++++++++++-- OpenSim.RegionServer/SimClient.cs | 32 ++++++---- OpenSim.RegionServer/world/AvatarUpdate.cs | 3 +- OpenSim.RegionServer/world/World.cs | 29 +++++---- 9 files changed, 129 insertions(+), 37 deletions(-) diff --git a/OpenGridServices.GridServer/SimProfiles.cs b/OpenGridServices.GridServer/SimProfiles.cs index 7fcfb8c3cd..bd91d5b259 100644 --- a/OpenGridServices.GridServer/SimProfiles.cs +++ b/OpenGridServices.GridServer/SimProfiles.cs @@ -158,13 +158,15 @@ namespace OpenGridServices.GridServer if (GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX + x) * 256), (uint)(TheSim.RegionLocY + y) * 256)) != null) { neighbour = GetProfileByHandle(Helpers.UIntsToLong((uint)((TheSim.RegionLocX + x) * 256), (uint)(TheSim.RegionLocY + y) * 256)); + NeighbourBlock = new Hashtable(); NeighbourBlock["sim_ip"] = neighbour.sim_ip; NeighbourBlock["sim_port"] = neighbour.sim_port.ToString(); NeighbourBlock["region_locx"] = neighbour.RegionLocX.ToString(); NeighbourBlock["region_locy"] = neighbour.RegionLocY.ToString(); NeighbourBlock["UUID"] = neighbour.UUID.ToString(); - SimNeighboursData.Add(NeighbourBlock); + + if(neighbour.UUID!=TheSim.UUID) SimNeighboursData.Add(NeighbourBlock); } } diff --git a/OpenSim.Framework/IGridServer.cs b/OpenSim.Framework/IGridServer.cs index 001ce3b3be..9c06a6bf11 100644 --- a/OpenSim.Framework/IGridServer.cs +++ b/OpenSim.Framework/IGridServer.cs @@ -27,6 +27,7 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; @@ -50,7 +51,7 @@ namespace OpenSim.Framework.Interfaces string GetName(); bool RequestConnection(LLUUID SimUUID, string sim_ip, uint sim_port); void SetServerInfo(string ServerUrl, string SendKey, string RecvKey); - void Close(); + void Close(); } public struct UUIDBlock diff --git a/OpenSim.Framework/RemoteGridBase.cs b/OpenSim.Framework/RemoteGridBase.cs index e1f0b9be61..0b72b9f388 100644 --- a/OpenSim.Framework/RemoteGridBase.cs +++ b/OpenSim.Framework/RemoteGridBase.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Text; using libsecondlife; @@ -21,5 +22,14 @@ namespace OpenSim.Framework.Interfaces public abstract bool RequestConnection(LLUUID SimUUID, string sim_ip, uint sim_port); public abstract void SetServerInfo(string ServerUrl, string SendKey, string RecvKey); public abstract void Close(); + public abstract Hashtable GridData { + get; + set; + } + + public abstract ArrayList neighbours { + get; + set; + } } } diff --git a/OpenSim.GridInterfaces/Remote/RemoteAssetServer.cs b/OpenSim.GridInterfaces/Remote/RemoteAssetServer.cs index 528e9fa680..71fca57f14 100644 --- a/OpenSim.GridInterfaces/Remote/RemoteAssetServer.cs +++ b/OpenSim.GridInterfaces/Remote/RemoteAssetServer.cs @@ -65,7 +65,7 @@ namespace OpenSim.GridInterfaces.Remote //we need to add support for the asset server not knowing about a requested asset ARequest req = this._assetRequests.Dequeue(); LLUUID assetID = req.AssetID; - OpenSim.Framework.Console.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it"); + OpenSim.Framework.Console.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it - " + this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data"); WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data"); WebResponse AssetResponse = AssetLoad.GetResponse(); byte[] idata = new byte[(int)AssetResponse.ContentLength]; diff --git a/OpenSim.GridInterfaces/Remote/RemoteGridServer.cs b/OpenSim.GridInterfaces/Remote/RemoteGridServer.cs index d51d212dc6..7cd68df3f2 100644 --- a/OpenSim.GridInterfaces/Remote/RemoteGridServer.cs +++ b/OpenSim.GridInterfaces/Remote/RemoteGridServer.cs @@ -44,13 +44,28 @@ namespace OpenSim.GridInterfaces.Remote private string GridSendKey; private string GridRecvKey; private Dictionary AgentCircuits = new Dictionary(); + private ArrayList simneighbours = new ArrayList(); + private Hashtable griddatahash; public override Dictionary agentcircuits { get { return AgentCircuits; } set { AgentCircuits = value; } } + + public override ArrayList neighbours + { + get { return simneighbours; } + set { simneighbours = value; } + } + public override Hashtable GridData + { + get { return griddatahash; } + set { griddatahash = value; } + } + + public RemoteGridServer() { OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Remote Grid Server class created"); @@ -69,13 +84,16 @@ namespace OpenSim.GridInterfaces.Remote XmlRpcRequest GridReq = new XmlRpcRequest("simulator_login", SendParams); XmlRpcResponse GridResp = GridReq.Send(this.GridServerUrl, 3000); Hashtable GridRespData = (Hashtable)GridResp.Value; - + this.griddatahash=GridRespData; + if(GridRespData.ContainsKey("error")) { string errorstring = (string)GridRespData["error"]; OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Error connecting to grid:"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine(errorstring); return false; - } + } + this.neighbours = (ArrayList)GridRespData["neighbours"]; + Console.WriteLine(simneighbours.Count); return true; } diff --git a/OpenSim.RegionServer/OpenSimMain.cs b/OpenSim.RegionServer/OpenSimMain.cs index 8c93128517..f10ca3403a 100644 --- a/OpenSim.RegionServer/OpenSimMain.cs +++ b/OpenSim.RegionServer/OpenSimMain.cs @@ -48,7 +48,7 @@ using OpenSim.Framework.Console; using OpenSim.Physics.Manager; using Nwc.XmlRpc; using OpenSim.Servers; -using OpenSim.GenericConfig; +using OpenSim.GenericConfig; namespace OpenSim { @@ -164,6 +164,18 @@ namespace OpenSim GridServers.AssetServer.SetServerInfo(regionData.AssetURL, regionData.AssetSendKey); IGridServer gridServer = GridServers.GridServer; gridServer.SetServerInfo(regionData.GridURL, regionData.GridSendKey, regionData.GridRecvKey); + + if(!m_sandbox) { + if(GridServers.GridServer.RequestConnection(regionData.SimUUID,regionData.IPListenAddr,(uint)regionData.IPListenPort)) { + m_console.WriteLine("Main.cs:Startup() - Got a grid connection OK!"); + } else { + m_console.WriteLine("AAAAAAAAAAAAARRRRRRRRRRGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!"); + m_console.WriteLine("I LOST MY GRID!!!!!!!!!!!!! AAAAAAAARRRRRRRRGGGGGGGGHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!"); + Shutdown(); + } + } + + GridServers.AssetServer.SetServerInfo((string)((RemoteGridBase)GridServers.GridServer).GridData["asset_url"], (string)((RemoteGridBase)GridServers.GridServer).GridData["asset_sendkey"]); LocalWorld.LoadPrimsFromStorage(); @@ -190,9 +202,11 @@ namespace OpenSim agent_data.firstname = (string)requestData["firstname"]; agent_data.lastname = (string)requestData["lastname"]; agent_data.AgentID = new LLUUID((string)requestData["agent_id"]); - agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); - - ((RemoteGridBase)gridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data); + agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); + if(requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1")) { + agent_data.child=true; + } + ((RemoteGridBase)gridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data); return new XmlRpcResponse(); }); @@ -288,15 +302,52 @@ namespace OpenSim } else if (packet.Type == PacketType.UseCircuitCode) { // new client + UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet; this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); - SimClient newuser = new SimClient(epSender, useCircuit, LocalWorld, _packetServer.ClientThreads, AssetCache, GridServers.GridServer, this, InventoryCache, m_sandbox); + SimClient newuser = new SimClient(epSender, useCircuit, LocalWorld, _packetServer.ClientThreads, AssetCache, GridServers.GridServer, this, InventoryCache, m_sandbox,((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].child); if ((this.GridServers.UserServer != null) && (user_accounts)) { newuser.UserServer = this.GridServers.UserServer; } //OpenSimRoot.Instance.ClientThreads.Add(epSender, newuser); this._packetServer.ClientThreads.Add(useCircuit.CircuitCode.Code, newuser); + + if(!((RemoteGridBase)GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].child) { + Hashtable SimParams; + ArrayList SendParams; + XmlRpcRequest GridReq; + XmlRpcResponse GridResp; + foreach (Hashtable neighbour in ((RemoteGridBase)this.GridServers.GridServer).neighbours) { + m_console.WriteLine("http://" + neighbour["sim_ip"] + ":" + neighbour["sim_port"]); + SimParams = new Hashtable(); + SimParams["session_id"] = ((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].SessionID.ToString(); + SimParams["secure_session_id"] = ((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].SecureSessionID.ToString(); + SimParams["firstname"] = ((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].firstname; + SimParams["lastname"] = ((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].lastname; + SimParams["agent_id"] = ((RemoteGridBase)this.GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].AgentID.ToString(); + SimParams["circuit_code"] = (Int32)useCircuit.CircuitCode.Code; + SimParams["child_agent"]="1"; + SendParams = new ArrayList(); + SendParams.Add(SimParams); + + GridReq = new XmlRpcRequest("expect_user", SendParams); + GridResp = GridReq.Send("http://" + neighbour["sim_ip"] + ":" + neighbour["sim_port"], 3000); + EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket(); + enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock(); + enablesimpacket.SimulatorInfo.Handle=Helpers.UIntsToLong((uint)(Convert.ToInt32(neighbour["region_locx"]) * 256), (uint)(Convert.ToInt32(neighbour["region_locy"]) * 256)); + System.Net.IPAddress neighbourIP = System.Net.IPAddress.Parse((string)neighbour["sim_ip"]); + byte[] byteIP = neighbourIP.GetAddressBytes(); + enablesimpacket.SimulatorInfo.IP=(uint)byteIP[3]<<24; + enablesimpacket.SimulatorInfo.IP+=(uint)byteIP[2]<<16; + enablesimpacket.SimulatorInfo.IP+=(uint)byteIP[1]<<8; + enablesimpacket.SimulatorInfo.IP+=(uint)byteIP[0]; + enablesimpacket.SimulatorInfo.Port=(ushort)Convert.ToInt32(neighbour["sim_port"]); + Thread.Sleep(3000); + _packetServer.ClientThreads[useCircuit.CircuitCode.Code].OutPacket(enablesimpacket); + } + } + } else { // invalid client diff --git a/OpenSim.RegionServer/SimClient.cs b/OpenSim.RegionServer/SimClient.cs index 6d174c8e11..c478d92d37 100644 --- a/OpenSim.RegionServer/SimClient.cs +++ b/OpenSim.RegionServer/SimClient.cs @@ -54,6 +54,7 @@ namespace OpenSim public LLUUID AgentID; public LLUUID SessionID; public LLUUID SecureSessionID = LLUUID.Zero; + public bool m_child; public uint CircuitCode; public world.Avatar ClientAvatar; private UseCircuitCodePacket cirpack; @@ -94,7 +95,7 @@ namespace OpenSim } } - public SimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, World world, Dictionary clientThreads, AssetCache assetCache, IGridServer gridServer, OpenSimNetworkHandler application, InventoryCache inventoryCache, bool sandboxMode) + public SimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, World world, Dictionary clientThreads, AssetCache assetCache, IGridServer gridServer, OpenSimNetworkHandler application, InventoryCache inventoryCache, bool sandboxMode, bool child) { m_world = world; m_clientThreads = clientThreads; @@ -103,6 +104,7 @@ namespace OpenSim m_application = application; m_inventoryCache = inventoryCache; m_sandboxMode = sandboxMode; + m_child=child; OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs - Started up new client thread to handle incoming request"); cirpack = initialcirpack; @@ -228,8 +230,10 @@ namespace OpenSim switch (Pack.Type) { case PacketType.CompleteAgentMovement: - ClientAvatar.CompleteMovement(m_world); - ClientAvatar.SendInitialPosition(); + if(!m_child) { + ClientAvatar.CompleteMovement(m_world); + ClientAvatar.SendInitialPosition(); + } break; case PacketType.RegionHandshakeReply: m_world.SendLayerData(this); @@ -476,16 +480,18 @@ namespace OpenSim } break; case PacketType.AgentAnimation: - AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; - for (int i = 0; i < AgentAni.AnimationList.Length; i++) - { - if (AgentAni.AnimationList[i].StartAnim) - { - ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID; - ClientAvatar.anim_seq = 1; - ClientAvatar.SendAnimPack(); - } - } + if(!m_child) { + AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; + for (int i = 0; i < AgentAni.AnimationList.Length; i++) + { + if (AgentAni.AnimationList[i].StartAnim) + { + ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID; + ClientAvatar.anim_seq = 1; + ClientAvatar.SendAnimPack(); + } + } + } break; case PacketType.ObjectSelect: ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; diff --git a/OpenSim.RegionServer/world/AvatarUpdate.cs b/OpenSim.RegionServer/world/AvatarUpdate.cs index d315de799d..453f419867 100644 --- a/OpenSim.RegionServer/world/AvatarUpdate.cs +++ b/OpenSim.RegionServer/world/AvatarUpdate.cs @@ -89,7 +89,8 @@ namespace OpenSim.world { System.Text.Encoding _enc = System.Text.Encoding.ASCII; //send a objectupdate packet with information about the clients avatar - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); + + ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); objupdate.RegionData.RegionHandle = m_regionHandle; objupdate.RegionData.TimeDilation = 64096; objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs index a973c6c87b..425a13551a 100644 --- a/OpenSim.RegionServer/world/World.cs +++ b/OpenSim.RegionServer/world/World.cs @@ -371,19 +371,22 @@ namespace OpenSim.world OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake "); newAvatar.SendRegionHandshake(this); - PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z); - lock (this.LockPhysicsEngine) - { - newAvatar.PhysActor = this.phyScene.AddAvatar(pVec); - } - lock (Entities) - { - this.Entities.Add(agentClient.AgentID, newAvatar); - } - lock (Avatars) - { - this.Avatars.Add(agentClient.AgentID, newAvatar); - } + 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) + { + this.Entities.Add(agentClient.AgentID, newAvatar); + } + lock (Avatars) + { + this.Avatars.Add(agentClient.AgentID, newAvatar); + } + } public void RemoveViewerAgent(SimClient agentClient)