From 5453580d550e96cdeeec855d610082c662562022 Mon Sep 17 00:00:00 2001 From: gareth Date: Tue, 27 Feb 2007 22:59:35 +0000 Subject: [PATCH] Removed old trunk code --- Agent_Manager.cs | 879 ------------------------------ AssemblyInfo.cs | 59 -- AssetManagement.cs | 469 ---------------- Asset_manager.cs | 231 -------- Controller.cs | 358 ------------ Globals.cs | 66 --- GridManager.cs | 372 ------------- InventoryManager.cs | 242 -------- Login_manager.cs | 228 -------- Physics_manager.cs | 41 -- Prim_manager.cs | 382 ------------- SceneGraphManager.cs | 40 -- Script_manager.cs | 103 ---- Second-server.csproj | 61 --- Second-server.sln | 34 -- Server.cs | 645 ---------------------- StorageManager.cs | 53 -- Texture_manager.cs | 238 -------- bin/Release/(TwoRegion)Grid.ini | 7 - bin/Release/Grid.ini | 6 - bin/Release/new-login.dat | 2 - bin/Release/textures/map1.jp2 | Bin 570 -> 0 bytes bin/Release/textures/map_base.jp2 | Bin 153 -> 0 bytes lib/Axiom.MathLib.dll | Bin 69632 -> 0 bytes lib/log4net.dll | Bin 270336 -> 0 bytes 25 files changed, 4516 deletions(-) delete mode 100644 Agent_Manager.cs delete mode 100644 AssemblyInfo.cs delete mode 100644 AssetManagement.cs delete mode 100644 Asset_manager.cs delete mode 100644 Controller.cs delete mode 100644 Globals.cs delete mode 100644 GridManager.cs delete mode 100644 InventoryManager.cs delete mode 100644 Login_manager.cs delete mode 100644 Physics_manager.cs delete mode 100644 Prim_manager.cs delete mode 100644 SceneGraphManager.cs delete mode 100644 Script_manager.cs delete mode 100644 Second-server.csproj delete mode 100644 Second-server.sln delete mode 100644 Server.cs delete mode 100644 StorageManager.cs delete mode 100644 Texture_manager.cs delete mode 100644 bin/Release/(TwoRegion)Grid.ini delete mode 100644 bin/Release/Grid.ini delete mode 100644 bin/Release/new-login.dat delete mode 100644 bin/Release/textures/map1.jp2 delete mode 100644 bin/Release/textures/map_base.jp2 delete mode 100644 lib/Axiom.MathLib.dll delete mode 100644 lib/log4net.dll diff --git a/Agent_Manager.cs b/Agent_Manager.cs deleted file mode 100644 index 11b523e524..0000000000 --- a/Agent_Manager.cs +++ /dev/null @@ -1,879 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; -using Axiom.MathLib; - -namespace OpenSim -{ - /// - /// Description of Agent_Manager. - /// - public class AgentManager - { - public Dictionary AgentList; - public static Dictionary AnimsLLUUID = new Dictionary(); - public static Dictionary AnimsNames = new Dictionary(); - - private uint _localNumber=0; - private Server _server; - public PrimManager Prim_Manager; - public AssetManagement assetManager; - - private libsecondlife.Packets.RegionHandshakePacket RegionPacket; - private System.Text.Encoding _enc = System.Text.Encoding.ASCII; - private libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; - - /// - /// - /// - /// - public AgentManager(Server server) - { - AgentList = new Dictionary(); - _server = server; - this.initialise(); - } - - /// - /// - /// - /// - /// - public AvatarData GetAgent(LLUUID id) - { - if(!this.AgentList.ContainsKey(id)) - { - return null; - } - else - { - AvatarData avatar = this.AgentList[id]; - return avatar; - } - } - /// - /// - /// - /// - public void AddAgent(AvatarData agent) - { - this.AgentList.Add(agent.FullID, agent); - } - /// - /// - /// - /// - /// - /// - /// - /// - - /// - /// - /// - /// - /// - /// - /// - public bool NewAgent(UserAgentInfo userInfo, string first, string last, LLUUID baseFolder, LLUUID inventoryFolder) - { - AvatarData agent = new AvatarData(); - agent.FullID = userInfo.AgentID; - agent.NetInfo = userInfo; - agent.NetInfo.first_name =first; - agent.NetInfo.last_name = last; - agent.Position = new LLVector3(100, 100, 22); - agent.BaseFolder = baseFolder; - agent.InventoryFolder = inventoryFolder; - agent.AnimID = AnimsLLUUID["ANIM_AGENT_STAND"]; - agent.AnimSequenceID = 1; - - this.AgentList.Add(agent.FullID, agent); - - //Create new Wearable Assets and place in Inventory - this.assetManager.CreateNewInventorySet(ref agent, userInfo); - - return(true); - } - - /// - /// - /// - /// - public void RemoveAgent(UserAgentInfo userInfo) - { - this.AgentList.Remove(userInfo.AgentID); - - //tell other clients to delete this avatar - } - - /// - /// - /// - /// - public void AgentJoin(UserAgentInfo userInfo) - { - //send region data - _server.SendPacket(RegionPacket,true, userInfo); - - //inform client of join comlete - libsecondlife.Packets.AgentMovementCompletePacket mov = new AgentMovementCompletePacket(); - mov.AgentData.SessionID = userInfo.SessionID; - mov.AgentData.AgentID = userInfo.AgentID; - mov.Data.RegionHandle = Globals.Instance.RegionHandle; - mov.Data.Timestamp = 1169838966; - mov.Data.Position = new LLVector3(100f, 100f, 22f); - mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0); - _server.SendPacket(mov, true, userInfo); - - } - - /// - /// - /// - public void UpdatePositions() - { - //update positions - foreach (KeyValuePair kp in this.AgentList) - { - - kp.Value.Position.X += (kp.Value.Velocity.X * 0.2f); - kp.Value.Position.Y += (kp.Value.Velocity.Y * 0.2f); - kp.Value.Position.Z += (kp.Value.Velocity.Z * 0.2f); - } - - } - - public void UpdateAnim(UserAgentInfo userInfo, LLUUID AnimID, int AnimSeq) - { - AgentList[userInfo.AgentID].AnimID = AnimID; - AgentList[userInfo.AgentID].AnimSequenceID = AnimSeq; - UpdateAnim(userInfo); - } - - public void UpdateAnim(UserAgentInfo userInfo) - { - Console.WriteLine("Agent_Manager.cs: UpdateAnim(UserAgentInfo userInfo): called for Agent " + userInfo.AgentID.ToString()); - AvatarAnimationPacket ani = new AvatarAnimationPacket(); - ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1]; - ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock(); - ani.AnimationSourceList[0].ObjectID = new LLUUID("00000000000000000000000000000000"); - ani.Sender = new AvatarAnimationPacket.SenderBlock(); - ani.Sender.ID = userInfo.AgentID; - ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[1]; - ani.AnimationList[0] = new AvatarAnimationPacket.AnimationListBlock(); - ani.AnimationList[0].AnimID = AgentList[userInfo.AgentID].AnimID; - ani.AnimationList[0].AnimSequenceID = AgentList[userInfo.AgentID].AnimSequenceID; - Console.WriteLine("Agenct_Manager.cs: UpdateAnim(UserAgentInfo userInfo): Sent Animation to client - " + AgentManager.AnimsNames[ani.AnimationList[0].AnimID]); - _server.SendPacket(ani, true, userInfo); - - // update other agents as appropiate - Axiom.MathLib.Sphere BoundingSphere; - foreach (KeyValuePair kp in this.AgentList) - { - if(kp.Key!=userInfo.AgentID) { - // Make a bounding sphere for the other avatar - BoundingSphere = new Sphere(new Vector3(kp.Value.Position.X,kp.Value.Position.Y,kp.Value.Position.Z), kp.Value.far); - - // If it intersects with our position, send an update packet - if(BoundingSphere.Intersects(new Vector3(this.AgentList[userInfo.AgentID].Position.X,this.AgentList[userInfo.AgentID].Position.Y,this.AgentList[userInfo.AgentID].Position.Z))) { - ani.AnimationSourceList[0].ObjectID = userInfo.AgentID; - ani.Sender = new AvatarAnimationPacket.SenderBlock(); - ani.Sender.ID = userInfo.AgentID; - ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[1]; - ani.AnimationList[0] = new AvatarAnimationPacket.AnimationListBlock(); - ani.AnimationList[0].AnimID = AgentList[userInfo.AgentID].AnimID; - ani.AnimationList[0].AnimSequenceID = AgentList[userInfo.AgentID].AnimSequenceID; - _server.SendPacket(ani, true, kp.Value.NetInfo); - } - } - } - } - /// - /// - /// - private void initialise() - { - //Region data - RegionPacket = new RegionHandshakePacket(); - RegionPacket.RegionInfo.BillableFactor = 0; - RegionPacket.RegionInfo.IsEstateManager = false; - RegionPacket.RegionInfo.TerrainHeightRange00 = 60; - RegionPacket.RegionInfo.TerrainHeightRange01 = 60; - RegionPacket.RegionInfo.TerrainHeightRange10 = 60; - RegionPacket.RegionInfo.TerrainHeightRange11 = 60; - RegionPacket.RegionInfo.TerrainStartHeight00 = 20; - RegionPacket.RegionInfo.TerrainStartHeight01 = 20; - RegionPacket.RegionInfo.TerrainStartHeight10 = 20; - RegionPacket.RegionInfo.TerrainStartHeight11 = 20; - RegionPacket.RegionInfo.SimAccess = 13; - RegionPacket.RegionInfo.WaterHeight = 5; - RegionPacket.RegionInfo.RegionFlags = 72458694; - RegionPacket.RegionInfo.SimName = _enc.GetBytes( Globals.Instance.RegionName); - RegionPacket.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000"); - RegionPacket.RegionInfo.TerrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975"); - RegionPacket.RegionInfo.TerrainBase1 = new LLUUID("abb783e6-3e93-26c0-248a-247666855da3"); - RegionPacket.RegionInfo.TerrainBase2 = new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f"); - RegionPacket.RegionInfo.TerrainBase3 = new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2"); - RegionPacket.RegionInfo.TerrainDetail0 = new LLUUID("00000000-0000-0000-0000-000000000000"); - RegionPacket.RegionInfo.TerrainDetail1 = new LLUUID("00000000-0000-0000-0000-000000000000"); - RegionPacket.RegionInfo.TerrainDetail2 = new LLUUID("00000000-0000-0000-0000-000000000000"); - RegionPacket.RegionInfo.TerrainDetail3 = new LLUUID("00000000-0000-0000-0000-000000000000"); - RegionPacket.RegionInfo.CacheID = new LLUUID("545ec0a5-5751-1026-8a0b-216e38a7ab37"); - - this.SetupTemplate("objectupate168.dat"); - this.LoadAnims(); - } - - /// - /// - /// - /// - private void SetupTemplate(string name) - { - - int i = 0; - FileInfo fInfo = new FileInfo(name); - long numBytes = fInfo.Length; - FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read); - BinaryReader br = new BinaryReader(fStream); - byte [] data1 = br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - - libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); - - System.Text.Encoding enc = System.Text.Encoding.ASCII; - libsecondlife.LLVector3 pos = new LLVector3(objdata.ObjectData, 16); - pos.X = 100f; - objdata.ID = 8880000; - objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0"); - libsecondlife.LLVector3 pos2 = new LLVector3(13.981f,100.0f,20.0f); - //objdata.FullID=user.AgentID; - byte[] pb = pos.GetBytes(); - Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length); - - AvatarTemplate = objdata; - - } - - private void LoadAnims() - { - AnimsLLUUID.Add("ANIM_AGENT_AFRAID", new LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca")); - AnimsLLUUID.Add("ANIM_AGENT_AIM_BAZOOKA_R", new LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef")); - AnimsLLUUID.Add("ANIM_AGENT_AIM_BOW_L", new LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506")); - AnimsLLUUID.Add("ANIM_AGENT_AIM_HANDGUN_R", new LLUUID("3147d815-6338-b932-f011-16b56d9ac18b")); - AnimsLLUUID.Add("ANIM_AGENT_AIM_RIFLE_R", new LLUUID("ea633413-8006-180a-c3ba-96dd1d756720")); - AnimsLLUUID.Add("ANIM_AGENT_ANGRY", new LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e")); - AnimsLLUUID.Add("ANIM_AGENT_AWAY", new LLUUID("fd037134-85d4-f241-72c6-4f42164fedee")); - AnimsLLUUID.Add("ANIM_AGENT_BACKFLIP", new LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304")); - AnimsLLUUID.Add("ANIM_AGENT_BELLY_LAUGH", new LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515")); - AnimsLLUUID.Add("ANIM_AGENT_BLOW_KISS", new LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624")); - AnimsLLUUID.Add("ANIM_AGENT_BORED", new LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510")); - AnimsLLUUID.Add("ANIM_AGENT_BOW", new LLUUID("82e99230-c906-1403-4d9c-3889dd98daba")); - AnimsLLUUID.Add("ANIM_AGENT_BRUSH", new LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01")); - AnimsLLUUID.Add("ANIM_AGENT_BUSY", new LLUUID("efcf670c-2d18-8128-973a-034ebc806b67")); - AnimsLLUUID.Add("ANIM_AGENT_CLAP", new LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668")); - AnimsLLUUID.Add("ANIM_AGENT_COURTBOW", new LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50")); - AnimsLLUUID.Add("ANIM_AGENT_CROUCH", new LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c")); - AnimsLLUUID.Add("ANIM_AGENT_CROUCHWALK", new LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022")); - AnimsLLUUID.Add("ANIM_AGENT_CRY", new LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed")); - AnimsLLUUID.Add("ANIM_AGENT_CUSTOMIZE", new LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53")); - AnimsLLUUID.Add("ANIM_AGENT_CUSTOMIZE_DONE", new LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE1", new LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE2", new LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE3", new LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE4", new LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE5", new LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE6", new LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE7", new LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6")); - AnimsLLUUID.Add("ANIM_AGENT_DANCE8", new LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc")); - AnimsLLUUID.Add("ANIM_AGENT_DEAD", new LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276")); - AnimsLLUUID.Add("ANIM_AGENT_DRINK", new LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f")); - AnimsLLUUID.Add("ANIM_AGENT_EMBARRASSED", new LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_AFRAID", new LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_ANGER", new LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_BORED", new LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_CRY", new LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_DISDAIN", new LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_EMBARRASSED", new LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_FROWN", new LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_KISS", new LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_LAUGH", new LLUUID("62570842-0950-96f8-341c-809e65110823")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_OPEN_MOUTH", new LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_REPULSED", new LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_SAD", new LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_SHRUG", new LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_SMILE", new LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_SURPRISE", new LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_TONGUE_OUT", new LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_TOOTHSMILE", new LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_WINK", new LLUUID("da020525-4d94-59d6-23d7-81fdebf33148")); - AnimsLLUUID.Add("ANIM_AGENT_EXPRESS_WORRY", new LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950")); - AnimsLLUUID.Add("ANIM_AGENT_FALLDOWN", new LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094")); - AnimsLLUUID.Add("ANIM_AGENT_FEMALE_WALK", new LLUUID("f5fc7433-043d-e819-8298-f519a119b688")); - AnimsLLUUID.Add("ANIM_AGENT_FINGER_WAG", new LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f")); - AnimsLLUUID.Add("ANIM_AGENT_FIST_PUMP", new LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a")); - AnimsLLUUID.Add("ANIM_AGENT_FLY", new LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf")); - AnimsLLUUID.Add("ANIM_AGENT_FLYSLOW", new LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6")); - AnimsLLUUID.Add("ANIM_AGENT_HELLO", new LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9")); - AnimsLLUUID.Add("ANIM_AGENT_HOLD_BAZOOKA_R", new LLUUID("ef62d355-c815-4816-2474-b1acc21094a6")); - AnimsLLUUID.Add("ANIM_AGENT_HOLD_BOW_L", new LLUUID("8b102617-bcba-037b-86c1-b76219f90c88")); - AnimsLLUUID.Add("ANIM_AGENT_HOLD_HANDGUN_R", new LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2")); - AnimsLLUUID.Add("ANIM_AGENT_HOLD_RIFLE_R", new LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33")); - AnimsLLUUID.Add("ANIM_AGENT_HOLD_THROW_R", new LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6")); - AnimsLLUUID.Add("ANIM_AGENT_HOVER", new LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d")); - AnimsLLUUID.Add("ANIM_AGENT_HOVER_DOWN", new LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e")); - AnimsLLUUID.Add("ANIM_AGENT_HOVER_UP", new LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864")); - AnimsLLUUID.Add("ANIM_AGENT_IMPATIENT", new LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3")); - AnimsLLUUID.Add("ANIM_AGENT_JUMP", new LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e")); - AnimsLLUUID.Add("ANIM_AGENT_JUMP_FOR_JOY", new LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa")); - AnimsLLUUID.Add("ANIM_AGENT_KISS_MY_BUTT", new LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51")); - AnimsLLUUID.Add("ANIM_AGENT_LAND", new LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f")); - AnimsLLUUID.Add("ANIM_AGENT_LAUGH_SHORT", new LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f")); - AnimsLLUUID.Add("ANIM_AGENT_MEDIUM_LAND", new LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57")); - AnimsLLUUID.Add("ANIM_AGENT_MOTORCYCLE_SIT", new LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29")); - AnimsLLUUID.Add("ANIM_AGENT_MUSCLE_BEACH", new LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b")); - AnimsLLUUID.Add("ANIM_AGENT_NO", new LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74")); - AnimsLLUUID.Add("ANIM_AGENT_NO_UNHAPPY", new LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4")); - AnimsLLUUID.Add("ANIM_AGENT_NYAH_NYAH", new LLUUID("f061723d-0a18-754f-66ee-29a44795a32f")); - AnimsLLUUID.Add("ANIM_AGENT_ONETWO_PUNCH", new LLUUID("eefc79be-daae-a239-8c04-890f5d23654a")); - AnimsLLUUID.Add("ANIM_AGENT_PEACE", new LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9")); - AnimsLLUUID.Add("ANIM_AGENT_POINT_ME", new LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752")); - AnimsLLUUID.Add("ANIM_AGENT_POINT_YOU", new LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de")); - AnimsLLUUID.Add("ANIM_AGENT_PRE_JUMP", new LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244")); - AnimsLLUUID.Add("ANIM_AGENT_PUNCH_LEFT", new LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0")); - AnimsLLUUID.Add("ANIM_AGENT_PUNCH_RIGHT", new LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656")); - AnimsLLUUID.Add("ANIM_AGENT_REPULSED", new LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf")); - AnimsLLUUID.Add("ANIM_AGENT_ROUNDHOUSE_KICK", new LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda")); - AnimsLLUUID.Add("ANIM_AGENT_RPS_COUNTDOWN", new LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f")); - AnimsLLUUID.Add("ANIM_AGENT_RPS_PAPER", new LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a")); - AnimsLLUUID.Add("ANIM_AGENT_RPS_ROCK", new LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f")); - AnimsLLUUID.Add("ANIM_AGENT_RPS_SCISSORS", new LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325")); - AnimsLLUUID.Add("ANIM_AGENT_RUN", new LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445")); - AnimsLLUUID.Add("ANIM_AGENT_SAD", new LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a")); - AnimsLLUUID.Add("ANIM_AGENT_SALUTE", new LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104")); - AnimsLLUUID.Add("ANIM_AGENT_SHOOT_BOW_L", new LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8")); - AnimsLLUUID.Add("ANIM_AGENT_SHOUT", new LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42")); - AnimsLLUUID.Add("ANIM_AGENT_SHRUG", new LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5")); - AnimsLLUUID.Add("ANIM_AGENT_SIT", new LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568")); - AnimsLLUUID.Add("ANIM_AGENT_SIT_FEMALE", new LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782")); - AnimsLLUUID.Add("ANIM_AGENT_SIT_GENERIC", new LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7")); - AnimsLLUUID.Add("ANIM_AGENT_SIT_GROUND", new LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86")); - AnimsLLUUID.Add("ANIM_AGENT_SIT_GROUND_CONSTRAINED", new LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e")); - AnimsLLUUID.Add("ANIM_AGENT_SIT_TO_STAND", new LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e")); - AnimsLLUUID.Add("ANIM_AGENT_SLEEP", new LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40")); - AnimsLLUUID.Add("ANIM_AGENT_SMOKE_IDLE", new LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a")); - AnimsLLUUID.Add("ANIM_AGENT_SMOKE_INHALE", new LLUUID("6802d553-49da-0778-9f85-1599a2266526")); - AnimsLLUUID.Add("ANIM_AGENT_SMOKE_THROW_DOWN", new LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6")); - AnimsLLUUID.Add("ANIM_AGENT_SNAPSHOT", new LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c")); - AnimsLLUUID.Add("ANIM_AGENT_STAND", new LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f")); - AnimsLLUUID.Add("ANIM_AGENT_STANDUP", new LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422")); - AnimsLLUUID.Add("ANIM_AGENT_STAND_1", new LLUUID("15468e00-3400-bb66-cecc-646d7c14458e")); - AnimsLLUUID.Add("ANIM_AGENT_STAND_2", new LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c")); - AnimsLLUUID.Add("ANIM_AGENT_STAND_3", new LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b")); - AnimsLLUUID.Add("ANIM_AGENT_STAND_4", new LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f")); - AnimsLLUUID.Add("ANIM_AGENT_STRETCH", new LLUUID("80700431-74ec-a008-14f8-77575e73693f")); - AnimsLLUUID.Add("ANIM_AGENT_STRIDE", new LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595")); - AnimsLLUUID.Add("ANIM_AGENT_SURF", new LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69")); - AnimsLLUUID.Add("ANIM_AGENT_SURPRISE", new LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224")); - AnimsLLUUID.Add("ANIM_AGENT_SWORD_STRIKE", new LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd")); - AnimsLLUUID.Add("ANIM_AGENT_TALK", new LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1")); - AnimsLLUUID.Add("ANIM_AGENT_TANTRUM", new LLUUID("11000694-3f41-adc2-606b-eee1d66f3724")); - AnimsLLUUID.Add("ANIM_AGENT_THROW_R", new LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca")); - AnimsLLUUID.Add("ANIM_AGENT_TRYON_SHIRT", new LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1")); - AnimsLLUUID.Add("ANIM_AGENT_TURNLEFT", new LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135")); - AnimsLLUUID.Add("ANIM_AGENT_TURNRIGHT", new LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30")); - AnimsLLUUID.Add("ANIM_AGENT_TYPE", new LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9")); - AnimsLLUUID.Add("ANIM_AGENT_WALK", new LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0")); - AnimsLLUUID.Add("ANIM_AGENT_WHISPER", new LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f")); - AnimsLLUUID.Add("ANIM_AGENT_WHISTLE", new LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0")); - AnimsLLUUID.Add("ANIM_AGENT_WINK", new LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e")); - AnimsLLUUID.Add("ANIM_AGENT_WINK_HOLLYWOOD", new LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c")); - AnimsLLUUID.Add("ANIM_AGENT_WORRY", new LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c")); - AnimsLLUUID.Add("ANIM_AGENT_YES", new LLUUID("15dd911d-be82-2856-26db-27659b142875")); - AnimsLLUUID.Add("ANIM_AGENT_YES_HAPPY", new LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d")); - AnimsLLUUID.Add("ANIM_AGENT_YOGA_FLOAT", new LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb")); - - - foreach (KeyValuePair kp in AgentManager.AnimsLLUUID) - { - AnimsNames.Add(kp.Value, kp.Key); - } - } - - /// - /// - /// - /// - public void SendInitialData(UserAgentInfo userInfo) - { - - //shouldn't have to read all this in from disk for every new client - string data_path = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"layer_data"); - - //send layerdata - LayerDataPacket layerpack = new LayerDataPacket(); - layerpack.LayerID.Type = 76; - this.SendLayerData(userInfo,ref layerpack, System.IO.Path.Combine(data_path, @"layerdata0.dat")); - - LayerDataPacket layerpack1 = new LayerDataPacket(); - layerpack1.LayerID.Type = 76; - this.SendLayerData(userInfo, ref layerpack, System.IO.Path.Combine(data_path, @"layerdata1.dat")); - - LayerDataPacket layerpack2 = new LayerDataPacket(); - layerpack2.LayerID.Type = 56; - this.SendLayerData(userInfo, ref layerpack, System.IO.Path.Combine(data_path, @"layerdata2.dat")); - - LayerDataPacket layerpack3 = new LayerDataPacket(); - layerpack3.LayerID.Type = 55; - this.SendLayerData(userInfo, ref layerpack, System.IO.Path.Combine(data_path, @"layerdata3.dat")); - - LayerDataPacket layerpack4 = new LayerDataPacket(); - layerpack4.LayerID.Type = 56; - this.SendLayerData(userInfo, ref layerpack, System.IO.Path.Combine(data_path, @"layerdata4.dat")); - - LayerDataPacket layerpack5 = new LayerDataPacket(); - layerpack5.LayerID.Type = 55; - this.SendLayerData(userInfo, ref layerpack, System.IO.Path.Combine(data_path, @"layerdata5.dat")); - - //send intial set of captured prims data? - this.Prim_Manager.ReadPrimDatabase( "objectdatabase.ini", userInfo); - - //send prims that have been created by users - //prim_man.send_existing_prims(User_info); - - //send update about clients avatar - this.SendInitialAvatarPosition(userInfo); - - //send updates about all other users - foreach (KeyValuePair kp in this.AgentList) - { - if(kp.Value.NetInfo.AgentID != userInfo.AgentID) - { - this.SendOtherAvatarPosition(userInfo, kp.Value); - } - } - } - - /// - /// - /// - /// - public void SendInitialAvatarPosition(UserAgentInfo userInfo) - { - //send a objectupdate packet with information about the clients avatar - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); - objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle; - objupdate.RegionData.TimeDilation = 64096; - objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; - - objupdate.ObjectData[0] = AvatarTemplate; - //give this avatar object a local id and assign the user a name - objupdate.ObjectData[0].ID = 8880000 + this._localNumber; - userInfo.localID = objupdate.ObjectData[0].ID; - //User_info.name="Test"+this.local_numer+" User"; - this.GetAgent(userInfo.AgentID).Started = true; - objupdate.ObjectData[0].FullID = userInfo.AgentID; - objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + userInfo.first_name + "\nLastName STRING RW SV " + userInfo.last_name + " \0"); - userInfo.name = "FirstName STRING RW SV " + userInfo.first_name + "\nLastName STRING RW SV " + userInfo.last_name + " \0"; - - libsecondlife.LLVector3 pos2 = new LLVector3(100f, 100.0f, 22.0f); - - byte[] pb = pos2.GetBytes(); - - Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); - this._localNumber++; - - _server.SendPacket(objupdate, true, userInfo); - - //send this info to other existing clients - foreach (KeyValuePair kp in this.AgentList) - { - if(kp.Value.NetInfo.AgentID != userInfo.AgentID) - { - _server.SendPacket(objupdate, true, kp.Value.NetInfo); - this.SendOtherAppearance(kp.Value.NetInfo, objupdate.ObjectData[0].FullID); - } - } - - } - - /// - /// - /// - /// - public void SendIntialAvatarAppearance(UserAgentInfo userInfo) - { - AvatarData Agent = this.AgentList[userInfo.AgentID]; - AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); - aw.AgentData.AgentID = userInfo.AgentID; - aw.AgentData.SerialNum = 0; - aw.AgentData.SessionID = userInfo.SessionID; - - aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; - AgentWearablesUpdatePacket.WearableDataBlock awb = null; - awb = new AgentWearablesUpdatePacket.WearableDataBlock(); - awb.WearableType = (byte)0; - awb.AssetID = Agent.Wearables[0].AssetID; - awb.ItemID = Agent.Wearables[0].ItemID; - aw.WearableData[0] = awb; - - awb = new AgentWearablesUpdatePacket.WearableDataBlock(); - awb.WearableType =(byte)1; - awb.AssetID = Agent.Wearables[1].AssetID; - awb.ItemID = Agent.Wearables[1].ItemID; - aw.WearableData[1] = awb; - - for(int i=2; i<13; i++) - { - awb = new AgentWearablesUpdatePacket.WearableDataBlock(); - awb.WearableType = (byte)i; - awb.AssetID = new LLUUID("00000000-0000-0000-0000-000000000000"); - awb.ItemID = new LLUUID("00000000-0000-0000-0000-000000000000"); - aw.WearableData[i] = awb; - } - - _server.SendPacket(aw, true, userInfo); - } - - /// - /// - /// - /// - /// - public void SendOtherAppearance(UserAgentInfo userInfo, LLUUID id) - { - AvatarAppearancePacket avp = new AvatarAppearancePacket(); - - - avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; - //avp.ObjectData.TextureEntry=this.avatar_template.TextureEntry;// br.ReadBytes((int)numBytes); - - FileInfo fInfo = new FileInfo("Avatar_texture3.dat"); - long numBytes = fInfo.Length; - FileStream fStream = new FileStream("Avatar_texture3.dat", FileMode.Open, FileAccess.Read); - BinaryReader br = new BinaryReader(fStream); - avp.ObjectData.TextureEntry = br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - - AvatarAppearancePacket.VisualParamBlock avblock = null; - for(int i = 0; i < 218; i++) - { - avblock = new AvatarAppearancePacket.VisualParamBlock(); - avblock.ParamValue = (byte)100; - avp.VisualParam[i] = avblock; - } - - avp.Sender.IsTrial = false; - avp.Sender.ID = id; - _server.SendPacket(avp, true, userInfo); - - } - - /// - /// - /// - /// - /// - public void SendOtherAvatarPosition(UserAgentInfo userInfo, AvatarData avatar) - { - //send a objectupdate packet with information about the clients avatar - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); - objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle; - objupdate.RegionData.TimeDilation = 64500; - objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; - - objupdate.ObjectData[0] = AvatarTemplate; - //give this avatar object a local id and assign the user a name - objupdate.ObjectData[0].ID = avatar.NetInfo.localID; - objupdate.ObjectData[0].FullID = avatar.NetInfo.AgentID; - objupdate.ObjectData[0].NameValue = _enc.GetBytes(avatar.NetInfo.name); - libsecondlife.LLVector3 pos2 = new LLVector3(avatar.Position.X, avatar.Position.Y, avatar.Position.Z); - - byte[] pb = pos2.GetBytes(); - Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); - this._localNumber++; - - _server.SendPacket(objupdate, true, userInfo); - this.SendOtherAppearance(userInfo, avatar.NetInfo.AgentID); - - } - - /// - /// - /// - /// - /// - public void SendChatMessage(UserAgentInfo userInfo, string line) - { - libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); - reply.ChatData.Audible = 1; - reply.ChatData.Message = _enc.GetBytes(line); - reply.ChatData.ChatType = 1; - reply.ChatData.SourceType = 1; - reply.ChatData.Position = new LLVector3(120, 100, 21); //should set to actual position - reply.ChatData.FromName = _enc.GetBytes(userInfo.first_name + " " + userInfo.last_name + "\0"); - reply.ChatData.OwnerID = userInfo.AgentID; - reply.ChatData.SourceID = userInfo.AgentID; - //echo to sender - _server.SendPacket(reply, true, userInfo); - - //send to all users - foreach (KeyValuePair kp in this.AgentList) - { - if(kp.Value.NetInfo.AgentID!=userInfo.AgentID) - { - _server.SendPacket(reply, true, kp.Value.NetInfo); - } - } - } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public void SendMoveCommand(UserAgentInfo userInfo, bool stop, float x, float y, float z, uint avatarID, libsecondlife.LLQuaternion body) - { - Console.WriteLine("sending move"); - uint ID = userInfo.localID; - byte[] bytes = new byte[60]; - int i=0; - - ImprovedTerseObjectUpdatePacket im = new ImprovedTerseObjectUpdatePacket(); - im.RegionData.RegionHandle = Globals.Instance.RegionHandle;; - im.RegionData.TimeDilation = 64096; - - im.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); - - im.ObjectData[0] = dat; - - dat.TextureEntry = AvatarTemplate.TextureEntry; - libsecondlife.LLVector3 pos2 = new LLVector3(x, y, z); - - bytes[i++] = (byte)(ID % 256); - bytes[i++] = (byte)((ID >> 8) % 256); - bytes[i++] = (byte)((ID >> 16) % 256); - bytes[i++] = (byte)((ID >> 24) % 256); - - bytes[i++] = 0; - bytes[i++] = 1; - - i += 14; - bytes[i++] = 128; - bytes[i++] = 63; - byte[] pb = pos2.GetBytes(); - - Array.Copy(pb, 0, bytes, i, pb.Length); - i += 12; - ushort ac = 32767; - Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0); - Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(body.W, body.X, body.Y, body.Z); - Axiom.MathLib.Vector3 direc = q * v3; - direc.Normalize(); - - direc = direc * (0.03f); - direc.x += 1; - direc.y += 1; - direc.z += 1; - ushort dx, dy, dz; - dx = (ushort)(32768 * direc.x); - dy = (ushort)(32768 * direc.y); - dz = (ushort)(32768 * direc.z); - - //vel - if(!stop) - { - bytes[i++] = (byte)(dx % 256); - bytes[i++] = (byte)((dx >> 8) % 256); - - bytes[i++] = (byte)(dy % 256); - bytes[i++] = (byte)((dy >> 8) % 256); - - bytes[i++] = (byte)(dz % 256); - bytes[i++] = (byte)((dz >> 8) % 256); - } - else - { - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - } - //accel - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - //rot - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - //rotation vel - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - dat.Data=bytes; - - _server.SendPacket(im, true, userInfo); - - //should send to all users. - foreach (KeyValuePair kp in this.AgentList) - { - if(kp.Value.NetInfo.AgentID != userInfo.AgentID) - { - _server.SendPacket(im, true, kp.Value.NetInfo); - } - } - - //check if we should be standing or walking - if (this.AgentList[userInfo.AgentID].Walk) - { - this.AgentList[userInfo.AgentID].AnimID = AgentManager.AnimsLLUUID["ANIM_AGENT_WALK"]; - this.AgentList[userInfo.AgentID].AnimSequenceID = 1; - this.UpdateAnim(userInfo); - } - else - { - this.AgentList[userInfo.AgentID].AnimID = AgentManager.AnimsLLUUID["ANIM_AGENT_STAND"]; - this.AgentList[userInfo.AgentID].AnimSequenceID = 1; - this.UpdateAnim(userInfo); - } - } - - /// - /// - /// - /// - /// - /// - public void SendLayerData(UserAgentInfo userInfo, ref LayerDataPacket layer, string name) - { - FileInfo fInfo = new FileInfo(name); - long numBytes = fInfo.Length; - FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read); - BinaryReader br = new BinaryReader(fStream); - byte [] data1 = br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - layer.LayerData.Data = data1; - _server.SendPacket(layer, true, userInfo); - - } - } - - public class AvatarData - { - public UserAgentInfo NetInfo; - public LLUUID FullID; - public LLVector3 Position; - public LLVector3 Velocity = new LLVector3(0,0,0); - //public LLQuaternion Rotation; - public bool Walk = false; - public bool Started = false; - //public TextureEntry TextureEntry; - public AvatarWearable[] Wearables; - public LLUUID InventoryFolder; - public LLUUID BaseFolder; - public LLUUID AnimID; - public int AnimSequenceID; - public float far; - public libsecondlife.LLVector3 CameraAtAxis; - public libsecondlife.LLVector3 CameraCenter; - public libsecondlife.LLVector3 CameraLeftAxis; - public libsecondlife.LLVector3 CameraUpAxis; - - public AvatarData() - { - Wearables=new AvatarWearable[2]; //should be 13 - for(int i = 0; i < 2; i++) - { - Wearables[i] = new AvatarWearable(); - } - } - } - - public class AvatarWearable - { - public LLUUID AssetID; - public LLUUID ItemID; - - public AvatarWearable() - { - - } - } - /* - public class AvatarParams - { - public byte[] Params; - - public AvatarParams() - { - - } - - } - */ -} diff --git a/AssemblyInfo.cs b/AssemblyInfo.cs deleted file mode 100644 index 3fc9cb35cc..0000000000 --- a/AssemblyInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* -* Copyright (c) , -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Information about this assembly is defined by the following -// attributes. -// -// change them to the information which is associated with the assembly -// you compile. - -[assembly: AssemblyTitle("OpenSim")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("OpenSim")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. -[assembly: ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all values by your own or you can build default build and revision -// numbers with the '*' character (the default): - -[assembly: AssemblyVersion("0.1.*")] diff --git a/AssetManagement.cs b/AssetManagement.cs deleted file mode 100644 index 0656494909..0000000000 --- a/AssetManagement.cs +++ /dev/null @@ -1,469 +0,0 @@ -/* - * -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* - */ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; - -namespace OpenSim -{ - /// - /// Asset and Image management - /// - public class AssetManagement - { - public Dictionary Assets; - public Dictionary Textures; - - public ArrayList AssetRequests = new ArrayList(); //should change to a generic - public ArrayList TextureRequests = new ArrayList(); - //public ArrayList uploads=new ArrayList(); - private Server _server; - private InventoryManager _inventoryManager; - private System.Text.Encoding _enc = System.Text.Encoding.ASCII; - - /// - /// - /// - /// - public AssetManagement(Server server, InventoryManager inventoryManager) - { - this._server = server; - this._inventoryManager = inventoryManager; - Textures = new Dictionary (); - Assets = new Dictionary (); - this.initialise(); - } - - /// - /// - /// - private void initialise() - { - //Shape and skin base assets - AssetInfo Asset = new AssetInfo(); - Asset.filename = "base_shape.dat"; - Asset.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); - this.LoadAsset(Asset, false); - this.Assets.Add(Asset.FullID, Asset); - - Asset = new AssetInfo(); - Asset.filename = "base_skin.dat"; - Asset.FullID = new LLUUID("e0ee49b5a4184df8d3c9a65361fe7f49"); - this.LoadAsset(Asset, false); - this.Assets.Add(Asset.FullID, Asset); - - //our test images - //Change these filenames to images you want to use. - TextureImage Image = new TextureImage(); - Image.filename = "testpic2.jp2"; - Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005"); - Image.Name = "test Texture"; - this.LoadAsset(Image, true); - this.Textures.Add(Image.FullID, Image); - - Image = new TextureImage(); - Image.filename = "map_base.jp2"; - Image.FullID = new LLUUID("00000000-0000-0000-7007-000000000006"); - this.LoadAsset(Image, true); - this.Textures.Add(Image.FullID, Image); - - Image = new TextureImage(); - Image.filename = "map1.jp2"; - Image.FullID = new LLUUID("00000000-0000-0000-7009-000000000008"); - this.LoadAsset(Image, true); - this.Textures.Add(Image.FullID, Image); - } - - /// - /// - /// - /// - /// - /// - #region AssetRegion - - public void AddAssetRequest(UserAgentInfo userInfo, LLUUID assetID, TransferRequestPacket transferRequest) - { - - if(!this.Assets.ContainsKey(assetID)) - { - //not found asset - return; - } - AssetInfo info = this.Assets[assetID]; - //for now as it will be only skin or shape request just send back the asset - TransferInfoPacket Transfer = new TransferInfoPacket(); - Transfer.TransferInfo.ChannelType = 2; - Transfer.TransferInfo.Status = 0; - Transfer.TransferInfo.TargetType = 0; - Transfer.TransferInfo.Params = transferRequest.TransferInfo.Params; - Transfer.TransferInfo.Size = info.data.Length; - Transfer.TransferInfo.TransferID = transferRequest.TransferInfo.TransferID; - - _server.SendPacket(Transfer, true, userInfo); - - TransferPacketPacket TransferPacket = new TransferPacketPacket(); - TransferPacket.TransferData.Packet = 0; - TransferPacket.TransferData.ChannelType = 2; - TransferPacket.TransferData.TransferID=transferRequest.TransferInfo.TransferID; - if(info.data.Length>1000) //but needs to be less than 2000 at the moment - { - byte[] chunk = new byte[1000]; - Array.Copy(info.data,chunk,1000); - TransferPacket.TransferData.Data = chunk; - TransferPacket.TransferData.Status = 0; - _server.SendPacket(TransferPacket,true,userInfo); - - TransferPacket = new TransferPacketPacket(); - TransferPacket.TransferData.Packet = 1; - TransferPacket.TransferData.ChannelType = 2; - TransferPacket.TransferData.TransferID = transferRequest.TransferInfo.TransferID; - byte[] chunk1 = new byte[(info.data.Length-1000)]; - Array.Copy(info.data, 1000, chunk1, 0, chunk1.Length); - TransferPacket.TransferData.Data = chunk1; - TransferPacket.TransferData.Status = 1; - _server.SendPacket(TransferPacket, true, userInfo); - } - else - { - TransferPacket.TransferData.Status = 1; //last packet? so set to 1 - TransferPacket.TransferData.Data = info.data; - _server.SendPacket(TransferPacket, true, userInfo); - } - - } - - public void CreateNewInventorySet(ref AvatarData Avata,UserAgentInfo UserInfo) - { - //Create Folders - LLUUID BaseFolder = Avata.BaseFolder; - _inventoryManager.CreateNewFolder(UserInfo, Avata.InventoryFolder); - _inventoryManager.CreateNewFolder(UserInfo, BaseFolder); - - //Give a copy of default shape - AssetInfo Base = this.Assets[new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73")]; - AssetInfo Shape = this.CloneAsset(UserInfo.AgentID, Base); - - Shape.filename = ""; - Shape.Name = "Default Shape"; - Shape.Description = "Default Shape"; - Shape.InvType = 18; - Shape.Type = libsecondlife.AssetSystem.Asset.ASSET_TYPE_WEARABLE_BODY; - - byte[] Agentid = _enc.GetBytes(UserInfo.AgentID.ToStringHyphenated()); - Array.Copy(Agentid, 0, Shape.data, 294, Agentid.Length); - this.Assets.Add(Shape.FullID, Shape); - - Avata.Wearables[0].ItemID = _inventoryManager.AddToInventory(UserInfo, BaseFolder, Shape); - Avata.Wearables[0].AssetID = Shape.FullID; - - //Give copy of default skin - Base = this.Assets[new LLUUID("e0ee49b5a4184df8d3c9a65361fe7f49")]; - AssetInfo Skin=this.CloneAsset(UserInfo.AgentID, Base); - - Skin.filename = ""; - Skin.Name = "Default Skin"; - Skin.Description = "Default Skin"; - Skin.InvType = 18; - Skin.Type = libsecondlife.AssetSystem.Asset.ASSET_TYPE_WEARABLE_BODY; - - Array.Copy(Agentid,0,Skin.data,238,Agentid.Length); - this.Assets.Add(Skin.FullID, Skin); - - Avata.Wearables[1].ItemID = _inventoryManager.AddToInventory(UserInfo, BaseFolder, Skin); - Avata.Wearables[1].AssetID = Skin.FullID; - - //give a copy of test texture - TextureImage Texture = this.CloneImage(UserInfo.AgentID, Textures[new LLUUID("00000000-0000-0000-5005-000000000005")]); - this.Textures.Add(Texture.FullID, Texture); - _inventoryManager.AddToInventory(UserInfo, BaseFolder, Texture); - - } - - - private void LoadAsset(AssetBase info, bool Image) - { - //should request Asset from storage manager - //but for now read from file - string folder; - if(Image) - { - folder = @"textures"; - } - else - { - folder = @"assets"; - } - string data_path = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, folder); - string filename = System.IO.Path.Combine(data_path, @info.filename); - FileInfo fInfo = new FileInfo(filename); - - long numBytes = fInfo.Length; - - FileStream fStream = new FileStream(filename, FileMode.Open, FileAccess.Read); - byte[] idata = new byte[numBytes]; - BinaryReader br = new BinaryReader(fStream); - idata= br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - info.data = idata; - //info.loaded=true; - } - - public AssetInfo CloneAsset(LLUUID NewOwner, AssetInfo SourceAsset) - { - AssetInfo NewAsset = new AssetInfo(); - NewAsset.data = new byte[SourceAsset.data.Length]; - Array.Copy(SourceAsset.data, NewAsset.data, SourceAsset.data.Length); - NewAsset.FullID = LLUUID.Random(); - NewAsset.Type = SourceAsset.Type; - NewAsset.InvType = SourceAsset.InvType; - return(NewAsset); - } - #endregion - - #region TextureRegion - public void AddTextureRequest(UserAgentInfo userInfo, LLUUID imageID) - { - - if(!this.Textures.ContainsKey(imageID)) - { - //not found image so send back image not in data base message - ImageNotInDatabasePacket im_not = new ImageNotInDatabasePacket(); - im_not.ImageID.ID=imageID; - _server.SendPacket(im_not, true, userInfo); - return; - } - TextureImage imag = this.Textures[imageID]; - TextureRequest req = new TextureRequest(); - req.RequestUser = userInfo; - req.RequestImage = imageID; - req.ImageInfo = imag; - - if(imag.data.LongLength>600) //should be bigger or smaller? - { - //over 600 bytes so split up file - req.NumPackets = 1 + (int)(imag.data.Length-600+999)/1000; - } - else - { - req.NumPackets = 1; - } - - this.TextureRequests.Add(req); - - } - - public void AddTexture(LLUUID imageID, string name, byte[] data) - { - - } - public void DoWork(ulong time) - { - if(this.TextureRequests.Count == 0) - { - //no requests waiting - return; - } - int num; - //should be running in its own thread but for now is called by timer - if(this.TextureRequests.Count < 5) - { - //lower than 5 so do all of them - num = this.TextureRequests.Count; - } - else - { - num=5; - } - TextureRequest req; - for(int i = 0; i < num; i++) - { - req=(TextureRequest)this.TextureRequests[i]; - - if(req.PacketCounter == 0) - { - //first time for this request so send imagedata packet - if(req.NumPackets == 1) - { - //only one packet so send whole file - ImageDataPacket im = new ImageDataPacket(); - im.ImageID.Packets = 1; - im.ImageID.ID = req.ImageInfo.FullID; - im.ImageID.Size = (uint)req.ImageInfo.data.Length; - im.ImageData.Data = req.ImageInfo.data; - im.ImageID.Codec = 2; - _server.SendPacket(im, true, req.RequestUser); - req.PacketCounter++; - req.ImageInfo.last_used = time; - //System.Console.WriteLine("sent texture: "+req.image_info.FullID); - } - else - { - //more than one packet so split file up - ImageDataPacket im = new ImageDataPacket(); - im.ImageID.Packets = (ushort)req.NumPackets; - im.ImageID.ID = req.ImageInfo.FullID; - im.ImageID.Size = (uint)req.ImageInfo.data.Length; - im.ImageData.Data = new byte[600]; - Array.Copy(req.ImageInfo.data, 0, im.ImageData.Data, 0, 600); - im.ImageID.Codec = 2; - _server.SendPacket(im, true, req.RequestUser); - req.PacketCounter++; - req.ImageInfo.last_used = time; - //System.Console.WriteLine("sent first packet of texture: - } - } - else - { - //send imagepacket - //more than one packet so split file up - ImagePacketPacket im = new ImagePacketPacket(); - im.ImageID.Packet = (ushort)req.PacketCounter; - im.ImageID.ID = req.ImageInfo.FullID; - int size = req.ImageInfo.data.Length - 600 - 1000*(req.PacketCounter - 1); - if(size > 1000) size = 1000; - im.ImageData.Data = new byte[size]; - Array.Copy(req.ImageInfo.data, 600 + 1000*(req.PacketCounter - 1), im.ImageData.Data, 0, size); - _server.SendPacket(im, true, req.RequestUser); - req.PacketCounter++; - req.ImageInfo.last_used = time; - //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID); - } - } - - //remove requests that have been completed - for(int i = 0; i < num; i++) - { - req=(TextureRequest)this.TextureRequests[i]; - if(req.PacketCounter == req.NumPackets) - { - this.TextureRequests.Remove(req); - } - } - } - - public void RecieveTexture(Packet pack) - { - - } - - public TextureImage CloneImage(LLUUID newOwner, TextureImage source) - { - TextureImage newImage = new TextureImage(); - newImage.data = new byte[source.data.Length]; - Array.Copy(source.data,newImage.data,source.data.Length); - newImage.filename = source.filename; - newImage.FullID = LLUUID.Random(); - newImage.Name = source.Name; - return(newImage); - } - - #endregion - } - - public class AssetRequest - { - public UserAgentInfo RequestUser; - public LLUUID RequestImage; - public AssetInfo asset_inf; - public long data_pointer = 0; - public int num_packets = 0; - public int packet_counter = 0; - - public AssetRequest() - { - - } - } - public class AssetInfo:AssetBase - { - //public byte[] data; - //public LLUUID Full_ID; - public bool loaded; - public ulong last_used; //need to add a tick/time counter and keep record - // of how often images are requested to unload unused ones. - - public AssetInfo() - { - - } - } - - public class AssetBase - { - public byte[] data; - public LLUUID FullID; - public sbyte Type; - public sbyte InvType; - public string Name; - public string Description; - public string filename; - - public AssetBase() - { - - } - } - public class TextureRequest - { - public UserAgentInfo RequestUser; - public LLUUID RequestImage; - public TextureImage ImageInfo; - public long DataPointer = 0; - public int NumPackets = 0; - public int PacketCounter = 0; - - public TextureRequest() - { - - } - } - public class TextureImage: AssetBase - { - //any need for this class now most has been moved into AssetBase? - //public byte[] data; - //public LLUUID Full_ID; - //public string name; - public bool loaded; - public ulong last_used; //need to add a tick/time counter and keep record - // of how often images are requested to unload unused ones. - - public TextureImage() - { - - } - } - - -} diff --git a/Asset_manager.cs b/Asset_manager.cs deleted file mode 100644 index 94832f7031..0000000000 --- a/Asset_manager.cs +++ /dev/null @@ -1,231 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - -* Copyright (c) , -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; - -namespace OpenSim -{ - /// - /// Description of Asset_manager. - /// - public class AssetManager - { - public Dictionary Assets; - public ArrayList requests=new ArrayList(); //should change to a generic - // public ArrayList uploads=new ArrayList(); - private Server server; - public TextureManager TextureMan; - public InventoryManager InventoryManager; - private System.Text.Encoding enc = System.Text.Encoding.ASCII; - - public AssetManager(Server serve) - { - server=serve; - Assets=new Dictionary (); - this.initialise(); - } - - public void AddRequest(User_Agent_info user, LLUUID asset_id, TransferRequestPacket tran_req) - { - Console.WriteLine("Asset Request "+ asset_id); - if(!this.Assets.ContainsKey(asset_id)) - { - //not found asset - return; - } - AssetInfo info=this.Assets[asset_id]; - System.Console.WriteLine("send asset : "+asset_id); - //for now as it will be only skin or shape request just send back the asset - TransferInfoPacket Transfer=new TransferInfoPacket(); - Transfer.TransferInfo.ChannelType=2; - Transfer.TransferInfo.Status=0; - Transfer.TransferInfo.TargetType=0; - Transfer.TransferInfo.Params=tran_req.TransferInfo.Params; - Transfer.TransferInfo.Size=info.data.Length; - Transfer.TransferInfo.TransferID=tran_req.TransferInfo.TransferID; - - server.SendPacket(Transfer,true,user); - - TransferPacketPacket tran_p=new TransferPacketPacket(); - tran_p.TransferData.Packet=0; - tran_p.TransferData.ChannelType=2; - tran_p.TransferData.TransferID=tran_req.TransferInfo.TransferID; - if(info.data.Length>1000) //but needs to be less than 2000 at the moment - { - byte[] chunk=new byte[1000]; - Array.Copy(info.data,chunk,1000); - tran_p.TransferData.Data=chunk; - tran_p.TransferData.Status=0; - server.SendPacket(tran_p,true,user); - - tran_p=new TransferPacketPacket(); - tran_p.TransferData.Packet=1; - tran_p.TransferData.ChannelType=2; - tran_p.TransferData.TransferID=tran_req.TransferInfo.TransferID; - byte[] chunk1=new byte[(info.data.Length-1000)]; - Array.Copy(info.data,1000,chunk1,0,chunk1.Length); - tran_p.TransferData.Data=chunk1; - tran_p.TransferData.Status=1; - server.SendPacket(tran_p,true,user); - } - else - { - tran_p.TransferData.Status=1; //last packet? so set to 1 - tran_p.TransferData.Data=info.data; - server.SendPacket(tran_p,true,user); - } - - } - public void CreateNewBaseSet(ref AvatarData Avata,User_Agent_info UserInfo) - { - //LLUUID BaseFolder=new LLUUID("4f5f559e-77a0-a4b9-84f9-8c74c07f7cfc");//*/"4fb2dab6-a987-da66-05ee-96ca82bccbf1"); - //LLUUID BaseFolder=new LLUUID("480e2d92-61f6-9f16-f4f5-0f77cfa4f8f9"); - LLUUID BaseFolder=Avata.BaseFolder; - InventoryManager.CreateNewFolder(UserInfo,Avata.InventoryFolder); - InventoryManager.CreateNewFolder(UserInfo, BaseFolder); - - AssetInfo Base=this.Assets[new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73")]; - AssetInfo Shape=new AssetInfo(); - - Shape.filename=""; - Shape.data=new byte[Base.data.Length]; - Array.Copy(Base.data,Shape.data,Base.data.Length); - Shape.Full_ID=LLUUID.Random(); - Shape.Name="Default Skin"; - Shape.Description="Default"; - Shape.InvType=18; - - Shape.Type=libsecondlife.AssetSystem.Asset.ASSET_TYPE_WEARABLE_BODY; - byte[] Agentid=enc.GetBytes(UserInfo.AgentID.ToStringHyphenated()); - Array.Copy(Agentid,0,Shape.data,294,Agentid.Length); - this.Assets.Add(Shape.Full_ID,Shape); - /*FileStream fStream = new FileStream("Assetshape.dat", FileMode.CreateNew); - BinaryWriter bw = new BinaryWriter(fStream); - bw.Write(Shape.data); - bw.Close(); - fStream.Close();*/ - - Avata.Wearables[0].ItemID=InventoryManager.AddToInventory(UserInfo,BaseFolder,Shape); - Avata.Wearables[0].AssetID=Shape.Full_ID; - //Avata.RootFolder=BaseFolder; - - //give test texture - - TextureImage Texture=TextureMan.textures[new LLUUID("00000000-0000-0000-5005-000000000005")]; - InventoryManager.AddToInventory(UserInfo,BaseFolder,Texture); - - } - - private void initialise() - { - //for now read in our test image - AssetInfo im=new AssetInfo(); - im.filename="base_shape.dat"; - im.Full_ID=new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); - this.loadAsset(im); - this.Assets.Add(im.Full_ID,im); - - - im=new AssetInfo(); - im.filename="base_skin.dat"; - im.Full_ID=new LLUUID("e0ee49b5a4184df8d3c9a65361fe7f49"); - this.loadAsset(im); - this.Assets.Add(im.Full_ID,im); - } - private void loadAsset(AssetInfo info) - { - //should request Asset from storage manager - //but for now read from file - - string data_path = System.AppDomain.CurrentDomain.BaseDirectory + @"\assets\"; - string filename=data_path+@info.filename; - FileInfo fInfo = new FileInfo(filename); - - long numBytes = fInfo.Length; - - FileStream fStream = new FileStream(filename, FileMode.Open, FileAccess.Read); - byte[] idata=new byte[numBytes]; - BinaryReader br = new BinaryReader(fStream); - idata= br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - info.data=idata; - info.loaded=true; - } - } - - public class AssetRequest - { - public User_Agent_info RequestUser; - public LLUUID RequestImage; - public AssetInfo asset_inf; - public long data_pointer=0; - public int num_packets=0; - public int packet_counter=0; - - public AssetRequest() - { - - } - } - public class AssetInfo:AssetBase - { - //public byte[] data; - //public LLUUID Full_ID; - public string filename; - public bool loaded; - public ulong last_used; //need to add a tick/time counter and keep record - // of how often images are requested to unload unused ones. - - public AssetInfo() - { - - } - } - - public class AssetBase - { - public byte[] data; - public LLUUID Full_ID; - public sbyte Type; - public sbyte InvType; - public string Name; - public string Description; - - public AssetBase() - { - - } - } -} diff --git a/Controller.cs b/Controller.cs deleted file mode 100644 index d0a17cf421..0000000000 --- a/Controller.cs +++ /dev/null @@ -1,358 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - - -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Timers; -using System.Collections.Generic; -using libsecondlife; -using libsecondlife.Packets; -using System.Collections; -using System.Text; -using System.IO; -using Axiom.MathLib; -using log4net; - -namespace OpenSim -{ - /// - /// Description of MainForm. - /// - public partial class Controller : ServerCallback - { - - [STAThread] - public static void Main( string[] args ) - { - Controller c = new Controller(); - while( true ) // fuckin' a - System.Threading.Thread.Sleep( 1000 ); - } - - private Server _server; - private Logon _login; - private AgentManager _agentManager; - private PrimManager _primManager; - private AssetManagement _assetManager; - private GridManager _gridManager; - private InventoryManager _inventoryManager; - private LoginManager _loginManager; //built in login server - private ulong time; //ticks - private Timer timer1 = new Timer(); - private System.Text.Encoding _enc = System.Text.Encoding.ASCII; - - public Controller() { - _login = new Logon(); // should create a list for these. - _server = new Server( this ); - _agentManager = new AgentManager( this._server ); - _primManager = new PrimManager( this._server ); - _inventoryManager = new InventoryManager(this._server); - _assetManager = new AssetManagement(this._server, _inventoryManager ); - _primManager.AgentManagement = _agentManager; - _agentManager.Prim_Manager = _primManager; - _agentManager.assetManager = _assetManager; - _gridManager = new GridManager(this._server, _agentManager); - - if(Globals.Instance.LoginSever) - { - Console.WriteLine("Starting login Server"); - _loginManager = new LoginManager(_login); // startup - _loginManager.Startup(); // login server - } - - timer1.Enabled = true; - timer1.Interval = 200; - timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick ); - - - } - public void MainCallback( Packet pack, UserAgentInfo userInfo ) - { - - /*if( ( pack.Type != PacketType.StartPingCheck ) && ( pack.Type != PacketType.AgentUpdate ) ) { - //Log packet? - //System.Console.WriteLine(pack.Type); - //this.richTextBox1.Text = this.richTextBox1.Text + "\n " + pack.Type; - }*/ - - //should replace with a switch - if( pack.Type == PacketType.AgentSetAppearance ) { - - } - else if (pack.Type == PacketType.AgentAnimation) - { - AgentAnimationPacket AgentAni = (AgentAnimationPacket)pack; - for (int i = 0; i < AgentAni.AnimationList.Length; i++) - { - if (AgentAni.AnimationList[i].StartAnim) - { - _agentManager.UpdateAnim(userInfo, AgentAni.AnimationList[0].AnimID, 1); - } - } - - } - else if (pack.Type == PacketType.FetchInventory) - { - FetchInventoryPacket FetchInventory = (FetchInventoryPacket)pack; - _inventoryManager.FetchInventory(userInfo, FetchInventory); - } - else if (pack.Type == PacketType.FetchInventoryDescendents) - { - FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)pack; - _inventoryManager.FetchInventoryDescendents(userInfo, Fetch); - } - else if (pack.Type == PacketType.MapBlockRequest) - { - MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)pack; - this._gridManager.RequestMapBlock(userInfo, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY); - - } - else if (pack.Type == PacketType.UUIDNameRequest) - { - UUIDNameRequestPacket nameRequest = (UUIDNameRequestPacket)pack; - UUIDNameReplyPacket nameReply = new UUIDNameReplyPacket(); - nameReply.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[nameRequest.UUIDNameBlock.Length]; - - for (int i = 0; i < nameRequest.UUIDNameBlock.Length; i++) - { - nameReply.UUIDNameBlock[i] = new UUIDNameReplyPacket.UUIDNameBlockBlock(); - nameReply.UUIDNameBlock[i].ID = nameRequest.UUIDNameBlock[i].ID; - nameReply.UUIDNameBlock[i].FirstName = _enc.GetBytes("harry \0"); //for now send any name - nameReply.UUIDNameBlock[i].LastName = _enc.GetBytes("tom \0"); //in future need to look it up - } - - _server.SendPacket(nameReply, true, userInfo); - } - else if (pack.Type == PacketType.CloseCircuit) - { - this._agentManager.RemoveAgent(userInfo); - } - else if (pack.Type == PacketType.MapLayerRequest) - { - this._gridManager.RequestMapLayer(userInfo); - } - else if ((pack.Type == PacketType.TeleportRequest) || (pack.Type == PacketType.TeleportLocationRequest)) - { - TeleportLocationRequestPacket Request = (TeleportLocationRequestPacket)pack; - this._gridManager.RequestTeleport(userInfo, Request); - - } - else if (pack.Type == PacketType.TransferRequest) - { - TransferRequestPacket transfer = (TransferRequestPacket)pack; - LLUUID id = new LLUUID(transfer.TransferInfo.Params, 0); - _assetManager.AddAssetRequest(userInfo, id, transfer); - } - else if ((pack.Type == PacketType.StartPingCheck)) - { - //reply to pingcheck - libsecondlife.Packets.StartPingCheckPacket startping = (libsecondlife.Packets.StartPingCheckPacket)pack; - libsecondlife.Packets.CompletePingCheckPacket endping = new CompletePingCheckPacket(); - endping.PingID.PingID = startping.PingID.PingID; - _server.SendPacket(endping, true, userInfo); - } - else if (pack.Type == PacketType.CompleteAgentMovement) - { - _agentManager.AgentJoin(userInfo); - } - else if (pack.Type == PacketType.RequestImage) - { - RequestImagePacket imageRequest = (RequestImagePacket)pack; - for (int i = 0; i < imageRequest.RequestImage.Length; i++) - { - this._assetManager.AddTextureRequest(userInfo, imageRequest.RequestImage[i].Image); - } - } - else if (pack.Type == PacketType.RegionHandshakeReply) - { - //recieved regionhandshake so can now start sending info - _agentManager.SendInitialData(userInfo); - } - else if (pack.Type == PacketType.ObjectAdd) - { - ObjectAddPacket ad = (ObjectAddPacket)pack; - _primManager.CreatePrim(userInfo, ad.ObjectData.RayEnd, ad); - } - else if (pack.Type == PacketType.ObjectPosition) - { - //System.Console.WriteLine(pack.ToString()); - } - else if (pack.Type == PacketType.MultipleObjectUpdate) - { - MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)pack; - - for (int i = 0; i < multipleupdate.ObjectData.Length; i++) - { - if (multipleupdate.ObjectData[i].Type == 9) //change position - { - libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0); - _primManager.UpdatePrimPosition(userInfo, pos, multipleupdate.ObjectData[i].ObjectLocalID, false, libsecondlife.LLQuaternion.Identity); - //should update stored position of the prim - } - else if (multipleupdate.ObjectData[i].Type == 10)//rotation - { - libsecondlife.LLVector3 pos = new LLVector3(100, 100, 22); - libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true); - _primManager.UpdatePrimPosition(userInfo, pos, multipleupdate.ObjectData[i].ObjectLocalID, true, rot); - } - } - } - else if (pack.Type == PacketType.AgentWearablesRequest) - { - _agentManager.SendIntialAvatarAppearance(userInfo); - } - else if (pack.Type == PacketType.AgentUpdate) - { - // System.Console.WriteLine("agent update"); - AgentUpdatePacket agent = (AgentUpdatePacket)pack; - uint mask = agent.AgentData.ControlFlags & (1); - AvatarData avatar = _agentManager.GetAgent(userInfo.AgentID); - avatar.CameraAtAxis = agent.AgentData.CameraAtAxis; - avatar.CameraUpAxis = agent.AgentData.CameraUpAxis; - avatar.CameraCenter = agent.AgentData.CameraCenter; - avatar.far = agent.AgentData.Far; - - if (avatar != null) - { - if (avatar.Started) - { - if (mask == (1)) - { - if (!avatar.Walk) - { - //start walking - _agentManager.SendMoveCommand(userInfo, false, avatar.Position.X, avatar.Position.Y, avatar.Position.Z, 0, agent.AgentData.BodyRotation); - _agentManager.UpdateAnim(avatar.NetInfo, AgentManager.AnimsLLUUID["ANIM_AGENT_WALK"], 1); - Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0); - Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(agent.AgentData.BodyRotation.W, agent.AgentData.BodyRotation.X, agent.AgentData.BodyRotation.Y, agent.AgentData.BodyRotation.Z); - Axiom.MathLib.Vector3 direc = q * v3; - direc.Normalize(); - direc = direc * ((0.03f) * 128f); - - avatar.Velocity.X = direc.x; - avatar.Velocity.Y = direc.y; - avatar.Velocity.Z = direc.z; - avatar.Walk = true; - } - } - else - { - if (avatar.Walk) - { - //walking but key not pressed so need to stop - _agentManager.SendMoveCommand(userInfo, true, avatar.Position.X, avatar.Position.Y, avatar.Position.Z, 0, agent.AgentData.BodyRotation); - _agentManager.UpdateAnim(avatar.NetInfo, AgentManager.AnimsLLUUID["ANIM_AGENT_STAND"], 1); - avatar.Walk = false; - avatar.Velocity.X = 0; - avatar.Velocity.Y = 0; - avatar.Velocity.Z = 0; - } - } - } - } - else - { - - } - } - else if (pack.Type == PacketType.ChatFromViewer) - { - ChatFromViewerPacket chat = (ChatFromViewerPacket)pack; - System.Text.Encoding enc = System.Text.Encoding.ASCII; - - string myString = enc.GetString(chat.ChatData.Message); - if (myString != "") - { - string[] comp = new string[10]; - string delimStr = " , "; - char[] delimiter = delimStr.ToCharArray(); - string line; - - line = myString; - comp = line.Split(delimiter); - if (comp[0] == "pos") - { - } - else if (comp[0] == "veloc") - { - } - else - { - _agentManager.SendChatMessage(userInfo, line); - } - } - } - } - public void NewUserCallback(UserAgentInfo userInfo ) - { - Console.WriteLine( "new user - {0} - has joined [session {1}]", userInfo.AgentID.ToString(), userInfo.SessionID.ToString() +"curcuit used"+userInfo.circuitCode); - string first,last; - LLUUID Base,Inventory; - lock(_login) - { - first=_login.First; - last=_login.Last; - Base=_login.BaseFolder; - Inventory=_login.InventoryFolder; - //should get agentid and sessionid so they can be checked. - } - _agentManager.NewAgent(userInfo, first, last, Base, Inventory); - //now because of the lack of Global account management (User server etc) - //we need to reset the names back to default incase a teleport happens - //which will not have a Login name set, so they will use default names - lock(_login) - { - _login.First="Test"; - _login.Last="User"; - } - } - - public void ErrorCallback( string text ) { - Console.WriteLine( "error report: {0}", text ); - } - - void Timer1Tick( object sender, System.EventArgs e ) { - this.time++; - _agentManager.UpdatePositions(); - this._assetManager.DoWork( time ); - } - } - public class Logon - { - public string First = "Test"; - public string Last = "User"; - public LLUUID Agent; - public LLUUID Session; - public LLUUID InventoryFolder; - public LLUUID BaseFolder; - public Logon() - { - - } - } -} diff --git a/Globals.cs b/Globals.cs deleted file mode 100644 index 067893c49b..0000000000 --- a/Globals.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - -* Copyright (c) , -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using libsecondlife; -using System.Collections.Generic; - -namespace OpenSim -{ - /// - /// Description of Globals. - /// - public sealed class Globals - { - private static Globals instance = new Globals(); - - public static Globals Instance - { - get - { - return instance; - } - } - - private Globals() - { - } - - public string RegionName = "Test Sandbox\0"; - public ulong RegionHandle = 1096213093147648; - public int IpPort = 1000; - - public bool LoginSever = true; - public ushort LoginServerPort = 8080; - - - - - } -} diff --git a/GridManager.cs b/GridManager.cs deleted file mode 100644 index c52bd51d51..0000000000 --- a/GridManager.cs +++ /dev/null @@ -1,372 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - -* Copyright (c) , -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; -using System.Xml; - - -namespace OpenSim -{ - /// - /// Description of GridManager. - /// - public class GridManager - { - private Server _server; - private System.Text.Encoding _enc = System.Text.Encoding.ASCII; - private AgentManager _agentManager; - public Dictionary Grid; - - /// - /// - /// - /// - /// - public GridManager(Server server, AgentManager agentManager) - { - Grid = new Dictionary(); - _server = server; - _agentManager = agentManager; - LoadGrid(); - } - - /// - /// - /// - /// - public void RequestMapLayer(UserAgentInfo userInfo) - { - //send a layer covering the 800,800 - 1200,1200 area - MapLayerReplyPacket MapReply = new MapLayerReplyPacket(); - MapReply.AgentData.AgentID = userInfo.AgentID; - MapReply.AgentData.Flags = 0; - MapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1]; - MapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock(); - MapReply.LayerData[0].Bottom = 800; - MapReply.LayerData[0].Left = 800; - MapReply.LayerData[0].Top = 1200; - MapReply.LayerData[0].Right = 1200; - MapReply.LayerData[0].ImageID = new LLUUID("00000000-0000-0000-7007-000000000006"); - _server.SendPacket(MapReply, true, userInfo); - } - - /// - /// - /// - /// - /// - /// - /// - /// - public void RequestMapBlock(UserAgentInfo userInfo, int minX, int minY,int maxX,int maxY) - { - foreach (KeyValuePair RegionPair in this.Grid) - { - //check Region is inside the requested area - RegionInfo Region = RegionPair.Value; - if(((Region.X > minX) && (Region.X < maxX)) && ((Region.Y > minY) && (Region.Y < maxY))) - { - MapBlockReplyPacket MapReply = new MapBlockReplyPacket(); - MapReply.AgentData.AgentID = userInfo.AgentID; - MapReply.AgentData.Flags = 0; - MapReply.Data = new MapBlockReplyPacket.DataBlock[1]; - MapReply.Data[0] = new MapBlockReplyPacket.DataBlock(); - MapReply.Data[0].MapImageID = Region.ImageID; - MapReply.Data[0].X = Region.X; - MapReply.Data[0].Y = Region.Y; - MapReply.Data[0].WaterHeight = Region.WaterHeight; - MapReply.Data[0].Name = _enc.GetBytes( Region.Name); - MapReply.Data[0].RegionFlags = 72458694; - MapReply.Data[0].Access = 13; - MapReply.Data[0].Agents = 1; - _server.SendPacket(MapReply, true, userInfo); - } - } - - } - - /// - /// - /// - /// - /// - public void RequestTeleport(UserAgentInfo userInfo, TeleportLocationRequestPacket request) - { - if(Grid.ContainsKey(request.Info.RegionHandle)) - { - RegionInfo Region = Grid[request.Info.RegionHandle]; - libsecondlife.Packets.TeleportStartPacket TeleportStart = new TeleportStartPacket(); - TeleportStart.Info.TeleportFlags = 16; - _server.SendPacket(TeleportStart, true, userInfo); - - libsecondlife.Packets.TeleportFinishPacket Teleport = new TeleportFinishPacket(); - Teleport.Info.AgentID = userInfo.AgentID; - Teleport.Info.RegionHandle = request.Info.RegionHandle; - Teleport.Info.SimAccess = 13; - Teleport.Info.SeedCapability = new byte[0]; - - System.Net.IPAddress oIP = System.Net.IPAddress.Parse(Region.IPAddress.Address); - 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 = Region.IPAddress.Port; - Teleport.Info.LocationID = 4; - Teleport.Info.TeleportFlags = 1 << 4;; - _server.SendPacket(Teleport, true, userInfo); - - this._agentManager.RemoveAgent(userInfo); - } - - } - - /// - /// - /// - private void LoadGrid() - { - //should connect to a space server to see what grids there are - //but for now we read static xml files - ulong CurrentHandle = 0; - bool Login = true; - - XmlDocument doc = new XmlDocument(); - - try { - doc.Load(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Grid.ini" )); - } - catch ( Exception e) - { - Console.WriteLine(e.Message); - return; - } - - try - { - XmlNode root = doc.FirstChild; - if (root.Name != "Root") - throw new Exception("Error: Invalid File. Missing "); - - XmlNode nodes = root.FirstChild; - if (nodes.Name != "Grid") - throw new Exception("Error: Invalid File. first child should be "); - - if (nodes.HasChildNodes) { - foreach( XmlNode xmlnc in nodes.ChildNodes) - { - if(xmlnc.Name == "Region") - { - string xmlAttri; - RegionInfo Region = new RegionInfo(); - if(xmlnc.Attributes["Name"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("Name")).Value; - Region.Name = xmlAttri+" \0"; - } - if(xmlnc.Attributes["ImageID"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("ImageID")).Value; - Region.ImageID = new LLUUID(xmlAttri); - } - if(xmlnc.Attributes["IP_Address"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("IP_Address")).Value; - Region.IPAddress.Address = xmlAttri; - } - if(xmlnc.Attributes["IP_Port"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("IP_Port")).Value; - Region.IPAddress.Port = Convert.ToUInt16(xmlAttri); - } - if(xmlnc.Attributes["Location_X"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("Location_X")).Value; - Region.X = Convert.ToUInt16(xmlAttri); - } - if(xmlnc.Attributes["Location_Y"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("Location_Y")).Value; - Region.Y = Convert.ToUInt16(xmlAttri); - } - - this.Grid.Add(Region.Handle, Region); - - } - if(xmlnc.Name == "CurrentRegion") - { - - string xmlAttri; - uint Rx = 0, Ry = 0; - if(xmlnc.Attributes["RegionHandle"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("RegionHandle")).Value; - CurrentHandle = Convert.ToUInt64(xmlAttri); - - } - else - { - if(xmlnc.Attributes["Region_X"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("Region_X")).Value; - Rx = Convert.ToUInt32(xmlAttri); - } - if(xmlnc.Attributes["Region_Y"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("Region_Y")).Value; - Ry = Convert.ToUInt32(xmlAttri); - } - } - if(xmlnc.Attributes["LoginServer"] != null) - { - xmlAttri = ((XmlAttribute)xmlnc.Attributes.GetNamedItem("LoginServer")).Value; - Login = Convert.ToBoolean(xmlAttri); - - } - if(CurrentHandle == 0) - { - //no RegionHandle set - //so check for Region X and Y - if((Rx > 0) && (Ry > 0)) - { - CurrentHandle = Helpers.UIntsToLong((Rx*256), (Ry*256)); - } - else - { - //seems to be no Region location set - // so set default - CurrentHandle = 1096213093147648; - } - } - } - } - - //finished loading grid, now set Globals to current region - if(CurrentHandle != 0) - { - if(Grid.ContainsKey(CurrentHandle)) - { - RegionInfo Region = Grid[CurrentHandle]; - Globals.Instance.RegionHandle = Region.Handle; - Globals.Instance.RegionName = Region.Name; - Globals.Instance.IpPort = Region.IPAddress.Port; - Globals.Instance.LoginSever = Login; - } - } - - } - } - catch ( Exception e) - { - Console.WriteLine(e.Message); - return; - } - } - } - - public class RegionInfo - { - public RegionIP IPAddress; - public string Name; - public ushort x; - public ushort y; - public ulong handle; - public LLUUID ImageID; - public uint Flags; - public byte WaterHeight; - - public ushort X - { - get - { - return(x); - } - set - { - x = value; - Handle = Helpers.UIntsToLong((((uint)x)*256), (((uint)y)*256)); - } - } - public ushort Y - { - get - { - return(y); - } - set - { - y = value; - Handle = Helpers.UIntsToLong((((uint)x)*256), (((uint)y)*256)); - } - } - public ulong Handle - { - get - { - if(handle > 0) - { - return(handle); - } - else - { - return(Helpers.UIntsToLong((((uint)x)*256), (((uint)y)*256))); - } - } - set - { - handle = value; - } - - } - - public RegionInfo() - { - this.IPAddress = new RegionIP(); - } - } - public class RegionIP - { - public string Address; - public ushort Port; - - public RegionIP() - { - - } - - } -} diff --git a/InventoryManager.cs b/InventoryManager.cs deleted file mode 100644 index 17f7f5c52a..0000000000 --- a/InventoryManager.cs +++ /dev/null @@ -1,242 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using libsecondlife; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; - -namespace OpenSim -{ - /// - /// Description of InventoryManager. - /// - public class InventoryManager - { - - public Dictionary Folders; - public Dictionary Items; - private Server _server; - private System.Text.Encoding _enc = System.Text.Encoding.ASCII; - private const uint FULL_MASK_PERMISSIONS = 2147483647; - - /// - /// - /// - /// - public InventoryManager(Server server) - { - _server = server; - Folders=new Dictionary(); - Items=new Dictionary(); - } - - /// - /// - /// - /// - /// - /// - /// - public LLUUID AddToInventory(UserAgentInfo userInfo, LLUUID folderID, AssetBase asset) - { - if(this.Folders.ContainsKey(folderID)) - { - LLUUID NewItemID = LLUUID.Random(); - - InventoryItem Item = new InventoryItem(); - Item.FolderID = folderID; - Item.OwnerID = userInfo.AgentID; - Item.AssetID = asset.FullID; - Item.ItemID = NewItemID; - Item.Type = asset.Type; - Item.Name = asset.Name; - Item.Description = asset.Description; - Item.InvType = asset.InvType; - this.Items.Add(Item.ItemID, Item); - InventoryFolder Folder = Folders[Item.FolderID]; - Folder.Items.Add(Item); - return(Item.ItemID); - } - else - { - return(null); - } - } - - /// - /// - /// - /// - /// - /// - public bool CreateNewFolder(UserAgentInfo userInfo, LLUUID newFolder) - { - InventoryFolder Folder = new InventoryFolder(); - Folder.FolderID = newFolder; - Folder.OwnerID = userInfo.AgentID; - this.Folders.Add(Folder.FolderID, Folder); - - return(true); - } - - /// - /// - /// - /// - /// - public void FetchInventoryDescendents(UserAgentInfo userInfo, FetchInventoryDescendentsPacket FetchDescend) - { - if(FetchDescend.InventoryData.FetchItems) - { - if(this.Folders.ContainsKey(FetchDescend.InventoryData.FolderID)) - { - - InventoryFolder Folder = this.Folders[FetchDescend.InventoryData.FolderID]; - InventoryDescendentsPacket Descend = new InventoryDescendentsPacket(); - Descend.AgentData.AgentID = userInfo.AgentID; - Descend.AgentData.OwnerID = Folder.OwnerID; - Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID; - Descend.AgentData.Descendents = Folder.Items.Count; - Descend.AgentData.Version = Folder.Items.Count; - - Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count]; - for(int i = 0; i < Folder.Items.Count ; i++) - { - - InventoryItem Item=Folder.Items[i]; - Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock(); - Descend.ItemData[i].ItemID = Item.ItemID; - Descend.ItemData[i].AssetID = Item.AssetID; - Descend.ItemData[i].CreatorID = Item.CreatorID; - Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS; - Descend.ItemData[i].CreationDate = 1000; - Descend.ItemData[i].Description = _enc.GetBytes(Item.Description+"\0"); - Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS; - Descend.ItemData[i].Flags = 1; - Descend.ItemData[i].FolderID = Item.FolderID; - Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); - Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS; - Descend.ItemData[i].InvType = Item.InvType; - Descend.ItemData[i].Name = _enc.GetBytes(Item.Name+"\0"); - Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS; - Descend.ItemData[i].OwnerID = Item.OwnerID; - Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS; - Descend.ItemData[i].SalePrice = 100; - Descend.ItemData[i].SaleType = 0; - Descend.ItemData[i].Type = Item.Type; - Descend.ItemData[i].CRC=libsecondlife.Helpers.InventoryCRC(1000, 0, Descend.ItemData[i].InvType, Descend.ItemData[i].Type, Descend.ItemData[i].AssetID, Descend.ItemData[i].GroupID, 100, Descend.ItemData[i].OwnerID, Descend.ItemData[i].CreatorID, Descend.ItemData[i].ItemID, Descend.ItemData[i].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); - } - _server.SendPacket(Descend, true, userInfo); - - } - } - else - { - Console.WriteLine("fetch subfolders"); - } - } - - /// - /// - /// - /// - public void FetchInventory(UserAgentInfo userInfo, FetchInventoryPacket FetchItems) - { - - for(int i = 0; i < FetchItems.InventoryData.Length; i++) - { - if(this.Items.ContainsKey(FetchItems.InventoryData[i].ItemID)) - { - - InventoryItem Item = Items[FetchItems.InventoryData[i].ItemID]; - FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket(); - InventoryReply.AgentData.AgentID = userInfo.AgentID; - InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1]; - InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock(); - InventoryReply.InventoryData[0].ItemID = Item.ItemID; - InventoryReply.InventoryData[0].AssetID = Item.AssetID; - InventoryReply.InventoryData[0].CreatorID = Item.CreatorID; - InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS; - InventoryReply.InventoryData[0].CreationDate = 1000; - InventoryReply.InventoryData[0].Description = _enc.GetBytes( Item.Description+"\0"); - InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS; - InventoryReply.InventoryData[0].Flags = 1; - InventoryReply.InventoryData[0].FolderID = Item.FolderID; - InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); - InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS; - InventoryReply.InventoryData[0].InvType = Item.InvType; - InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name+"\0"); - InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS; - InventoryReply.InventoryData[0].OwnerID = Item.OwnerID; - InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS; - InventoryReply.InventoryData[0].SalePrice = 100; - InventoryReply.InventoryData[0].SaleType = 0; - InventoryReply.InventoryData[0].Type = Item.Type; - InventoryReply.InventoryData[0].CRC = libsecondlife.Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType, InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID, InventoryReply.InventoryData[0].GroupID, 100, InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID, InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); - _server.SendPacket(InventoryReply, true, userInfo); - } - } - } - } - - public class InventoryFolder - { - public List Items; - //public List Subfolders; - - public LLUUID FolderID; - public LLUUID OwnerID; - public LLUUID ParentID; - - - public InventoryFolder() - { - Items = new List(); - } - - } - - public class InventoryItem - { - public LLUUID FolderID; - public LLUUID OwnerID; - public LLUUID ItemID; - public LLUUID AssetID; - public LLUUID CreatorID = LLUUID.Zero; - public sbyte InvType; - public sbyte Type; - public string Name; - public string Description; - - public InventoryItem() - { - - } - } -} diff --git a/Login_manager.cs b/Login_manager.cs deleted file mode 100644 index 2d4f524992..0000000000 --- a/Login_manager.cs +++ /dev/null @@ -1,228 +0,0 @@ -/* -* Copyright (c) OpenSim project, http://sim.opensecondlife.org/> -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -using Nwc.XmlRpc; -using System; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Collections; -using System.Xml; -using libsecondlife; - -namespace OpenSim -{ - /// - /// Description of Login_manager. - /// - public class LoginManager - { - public LoginManager(Logon login) - { - Login=login; - } - public Logon Login; - public ushort loginPort = Globals.Instance.LoginServerPort; - public IPAddress clientAddress = IPAddress.Loopback; - public IPAddress remoteAddress = IPAddress.Any; - private Socket loginServer; - private Random RandomClass = new Random(); - private int NumClients; - - // InitializeLoginProxy: initialize the login proxy - private void InitializeLoginProxy() { - loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - loginServer.Bind(new IPEndPoint(remoteAddress, loginPort)); - loginServer.Listen(1); - } - - public void Startup() - { - this.InitializeLoginProxy(); - Thread runLoginProxy = new Thread(new ThreadStart(RunLoginProxy)); - runLoginProxy.IsBackground = true; - runLoginProxy.Start(); - } - - private void RunLoginProxy() - { - try - { - for (;;) - { - Socket client = loginServer.Accept(); - IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint; - - - NetworkStream networkStream = new NetworkStream(client); - StreamReader networkReader = new StreamReader(networkStream); - StreamWriter networkWriter = new StreamWriter(networkStream); - - try - { - ProxyLogin(networkReader, networkWriter); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - - networkWriter.Close(); - networkReader.Close(); - networkStream.Close(); - - client.Close(); - - // send any packets queued for injection - - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine(e.StackTrace); - } - } - - // ProxyLogin: proxy a login request - private void ProxyLogin(StreamReader reader, StreamWriter writer) { lock(this) { - string line; - int contentLength = 0; - - // read HTTP header - do - { - // read one line of the header - line = reader.ReadLine(); - - // check for premature EOF - if (line == null) - throw new Exception("EOF in client HTTP header"); - - // look for Content-Length - Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line); - if (match.Success) - contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString()); - } while (line != ""); - - // read the HTTP body into a buffer - char[] content = new char[contentLength]; - reader.Read(content, 0, contentLength); - //System.Text.Encoding enc = System.Text.Encoding.ASCII; - XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content)); - Hashtable requestData = (Hashtable)request.Params[0]; - - string first; - string last; - LLUUID Agent; - LLUUID Session; - - //get login name - if(requestData.Contains("first")) - { - first = (string)requestData["first"]; - } - else - { - first = "test"; - } - if(requestData.Contains("last")) - { - last = (string)requestData["last"]; - } - else - { - last = "User"+NumClients.ToString(); - } - NumClients++; - - //create a agent and session LLUUID - int AgentRand = this.RandomClass.Next(1,9999); - Agent = new LLUUID("99998888-"+AgentRand.ToString("0000")+"-4f52-8ec1-0b1d5cd6aead"); - int SessionRand = this.RandomClass.Next(1,999); - Session = new LLUUID("aaaabbbb-8932-"+SessionRand.ToString("0000")+"-8664-58f53e442797"); - - - StreamReader SR; - string ResponseString = ""; - string lines; - SR=File.OpenText("new-login.dat"); - - lines=SR.ReadLine(); - - while(lines != "end-mfile") - { - - ResponseString += lines; - lines = SR.ReadLine(); - } - SR.Close(); - - XmlRpcResponse response =(XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(ResponseString); - Hashtable responseData = (Hashtable)response.Value; - - responseData["agent_id"] = Agent.ToStringHyphenated(); - responseData["session_id"] = Session.ToStringHyphenated(); - ArrayList InventoryList = (ArrayList) responseData["inventory-skeleton"]; - Hashtable Inventory1 = (Hashtable)InventoryList[0]; - Hashtable Inventory2 = (Hashtable)InventoryList[1]; - LLUUID BaseFolderID = LLUUID.Random(); - LLUUID InventoryFolderID = LLUUID.Random(); - Inventory2["name"] = "Base"; - Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated(); - Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated(); - - ArrayList InventoryRoot = (ArrayList) responseData["inventory-root"]; - Hashtable Inventoryroot = (Hashtable)InventoryRoot[0]; - Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated(); - - - //copy data to login object - lock(Login) - { - Login.First = first; - Login.Last = last; - Login.Agent = Agent; - Login.Session = Session; - Login.BaseFolder = BaseFolderID; - Login.InventoryFolder = InventoryFolderID; - } - - // forward the XML-RPC response to the client - writer.WriteLine("HTTP/1.0 200 OK"); - writer.WriteLine("Content-type: text/xml"); - writer.WriteLine(); - - XmlTextWriter responseWriter = new XmlTextWriter(writer); - XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response); - responseWriter.Close(); - } - } - } -} diff --git a/Physics_manager.cs b/Physics_manager.cs deleted file mode 100644 index 17f3340654..0000000000 --- a/Physics_manager.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; - -namespace OpenSim -{ - /// - /// Description of Physics_manager. - /// - public class PhysicsManager - { - public PhysicsManager() - { - } - } -} diff --git a/Prim_manager.cs b/Prim_manager.cs deleted file mode 100644 index 3b6af10125..0000000000 --- a/Prim_manager.cs +++ /dev/null @@ -1,382 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; -using Axiom.MathLib; - -namespace OpenSim -{ - /// - /// Description of Prim_manager. - /// - public class PrimManager - { - private Server _server; - private uint _primCount; - - public AgentManager AgentManagement; - public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock PrimTemplate; - public Dictionary PrimList; - - /// - /// - /// - /// - public PrimManager(Server server) - { - _server = server; - PrimList = new Dictionary (); - this.SetupTemplates("objectupate164.dat"); - - } - - /// - /// - /// - /// - /// - /// - public void CreatePrim(UserAgentInfo userInfo, libsecondlife.LLVector3 pos1, ObjectAddPacket addPacket) - { - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); - objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle; - objupdate.RegionData.TimeDilation = 64096; - - objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; - PrimData PData = new PrimData(); - objupdate.ObjectData[0] = this.PrimTemplate; - PData.OwnerID=objupdate.ObjectData[0].OwnerID = userInfo.AgentID; - PData.PCode=objupdate.ObjectData[0].PCode = addPacket.ObjectData.PCode; - PData.PathBegin=objupdate.ObjectData[0].PathBegin = addPacket.ObjectData.PathBegin; - PData.PathEnd=objupdate.ObjectData[0].PathEnd = addPacket.ObjectData.PathEnd; - PData.PathScaleX=objupdate.ObjectData[0].PathScaleX = addPacket.ObjectData.PathScaleX; - PData.PathScaleY=objupdate.ObjectData[0].PathScaleY = addPacket.ObjectData.PathScaleY; - PData.PathShearX=objupdate.ObjectData[0].PathShearX = addPacket.ObjectData.PathShearX; - PData.PathShearY=objupdate.ObjectData[0].PathShearY = addPacket.ObjectData.PathShearY; - PData.PathSkew=objupdate.ObjectData[0].PathSkew = addPacket.ObjectData.PathSkew; - PData.ProfileBegin=objupdate.ObjectData[0].ProfileBegin = addPacket.ObjectData.ProfileBegin; - PData.ProfileEnd=objupdate.ObjectData[0].ProfileEnd = addPacket.ObjectData.ProfileEnd; - PData.Scale=objupdate.ObjectData[0].Scale = addPacket.ObjectData.Scale; - PData.PathCurve=objupdate.ObjectData[0].PathCurve = addPacket.ObjectData.PathCurve; - PData.ProfileCurve=objupdate.ObjectData[0].ProfileCurve = addPacket.ObjectData.ProfileCurve; - PData.ParentID=objupdate.ObjectData[0].ParentID = 0; - PData.ProfileHollow=objupdate.ObjectData[0].ProfileHollow = addPacket.ObjectData.ProfileHollow; - //finish off copying rest of shape data - - objupdate.ObjectData[0].ID = (uint)(702000 + _primCount); - objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efefda"+_primCount.ToString("000")); - - //update position - byte[] pb = pos1.GetBytes(); - Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length); - - _primCount++; - _server.SendPacket(objupdate, true, userInfo); - - //should send to all users - foreach (KeyValuePair kp in AgentManagement.AgentList) - { - if(kp.Value.NetInfo.AgentID != userInfo.AgentID) - { - _server.SendPacket(objupdate, true, kp.Value.NetInfo); - } - } - //should store this infomation - PrimInfo NewPrim = new PrimInfo(); - NewPrim.FullID = objupdate.ObjectData[0].FullID; - NewPrim.LocalID = objupdate.ObjectData[0].ID; - NewPrim.Position = pos1; - NewPrim.Data = PData; - - this.PrimList.Add(NewPrim.FullID, NewPrim); - - //store rest of data - - } - - /// - /// - /// - /// - /// - /// - /// - /// - public void UpdatePrimPosition(UserAgentInfo userInfo, LLVector3 position, uint localID, bool setRotation, LLQuaternion rotation) - { - PrimInfo pri = null; - foreach (KeyValuePair kp in this.PrimList) - { - if(kp.Value.LocalID == localID) - { - pri = kp.Value; - } - } - if(pri == null) - { - return; - } - uint ID = pri.LocalID; - libsecondlife.LLVector3 pos2 = new LLVector3(position.X, position.Y, position.Z); - libsecondlife.LLQuaternion rotation2; - if(!setRotation) - { - pri.Position = pos2; - rotation2 = new LLQuaternion(pri.Rotation.X, pri.Rotation.Y, pri.Rotation.Z, pri.Rotation.W); - } - else - { - rotation2=new LLQuaternion(rotation.X, rotation.Y, rotation.Z, rotation.W); - pos2 = pri.Position; - pri.Rotation = rotation; - } - rotation2.W += 1; - rotation2.X += 1; - rotation2.Y += 1; - rotation2.Z += 1; - - byte[] bytes = new byte[60]; - - ImprovedTerseObjectUpdatePacket im = new ImprovedTerseObjectUpdatePacket(); - im.RegionData.RegionHandle = Globals.Instance.RegionHandle; - im.RegionData.TimeDilation = 64096; - im.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - int i = 0; - ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); - im.ObjectData[0] = dat; - dat.TextureEntry = PrimTemplate.TextureEntry; - - bytes[i++] = (byte)(ID % 256); - bytes[i++] = (byte)((ID >> 8) % 256); - bytes[i++] = (byte)((ID >> 16) % 256); - bytes[i++] = (byte)((ID >> 24) % 256); - bytes[i++]= 0; - bytes[i++]= 0; - - byte[] pb = pos2.GetBytes(); - pri.Position = pos2; - Array.Copy(pb, 0, bytes, i, pb.Length); - i += 12; - ushort ac = 32767; - - //vel - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - //accel - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - ushort rw, rx,ry,rz; - rw = (ushort)(32768 * rotation2.W); - rx = (ushort)(32768 * rotation2.X); - ry = (ushort)(32768 * rotation2.Y); - rz = (ushort)(32768 * rotation2.Z); - - //rot - bytes[i++] = (byte)(rx % 256); - bytes[i++] = (byte)((rx >> 8) % 256); - bytes[i++] = (byte)(ry % 256); - bytes[i++] = (byte)((ry >> 8) % 256); - bytes[i++] = (byte)(rz % 256); - bytes[i++] = (byte)((rz >> 8) % 256); - bytes[i++] = (byte)(rw % 256); - bytes[i++] = (byte)((rw >> 8) % 256); - - //rotation vel - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - bytes[i++] = (byte)(ac % 256); - bytes[i++] = (byte)((ac >> 8) % 256); - - dat.Data=bytes; - - foreach (KeyValuePair kp in AgentManagement.AgentList) - { - if(kp.Value.NetInfo.AgentID!=userInfo.AgentID) - { - _server.SendPacket(im, true, kp.Value.NetInfo); - } - } - } - - /// - /// - /// - /// - public void SendExistingPrims(UserAgentInfo userInfo) - { - //send data for already created prims to a new joining user - } - - /// - /// - /// - /// - public void SetupTemplates(string name) - { - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); - objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle; - objupdate.RegionData.TimeDilation = 64096; - objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; - - int i = 0; - FileInfo fInfo = new FileInfo(name); - long numBytes = fInfo.Length; - FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read); - BinaryReader br = new BinaryReader(fStream); - byte [] data1 = br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - - libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1,ref i); - objupdate.ObjectData[0] = objdata; - this.PrimTemplate = objdata; - objdata.UpdateFlags = objdata.UpdateFlags + 12 - 16 + 32 + 256; - objdata.OwnerID = new LLUUID("00000000-0000-0000-0000-000000000000"); - //test adding a new texture to object , to test image downloading - LLObject.TextureEntry te = new LLObject.TextureEntry(objdata.TextureEntry, 0, objdata.TextureEntry.Length); - te.DefaultTexture.TextureID = new LLUUID("00000000-0000-0000-5005-000000000005"); - - LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005")); - - objdata.TextureEntry = ntex.ToBytes(); - } - - /// - /// - /// - /// - /// - public void ReadPrimDatabase(string name, UserAgentInfo userInfo) - { - StreamReader SR; - string line; - SR=File.OpenText(name); - string [] comp = new string[10]; - string delimStr = " , "; - char [] delimiter = delimStr.ToCharArray(); - - line=SR.ReadLine(); - while(line != "end") - { - comp = line.Split(delimiter); - if(comp[0] == "ObjPack") - { - int num = Convert.ToInt32(comp[2]); - int start = Convert.ToInt32(comp[1]); - ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); - objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle; - objupdate.RegionData.TimeDilation = 64096; - objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[num]; - - // int count=0; - string data_path = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"data"); - for(int cc = 0; cc < num; cc++) - { - string filenam = System.IO.Path.Combine(data_path, @"prim_updates"+start+".dat"); - int i = 0; - //FileInfo fInfo = new FileInfo("objectupate"+start+".dat"); - FileInfo fInfo = new FileInfo(filenam); - long numBytes = fInfo.Length; - //FileStream fStream = new FileStream("objectupate"+start+".dat", FileMode.Open, FileAccess.Read); - FileStream fStream = new FileStream(filenam, FileMode.Open, FileAccess.Read); - BinaryReader br = new BinaryReader(fStream); - byte [] data1 = br.ReadBytes((int)numBytes); - br.Close(); - fStream.Close(); - - libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); - objupdate.ObjectData[cc] = objdata; - start++; - } - _server.SendPacket(objupdate, true, userInfo); - line = SR.ReadLine(); - } - } - SR.Close(); - } - } - - public class PrimInfo - { - public LLVector3 Position; - public LLVector3 Velocity; - public LLQuaternion Rotation=LLQuaternion.Identity; - public uint LocalID; - public LLUUID FullID; - public PrimData Data; - - public PrimInfo() - { - Position=new LLVector3(0,0,0); - Velocity=new LLVector3(0,0,0); - //data=new PrimData(); - } - } - public class PrimData - { - public LLUUID OwnerID; - public byte PCode; - public byte PathBegin; - public byte PathEnd; - public byte PathScaleX; - public byte PathScaleY; - public byte PathShearX; - public byte PathShearY; - public sbyte PathSkew; - public byte ProfileBegin; - public byte ProfileEnd; - public LLVector3 Scale; - public byte PathCurve; - public byte ProfileCurve; - public uint ParentID=0; - public byte ProfileHollow; - - public bool DataBaseStorage=false; - - public PrimData() - { - - } - } -} diff --git a/SceneGraphManager.cs b/SceneGraphManager.cs deleted file mode 100644 index 739eccb7e8..0000000000 --- a/SceneGraphManager.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; - -namespace OpenSim -{ - /// - /// Description of SceneGraphManager. - /// - public class SceneGraphManager - { - public SceneGraphManager() - { - } - } -} diff --git a/Script_manager.cs b/Script_manager.cs deleted file mode 100644 index 26b87f197f..0000000000 --- a/Script_manager.cs +++ /dev/null @@ -1,103 +0,0 @@ -/* - Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - -using System; -using System.Collections; -//using LuaInterface; -using libsecondlife; - -namespace OpenSim -{ - /// - /// Description of Script_manager. - /// - public class ScriptManager - { - //public LuaInterface.Lua Lu; - //private ArrayList scripts; - //private prim_info current_prim; - - public ScriptManager() - { - } - - /*public void start_up (Lua lua, App ap) - { - this.Lu=lua; - //register any lua routines , like check finish script one - Lu.OpenMathLib(); - }*/ - - private void RegisterFunctions() - { - //lu.RegisterFunction( "RegisterScript",this,this.GetType().GetMethod("ScriptRegister")); - //lu.RegisterFunction( "MoveObject",this,this.GetType().GetMethod("MoveObject")); - //lu.RegisterFunction( "Say",this,this.GetType().GetMethod("Say")); - - } - - public void Call_tick(PrimInfo prim) - { - //set current prim and then call tick function in linked script - } - public void Call_touch(PrimInfo prim) - { - //set current prim and then call clicked function in linked script - - } - public void Call_on_rex(PrimInfo prim) - { - //set current prim and then call clicked function in linked script - - } - - #region Lua Functions - - public void ScriptRegister(script_object_interface script) - { - //called by scripts to register themselves - } - public void MoveObject(float x , float y, float z) - { - - } - public void Say(string message) - { - - } - #endregion - - } - - public interface script_object_interface - { - void frame_tick(); - void touch(int num); - void on_rex(int num); - } -} diff --git a/Second-server.csproj b/Second-server.csproj deleted file mode 100644 index c263a328a5..0000000000 --- a/Second-server.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - Exe - OpenSim - OpenSim - Debug - AnyCPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E} - OpenSim.Controller - - - bin\Debug\ - False - DEBUG;TRACE - True - Full - True - - - bin\Release\ - True - TRACE - False - None - False - - - - False - lib\Axiom.MathLib.dll - - - False - ..\..\..\..\..\dev\libsecondlife\bin\libsecondlife.dll - - - False - lib\log4net.dll - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Second-server.sln b/Second-server.sln deleted file mode 100644 index 44be1dbfbc..0000000000 --- a/Second-server.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# SharpDevelop 2.1.0.2017 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Second-server", "Second-server.csproj", "{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|.NET 1.1 = Debug|.NET 1.1 - Debug|Any CPU = Debug|Any CPU - Release|.NET 1.1 = Release|.NET 1.1 - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|.NET 1.1.ActiveCfg = Debug|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|.NET 1.1.ActiveCfg = Release|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.Build.0 = Release|Any CPU - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1 - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1 - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1 - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|.NET 1.1.Build.0 = Release|.NET 1.1 - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|Any CPU.Build.0 = Release|Any CPU - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1 - {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|.NET 1.1.Build.0 = Release|.NET 1.1 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Server.cs b/Server.cs deleted file mode 100644 index 5e1bb5aa4e..0000000000 --- a/Server.cs +++ /dev/null @@ -1,645 +0,0 @@ -/* - * Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.Net; -using System.Net.Sockets; -using System.Timers; - -//really hacked , messy code - -namespace OpenSim -{ - /// - /// Description of Server. - /// - public interface ServerCallback - { - //should replace with delegates - void MainCallback(Packet pack, UserAgentInfo User_info); - void NewUserCallback(UserAgentInfo User_info); - void ErrorCallback(string text); - } - public class Server - { - /// A public reference to the client that this Simulator object - /// is attached to - //public SecondLife Client; - - /// The Region class that this Simulator wraps - // public Region Region; - - /// - /// Used internally to track sim disconnections, do not modify this - /// variable - /// - public bool DisconnectCandidate = false; - - /// - /// The ID number associated with this particular connection to the - /// simulator, used to emulate TCP connections. This is used - /// internally for packets that have a CircuitCode field - /// - public uint CircuitCode - { - get { return circuitCode; } - set { circuitCode = value; } - } - - /// - /// The IP address and port of the server - /// - public IPEndPoint IPEndPoint - { - get { return ipEndPoint; } - } - - /// - /// A boolean representing whether there is a working connection to the - /// simulator or not - /// - public bool Connected - { - get { return connected; } - } - - private ServerCallback CallbackObject; - private uint Sequence = 0; - private object SequenceLock = new object(); - private byte[] RecvBuffer = new byte[4096]; - private byte[] ZeroBuffer = new byte[8192]; - private byte[] ZeroOutBuffer = new byte[4096]; - private Socket Connection = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - private AsyncCallback ReceivedData; - private bool connected = false; - private uint circuitCode; - private IPEndPoint ipEndPoint; - private EndPoint endPoint; - private IPEndPoint ipeSender; - private EndPoint epSender; - private System.Timers.Timer AckTimer; - private Server_Settings Settings=new Server_Settings(); - public ArrayList User_agents=new ArrayList(); - - /// - /// Constructor for Simulator - /// - /// - /// - /// - /// - /// - public Server(ServerCallback s_callback) - { - - this.CallbackObject=s_callback; //should be using delegate - AckTimer = new System.Timers.Timer(Settings.NETWORK_TICK_LENGTH); - AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed); - - // Initialize the callback for receiving a new packet - ReceivedData = new AsyncCallback(this.OnReceivedData); - - // Client.Log("Connecting to " + ip.ToString() + ":" + port, Helpers.LogLevel.Info); - - try - { - // Create an endpoint that we will be communicating with (need it in two - // types due to .NET weirdness) - // ipEndPoint = new IPEndPoint(ip, port); - ipEndPoint = new IPEndPoint(IPAddress.Any, Globals.Instance.IpPort); - endPoint = (EndPoint)ipEndPoint; - - // Associate this simulator's socket with the given ip/port and start listening - Connection.Bind(endPoint); - ipeSender = new IPEndPoint(IPAddress.Any, 0); - //The epSender identifies the incoming clients - epSender = (EndPoint) ipeSender; - Connection.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); - - // Start the ACK timer - AckTimer.Start(); - } - catch (Exception e) - { - - System.Console.WriteLine(e.Message); - } - } - - /// - /// Disconnect a Simulator - /// - public void Disconnect() - { - if (connected) - { - connected = false; - AckTimer.Stop(); - - // Send the CloseCircuit notice - CloseCircuitPacket close = new CloseCircuitPacket(); - - if (Connection.Connected) - { - try - { - // Connection.Send(close.ToBytes()); - } - catch (SocketException) - { - // There's a high probability of this failing if the network is - // disconnecting, so don't even bother logging the error - } - } - - try - { - // Shut the socket communication down - // Connection.Shutdown(SocketShutdown.Both); - } - catch (SocketException) - { - } - } - } - - /// - /// Sends a packet - /// - /// Packet to be sent - /// Increment sequence number? - public void SendPacket(Packet packet, bool incrementSequence, UserAgentInfo User_info) - { - byte[] buffer; - int bytes; - - if (!connected && packet.Type != PacketType.UseCircuitCode) - { - // Client.Log("Trying to send a " + packet.Type.ToString() + " packet when the socket is closed", - // Helpers.LogLevel.Info); - - return; - } - - if (packet.Header.AckList.Length > 0) - { - // Scrub any appended ACKs since all of the ACK handling is done here - packet.Header.AckList = new uint[0]; - } - packet.Header.AppendedAcks = false; - - // Keep track of when this packet was sent out - packet.TickCount = Environment.TickCount; - - if (incrementSequence) - { - // Set the sequence number - lock (SequenceLock) - { - if (Sequence > Settings.MAX_SEQUENCE) - Sequence = 1; - else - Sequence++; - packet.Header.Sequence = Sequence; - } - - if (packet.Header.Reliable) - { - lock (User_info.NeedAck) - { - if (!User_info.NeedAck.ContainsKey(packet.Header.Sequence)) - { - User_info.NeedAck.Add(packet.Header.Sequence, packet); - } - else - { - // Client.Log("Attempted to add a duplicate sequence number (" + - // packet.Header.Sequence + ") to the NeedAck dictionary for packet type " + - // packet.Type.ToString(), Helpers.LogLevel.Warning); - } - } - - // Don't append ACKs to resent packets, in case that's what was causing the - // delivery to fail - if (!packet.Header.Resent) - { - // Append any ACKs that need to be sent out to this packet - lock (User_info.PendingAcks) - { - if (User_info.PendingAcks.Count > 0 && User_info.PendingAcks.Count < Settings.MAX_APPENDED_ACKS && - packet.Type != PacketType.PacketAck && - packet.Type != PacketType.LogoutRequest) - { - packet.Header.AckList = new uint[User_info.PendingAcks.Count]; - int i = 0; - - foreach (uint ack in User_info.PendingAcks.Values) - { - packet.Header.AckList[i] = ack; - i++; - } - - User_info.PendingAcks.Clear(); - packet.Header.AppendedAcks = true; - } - } - } - } - } - - // Serialize the packet - buffer = packet.ToBytes(); - bytes = buffer.Length; - - try - { - // Zerocode if needed - if (packet.Header.Zerocoded) - { - lock (ZeroOutBuffer) - { - bytes = Helpers.ZeroEncode(buffer, bytes, ZeroOutBuffer); - Connection.SendTo(ZeroOutBuffer, bytes, SocketFlags.None,User_info.endpoint); - } - } - else - { - - Connection.SendTo(buffer, bytes, SocketFlags.None,User_info.endpoint); - } - } - catch (SocketException) - { - //Client.Log("Tried to send a " + packet.Type.ToString() + " on a closed socket", - // Helpers.LogLevel.Warning); - - Disconnect(); - } - } - - /// - /// Send a raw byte array payload as a packet - /// - /// The packet payload - /// Whether the second, third, and fourth bytes - /// should be modified to the current stream sequence number - /// - /// Returns Simulator Name as a String - /// - /// - public override string ToString() - { - return( " (" + ipEndPoint.ToString() + ")"); - } - - /// - /// Sends out pending acknowledgements - /// - private void SendAcks(UserAgentInfo User_info) - { - lock (User_info.PendingAcks) - { - if (connected && User_info.PendingAcks.Count > 0) - { - if (User_info.PendingAcks.Count > 250) - { - // FIXME: Handle the odd case where we have too many pending ACKs queued up - //Client.Log("Too many ACKs queued up!", Helpers.LogLevel.Error); - return; - } - - int i = 0; - PacketAckPacket acks = new PacketAckPacket(); - acks.Packets = new PacketAckPacket.PacketsBlock[User_info.PendingAcks.Count]; - - foreach (uint ack in User_info.PendingAcks.Values) - { - acks.Packets[i] = new PacketAckPacket.PacketsBlock(); - acks.Packets[i].ID = ack; - i++; - } - - acks.Header.Reliable = false; - SendPacket(acks, true,User_info); - - User_info.PendingAcks.Clear(); - } - } - } - /// - /// Resend unacknowledged packets - /// - private void ResendUnacked(UserAgentInfo User_info) - { - if (connected) - { - int now = Environment.TickCount; - - lock (User_info.NeedAck) - { - foreach (Packet packet in User_info.NeedAck.Values) - { - if (now - packet.TickCount > Settings.RESEND_TIMEOUT) - { - // Client.Log("Resending " + packet.Type.ToString() + " packet, " + - // (now - packet.TickCount) + "ms have passed", Helpers.LogLevel.Info); - - packet.Header.Resent = true; - SendPacket(packet, false,User_info); - } - } - } - } - } - /// - /// Callback handler for incomming data - /// - /// - private void OnReceivedData(IAsyncResult result) - { - - ipeSender = new IPEndPoint(IPAddress.Any, 0); - epSender = (EndPoint)ipeSender; - Packet packet = null; - int numBytes; - - // If we're receiving data the sim connection is open - connected = true; - - // Update the disconnect flag so this sim doesn't time out - DisconnectCandidate = false; - UserAgentInfo User_info=null; - - lock (RecvBuffer) - { - // Retrieve the incoming packet - try - { - numBytes = Connection.EndReceiveFrom(result, ref epSender); - - //find user_agent_info - - int packetEnd = numBytes - 1; - packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); - - - //should check if login/useconnection packet first - if (packet.Type == PacketType.UseCircuitCode) - { - UseCircuitCodePacket cir_pack=(UseCircuitCodePacket)packet; - UserAgentInfo new_user=new UserAgentInfo(); - new_user.circuitCode=cir_pack.CircuitCode.Code; - new_user.AgentID=cir_pack.CircuitCode.ID; - new_user.SessionID=cir_pack.CircuitCode.SessionID; - new_user.endpoint=epSender; - new_user.Inbox = new Queue(Settings.INBOX_SIZE); - - this.CallbackObject.NewUserCallback(new_user); - this.User_agents.Add(new_user); - - } - - - UserAgentInfo temp_agent=null; - IPEndPoint send_ip=(IPEndPoint)epSender; - // this.callback_object.error("incoming: address is "+send_ip.Address +"port number is: "+send_ip.Port.ToString()); - - for(int ii=0; ii Settings.MAX_PENDING_ACKS) - { - SendAcks(User_info); - } - - // Check if we already received this packet - if (User_info.Inbox.Contains(packet.Header.Sequence)) - { - //Client.Log("Received a duplicate " + packet.Type.ToString() + ", sequence=" + - // packet.Header.Sequence + ", resent=" + ((packet.Header.Resent) ? "Yes" : "No") + - // ", Inbox.Count=" + Inbox.Count + ", NeedAck.Count=" + NeedAck.Count, - // Helpers.LogLevel.Info); - - // Send an ACK for this packet immediately - //SendAck(packet.Header.Sequence); - - // TESTING: Try just queuing up ACKs for resent packets instead of immediately triggering an ACK - lock (User_info.PendingAcks) - { - uint sequence = (uint)packet.Header.Sequence; - if (!User_info.PendingAcks.ContainsKey(sequence)) { User_info.PendingAcks[sequence] = sequence; } - } - - // Avoid firing a callback twice for the same packet - // this.callback_object.error("avoiding callback"); - return; - } - else - { - lock (User_info.PendingAcks) - { - uint sequence = (uint)packet.Header.Sequence; - if (!User_info.PendingAcks.ContainsKey(sequence)) { User_info.PendingAcks[sequence] = sequence; } - } - } - } - - // Add this packet to our inbox - lock (User_info.Inbox) - { - while (User_info.Inbox.Count >= Settings.INBOX_SIZE) - { - User_info.Inbox.Dequeue(); - } - User_info.Inbox.Enqueue(packet.Header.Sequence); - } - - // Handle appended ACKs - if (packet.Header.AppendedAcks) - { - lock (User_info.NeedAck) - { - foreach (uint ack in packet.Header.AckList) - { - User_info.NeedAck.Remove(ack); - } - } - } - - // Handle PacketAck packets - if (packet.Type == PacketType.PacketAck) - { - PacketAckPacket ackPacket = (PacketAckPacket)packet; - - lock (User_info.NeedAck) - { - foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) - { - User_info.NeedAck.Remove(block.ID); - } - } - } - - this.CallbackObject.MainCallback(packet,User_info); - - } - - private void AckTimer_Elapsed(object sender, ElapsedEventArgs ea) - { - if (connected) - { - - //TODO for each user_agent_info - for(int i=0; iThe version of libsecondlife (not the SL protocol itself) - public string VERSION = "libsecondlife 0.0.9"; - /// XML-RPC login server to connect to - public string LOGIN_SERVER = "https://login.agni.lindenlab.com/cgi-bin/login.cgi"; - - /// Millisecond interval between ticks, where all ACKs are - /// sent out and the age of unACKed packets is checked - public readonly int NETWORK_TICK_LENGTH = 500; - /// The maximum value of a packet sequence number. After that - /// we assume the sequence number just rolls over? Or maybe the - /// protocol isn't able to sustain a connection past that - public readonly int MAX_SEQUENCE = 0xFFFFFF; - /// Number of milliseconds before a teleport attempt will time - /// out - public readonly int TELEPORT_TIMEOUT = 18 * 1000; - - /// Number of milliseconds before NetworkManager.Logout() will time out - public int LOGOUT_TIMEOUT = 5 * 1000; - /// Number of milliseconds for xml-rpc to timeout - public int LOGIN_TIMEOUT = 30 * 1000; - /// The maximum size of the sequence number inbox, used to - /// check for resent and/or duplicate packets - public int INBOX_SIZE = 100; - /// Milliseconds before a packet is assumed lost and resent - public int RESEND_TIMEOUT = 4000; - /// Milliseconds before the connection to a simulator is - /// assumed lost - public int SIMULATOR_TIMEOUT = 15000; - /// Maximum number of queued ACKs to be sent before SendAcks() - /// is forced - public int MAX_PENDING_ACKS = 10; - /// Maximum number of ACKs to append to a packet - public int MAX_APPENDED_ACKS = 10; - /// Cost of uploading an asset - public int UPLOAD_COST { get { return priceUpload; } } - - - private int priceUpload = 0; - - public Server_Settings() - { - - } - } - - public class UserAgentInfo - { - public EndPoint endpoint; - public LLUUID AgentID; - public LLUUID SessionID; - public uint circuitCode; - public string name; - public uint localID; - public string first_name; - public string last_name; - - public Dictionary NeedAck = new Dictionary(); - // Sequence numbers of packets we've received from the simulator - public Queue Inbox; - // ACKs that are queued up to be sent to the simulator - public Dictionary PendingAcks = new Dictionary(); - - public UserAgentInfo() - { - - } - } - -} diff --git a/StorageManager.cs b/StorageManager.cs deleted file mode 100644 index 596e4e677d..0000000000 --- a/StorageManager.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; - -namespace OpenSim -{ - /// - /// Description of StorageManager. - /// - public class StorageManager - { - public StorageManager() - { - } - } - - public class AssetStorage - { - public LLUUID Full_ID; - public byte Type; - } -} diff --git a/Texture_manager.cs b/Texture_manager.cs deleted file mode 100644 index daf14528d7..0000000000 --- a/Texture_manager.cs +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright (c) OpenSim project, http://sim.opensecondlife.org/ - -* Copyright (c) , -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -using System; -using System.Collections.Generic; -using libsecondlife; -using System.Collections; -using libsecondlife.Packets; -using libsecondlife.AssetSystem; -using System.IO; - - -namespace OpenSim -{ - /// - /// Description of Texture_manager. - /// - public class TextureManager - { - public Dictionary textures; - public ArrayList requests=new ArrayList(); //should change to a generic - public ArrayList uploads=new ArrayList(); - private Server server; - - public TextureManager(Server serve) - { - server=serve; - textures=new Dictionary (); - this.initialise(); - } - - public void AddRequest(User_Agent_info user, LLUUID image_id) - { - - if(!this.textures.ContainsKey(image_id)) - { - //not found image so send back image not in data base message - ImageNotInDatabasePacket im_not=new ImageNotInDatabasePacket(); - im_not.ImageID.ID=image_id; - server.SendPacket(im_not,true,user); - return; - } - TextureImage imag=this.textures[image_id]; - TextureRequest req=new TextureRequest(); - req.RequestUser=user; - req.RequestImage=image_id; - req.image_info=imag; - - if(imag.data.LongLength>1000) //should be bigger or smaller? - { - //over 1000 bytes so split up file - req.num_packets=(int)imag.data.LongLength/1000; - req.num_packets++; - } - else - { - req.num_packets=1; - } - - this.requests.Add(req); - - } - - public void AddTexture(LLUUID image_id, string name, byte[] data) - { - - } - public void DoWork(ulong time) - { - if(this.requests.Count==0) - { - //no requests waiting - return; - } - int num; - //should be running in its own thread but for now is called by timer - if(this.requests.Count<5) - { - //lower than 5 so do all of them - num=this.requests.Count; - } - else - { - num=5; - } - TextureRequest req; - for(int i=0; i - - - - - - \ No newline at end of file diff --git a/bin/Release/Grid.ini b/bin/Release/Grid.ini deleted file mode 100644 index ef922b1534..0000000000 --- a/bin/Release/Grid.ini +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/bin/Release/new-login.dat b/bin/Release/new-login.dat deleted file mode 100644 index 48335335ab..0000000000 --- a/bin/Release/new-login.dat +++ /dev/null @@ -1,2 +0,0 @@ -messageWelcome to OpenSimsession_id99998888-8520-4f52-8ec1-0b1d5cd6aeadinventory-skel-libsim_port1000agent_accessMevent_notificationsstart_locationlastglobal-texturessun_texture_idcce0f112-878f-4586-a2e2-a8f104bba271cloud_texture_idfc4b9f0b-d008-45c6-96a4-01dd947ac621moon_texture_idd07f6eed-b96a-47cd-b51d-400ad4a1c428seconds_since_epoch1169908672first_name"Test"circuit_code50633318event_categorieslogin-flagsstipend_since_loginNever_logged_inYgenderedYdaylight_savingsNseed_capabilityhome{'region_handle':[r258560, r259840], 'position':[r41.6589, r100.8374, r22.5072], 'look_at':[r-0.57343, r-0.819255,r0]}secure_session_id71810f75-7437-49fb-8963-02b8fd1b95bflast_nameUserui-configallow_first_lifeYclassified_categoriescategory_nameShoppingcategory_id1category_nameLand Rentalcategory_id2category_nameProperty Rentalcategory_id3category_nameSpecial Attractioncategory_id4category_nameNew Productscategory_id5category_nameEmploymentcategory_id6category_nameWantedcategory_id7category_nameServicecategory_id8category_namePersonalcategory_id9region_x255232inventory-skeletonnameMy Inventoryparent_id00000000-0000-0000-0000-000000000000version4type_default8folder_idf798e114-c10f-409b-a90d-a11577ff1de8nameTexturesparent_idf798e114-c10f-409b-a90d-a11577ff1de8version1type_default0folder_idfc8b4059-30bb-43a8-a042-46f5b431ad82sim_ip127.0.0.1region_y254976gesturesinventory-lib-ownerinventory-rootfolder_idf798e114-c10f-409b-a90d-a11577ff1de8logintruelook_at[r0.99949799999999999756,r0.03166859999999999814,r0]agent_idaaaabbbb-8932-0271-8664-58f53e442797inventory-lib-rootinitial-outfitfolder_nameNightclub Femalegenderfemale -end-mfile \ No newline at end of file diff --git a/bin/Release/textures/map1.jp2 b/bin/Release/textures/map1.jp2 deleted file mode 100644 index cd2fd94422cdb60b744e5055749e622aca936060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmezG|38pHp8*6Mpcupk0S71su^AYc*%=uj=zkCc4^V)Sk&T6gf$@I~1FItg!~Y2k zTp(qPAAmyW3d9^7JUjx>(ErKjmnd*d{=eq%10J^jYYy}<{$F$Okoz$q{vHJe`TuKJ z>i@4{wg-xRZ0TR3B5&Zp2^3(r{=bH!`u~~*1qn<*oiF+Mm)OXA6mW~qW7Gb>h9~&U zF`y3K*JXjsP+1e8EDwv=10bI}P3EJfod9#-%yoLm?Q70pv>**yzQNDC>QJX zi$NSS&Hk^ED(&Aj$!nL!!EzGuFjUQQ8<7@qdlvX1>YG<FX51%gDVp^$4Ef}IV)wQc7w^8hmB4DOXIGN&{z>oJs%bi^_gjX=8?H-smddz(nx$|k&hYsh+2V9z)6hC>CH=Iok3rQ}gV H!~dHAp6clh diff --git a/bin/Release/textures/map_base.jp2 b/bin/Release/textures/map_base.jp2 deleted file mode 100644 index 5ad1fd0f435fd9ef8919455b2b8a728feffcaf09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmezG|38pHp8*6Mpcupk0S71su^AYc*%=uj=zkCc4^V)Sk&T6gf$@I~1FItg!~Y2k kTwrznKp}JmVh#=-9sy|R|Kx`AOB9&S|6kL93I5*%0HvZL`~Uy| diff --git a/lib/Axiom.MathLib.dll b/lib/Axiom.MathLib.dll deleted file mode 100644 index 21ce3a8b188cace619bd0ebf71a6992bb23408b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 zcmeFa3w%|@)jmA4_qioG0ZxJmB5G97V?cxi0hLMuL4_h9Ho)b}H}-Y()OB|B_T~rb*5&H@Huu(b_13j4T~XJQU!R*=Sy?{OiC(tA zn8nsNcisM9^McxTnNbH+*n}~=kW#0q_rD&*Eh0^tK1TH>2lbbqCgdZXKWG<{0R#tO zm@Pb~LGB8PS+g}1A_+?BtVu`UTaMNllZr5>fRB&hsROyK1HcbG2ZB6ltJ51ue(H=l zb!uOKUnh|2=Gyj(<_EM12ASHI>&}BwbcN2^W`vO+@P#&xB)=1V#{%zI;2jIRV}W-p z@QwxEvA{bPc*g?oSl}HCykmj?A6Vc9o~!Z0v#E#Qi8mV4@*ZP~PmbhxYd`+9m^sz4 zdfOo-b|BCL1(JQ)n1r_-bxF=#<|xse{VvTwlOdknz1kt1$YWl1Z)3_mZ;;ZwL6*$M zA*7ylt^Pk!m+xx89l|u<)T3hj&v=7WXNs+_GOzDNEvu{xJq>FsYpP?je+`v z#4ab_nIzdB=$tM)Y)q9mxCD7sR)U$Ms;o;HVzM$URR#u*fzcrnWmu*R3>*WaLnM(Z zj8rjWRF&CH6=skk9Yd)q%pgTNhOmm7%1o@bwHocyc3##sxBQJa-tZDh?HSt5Gl!t7 z_@g{EVhZiW^JoxFuGM657136#P@Kmu7e&PY#d&lJ(NWs2dE=Z+DMzD5WESOxEiNus zO6J~skQwAjxnVMk@PNK2X{*xmh$rqr+78>I{%2f`329LQOKbcTn?j=9NNI;FseDyN;;Y^6PpffkruY! z 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