From f9b7cc53deb93fc3528929385d3f76519083c927 Mon Sep 17 00:00:00 2001
From: gareth
Date: Sun, 15 Apr 2007 02:31:34 +0000
Subject: 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 ++++
 OpenSim.GridInterfaces/Remote/RemoteAssetServer.cs |  2 +-
 OpenSim.GridInterfaces/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 7fcfb8c..bd91d5b 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 001ce3b..9c06a6b 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 e1f0b9b..0b72b9f 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 528e9fa..71fca57 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 d51d212..7cd68df 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<uint, AgentCircuitData> AgentCircuits = new Dictionary<uint, AgentCircuitData>();
+	private ArrayList simneighbours = new ArrayList();
+	private Hashtable griddatahash;
 
         public override Dictionary<uint, AgentCircuitData> 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 8c93128..f10ca34 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 6d174c8..c478d92 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<uint, SimClient> clientThreads, AssetCache assetCache, IGridServer gridServer, OpenSimNetworkHandler application, InventoryCache inventoryCache, bool sandboxMode)
+        public SimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, World world, Dictionary<uint, SimClient> 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 d315de7..453f419 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 a973c6c..425a135 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)
-- 
cgit v1.1