From 646bbbc84b8010e0dacbeed5342cdb045f46cc49 Mon Sep 17 00:00:00 2001
From: MW
Date: Wed, 27 Jun 2007 15:28:52 +0000
Subject: Some work on restructuring the namespaces / project names. Note this
doesn't compile yet as not all the code has been changed to use the new
namespaces. Am committing it now for feedback on the namespaces.
---
OpenSim/Region/Application/Application.cs | 121 +++
OpenSim/Region/Application/OpenSim.csproj | 181 ++++
OpenSim/Region/Application/OpenSim.csproj.user | 13 +
OpenSim/Region/Application/OpenSimMain.cs | 476 ++++++++++
OpenSim/Region/Caches/AssetCache.cs | 670 ++++++++++++++
OpenSim/Region/Caches/OpenSim.Region.Caches.csproj | 97 ++
.../Caches/OpenSim.Region.Caches.csproj.user | 12 +
OpenSim/Region/Caches/Properties/AssemblyInfo.cs | 35 +
OpenSim/Region/Caps/Caps.cs | 258 ++++++
OpenSim/Region/Caps/LLSDHelpers.cs | 246 ++++++
.../Region/ClientStack/Assets/InventoryCache.cs | 337 +++++++
.../ClientStack/ClientStackNetworkHandler.cs | 46 +
OpenSim/Region/ClientStack/ClientView.API.cs | 975 +++++++++++++++++++++
.../ClientStack/ClientView.AgentAssetUpload.cs | 358 ++++++++
.../ClientStack/ClientView.PacketHandlers.cs | 198 +++++
.../ClientStack/ClientView.ProcessPackets.cs | 550 ++++++++++++
OpenSim/Region/ClientStack/ClientView.cs | 273 ++++++
OpenSim/Region/ClientStack/ClientViewBase.cs | 327 +++++++
.../ClientStack/OpenSim.Region.ClientStack.csproj | 173 ++++
.../OpenSim.Region.ClientStack.csproj.user | 12 +
OpenSim/Region/ClientStack/PacketServer.cs | 183 ++++
.../Region/ClientStack/RegionApplicationBase.cs | 129 +++
OpenSim/Region/ClientStack/UDPServer.cs | 208 +++++
OpenSim/Region/ClientStack/VersionInfo.cs | 38 +
OpenSim/Region/Examples/SimpleApp/MyWorld.cs | 113 +++
OpenSim/Region/Examples/SimpleApp/Program.cs | 128 +++
.../Examples/SimpleApp/Properties/AssemblyInfo.cs | 33 +
OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj | 154 ++++
.../Examples/SimpleApp/SimpleApp.csproj.user | 12 +
.../Region/GridInterfaces/Local/AssemblyInfo.cs | 58 ++
.../GridInterfaces/Local/LocalAssetServer.cs | 312 +++++++
.../OpenSim.Region.GridInterfaces.Local.csproj | 107 +++
...OpenSim.Region.GridInterfaces.Local.csproj.user | 12 +
.../Region/GridInterfaces/Remote/AssemblyInfo.cs | 58 ++
.../OpenSim.Region.GridInterfaces.Remote.csproj | 107 +++
...penSim.Region.GridInterfaces.Remote.csproj.user | 12 +
.../GridInterfaces/Remote/RemoteAssetServer.cs | 135 +++
.../LocalCommunications/CommunicationsLocal.cs | 61 ++
.../LocalCommunications/LocalBackEndServices.cs | 209 +++++
.../LocalCommunications/LocalUserServices.cs | 118 +++
.../OpenSim.Region.LocalCommunications.csproj | 121 +++
.../OpenSim.Region.LocalCommunications.csproj.user | 12 +
.../LocalCommunications/Properties/AssemblyInfo.cs | 35 +
.../Physics/BasicPhysicsPlugin/AssemblyInfo.cs | 58 ++
.../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 294 +++++++
...penSim.Region.Physics.BasicPhysicsPlugin.csproj | 93 ++
...m.Region.Physics.BasicPhysicsPlugin.csproj.user | 12 +
OpenSim/Region/Physics/Manager/AssemblyInfo.cs | 58 ++
.../Manager/OpenSim.Region.Physics.Manager.csproj | 112 +++
.../OpenSim.Region.Physics.Manager.csproj.user | 12 +
OpenSim/Region/Physics/Manager/PhysicsActor.cs | 161 ++++
OpenSim/Region/Physics/Manager/PhysicsManager.cs | 117 +++
OpenSim/Region/Physics/Manager/PhysicsScene.cs | 113 +++
OpenSim/Region/Physics/Manager/PhysicsVector.cs | 54 ++
OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs | 58 ++
OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 456 ++++++++++
.../OpenSim.Region.Physics.OdePlugin.csproj | 97 ++
.../OpenSim.Region.Physics.OdePlugin.csproj.user | 12 +
OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs | 58 ++
.../OpenSim.Region.Physics.PhysXPlugin.csproj | 97 ++
.../OpenSim.Region.Physics.PhysXPlugin.csproj.user | 12 +
OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | 424 +++++++++
.../Region/Scripting/Properties/AssemblyInfo.cs | 35 +
OpenSim/Region/Scripting/Script.cs | 32 +
OpenSim/Region/Scripting/ScriptAccess.cs | 31 +
OpenSim/Region/Simulation/Caps.cs | 258 ++++++
OpenSim/Region/Simulation/EstateManager.cs | 301 +++++++
.../Simulation/OpenSim.Region.Simulation.csproj | 211 +++++
.../OpenSim.Region.Simulation.csproj.user | 12 +
OpenSim/Region/Simulation/ParcelManager.cs | 892 +++++++++++++++++++
OpenSim/Region/Simulation/RegionManager.cs | 30 +
OpenSim/Region/Simulation/Scenes/Entity.cs | 194 ++++
.../Region/Simulation/Scenes/IScenePresenceBody.cs | 19 +
OpenSim/Region/Simulation/Scenes/Primitive.cs | 582 ++++++++++++
.../Simulation/Scenes/Scene.PacketHandlers.cs | 305 +++++++
.../Region/Simulation/Scenes/Scene.Scripting.cs | 184 ++++
OpenSim/Region/Simulation/Scenes/Scene.cs | 795 +++++++++++++++++
OpenSim/Region/Simulation/Scenes/SceneBase.cs | 201 +++++
OpenSim/Region/Simulation/Scenes/SceneEvents.cs | 52 ++
OpenSim/Region/Simulation/Scenes/SceneObject.cs | 128 +++
.../Simulation/Scenes/ScenePresence.Animations.cs | 76 ++
.../Region/Simulation/Scenes/ScenePresence.Body.cs | 90 ++
OpenSim/Region/Simulation/Scenes/ScenePresence.cs | 525 +++++++++++
.../Simulation/Scenes/scripting/IScriptContext.cs | 40 +
.../Simulation/Scenes/scripting/IScriptEntity.cs | 46 +
.../Simulation/Scenes/scripting/IScriptHandler.cs | 126 +++
.../Region/Simulation/Scenes/scripting/Script.cs | 53 ++
.../Simulation/Scenes/scripting/ScriptFactory.cs | 35 +
.../Scenes/scripting/Scripts/FollowRandomAvatar.cs | 64 ++
.../LocalStorageBerkeleyDB/BDBLocalStorage.cs | 117 +++
...im.Region.Storage.LocalStorageBerkeleyDB.csproj | 112 +++
...gion.Storage.LocalStorageBerkeleyDB.csproj.user | 12 +
...penSim.Storage.LocalStorageBerkeleyDB.dll.build | 46 +
.../Storage/LocalStorageDb4o/AssemblyInfo.cs | 58 ++
.../Storage/LocalStorageDb4o/Db4LocalStorage.cs | 271 ++++++
.../Region/Storage/LocalStorageDb4o/MapStorage.cs | 43 +
.../OpenSim.Region.Storage.LocalStorageDb4o.csproj | 116 +++
...Sim.Region.Storage.LocalStorageDb4o.csproj.user | 12 +
.../Storage/LocalStorageDb4o/UUIDParcelQuery.cs | 52 ++
.../Storage/LocalStorageDb4o/UUIDPrimQuery.cs | 52 ++
...penSim.Region.Storage.LocalStorageSQLite.csproj | 111 +++
...m.Region.Storage.LocalStorageSQLite.csproj.user | 12 +
.../OpenSim.Storage.LocalStorageSQLite.dll.build | 46 +
.../LocalStorageSQLite/Properties/AssemblyInfo.cs | 62 ++
.../LocalStorageSQLite/SQLiteLocalStorage.cs | 198 +++++
.../OpenSim.Region.Terrain.BasicTerrain.csproj | 110 +++
...OpenSim.Region.Terrain.BasicTerrain.csproj.user | 12 +
.../Properties/AssemblyInfo.cs | 62 ++
.../Region/Terrain.BasicTerrain/TerrainEngine.cs | 786 +++++++++++++++++
.../Region/Terrain.BasicTerrain/TerrainFilter.cs | 103 +++
110 files changed, 17721 insertions(+)
create mode 100644 OpenSim/Region/Application/Application.cs
create mode 100644 OpenSim/Region/Application/OpenSim.csproj
create mode 100644 OpenSim/Region/Application/OpenSim.csproj.user
create mode 100644 OpenSim/Region/Application/OpenSimMain.cs
create mode 100644 OpenSim/Region/Caches/AssetCache.cs
create mode 100644 OpenSim/Region/Caches/OpenSim.Region.Caches.csproj
create mode 100644 OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user
create mode 100644 OpenSim/Region/Caches/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Caps/Caps.cs
create mode 100644 OpenSim/Region/Caps/LLSDHelpers.cs
create mode 100644 OpenSim/Region/ClientStack/Assets/InventoryCache.cs
create mode 100644 OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs
create mode 100644 OpenSim/Region/ClientStack/ClientView.API.cs
create mode 100644 OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs
create mode 100644 OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs
create mode 100644 OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
create mode 100644 OpenSim/Region/ClientStack/ClientView.cs
create mode 100644 OpenSim/Region/ClientStack/ClientViewBase.cs
create mode 100644 OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj
create mode 100644 OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user
create mode 100644 OpenSim/Region/ClientStack/PacketServer.cs
create mode 100644 OpenSim/Region/ClientStack/RegionApplicationBase.cs
create mode 100644 OpenSim/Region/ClientStack/UDPServer.cs
create mode 100644 OpenSim/Region/ClientStack/VersionInfo.cs
create mode 100644 OpenSim/Region/Examples/SimpleApp/MyWorld.cs
create mode 100644 OpenSim/Region/Examples/SimpleApp/Program.cs
create mode 100644 OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj
create mode 100644 OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user
create mode 100644 OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs
create mode 100644 OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs
create mode 100644 OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj
create mode 100644 OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user
create mode 100644 OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs
create mode 100644 OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj
create mode 100644 OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user
create mode 100644 OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs
create mode 100644 OpenSim/Region/LocalCommunications/CommunicationsLocal.cs
create mode 100644 OpenSim/Region/LocalCommunications/LocalBackEndServices.cs
create mode 100644 OpenSim/Region/LocalCommunications/LocalUserServices.cs
create mode 100644 OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj
create mode 100644 OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj.user
create mode 100644 OpenSim/Region/LocalCommunications/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj
create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user
create mode 100644 OpenSim/Region/Physics/Manager/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj
create mode 100644 OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user
create mode 100644 OpenSim/Region/Physics/Manager/PhysicsActor.cs
create mode 100644 OpenSim/Region/Physics/Manager/PhysicsManager.cs
create mode 100644 OpenSim/Region/Physics/Manager/PhysicsScene.cs
create mode 100644 OpenSim/Region/Physics/Manager/PhysicsVector.cs
create mode 100644 OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
create mode 100644 OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj
create mode 100644 OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user
create mode 100644 OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj
create mode 100644 OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user
create mode 100644 OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
create mode 100644 OpenSim/Region/Scripting/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Scripting/Script.cs
create mode 100644 OpenSim/Region/Scripting/ScriptAccess.cs
create mode 100644 OpenSim/Region/Simulation/Caps.cs
create mode 100644 OpenSim/Region/Simulation/EstateManager.cs
create mode 100644 OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj
create mode 100644 OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user
create mode 100644 OpenSim/Region/Simulation/ParcelManager.cs
create mode 100644 OpenSim/Region/Simulation/RegionManager.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/Entity.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/Primitive.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/Scene.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/SceneBase.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/SceneEvents.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/SceneObject.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/ScenePresence.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/Script.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs
create mode 100644 OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj
create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user
create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Storage.LocalStorageBerkeleyDB.dll.build
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj
create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user
create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build
create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs
create mode 100644 OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj
create mode 100644 OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user
create mode 100644 OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs
create mode 100644 OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
create mode 100644 OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
new file mode 100644
index 0000000..40701b0
--- /dev/null
+++ b/OpenSim/Region/Application/Application.cs
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using OpenSim.Framework.Console;
+
+namespace OpenSim
+{
+ public class Application
+ {
+ //could move our main function into OpenSimMain and kill this class
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
+ Console.WriteLine("Starting...\n");
+
+ bool sandBoxMode = false;
+ bool startLoginServer = false;
+ string physicsEngine = "basicphysics";
+ bool allowFlying = false;
+ bool userAccounts = false;
+ bool gridLocalAsset = false;
+ bool useConfigFile = false;
+ bool silent = false;
+ string configFile = "simconfig.xml";
+
+ for (int i = 0; i < args.Length; i++)
+ {
+ if (args[i] == "-sandbox")
+ {
+ sandBoxMode = true;
+ startLoginServer = true;
+ }
+ /*
+ if (args[i] == "-loginserver")
+ {
+ startLoginServer = true;
+ }*/
+ if (args[i] == "-accounts")
+ {
+ userAccounts = true;
+ }
+ if (args[i] == "-realphysx")
+ {
+ physicsEngine = "RealPhysX";
+ allowFlying = true;
+ }
+ if (args[i] == "-ode")
+ {
+ physicsEngine = "OpenDynamicsEngine";
+ allowFlying = true;
+ }
+ if (args[i] == "-localasset")
+ {
+ gridLocalAsset = true;
+ }
+ if (args[i] == "-configfile")
+ {
+ useConfigFile = true;
+ }
+ if (args[i] == "-noverbose")
+ {
+ silent = true;
+ }
+ if (args[i] == "-config")
+ {
+ try
+ {
+ i++;
+ configFile = args[i];
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("-config: Please specify a config file. (" + e.ToString() + ")");
+ }
+ }
+ }
+
+ OpenSimMain sim = new OpenSimMain(sandBoxMode, startLoginServer, physicsEngine, useConfigFile, silent, configFile);
+ // OpenSimRoot.Instance.Application = sim;
+ sim.m_sandbox = sandBoxMode;
+ sim.user_accounts = userAccounts;
+ sim.gridLocalAsset = gridLocalAsset;
+ OpenSim.Region.Scenes.ScenePresence.PhysicsEngineFlying = allowFlying;
+
+ sim.StartUp();
+
+ while (true)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.MainLogPrompt();
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/Application/OpenSim.csproj b/OpenSim/Region/Application/OpenSim.csproj
new file mode 100644
index 0000000..214f2cf
--- /dev/null
+++ b/OpenSim/Region/Application/OpenSim.csproj
@@ -0,0 +1,181 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {438A9556-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+
+ OpenSim
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ ..\..\..\bin\Db4objects.Db4o.dll
+ False
+
+
+ ..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ ..\..\..\bin\XMLRPC.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Communications
+ {CB52B7E7-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Communications.OGS1
+ {6109024D-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.GenericConfig.Xml
+ {C74E4A30-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Servers
+ {2CC71860-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.UserManagement
+ {586E2916-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Caches
+ {61FCCDB3-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.ClientStack
+ {DC3698B2-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.LocalCommunications
+ {EB3A1BA8-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Simulation
+ {C0DAB338-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Terrain.BasicTerrain
+ {C9E0F891-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Application/OpenSim.csproj.user b/OpenSim/Region/Application/OpenSim.csproj.user
new file mode 100644
index 0000000..2ff1c4c
--- /dev/null
+++ b/OpenSim/Region/Application/OpenSim.csproj.user
@@ -0,0 +1,13 @@
+
+
+ Debug
+ AnyCPU
+ -loginserver -sandbox -accounts
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
new file mode 100644
index 0000000..7da2263
--- /dev/null
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -0,0 +1,476 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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.Text;
+using System.IO;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using System.Timers;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Region;
+using OpenSim.Region.Scenes;
+using OpenSim.Terrain;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework;
+using OpenSim.Assets;
+using OpenSim.Caches;
+using OpenSim.Framework.Console;
+using OpenSim.Physics.Manager;
+using Nwc.XmlRpc;
+using OpenSim.Servers;
+using OpenSim.GenericConfig;
+using OpenGrid.Framework.Communications;
+using OpenSim.LocalCommunications;
+using OpenGrid.Framework.Communications.OGS1;
+
+namespace OpenSim
+{
+
+ public class OpenSimMain : RegionApplicationBase, conscmd_callback
+ {
+ // private CheckSumServer checkServer;
+ protected CommunicationsManager commsManager;
+
+ private bool m_silent;
+ private string m_logFilename = "region-console-" + Guid.NewGuid().ToString() + ".log";
+
+ public OpenSimMain(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile)
+ {
+ this.configFileSetup = useConfigFile;
+ m_sandbox = sandBoxMode;
+ m_loginserver = startLoginServer;
+ m_physicsEngine = physicsEngine;
+ m_config = configFile;
+ m_silent = silent;
+ }
+
+ ///
+ /// Performs initialisation of the world, such as loading configuration from disk.
+ ///
+ public override void StartUp()
+ {
+ this.serversData = new NetworkServersInfo();
+
+ this.localConfig = new XmlConfig(m_config);
+ this.localConfig.LoadData();
+
+ if (this.configFileSetup)
+ {
+ this.SetupFromConfigFile(this.localConfig);
+ }
+
+ m_log = new LogBase(m_logFilename, "Region", this, m_silent);
+ OpenSim.Framework.Console.MainLog.Instance = m_log;
+
+ m_log.Verbose( "Main.cs:Startup() - Loading configuration");
+ this.serversData.InitConfig(this.m_sandbox, this.localConfig);
+ this.localConfig.Close();//for now we can close it as no other classes read from it , but this should change
+
+ ScenePresence.LoadTextureFile("avatar-texture.dat");
+
+ ClientView.TerrainManager = new TerrainManager(new SecondLife());
+
+ CommunicationsLocal sandboxCommunications = null;
+ if (m_sandbox)
+ {
+ this.SetupLocalGridServers();
+ // this.checkServer = new CheckSumServer(12036);
+ // this.checkServer.ServerListener();
+ sandboxCommunications = new CommunicationsLocal(this.serversData);
+ this.commsManager = sandboxCommunications;
+ }
+ else
+ {
+ this.SetupRemoteGridServers();
+ this.commsManager = new GridCommsManager(this.serversData);
+ }
+
+ startuptime = DateTime.Now;
+
+ this.physManager = new OpenSim.Physics.Manager.PhysicsManager();
+ this.physManager.LoadPlugins();
+
+ this.SetupHttpListener();
+
+ this.SetupWorld();
+
+ m_log.Verbose( "Main.cs:Startup() - Initialising HTTP server");
+
+
+
+ if (m_sandbox)
+ {
+ httpServer.AddXmlRPCHandler("login_to_simulator", sandboxCommunications.UserServices.XmlRpcLoginMethod);
+ }
+
+ //Start http server
+ m_log.Verbose( "Main.cs:Startup() - Starting HTTP server");
+ httpServer.Start();
+
+ // Start UDP servers
+ for (int i = 0; i < m_udpServer.Count; i++)
+ {
+ this.m_udpServer[i].ServerListener();
+ }
+
+ }
+
+ # region Setup methods
+ protected override void SetupLocalGridServers()
+ {
+ try
+ {
+ AssetCache = new AssetCache("OpenSim.GridInterfaces.Local.dll", this.serversData.AssetURL, this.serversData.AssetSendKey);
+ InventoryCache = new InventoryCache();
+ }
+ catch (Exception e)
+ {
+ m_log.Error( e.Message + "\nSorry, could not setup local cache");
+ Environment.Exit(1);
+ }
+
+ }
+
+ protected override void SetupRemoteGridServers()
+ {
+ try
+ {
+ AssetCache = new AssetCache("OpenSim.GridInterfaces.Remote.dll", this.serversData.AssetURL, this.serversData.AssetSendKey);
+ InventoryCache = new InventoryCache();
+ }
+ catch (Exception e)
+ {
+ m_log.Error( e.Message + "\nSorry, could not setup remote cache");
+ Environment.Exit(1);
+ }
+ }
+
+ protected override void SetupWorld()
+ {
+ IGenericConfig regionConfig;
+ Scene LocalWorld;
+ UDPServer udpServer;
+ RegionInfo regionDat = new RegionInfo();
+ AuthenticateSessionsBase authenBase;
+
+ string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Regions");
+ string[] configFiles = Directory.GetFiles(path, "*.xml");
+
+ if (configFiles.Length == 0)
+ {
+ string path2 = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Regions");
+ string path3 = Path.Combine(path2, "default.xml");
+ Console.WriteLine("Creating default region config file");
+ //TODO create default region
+ IGenericConfig defaultConfig = new XmlConfig(path3);
+ defaultConfig.LoadData();
+ defaultConfig.Commit();
+ defaultConfig.Close();
+ defaultConfig = null;
+ configFiles = Directory.GetFiles(path, "*.xml");
+ }
+
+ for (int i = 0; i < configFiles.Length; i++)
+ {
+ regionDat = new RegionInfo();
+ if (m_sandbox)
+ {
+ AuthenticateSessionsBase authen = new AuthenticateSessionsBase(); // new AuthenticateSessionsLocal();
+ this.AuthenticateSessionsHandler.Add(authen);
+ authenBase = authen;
+ }
+ else
+ {
+ AuthenticateSessionsBase authen = new AuthenticateSessionsBase(); //new AuthenticateSessionsRemote();
+ this.AuthenticateSessionsHandler.Add(authen);
+ authenBase = authen;
+ }
+ Console.WriteLine("Loading region config file");
+ regionConfig = new XmlConfig(configFiles[i]);
+ regionConfig.LoadData();
+ regionDat.InitConfig(this.m_sandbox, regionConfig);
+ regionConfig.Close();
+
+ udpServer = new UDPServer(regionDat.CommsIPListenPort, this.AssetCache, this.InventoryCache, this.m_log, authenBase);
+
+ m_udpServer.Add(udpServer);
+ this.regionData.Add(regionDat);
+
+ /*
+ m_log.WriteLine(OpenSim.Framework.Console.LogPriority.NORMAL, "Main.cs:Startup() - We are " + regionData.RegionName + " at " + regionData.RegionLocX.ToString() + "," + regionData.RegionLocY.ToString());
+ m_log.Verbose( "Initialising world");
+ m_log.componentname = "Region " + regionData.RegionName;
+ */
+
+ LocalWorld = new Scene(udpServer.PacketServer.ClientAPIs, regionDat, authenBase, commsManager, this.AssetCache, httpServer);
+ this.m_localWorld.Add(LocalWorld);
+ //LocalWorld.InventoryCache = InventoryCache;
+ //LocalWorld.AssetCache = AssetCache;
+
+ udpServer.LocalWorld = LocalWorld;
+
+ LocalWorld.LoadStorageDLL("OpenSim.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded.
+ LocalWorld.LoadWorldMap();
+
+ m_log.Verbose( "Main.cs:Startup() - Starting up messaging system");
+ LocalWorld.PhysScene = this.physManager.GetPhysicsScene(this.m_physicsEngine);
+ LocalWorld.PhysScene.SetTerrain(LocalWorld.Terrain.getHeights1D());
+ LocalWorld.LoadPrimsFromStorage();
+ LocalWorld.localStorage.LoadParcels((ILocalStorageParcelReceiver)LocalWorld.parcelManager);
+
+
+ LocalWorld.StartTimer();
+ }
+ }
+
+ protected override void SetupHttpListener()
+ {
+ httpServer = new BaseHttpServer(this.serversData.HttpListenerPort); //regionData[0].IPListenPort);
+
+ if (!this.m_sandbox)
+ {
+
+ // we are in Grid mode so set a XmlRpc handler to handle "expect_user" calls from the user server
+
+
+ httpServer.AddRestHandler("GET", "/simstatus/",
+ delegate(string request, string path, string param)
+ {
+ return "OK";
+ });
+ }
+ }
+
+ protected override void ConnectToRemoteGridServer()
+ {
+
+ }
+
+ #endregion
+
+ private void SetupFromConfigFile(IGenericConfig configData)
+ {
+ // Log filename
+ string attri = "";
+ attri = configData.GetAttribute("LogFilename");
+ if (String.IsNullOrEmpty(attri))
+ {
+ }
+ else
+ {
+ m_logFilename = attri;
+ }
+
+ // SandBoxMode
+ attri = "";
+ attri = configData.GetAttribute("SandBox");
+ if ((attri == "") || ((attri != "false") && (attri != "true")))
+ {
+ this.m_sandbox = false;
+ configData.SetAttribute("SandBox", "false");
+ }
+ else
+ {
+ this.m_sandbox = Convert.ToBoolean(attri);
+ }
+
+ // LoginServer
+ attri = "";
+ attri = configData.GetAttribute("LoginServer");
+ if ((attri == "") || ((attri != "false") && (attri != "true")))
+ {
+ this.m_loginserver = false;
+ configData.SetAttribute("LoginServer", "false");
+ }
+ else
+ {
+ this.m_loginserver = Convert.ToBoolean(attri);
+ }
+
+ // Sandbox User accounts
+ attri = "";
+ attri = configData.GetAttribute("UserAccount");
+ if ((attri == "") || ((attri != "false") && (attri != "true")))
+ {
+ this.user_accounts = false;
+ configData.SetAttribute("UserAccounts", "false");
+ }
+ else if (attri == "true")
+ {
+ this.user_accounts = Convert.ToBoolean(attri);
+ }
+
+ // Grid mode hack to use local asset server
+ attri = "";
+ attri = configData.GetAttribute("LocalAssets");
+ if ((attri == "") || ((attri != "false") && (attri != "true")))
+ {
+ this.gridLocalAsset = false;
+ configData.SetAttribute("LocalAssets", "false");
+ }
+ else if (attri == "true")
+ {
+ this.gridLocalAsset = Convert.ToBoolean(attri);
+ }
+
+
+ attri = "";
+ attri = configData.GetAttribute("PhysicsEngine");
+ switch (attri)
+ {
+ default:
+ m_log.Warn( "Main.cs: SetupFromConfig() - Invalid value for PhysicsEngine attribute, terminating");
+ Environment.Exit(1);
+ break;
+
+ case "":
+ this.m_physicsEngine = "basicphysics";
+ configData.SetAttribute("PhysicsEngine", "basicphysics");
+ OpenSim.Region.Scenes.ScenePresence.PhysicsEngineFlying = false;
+ break;
+
+ case "basicphysics":
+ this.m_physicsEngine = "basicphysics";
+ configData.SetAttribute("PhysicsEngine", "basicphysics");
+ OpenSim.Region.Scenes.ScenePresence.PhysicsEngineFlying = false;
+ break;
+
+ case "RealPhysX":
+ this.m_physicsEngine = "RealPhysX";
+ OpenSim.Region.Scenes.ScenePresence.PhysicsEngineFlying = true;
+ break;
+
+ case "OpenDynamicsEngine":
+ this.m_physicsEngine = "OpenDynamicsEngine";
+ OpenSim.Region.Scenes.ScenePresence.PhysicsEngineFlying = true;
+ break;
+ }
+
+ configData.Commit();
+
+ }
+
+ ///
+ /// Performs any last-minute sanity checking and shuts down the region server
+ ///
+ public virtual void Shutdown()
+ {
+ m_log.Verbose( "Main.cs:Shutdown() - Closing all threads");
+ m_log.Verbose( "Main.cs:Shutdown() - Killing listener thread");
+ m_log.Verbose( "Main.cs:Shutdown() - Killing clients");
+ // IMPLEMENT THIS
+ m_log.Verbose( "Main.cs:Shutdown() - Closing console and terminating");
+ for (int i = 0; i < m_localWorld.Count; i++)
+ {
+ ((Scene)m_localWorld[i]).Close();
+ }
+ m_log.Close();
+ Environment.Exit(0);
+ }
+
+ #region Console Commands
+ ///
+ /// Runs commands issued by the server console from the operator
+ ///
+ /// The first argument of the parameter (the command)
+ /// Additional arguments passed to the command
+ public void RunCmd(string command, string[] cmdparams)
+ {
+ switch (command)
+ {
+ case "help":
+ m_log.Error( "show users - show info about connected users");
+ m_log.Error( "shutdown - disconnect all clients and shutdown");
+ break;
+
+ case "show":
+ if (cmdparams.Length > 0)
+ {
+ Show(cmdparams[0]);
+ }
+ break;
+
+ case "terrain":
+ string result = "";
+ for (int i = 0; i < m_localWorld.Count; i++)
+ {
+ if (!((Scene)m_localWorld[i]).Terrain.RunTerrainCmd(cmdparams, ref result))
+ {
+ m_log.Error(result);
+ }
+ }
+ break;
+
+ case "shutdown":
+ Shutdown();
+ break;
+
+ default:
+ m_log.Error( "Unknown command");
+ break;
+ }
+ }
+
+ ///
+ /// Outputs to the console information about the region
+ ///
+ /// What information to display (valid arguments are "uptime", "users")
+ public void Show(string ShowWhat)
+ {
+ switch (ShowWhat)
+ {
+ case "uptime":
+ m_log.Error( "OpenSim has been running since " + startuptime.ToString());
+ m_log.Error( "That is " + (DateTime.Now - startuptime).ToString());
+ break;
+ case "users":
+ OpenSim.Region.Scenes.ScenePresence TempAv;
+ m_log.Error( String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}", "Firstname", "Lastname", "Agent ID", "Session ID", "Circuit", "IP"));
+ /* foreach (libsecondlife.LLUUID UUID in LocalWorld.Entities.Keys)
+ {
+ if (LocalWorld.Entities[UUID].ToString() == "OpenSim.world.Avatar")
+ {
+ TempAv = (OpenSim.world.Avatar)LocalWorld.Entities[UUID];
+ m_log.Error( String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}", TempAv.firstname, TempAv.lastname, UUID, TempAv.ControllingClient.SessionID, TempAv.ControllingClient.CircuitCode, TempAv.ControllingClient.userEP.ToString()));
+ }
+ }*/
+ break;
+ }
+ }
+ #endregion
+ }
+
+
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Caches/AssetCache.cs b/OpenSim/Region/Caches/AssetCache.cs
new file mode 100644
index 0000000..d0cc370
--- /dev/null
+++ b/OpenSim/Region/Caches/AssetCache.cs
@@ -0,0 +1,670 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Threading;
+using System.Reflection;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Utilities;
+
+namespace OpenSim.Caches
+{
+ public delegate void DownloadComplete(AssetCache.TextureSender sender);
+
+ ///
+ /// Manages local cache of assets and their sending to viewers.
+ ///
+ public class AssetCache : IAssetReceiver
+ {
+ public Dictionary Assets;
+ public Dictionary Textures;
+
+ public List AssetRequests = new List(); //assets ready to be sent to viewers
+ public List TextureRequests = new List(); //textures ready to be sent
+
+ public Dictionary RequestedAssets = new Dictionary(); //Assets requested from the asset server
+ public Dictionary RequestedTextures = new Dictionary(); //Textures requested from the asset server
+
+ public Dictionary SendingTextures = new Dictionary();
+ private IAssetServer _assetServer;
+ private Thread _assetCacheThread;
+ private LLUUID[] textureList = new LLUUID[5];
+
+ ///
+ ///
+ ///
+ public AssetCache(IAssetServer assetServer)
+ {
+ Console.WriteLine("Creating Asset cache");
+ _assetServer = assetServer;
+ _assetServer.SetReceiver(this);
+ Assets = new Dictionary();
+ Textures = new Dictionary();
+ this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
+ this._assetCacheThread.IsBackground = true;
+ this._assetCacheThread.Start();
+
+ }
+
+ public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey)
+ {
+ Console.WriteLine("Creating Asset cache");
+ _assetServer = this.LoadAssetDll(assetServerDLLName);
+ _assetServer.SetServerInfo(assetServerURL, assetServerKey);
+ _assetServer.SetReceiver(this);
+ Assets = new Dictionary();
+ Textures = new Dictionary();
+ this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
+ this._assetCacheThread.IsBackground = true;
+ this._assetCacheThread.Start();
+
+ }
+
+ ///
+ ///
+ ///
+ public void RunAssetManager()
+ {
+ while (true)
+ {
+ try
+ {
+ //Console.WriteLine("Asset cache loop");
+ this.ProcessAssetQueue();
+ this.ProcessTextureQueue();
+ Thread.Sleep(500);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+ }
+ }
+
+ public void LoadDefaultTextureSet()
+ {
+ //hack: so we can give each user a set of textures
+ textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001");
+ textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002");
+ textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003");
+ textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004");
+ textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005");
+
+ for (int i = 0; i < textureList.Length; i++)
+ {
+ this._assetServer.RequestAsset(textureList[i], true);
+ }
+
+ }
+
+ public AssetBase[] CreateNewInventorySet(LLUUID agentID)
+ {
+ AssetBase[] inventorySet = new AssetBase[this.textureList.Length];
+ for (int i = 0; i < textureList.Length; i++)
+ {
+ if (this.Textures.ContainsKey(textureList[i]))
+ {
+ inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]);
+ TextureImage image = new TextureImage(inventorySet[i]);
+ this.Textures.Add(image.FullID, image);
+ this._assetServer.UploadNewAsset(image); //save the asset to the asset server
+ }
+ }
+ return inventorySet;
+ }
+
+ public AssetBase GetAsset(LLUUID assetID)
+ {
+ AssetBase asset = null;
+ if (this.Textures.ContainsKey(assetID))
+ {
+ asset = this.Textures[assetID];
+ }
+ else if (this.Assets.ContainsKey(assetID))
+ {
+ asset = this.Assets[assetID];
+ }
+ return asset;
+ }
+
+ public void AddAsset(AssetBase asset)
+ {
+ // Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
+ if (asset.Type == 0)
+ {
+ //Console.WriteLine("which is a texture");
+ if (!this.Textures.ContainsKey(asset.FullID))
+ { //texture
+ TextureImage textur = new TextureImage(asset);
+ this.Textures.Add(textur.FullID, textur);
+ this._assetServer.UploadNewAsset(asset);
+ }
+ }
+ else
+ {
+ if (!this.Assets.ContainsKey(asset.FullID))
+ {
+ AssetInfo assetInf = new AssetInfo(asset);
+ this.Assets.Add(assetInf.FullID, assetInf);
+ this._assetServer.UploadNewAsset(asset);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ private void ProcessTextureQueue()
+ {
+ if (this.TextureRequests.Count == 0)
+ {
+ //no requests waiting
+ return;
+ }
+ int num;
+ num = this.TextureRequests.Count;
+
+ AssetRequest req;
+ for (int i = 0; i < num; i++)
+ {
+ req = (AssetRequest)this.TextureRequests[i];
+ if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID))
+ {
+ TextureSender sender = new TextureSender(req);
+ sender.OnComplete += this.TextureSent;
+ lock (this.SendingTextures)
+ {
+ this.SendingTextures.Add(req.ImageInfo.FullID, sender);
+ }
+ }
+
+ }
+
+ this.TextureRequests.Clear();
+ }
+
+ ///
+ /// Event handler, called by a TextureSender object to say that texture has been sent
+ ///
+ ///
+ public void TextureSent(AssetCache.TextureSender sender)
+ {
+ if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID))
+ {
+ lock (this.SendingTextures)
+ {
+ this.SendingTextures.Remove(sender.request.ImageInfo.FullID);
+ }
+ }
+ }
+
+ public void AssetReceived(AssetBase asset, bool IsTexture)
+ {
+ if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server
+ {
+ //check if it is a texture or not
+ //then add to the correct cache list
+ //then check for waiting requests for this asset/texture (in the Requested lists)
+ //and move those requests into the Requests list.
+ if (IsTexture)
+ {
+ TextureImage image = new TextureImage(asset);
+ this.Textures.Add(image.FullID, image);
+ if (this.RequestedTextures.ContainsKey(image.FullID))
+ {
+ AssetRequest req = this.RequestedTextures[image.FullID];
+ req.ImageInfo = image;
+ if (image.Data.LongLength > 600)
+ {
+ //over 600 bytes so split up file
+ req.NumPackets = 1 + (int)(image.Data.Length - 600 + 999) / 1000;
+ }
+ else
+ {
+ req.NumPackets = 1;
+ }
+ this.RequestedTextures.Remove(image.FullID);
+ this.TextureRequests.Add(req);
+ }
+ }
+ else
+ {
+ AssetInfo assetInf = new AssetInfo(asset);
+ this.Assets.Add(assetInf.FullID, assetInf);
+ if (this.RequestedAssets.ContainsKey(assetInf.FullID))
+ {
+ AssetRequest req = this.RequestedAssets[assetInf.FullID];
+ req.AssetInf = assetInf;
+ if (assetInf.Data.LongLength > 600)
+ {
+ //over 600 bytes so split up file
+ req.NumPackets = 1 + (int)(assetInf.Data.Length - 600 + 999) / 1000;
+ }
+ else
+ {
+ req.NumPackets = 1;
+ }
+ this.RequestedAssets.Remove(assetInf.FullID);
+ this.AssetRequests.Add(req);
+ }
+ }
+ }
+ }
+
+ public void AssetNotFound(AssetBase asset)
+ {
+ //the asset server had no knowledge of requested asset
+
+ }
+
+ #region Assets
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest)
+ {
+ LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
+ //check to see if asset is in local cache, if not we need to request it from asset server.
+
+ if (!this.Assets.ContainsKey(requestID))
+ {
+ //not found asset
+ // so request from asset server
+ if (!this.RequestedAssets.ContainsKey(requestID))
+ {
+ AssetRequest request = new AssetRequest();
+ request.RequestUser = userInfo;
+ request.RequestAssetID = requestID;
+ request.TransferRequestID = transferRequest.TransferInfo.TransferID;
+ this.RequestedAssets.Add(requestID, request);
+ this._assetServer.RequestAsset(requestID, false);
+ }
+ return;
+ }
+ //it is in our cache
+ AssetInfo asset = this.Assets[requestID];
+
+ //work out how many packets it should be sent in
+ // and add to the AssetRequests list
+ AssetRequest req = new AssetRequest();
+ req.RequestUser = userInfo;
+ req.RequestAssetID = requestID;
+ req.TransferRequestID = transferRequest.TransferInfo.TransferID;
+ req.AssetInf = asset;
+
+ if (asset.Data.LongLength > 600)
+ {
+ //over 600 bytes so split up file
+ req.NumPackets = 1 + (int)(asset.Data.Length - 600 + 999) / 1000;
+ }
+ else
+ {
+ req.NumPackets = 1;
+ }
+
+ this.AssetRequests.Add(req);
+ }
+
+ ///
+ ///
+ ///
+ private void ProcessAssetQueue()
+ {
+ if (this.AssetRequests.Count == 0)
+ {
+ //no requests waiting
+ return;
+ }
+ int num;
+
+ if (this.AssetRequests.Count < 5)
+ {
+ //lower than 5 so do all of them
+ num = this.AssetRequests.Count;
+ }
+ else
+ {
+ num = 5;
+ }
+ AssetRequest req;
+ for (int i = 0; i < num; i++)
+ {
+ req = (AssetRequest)this.AssetRequests[i];
+
+ TransferInfoPacket Transfer = new TransferInfoPacket();
+ Transfer.TransferInfo.ChannelType = 2;
+ Transfer.TransferInfo.Status = 0;
+ Transfer.TransferInfo.TargetType = 0;
+ Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes();
+ Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
+ Transfer.TransferInfo.TransferID = req.TransferRequestID;
+ req.RequestUser.OutPacket(Transfer);
+
+ if (req.NumPackets == 1)
+ {
+ TransferPacketPacket TransferPacket = new TransferPacketPacket();
+ TransferPacket.TransferData.Packet = 0;
+ TransferPacket.TransferData.ChannelType = 2;
+ TransferPacket.TransferData.TransferID = req.TransferRequestID;
+ TransferPacket.TransferData.Data = req.AssetInf.Data;
+ TransferPacket.TransferData.Status = 1;
+ req.RequestUser.OutPacket(TransferPacket);
+ }
+ else
+ {
+ //more than one packet so split file up , for now it can't be bigger than 2000 bytes
+ TransferPacketPacket TransferPacket = new TransferPacketPacket();
+ TransferPacket.TransferData.Packet = 0;
+ TransferPacket.TransferData.ChannelType = 2;
+ TransferPacket.TransferData.TransferID = req.TransferRequestID;
+ byte[] chunk = new byte[1000];
+ Array.Copy(req.AssetInf.Data, chunk, 1000);
+ TransferPacket.TransferData.Data = chunk;
+ TransferPacket.TransferData.Status = 0;
+ req.RequestUser.OutPacket(TransferPacket);
+
+ TransferPacket = new TransferPacketPacket();
+ TransferPacket.TransferData.Packet = 1;
+ TransferPacket.TransferData.ChannelType = 2;
+ TransferPacket.TransferData.TransferID = req.TransferRequestID;
+ byte[] chunk1 = new byte[(req.AssetInf.Data.Length - 1000)];
+ Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length);
+ TransferPacket.TransferData.Data = chunk1;
+ TransferPacket.TransferData.Status = 1;
+ req.RequestUser.OutPacket(TransferPacket);
+ }
+
+ }
+
+ //remove requests that have been completed
+ for (int i = 0; i < num; i++)
+ {
+ this.AssetRequests.RemoveAt(0);
+ }
+
+ }
+
+ 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 Textures
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID)
+ {
+ //Console.WriteLine("texture request for " + imageID.ToStringHyphenated());
+ //check to see if texture is in local cache, if not request from asset server
+ if (!this.Textures.ContainsKey(imageID))
+ {
+ if (!this.RequestedTextures.ContainsKey(imageID))
+ {
+ //not is cache so request from asset server
+ AssetRequest request = new AssetRequest();
+ request.RequestUser = userInfo;
+ request.RequestAssetID = imageID;
+ request.IsTextureRequest = true;
+ this.RequestedTextures.Add(imageID, request);
+ this._assetServer.RequestAsset(imageID, true);
+ }
+ return;
+ }
+
+ //Console.WriteLine("texture already in cache");
+ TextureImage imag = this.Textures[imageID];
+ AssetRequest req = new AssetRequest();
+ req.RequestUser = userInfo;
+ req.RequestAssetID = imageID;
+ req.IsTextureRequest = true;
+ req.ImageInfo = imag;
+
+ if (imag.Data.LongLength > 600)
+ {
+ //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 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
+
+ private IAssetServer LoadAssetDll(string dllName)
+ {
+ Assembly pluginAssembly = Assembly.LoadFrom(dllName);
+ IAssetServer server = null;
+
+ foreach (Type pluginType in pluginAssembly.GetTypes())
+ {
+ if (pluginType.IsPublic)
+ {
+ if (!pluginType.IsAbstract)
+ {
+ Type typeInterface = pluginType.GetInterface("IAssetPlugin", true);
+
+ if (typeInterface != null)
+ {
+ IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
+ server = plug.GetAssetServer();
+ break;
+ }
+
+ typeInterface = null;
+ }
+ }
+ }
+ pluginAssembly = null;
+ return server;
+ }
+
+ public class AssetRequest
+ {
+ public IClientAPI RequestUser;
+ public LLUUID RequestAssetID;
+ public AssetInfo AssetInf;
+ public TextureImage ImageInfo;
+ public LLUUID TransferRequestID;
+ public long DataPointer = 0;
+ public int NumPackets = 0;
+ public int PacketCounter = 0;
+ public bool IsTextureRequest;
+ //public bool AssetInCache;
+ //public int TimeRequested;
+
+ public AssetRequest()
+ {
+
+ }
+ }
+
+ public class AssetInfo : AssetBase
+ {
+ public AssetInfo()
+ {
+
+ }
+
+ public AssetInfo(AssetBase aBase)
+ {
+ Data = aBase.Data;
+ FullID = aBase.FullID;
+ Type = aBase.Type;
+ InvType = aBase.InvType;
+ Name = aBase.Name;
+ Description = aBase.Description;
+ }
+ }
+
+ public class TextureImage : AssetBase
+ {
+ public TextureImage()
+ {
+
+ }
+
+ public TextureImage(AssetBase aBase)
+ {
+ Data = aBase.Data;
+ FullID = aBase.FullID;
+ Type = aBase.Type;
+ InvType = aBase.InvType;
+ Name = aBase.Name;
+ Description = aBase.Description;
+ }
+ }
+
+ public class TextureSender
+ {
+ public AssetRequest request;
+ public event DownloadComplete OnComplete;
+ Thread m_thread;
+ public TextureSender(AssetRequest req)
+ {
+ request = req;
+ //Console.WriteLine("creating worker thread for texture " + req.ImageInfo.FullID.ToStringHyphenated());
+ //Console.WriteLine("texture data length is " + req.ImageInfo.Data.Length);
+ // Console.WriteLine("in " + req.NumPackets + " packets");
+ //ThreadPool.QueueUserWorkItem(new WaitCallback(SendTexture), new object());
+
+ //need some sort of custom threadpool here, as using the .net one, overloads it and stops the handling of incoming packets etc
+ //but don't really want to create a thread for every texture download
+ m_thread = new Thread(new ThreadStart(SendTexture));
+ m_thread.IsBackground = true;
+ m_thread.Start();
+ }
+
+ public void SendTexture()
+ {
+ //Console.WriteLine("starting to send sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
+ while (request.PacketCounter != request.NumPackets)
+ {
+ SendPacket();
+ Thread.Sleep(500);
+ }
+
+ //Console.WriteLine("finished sending texture " + request.ImageInfo.FullID.ToStringHyphenated());
+ if (OnComplete != null)
+ {
+ OnComplete(this);
+ }
+ }
+
+ public void SendPacket()
+ {
+ AssetRequest req = request;
+ // Console.WriteLine("sending " + req.ImageInfo.FullID);
+
+ // if (req.ImageInfo.FullID == new LLUUID("00000000-0000-0000-5005-000000000005"))
+ 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;
+ req.RequestUser.OutPacket(im);
+ req.PacketCounter++;
+ //req.ImageInfo.l= time;
+ //System.Console.WriteLine("sent texture: " + req.ImageInfo.FullID);
+ // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
+ }
+ 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;
+ req.RequestUser.OutPacket(im);
+ req.PacketCounter++;
+ //req.ImageInfo.last_used = time;
+ //System.Console.WriteLine("sent first packet of texture:
+ // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated());
+ }
+ }
+ else
+ {
+ //Console.WriteLine("sending packet" + req.PacketCounter + "for " + req.ImageInfo.FullID.ToStringHyphenated());
+ //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);
+ req.RequestUser.OutPacket(im);
+ req.PacketCounter++;
+ //req.ImageInfo.last_used = time;
+ //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
+ }
+
+ }
+ }
+ }
+}
+
diff --git a/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj
new file mode 100644
index 0000000..4a73d08
--- /dev/null
+++ b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj
@@ -0,0 +1,97 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {61FCCDB3-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Caches
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Caches
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Caches/Properties/AssemblyInfo.cs b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..00f5dfe
--- /dev/null
+++ b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenSim.Caches")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenSim.Caches")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2b15ddbf-0341-49a6-85c0-cece268a4518")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Caps/Caps.cs b/OpenSim/Region/Caps/Caps.cs
new file mode 100644
index 0000000..13a351d
--- /dev/null
+++ b/OpenSim/Region/Caps/Caps.cs
@@ -0,0 +1,258 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Xml;
+using OpenSim.Servers;
+using OpenSim.Framework;
+using OpenSim.Framework.Utilities;
+using OpenSim.Framework.Types;
+using OpenSim.Caches;
+using libsecondlife;
+
+namespace OpenSim.Region
+{
+ public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data);
+
+ public class Caps
+ {
+ private string httpListenerAddress;
+ private uint httpListenPort;
+ private string capsObjectPath = "00001-";
+ private string requestPath = "0000/";
+ private string mapLayerPath = "0001/";
+ private string newInventory = "0002/";
+ private string requestTexture = "0003/";
+ private string eventQueue = "0100/";
+ private BaseHttpServer httpListener;
+ private LLUUID agentID;
+ private AssetCache assetCache;
+ private int eventQueueCount = 1;
+ private Queue CapsEventQueue = new Queue();
+
+ public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, LLUUID agent)
+ {
+ assetCache = assetCach;
+ capsObjectPath = capsPath;
+ httpListener = httpServer;
+ httpListenerAddress = httpListen;
+ httpListenPort = httpPort;
+ agentID = agent;
+ }
+
+ ///
+ ///
+ ///
+ public void RegisterHandlers()
+ {
+ Console.WriteLine("registering CAPS handlers");
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + requestPath, CapsRequest);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + mapLayerPath, MapLayer);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + newInventory, NewAgentInventory);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + eventQueue, ProcessEventQueue);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string CapsRequest(string request, string path, string param)
+ {
+ // Console.WriteLine("Caps Request " + request);
+ string result = "";
+ result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
+ return result;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected LLSDCapsDetails GetCapabilities()
+ {
+ /* string capURLS = "";
+ capURLS += "MapLayerhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath + "";
+ capURLS += "NewFileAgentInventoryhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory + "";
+ //capURLS += "RequestTextureDownloadhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + requestTexture + "";
+ //capURLS += "EventQueueGethttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + eventQueue + "";
+ return capURLS;*/
+
+ LLSDCapsDetails caps = new LLSDCapsDetails();
+ caps.MapLayer = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath;
+ caps.NewFileAgentInventory = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory;
+ return caps;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string MapLayer(string request, string path, string param)
+ {
+ Encoding _enc = System.Text.Encoding.UTF8;
+ Hashtable hash =(Hashtable) LLSD.LLSDDeserialize(_enc.GetBytes(request));
+ LLSDMapRequest mapReq = new LLSDMapRequest();
+ LLSDHelpers.DeserialiseLLSDMap(hash, mapReq );
+
+ LLSDMapLayerResponse mapResponse= new LLSDMapLayerResponse();
+ mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
+ string res = LLSDHelpers.SerialiseLLSDReply(mapResponse);
+
+ //Console.WriteLine(" Maplayer response is " + res);
+
+ return res;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected LLSDMapLayer BuildLLSDMapLayerResponse()
+ {
+ LLSDMapLayer mapLayer = new LLSDMapLayer();
+ mapLayer.Right = 5000;
+ mapLayer.Top = 5000;
+ mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
+
+ return mapLayer;
+ }
+
+ public string ProcessEventQueue(string request, string path, string param)
+ {
+ // Console.WriteLine("event queue request " + request);
+ string res = "";
+ int timer = 0;
+
+ /*while ((timer < 200) || (this.CapsEventQueue.Count < 1))
+ {
+ timer++;
+ }*/
+ if (this.CapsEventQueue.Count > 0)
+ {
+ lock (this.CapsEventQueue)
+ {
+ string item = CapsEventQueue.Dequeue();
+ res = item;
+ }
+ }
+ else
+ {
+ res = this.CreateEmptyEventResponse();
+ }
+ return res;
+ }
+
+ public string CreateEstablishAgentComms(string caps, string ipAddressPort)
+ {
+ string res = "";
+ eventQueueCount++;
+ this.CapsEventQueue.Enqueue(res);
+ return res;
+ }
+
+ public string CreateEmptyEventResponse()
+ {
+ string res = "id" + eventQueueCount + "";
+ res += "events";
+ res += "";
+ res += "";
+ eventQueueCount++;
+ return res;
+ }
+
+ public string NewAgentInventory(string request, string path, string param)
+ {
+ //Console.WriteLine("received upload request:"+ request);
+ string res = "";
+ LLUUID newAsset = LLUUID.Random();
+ LLUUID newInvItem = LLUUID.Random();
+ string uploaderPath = capsObjectPath + Util.RandomClass.Next(5000, 8000).ToString("0000");
+ AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener);
+ httpListener.AddRestHandler("POST", "/CAPS/" + uploaderPath, uploader.uploaderCaps);
+ string uploaderURL = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + uploaderPath;
+ //Console.WriteLine("uploader url is " + uploaderURL);
+ res += "";
+ res += "uploader" + uploaderURL + "";
+ //res += "successtrue";
+ res += "stateupload";
+ res += "";
+ uploader.OnUpLoad += this.UploadHandler;
+ return res;
+ }
+
+ public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data)
+ {
+ // Console.WriteLine("upload handler called");
+ AssetBase asset;
+ asset = new AssetBase();
+ asset.FullID = assetID;
+ asset.Type = 0;
+ asset.InvType = 0;
+ asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
+ asset.Data = data;
+ this.assetCache.AddAsset(asset);
+ }
+
+ public class AssetUploader
+ {
+ public event UpLoadedTexture OnUpLoad;
+
+ private string uploaderPath = "";
+ private LLUUID newAssetID;
+ private LLUUID inventoryItemID;
+ private BaseHttpServer httpListener;
+ public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
+ {
+ newAssetID = assetID;
+ inventoryItemID = inventoryItem;
+ uploaderPath = path;
+ httpListener = httpServer;
+
+ }
+
+ public string uploaderCaps(string request, string path, string param)
+ {
+ Encoding _enc = System.Text.Encoding.UTF8;
+ byte[] data = _enc.GetBytes(request);
+ //Console.WriteLine("recieved upload " + Util.FieldToString(data));
+ LLUUID inv = this.inventoryItemID;
+ string res = "";
+ res += "";
+ res += "new_asset" + newAssetID.ToStringHyphenated() + "";
+ res += "new_inventory_item" + inv.ToStringHyphenated() + "";
+ res += "statecomplete";
+ res += "";
+
+ // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated());
+ httpListener.RemoveRestHandler("POST", "/CAPS/" + uploaderPath);
+ if (OnUpLoad != null)
+ {
+ OnUpLoad(newAssetID, inv, data);
+ }
+
+ /*FileStream fs = File.Create("upload.jp2");
+ BinaryWriter bw = new BinaryWriter(fs);
+ bw.Write(data);
+ bw.Close();
+ fs.Close();*/
+ return res;
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/Caps/LLSDHelpers.cs b/OpenSim/Region/Caps/LLSDHelpers.cs
new file mode 100644
index 0000000..051520c
--- /dev/null
+++ b/OpenSim/Region/Caps/LLSDHelpers.cs
@@ -0,0 +1,246 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Xml;
+using libsecondlife;
+
+namespace OpenSim.Framework
+{
+ public class LLSDHelpers
+ {
+ public static string SerialiseLLSDReply(object obj)
+ {
+ StringWriter sw = new StringWriter();
+ XmlTextWriter writer = new XmlTextWriter(sw);
+ writer.Formatting = Formatting.None;
+ writer.WriteStartElement(String.Empty, "llsd", String.Empty);
+ LLSDHelpers.SerializeLLSDType(writer, obj);
+ writer.WriteEndElement();
+ writer.Close();
+ return sw.ToString();
+ }
+
+ public static void SerializeLLSDType(XmlTextWriter writer, object obj)
+ {
+ Type myType = obj.GetType();
+ LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false);
+ if (llsdattributes.Length > 0)
+ {
+ switch (llsdattributes[0].ObjectType)
+ {
+ case "MAP":
+ writer.WriteStartElement(String.Empty, "map", String.Empty);
+ System.Reflection.FieldInfo[] fields = myType.GetFields();
+ for (int i = 0; i < fields.Length; i++)
+ {
+ object fieldValue = fields[i].GetValue(obj);
+ LLSDType[] fieldAttributes = (LLSDType[])fieldValue.GetType().GetCustomAttributes(typeof(LLSDType), false);
+ if (fieldAttributes.Length > 0)
+ {
+ writer.WriteStartElement(String.Empty, "key", String.Empty);
+ writer.WriteString(fields[i].Name);
+ writer.WriteEndElement();
+ SerializeLLSDType(writer, fieldValue);
+ }
+ else
+ {
+ //Console.WriteLine("LLSD field name" + fields[i].Name + " , " + fields[i].GetValue(obj).GetType());
+ writer.WriteStartElement(String.Empty, "key", String.Empty);
+ writer.WriteString(fields[i].Name);
+ writer.WriteEndElement();
+ LLSD.LLSDWriteOne(writer, fieldValue);
+ }
+ }
+ writer.WriteEndElement();
+ break;
+ case "ARRAY":
+ // LLSDArray arrayObject = obj as LLSDArray;
+ // ArrayList a = arrayObject.Array;
+ ArrayList a = (ArrayList)obj.GetType().GetField("Array").GetValue(obj);
+ writer.WriteStartElement(String.Empty, "array", String.Empty);
+ foreach (object item in a)
+ {
+ SerializeLLSDType(writer, item);
+ }
+ writer.WriteEndElement();
+ break;
+ }
+ }
+ else
+ {
+ LLSD.LLSDWriteOne(writer, obj);
+ }
+ }
+
+ public static object DeserialiseLLSDMap(Hashtable llsd, object obj)
+ {
+ Type myType = obj.GetType();
+ LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false);
+ if (llsdattributes.Length > 0)
+ {
+ switch (llsdattributes[0].ObjectType)
+ {
+ case "MAP":
+ IDictionaryEnumerator enumerator = llsd.GetEnumerator();
+ while (enumerator.MoveNext())
+ {
+ System.Reflection.FieldInfo field = myType.GetField((string)enumerator.Key);
+ if (field != null)
+ {
+ if (enumerator.Value is Hashtable)
+ {
+ object fieldValue = field.GetValue(obj);
+ DeserialiseLLSDMap((Hashtable) enumerator.Value, fieldValue);
+ }
+ else if (enumerator.Value is ArrayList)
+ {
+ object fieldValue = field.GetValue(obj);
+ fieldValue.GetType().GetField("Array").SetValue(fieldValue, enumerator.Value);
+ //TODO
+ // the LLSD map/array types in the array need to be deserialised
+ // but first we need to know the right class to deserialise them into.
+ }
+ else
+ {
+ field.SetValue(obj, enumerator.Value);
+ }
+ }
+ }
+ break;
+ }
+ }
+ return obj;
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDMapLayerResponse
+ {
+ public LLSDMapRequest AgentData = new LLSDMapRequest();
+ public LLSDArray LayerData = new LLSDArray();
+
+ public LLSDMapLayerResponse()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDCapsDetails
+ {
+ public string MapLayer = "";
+ public string NewFileAgentInventory = "";
+ //public string EventQueueGet = "";
+
+ public LLSDCapsDetails()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDMapLayer
+ {
+ public int Left = 0;
+ public int Right = 0;
+ public int Top = 0;
+ public int Bottom = 0;
+ public LLUUID ImageID = LLUUID.Zero;
+
+ public LLSDMapLayer()
+ {
+
+ }
+ }
+
+ [LLSDType("ARRAY")]
+ public class LLSDArray
+ {
+ public ArrayList Array = new ArrayList();
+
+ public LLSDArray()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDMapRequest
+ {
+ public int Flags = 0;
+
+ public LLSDMapRequest()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDUploadReply
+ {
+ public string new_asset = "";
+ public LLUUID new_inventory_item = LLUUID.Zero;
+ public string state = "";
+
+ public LLSDUploadReply()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDCapEvent
+ {
+ public int id = 0;
+ public LLSDArray events = new LLSDArray();
+
+ public LLSDCapEvent()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDEmpty
+ {
+ public LLSDEmpty()
+ {
+
+ }
+ }
+
+ [LLSDType("MAP")]
+ public class LLSDTest
+ {
+ public int Test1 = 20;
+ public int Test2 = 10;
+
+ public LLSDTest()
+ {
+
+ }
+ }
+
+
+ [AttributeUsage(AttributeTargets.Class)]
+ public class LLSDType : Attribute
+ {
+ private string myType;
+
+ public LLSDType(string type)
+ {
+ myType = type;
+
+ }
+
+ public string ObjectType
+ {
+ get
+ {
+ return myType;
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/Assets/InventoryCache.cs b/OpenSim/Region/ClientStack/Assets/InventoryCache.cs
new file mode 100644
index 0000000..5d5021c
--- /dev/null
+++ b/OpenSim/Region/ClientStack/Assets/InventoryCache.cs
@@ -0,0 +1,337 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 OpenSim;
+using libsecondlife.Packets;
+//using OpenSim.GridServers;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Interfaces;
+
+namespace OpenSim.Assets
+{
+ ///
+ /// Description of InventoryManager.
+ ///
+ public class InventoryCache
+ {
+ private Dictionary _agentsInventory;
+ private List _serverRequests; //list of requests made to user server.
+ private System.Text.Encoding _enc = System.Text.Encoding.ASCII;
+ private const uint FULL_MASK_PERMISSIONS = 2147483647;
+
+ public InventoryCache()
+ {
+ _agentsInventory = new Dictionary();
+ _serverRequests = new List();
+ }
+
+ public void AddNewAgentsInventory(AgentInventory agentInventory)
+ {
+ if (!this._agentsInventory.ContainsKey(agentInventory.AgentID))
+ {
+ this._agentsInventory.Add(agentInventory.AgentID, agentInventory);
+ }
+ }
+
+ public AgentInventory FetchAgentsInventory(LLUUID agentID, IUserServer userserver)
+ {
+ AgentInventory res = null;
+ if (!this._agentsInventory.ContainsKey(agentID))
+ {
+ res = userserver.RequestAgentsInventory(agentID);
+ this._agentsInventory.Add(agentID,res);
+ }
+ return res;
+ }
+
+ public AgentInventory GetAgentsInventory(LLUUID agentID)
+ {
+ if (this._agentsInventory.ContainsKey(agentID))
+ {
+ return this._agentsInventory[agentID];
+ }
+
+ return null;
+ }
+
+ public void ClientLeaving(LLUUID clientID, IUserServer userserver)
+ {
+ if (this._agentsInventory.ContainsKey(clientID))
+ {
+ if (userserver != null)
+ {
+ userserver.UpdateAgentsInventory(clientID, this._agentsInventory[clientID]);
+ }
+ this._agentsInventory.Remove(clientID);
+ }
+ }
+
+ public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID)
+ {
+ return this.CreateNewInventoryFolder(remoteClient, folderID, 0);
+ }
+
+ public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type)
+ {
+ bool res = false;
+ if (folderID != LLUUID.Zero) //don't create a folder with a zero id
+ {
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type);
+ }
+ }
+ return res;
+ }
+
+ public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type, string folderName, LLUUID parent)
+ {
+ bool res = false;
+ if (folderID != LLUUID.Zero) //don't create a folder with a zero id
+ {
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type, folderName, parent);
+ }
+ }
+ return res;
+ }
+
+ public LLUUID AddNewInventoryItem(ClientView remoteClient, LLUUID folderID, OpenSim.Framework.Types.AssetBase asset)
+ {
+ LLUUID newItem = null;
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset);
+ if (newItem != null)
+ {
+ InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[newItem];
+ this.SendItemUpdateCreate(remoteClient, Item);
+ }
+ }
+
+ return newItem;
+ }
+ public bool DeleteInventoryItem(ClientView remoteClient, LLUUID itemID)
+ {
+ bool res = false;
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ res = this._agentsInventory[remoteClient.AgentID].DeleteFromInventory(itemID);
+ if (res)
+ {
+ RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket();
+ remove.AgentData.AgentID = remoteClient.AgentID;
+ remove.AgentData.SessionID = remoteClient.SessionID;
+ remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
+ remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
+ remove.InventoryData[0].ItemID = itemID;
+ remoteClient.OutPacket(remove);
+ }
+ }
+
+ return res;
+ }
+
+ public bool UpdateInventoryItemAsset(ClientView remoteClient, LLUUID itemID, OpenSim.Framework.Types.AssetBase asset)
+ {
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ bool res = _agentsInventory[remoteClient.AgentID].UpdateItemAsset(itemID, asset);
+ if (res)
+ {
+ InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID];
+ this.SendItemUpdateCreate(remoteClient, Item);
+ }
+ return res;
+ }
+
+ return false;
+ }
+
+ public bool UpdateInventoryItemDetails(ClientView remoteClient, LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet)
+ {
+ if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
+ {
+ bool res = _agentsInventory[remoteClient.AgentID].UpdateItemDetails(itemID, packet);
+ if (res)
+ {
+ InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID];
+ this.SendItemUpdateCreate(remoteClient, Item);
+ }
+ return res;
+ }
+
+ return false;
+ }
+
+ public void FetchInventoryDescendents(ClientView userInfo, FetchInventoryDescendentsPacket FetchDescend)
+ {
+ if (this._agentsInventory.ContainsKey(userInfo.AgentID))
+ {
+ AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
+ if (FetchDescend.InventoryData.FetchItems)
+ {
+ if (agentInventory.InventoryFolders.ContainsKey(FetchDescend.InventoryData.FolderID))
+ {
+ InventoryFolder Folder = agentInventory.InventoryFolders[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);
+ }
+
+ userInfo.OutPacket(Descend);
+
+ }
+ }
+ else
+ {
+ Console.WriteLine("fetch subfolders");
+ }
+ }
+ }
+
+ public void FetchInventory(ClientView userInfo, FetchInventoryPacket FetchItems)
+ {
+ if (this._agentsInventory.ContainsKey(userInfo.AgentID))
+ {
+ AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
+
+ for (int i = 0; i < FetchItems.InventoryData.Length; i++)
+ {
+ if (agentInventory.InventoryItems.ContainsKey(FetchItems.InventoryData[i].ItemID))
+ {
+ InventoryItem Item = agentInventory.InventoryItems[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 = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+ InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0");
+ InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
+ InventoryReply.InventoryData[0].Flags = 0;
+ 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);
+ userInfo.OutPacket(InventoryReply);
+ }
+ }
+ }
+ }
+
+ private void SendItemUpdateCreate(ClientView remoteClient, InventoryItem Item)
+ {
+
+ UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket();
+ InventoryReply.AgentData.AgentID = remoteClient.AgentID;
+ InventoryReply.AgentData.SimApproved = true;
+ InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
+ InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.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 = 0;
+ 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);
+
+ remoteClient.OutPacket(InventoryReply);
+ }
+ }
+
+
+
+ public class UserServerRequest
+ {
+ public UserServerRequest()
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs
new file mode 100644
index 0000000..7552195
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using System.Net;
+using System.Net.Sockets;
+using libsecondlife;
+
+
+namespace OpenSim
+{
+
+ public interface ClientStackNetworkHandler
+ {
+ void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode);// EndPoint packetSender);
+ void RemoveClientCircuit(uint circuitcode);
+ void RegisterPacketServer(PacketServer server);
+ }
+
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
new file mode 100644
index 0000000..902f3c7
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -0,0 +1,975 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Types;
+
+using libsecondlife;
+using libsecondlife.Packets;
+
+namespace OpenSim
+{
+ partial class ClientView
+ {
+ public event ChatFromViewer OnChatFromViewer;
+ public event RezObject OnRezObject;
+ public event GenericCall4 OnDeRezObject;
+ public event ModifyTerrain OnModifyTerrain;
+ public event GenericCall OnRegionHandShakeReply;
+ public event GenericCall OnRequestWearables;
+ public event SetAppearance OnSetAppearance;
+ public event GenericCall2 OnCompleteMovementToRegion;
+ public event UpdateAgent OnAgentUpdate;
+ public event StartAnim OnStartAnim;
+ public event GenericCall OnRequestAvatarsData;
+ public event LinkObjects OnLinkObjects;
+ public event UpdateVector OnGrapObject;
+ public event ObjectSelect OnDeGrapObject;
+ public event MoveObject OnGrapUpdate;
+ public event GenericCall4 OnAddPrim;
+ public event UpdateShape OnUpdatePrimShape;
+ public event ObjectSelect OnObjectSelect;
+ public event UpdatePrimFlags OnUpdatePrimFlags;
+ public event UpdatePrimTexture OnUpdatePrimTexture;
+ public event UpdateVector OnUpdatePrimPosition;
+ public event UpdatePrimRotation OnUpdatePrimRotation;
+ public event UpdateVector OnUpdatePrimScale;
+ public event StatusChange OnChildAgentStatus;
+ public event GenericCall2 OnStopMovement;
+ public event NewAvatar OnNewAvatar;
+ public event GenericCall6 OnRemoveAvatar;
+ public event RequestMapBlocks OnRequestMapBlocks;
+ public event TeleportLocationRequest OnTeleportLocationRequest;
+
+ public event ParcelPropertiesRequest OnParcelPropertiesRequest;
+ public event ParcelDivideRequest OnParcelDivideRequest;
+ public event ParcelJoinRequest OnParcelJoinRequest;
+ public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
+
+ public event EstateOwnerMessageRequest OnEstateOwnerMessage;
+
+ ///
+ ///
+ ///
+ public LLVector3 StartPos
+ {
+ get
+ {
+ return startpos;
+ }
+ set
+ {
+ startpos = value;
+ }
+ }
+
+ ///
+ ///
+ ///
+ public LLUUID AgentId
+ {
+ get
+ {
+ return this.AgentID;
+ }
+ }
+
+ ///
+ ///
+ ///
+ public string FirstName
+ {
+ get
+ {
+ return this.firstName;
+ }
+
+ }
+
+ ///
+ ///
+ ///
+ public string LastName
+ {
+ get
+ {
+ return this.lastName;
+ }
+ }
+
+ #region World/Avatar to Client
+
+ ///
+ ///
+ ///
+ ///
+ public void SendRegionHandshake(RegionInfo regionInfo)
+ {
+ System.Text.Encoding _enc = System.Text.Encoding.ASCII;
+ RegionHandshakePacket handshake = new RegionHandshakePacket();
+
+ handshake.RegionInfo.BillableFactor = regionInfo.estateSettings.billableFactor;
+ handshake.RegionInfo.IsEstateManager = false;
+ handshake.RegionInfo.TerrainHeightRange00 = regionInfo.estateSettings.terrainHeightRange0;
+ handshake.RegionInfo.TerrainHeightRange01 = regionInfo.estateSettings.terrainHeightRange1;
+ handshake.RegionInfo.TerrainHeightRange10 = regionInfo.estateSettings.terrainHeightRange2;
+ handshake.RegionInfo.TerrainHeightRange11 = regionInfo.estateSettings.terrainHeightRange3;
+ handshake.RegionInfo.TerrainStartHeight00 = regionInfo.estateSettings.terrainStartHeight0;
+ handshake.RegionInfo.TerrainStartHeight01 = regionInfo.estateSettings.terrainStartHeight1;
+ handshake.RegionInfo.TerrainStartHeight10 = regionInfo.estateSettings.terrainStartHeight2;
+ handshake.RegionInfo.TerrainStartHeight11 = regionInfo.estateSettings.terrainStartHeight3;
+ handshake.RegionInfo.SimAccess = (byte)regionInfo.estateSettings.simAccess;
+ handshake.RegionInfo.WaterHeight = regionInfo.estateSettings.waterHeight;
+
+
+ handshake.RegionInfo.RegionFlags = (uint)regionInfo.estateSettings.regionFlags;
+
+ handshake.RegionInfo.SimName = _enc.GetBytes(regionInfo.RegionName + "\0");
+ handshake.RegionInfo.SimOwner = regionInfo.MasterAvatarAssignedUUID;
+ handshake.RegionInfo.TerrainBase0 = regionInfo.estateSettings.terrainBase0;
+ handshake.RegionInfo.TerrainBase1 = regionInfo.estateSettings.terrainBase1;
+ handshake.RegionInfo.TerrainBase2 = regionInfo.estateSettings.terrainBase2;
+ handshake.RegionInfo.TerrainBase3 = regionInfo.estateSettings.terrainBase3;
+ handshake.RegionInfo.TerrainDetail0 = regionInfo.estateSettings.terrainDetail0;
+ handshake.RegionInfo.TerrainDetail1 = regionInfo.estateSettings.terrainDetail1;
+ handshake.RegionInfo.TerrainDetail2 = regionInfo.estateSettings.terrainDetail2;
+ handshake.RegionInfo.TerrainDetail3 = regionInfo.estateSettings.terrainDetail3;
+ handshake.RegionInfo.CacheID = LLUUID.Random(); //I guess this is for the client to remember an old setting?
+
+ this.OutPacket(handshake);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look)
+ {
+ AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
+ mov.AgentData.SessionID = this.SessionID;
+ mov.AgentData.AgentID = this.AgentID;
+ mov.Data.RegionHandle = regInfo.RegionHandle;
+ mov.Data.Timestamp = 1172750370; // TODO - dynamicalise this
+
+ if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
+ {
+ mov.Data.Position = this.startpos;
+ }
+ else
+ {
+ mov.Data.Position = pos;
+ }
+ mov.Data.LookAt = look;
+
+ OutPacket(mov);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
+ {
+ SendChatMessage(Helpers.StringToField(message), type, fromPos, fromName, fromAgentID);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
+ {
+ System.Text.Encoding enc = System.Text.Encoding.ASCII;
+ libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
+ reply.ChatData.Audible = 1;
+ reply.ChatData.Message = message;
+ reply.ChatData.ChatType = type;
+ reply.ChatData.SourceType = 1;
+ reply.ChatData.Position = fromPos;
+ reply.ChatData.FromName = enc.GetBytes(fromName + "\0");
+ reply.ChatData.OwnerID = fromAgentID;
+ reply.ChatData.SourceID = fromAgentID;
+
+ this.OutPacket(reply);
+ }
+
+
+ ///
+ /// Send the region heightmap to the client
+ ///
+ /// heightmap
+ public virtual void SendLayerData(float[] map)
+ {
+ try
+ {
+ int[] patches = new int[4];
+
+ for (int y = 0; y < 16; y++)
+ {
+ for (int x = 0; x < 16; x = x + 4)
+ {
+ patches[0] = x + 0 + y * 16;
+ patches[1] = x + 1 + y * 16;
+ patches[2] = x + 2 + y * 16;
+ patches[3] = x + 3 + y * 16;
+
+ Packet layerpack = TerrainManager.CreateLandPacket(map, patches);
+ OutPacket(layerpack);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("ClientView API.cs: SendLayerData() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ /// Sends a specified patch to a client
+ ///
+ /// Patch coordinate (x) 0..16
+ /// Patch coordinate (y) 0..16
+ /// heightmap
+ public void SendLayerData(int px, int py, float[] map)
+ {
+ try
+ {
+ int[] patches = new int[1];
+ int patchx, patchy;
+ patchx = px / 16;
+ patchy = py / 16;
+
+ patches[0] = patchx + 0 + patchy * 16;
+
+ Packet layerpack = TerrainManager.CreateLandPacket(map, patches);
+ OutPacket(layerpack);
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void InformClientOfNeighbour(ulong neighbourHandle, System.Net.IPAddress neighbourIP, ushort neighbourPort)
+ {
+ EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
+ enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
+ enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
+
+ byte[] byteIP = neighbourIP.GetAddressBytes();
+ enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
+ enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
+ enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
+ enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
+ enablesimpacket.SimulatorInfo.Port = neighbourPort;
+ OutPacket(enablesimpacket);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public AgentCircuitData RequestClientInfo()
+ {
+ AgentCircuitData agentData = new AgentCircuitData();
+ agentData.AgentID = this.AgentId;
+ agentData.SessionID = this.SessionID;
+ agentData.SecureSessionID = this.SecureSessionID;
+ agentData.circuitcode = this.CircuitCode;
+ agentData.child = false;
+ agentData.firstname = this.firstName;
+ agentData.lastname = this.lastName;
+
+ return agentData;
+ }
+
+ public void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, System.Net.IPAddress newRegionIP, ushort newRegionPort)
+ {
+ LLVector3 look = new LLVector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
+
+ CrossedRegionPacket newSimPack = new CrossedRegionPacket();
+ newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
+ newSimPack.AgentData.AgentID = this.AgentID;
+ newSimPack.AgentData.SessionID = this.SessionID;
+ newSimPack.Info = new CrossedRegionPacket.InfoBlock();
+ newSimPack.Info.Position = pos;
+ newSimPack.Info.LookAt = look; // new LLVector3(0.0f, 0.0f, 0.0f); // copied from Avatar.cs - SHOULD BE DYNAMIC!!!!!!!!!!
+ newSimPack.RegionData = new libsecondlife.Packets.CrossedRegionPacket.RegionDataBlock();
+ newSimPack.RegionData.RegionHandle = newRegionHandle;
+ byte[] byteIP = newRegionIP.GetAddressBytes();
+ newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
+ newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
+ newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
+ newSimPack.RegionData.SimIP += (uint)byteIP[0];
+ newSimPack.RegionData.SimPort = newRegionPort;
+ newSimPack.RegionData.SeedCapability = new byte[0];
+
+ this.OutPacket(newSimPack);
+ //this.DowngradeClient();
+ }
+
+ public void SendMapBlock(List mapBlocks)
+ {
+ System.Text.Encoding _enc = System.Text.Encoding.ASCII;
+
+ MapBlockReplyPacket mapReply = new MapBlockReplyPacket();
+ mapReply.AgentData.AgentID = this.AgentID;
+ mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count];
+ mapReply.AgentData.Flags = 0;
+
+ for (int i = 0; i < mapBlocks.Count; i++)
+ {
+ mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
+ mapReply.Data[i].MapImageID = mapBlocks[i].MapImageId;
+ mapReply.Data[i].X = mapBlocks[i].X;
+ mapReply.Data[i].Y = mapBlocks[i].Y;
+ mapReply.Data[i].WaterHeight = mapBlocks[i].WaterHeight;
+ mapReply.Data[i].Name = _enc.GetBytes(mapBlocks[i].Name);
+ mapReply.Data[i].RegionFlags = mapBlocks[i].RegionFlags;
+ mapReply.Data[i].Access = mapBlocks[i].Access;
+ mapReply.Data[i].Agents = mapBlocks[i].Agents;
+ }
+ this.OutPacket(mapReply);
+ }
+
+ public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags)
+ {
+ TeleportLocalPacket tpLocal = new TeleportLocalPacket();
+ tpLocal.Info.AgentID = this.AgentID;
+ tpLocal.Info.TeleportFlags = flags;
+ tpLocal.Info.LocationID = 2;
+ tpLocal.Info.LookAt = lookAt;
+ tpLocal.Info.Position = position;
+ OutPacket(tpLocal);
+ }
+
+ public void SendRegionTeleport(ulong regionHandle, byte simAccess, string ipAddress, ushort ipPort, uint locationID, uint flags)
+ {
+ TeleportFinishPacket teleport = new TeleportFinishPacket();
+ teleport.Info.AgentID = this.AgentID;
+ teleport.Info.RegionHandle = regionHandle;
+ teleport.Info.SimAccess = simAccess;
+ teleport.Info.SeedCapability = new byte[0];
+
+ System.Net.IPAddress oIP = System.Net.IPAddress.Parse(ipAddress);
+ byte[] byteIP = oIP.GetAddressBytes();
+ uint ip = (uint)byteIP[3] << 24;
+ ip += (uint)byteIP[2] << 16;
+ ip += (uint)byteIP[1] << 8;
+ ip += (uint)byteIP[0];
+
+ teleport.Info.SimIP = ip;
+ teleport.Info.SimPort = ipPort;
+ teleport.Info.LocationID = 4;
+ teleport.Info.TeleportFlags = 1 << 4;
+ OutPacket(teleport);
+ }
+
+ ///
+ ///
+ ///
+ public void SendTeleportCancel()
+ {
+ TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ tpCancel.Info.SessionID = this.SessionID;
+ tpCancel.Info.AgentID = this.AgentID;
+
+ OutPacket(tpCancel);
+ }
+
+ ///
+ ///
+ ///
+ public void SendTeleportLocationStart()
+ {
+ TeleportStartPacket tpStart = new TeleportStartPacket();
+ tpStart.Info.TeleportFlags = 16; // Teleport via location
+ OutPacket(tpStart);
+ }
+
+ public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance)
+ {
+ MoneyBalanceReplyPacket money = new MoneyBalanceReplyPacket();
+ money.MoneyData.AgentID = this.AgentID;
+ money.MoneyData.TransactionID = transaction;
+ money.MoneyData.TransactionSuccess = success;
+ money.MoneyData.Description = description;
+ money.MoneyData.MoneyBalance = balance;
+ OutPacket(money);
+ }
+
+ #region Appearance/ Wearables Methods
+
+ ///
+ ///
+ ///
+ ///
+ public void SendWearables(AvatarWearable[] wearables)
+ {
+ AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
+ aw.AgentData.AgentID = this.AgentID;
+ aw.AgentData.SerialNum = 0;
+ aw.AgentData.SessionID = this.SessionID;
+
+ aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
+ AgentWearablesUpdatePacket.WearableDataBlock awb;
+ for (int i = 0; i < wearables.Length; i++)
+ {
+ awb = new AgentWearablesUpdatePacket.WearableDataBlock();
+ awb.WearableType = (byte)i;
+ awb.AssetID = wearables[i].AssetID;
+ awb.ItemID = wearables[i].ItemID;
+ aw.WearableData[i] = awb;
+ }
+
+ this.OutPacket(aw);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
+ {
+ AvatarAppearancePacket avp = new AvatarAppearancePacket();
+ avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
+ avp.ObjectData.TextureEntry = textureEntry;
+
+ AvatarAppearancePacket.VisualParamBlock avblock = null;
+ for (int i = 0; i < visualParams.Length; i++)
+ {
+ avblock = new AvatarAppearancePacket.VisualParamBlock();
+ avblock.ParamValue = visualParams[i];
+ avp.VisualParam[i] = avblock;
+ }
+
+ avp.Sender.IsTrial = false;
+ avp.Sender.ID = agentID;
+ OutPacket(avp);
+ }
+
+ #endregion
+
+ #region Avatar Packet/data sending Methods
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID, uint avatarLocalID, LLVector3 Pos, byte[] textureEntry)
+ {
+ System.Text.Encoding _enc = System.Text.Encoding.ASCII;
+ //send a objectupdate packet with information about the clients avatar
+
+ ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
+ objupdate.RegionData.RegionHandle = regionHandle;
+ objupdate.RegionData.TimeDilation = 64096;
+ objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
+ objupdate.ObjectData[0] = this.CreateDefaultAvatarPacket(textureEntry);
+ //give this avatar object a local id and assign the user a name
+
+ objupdate.ObjectData[0].ID = avatarLocalID;
+ objupdate.ObjectData[0].FullID = avatarID;
+ objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + " \0");
+ libsecondlife.LLVector3 pos2 = new LLVector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z);
+ byte[] pb = pos2.GetBytes();
+ Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
+
+ OutPacket(objupdate);
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity)
+ {
+ ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = this.CreateAvatarImprovedBlock(localID, position, velocity);
+ ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+ terse.RegionData.RegionHandle = regionHandle;
+ terse.RegionData.TimeDilation = timeDilation;
+ terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
+ terse.ObjectData[0] = terseBlock;
+
+ this.OutPacket(terse);
+ }
+
+ #endregion
+
+ #region Primitive Packet/data Sending Methods
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint)
+ {
+ ObjectAttachPacket attach = new ObjectAttachPacket();
+ attach.AgentData.AgentID = this.AgentID;
+ attach.AgentData.SessionID = this.SessionID;
+ attach.AgentData.AttachmentPoint = attachPoint;
+ attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
+ attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
+ attach.ObjectData[0].ObjectLocalID = localID;
+ attach.ObjectData[0].Rotation = rotation;
+
+ this.OutPacket(attach);
+ }
+
+ ///
+ /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
+ /// or big changes to a existing primitive.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags)
+ {
+ ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
+ outPacket.RegionData.RegionHandle = regionHandle;
+ outPacket.RegionData.TimeDilation = timeDilation;
+ outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
+ outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
+ outPacket.ObjectData[0].ID = localID;
+ outPacket.ObjectData[0].FullID = primData.FullID;
+ byte[] pb = pos.GetBytes();
+ Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
+ byte[] rot = rotation.GetBytes();
+ Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 48, rot.Length);
+ OutPacket(outPacket);
+ }
+
+ ///
+ /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
+ /// or big changes to a existing primitive.
+ /// Uses default rotation
+ ///
+ ///
+ ///
+ public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID , uint flags)
+ {
+ ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
+ outPacket.RegionData.RegionHandle = regionHandle;
+ outPacket.RegionData.TimeDilation = timeDilation;
+ outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
+ outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
+ outPacket.ObjectData[0].ID = localID;
+ outPacket.ObjectData[0].FullID = primData.FullID;
+ byte[] pb = pos.GetBytes();
+ Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
+
+ OutPacket(outPacket);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation)
+ {
+ ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+ terse.RegionData.RegionHandle = regionHandle;
+ terse.RegionData.TimeDilation = timeDilation;
+ terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
+ terse.ObjectData[0] = this.CreatePrimImprovedBlock(localID, position, rotation);
+
+ this.OutPacket(terse);
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Helper Methods
+
+ protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, LLVector3 pos, LLVector3 velocity)
+ {
+ byte[] bytes = new byte[60];
+ int i = 0;
+ ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
+
+ dat.TextureEntry = new byte[0];// AvatarTemplate.TextureEntry;
+
+ uint ID = localID;
+
+ 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 = pos.GetBytes();
+ Array.Copy(pb, 0, bytes, i, pb.Length);
+ i += 12;
+ ushort InternVelocityX;
+ ushort InternVelocityY;
+ ushort InternVelocityZ;
+ Axiom.MathLib.Vector3 internDirec = new Axiom.MathLib.Vector3(0, 0, 0);
+
+ internDirec = new Axiom.MathLib.Vector3(velocity.X, velocity.Y, velocity.Z);
+
+ internDirec = internDirec / 128.0f;
+ internDirec.x += 1;
+ internDirec.y += 1;
+ internDirec.z += 1;
+
+ InternVelocityX = (ushort)(32768 * internDirec.x);
+ InternVelocityY = (ushort)(32768 * internDirec.y);
+ InternVelocityZ = (ushort)(32768 * internDirec.z);
+
+ ushort ac = 32767;
+ bytes[i++] = (byte)(InternVelocityX % 256);
+ bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
+ bytes[i++] = (byte)(InternVelocityY % 256);
+ bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
+ bytes[i++] = (byte)(InternVelocityZ % 256);
+ bytes[i++] = (byte)((InternVelocityZ >> 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;
+ return (dat);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID, LLVector3 position, LLQuaternion rotation)
+ {
+ uint ID = localID;
+ byte[] bytes = new byte[60];
+
+ int i = 0;
+ ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
+ dat.TextureEntry = new byte[0];
+ 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 = position.GetBytes();
+ 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 * (rotation.W + 1));
+ rx = (ushort)(32768 * (rotation.X + 1));
+ ry = (ushort)(32768 * (rotation.Y + 1));
+ rz = (ushort)(32768 * (rotation.Z + 1));
+
+ //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;
+ return dat;
+ }
+
+
+ ///
+ /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
+ ///
+ ///
+ ///
+ protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimData primData, LLUUID textureID, uint flags)
+ {
+ ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
+ this.SetDefaultPrimPacketValues(objupdate);
+ objupdate.UpdateFlags = flags;
+ this.SetPrimPacketShapeData(objupdate, primData, textureID);
+
+ return objupdate;
+ }
+
+ ///
+ /// Copy the data from a PrimData object to a ObjectUpdatePacket
+ ///
+ ///
+ ///
+ protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimData primData, LLUUID textureID)
+ {
+ LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID);
+ objectData.TextureEntry = ntex.ToBytes();
+ objectData.OwnerID = primData.OwnerID;
+ objectData.PCode = primData.PCode;
+ objectData.PathBegin = primData.PathBegin;
+ objectData.PathEnd = primData.PathEnd;
+ objectData.PathScaleX = primData.PathScaleX;
+ objectData.PathScaleY = primData.PathScaleY;
+ objectData.PathShearX = primData.PathShearX;
+ objectData.PathShearY = primData.PathShearY;
+ objectData.PathSkew = primData.PathSkew;
+ objectData.ProfileBegin = primData.ProfileBegin;
+ objectData.ProfileEnd = primData.ProfileEnd;
+ objectData.Scale = primData.Scale;
+ objectData.PathCurve = primData.PathCurve;
+ objectData.ProfileCurve = primData.ProfileCurve;
+ objectData.ParentID = primData.ParentID;
+ objectData.ProfileHollow = primData.ProfileHollow;
+ objectData.PathRadiusOffset = primData.PathRadiusOffset;
+ objectData.PathRevolutions = primData.PathRevolutions;
+ objectData.PathTaperX = primData.PathTaperX;
+ objectData.PathTaperY = primData.PathTaperY;
+ objectData.PathTwist = primData.PathTwist;
+ objectData.PathTwistBegin = primData.PathTwistBegin;
+ }
+
+ ///
+ /// Set some default values in a ObjectUpdatePacket
+ ///
+ ///
+ protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata)
+ {
+ objdata.PSBlock = new byte[0];
+ objdata.ExtraParams = new byte[1];
+ objdata.MediaURL = new byte[0];
+ objdata.NameValue = new byte[0];
+ objdata.Text = new byte[0];
+ objdata.TextColor = new byte[4];
+ objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0);
+ objdata.JointPivot = new LLVector3(0, 0, 0);
+ objdata.Material = 3;
+ objdata.TextureAnim = new byte[0];
+ objdata.Sound = LLUUID.Zero;
+ objdata.State = 0;
+ objdata.Data = new byte[0];
+
+ objdata.ObjectData = new byte[60];
+ objdata.ObjectData[46] = 128;
+ objdata.ObjectData[47] = 63;
+ }
+
+
+ ///
+ ///
+ ///
+ ///
+ protected ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry)
+ {
+ libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock(); // new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
+
+ SetDefaultAvatarPacketValues(ref objdata);
+ objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
+ objdata.PathCurve = 16;
+ objdata.ProfileCurve = 1;
+ objdata.PathScaleX = 100;
+ objdata.PathScaleY = 100;
+ objdata.ParentID = 0;
+ objdata.OwnerID = LLUUID.Zero;
+ objdata.Scale = new LLVector3(1, 1, 1);
+ objdata.PCode = 47;
+ if (textureEntry != null)
+ {
+ objdata.TextureEntry = textureEntry;
+ }
+ 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(100f, 100f, 23f);
+ //objdata.FullID=user.AgentID;
+ byte[] pb = pos.GetBytes();
+ Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
+
+ return objdata;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata)
+ {
+ objdata.PSBlock = new byte[0];
+ objdata.ExtraParams = new byte[1];
+ objdata.MediaURL = new byte[0];
+ objdata.NameValue = new byte[0];
+ objdata.Text = new byte[0];
+ objdata.TextColor = new byte[4];
+ objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0);
+ objdata.JointPivot = new LLVector3(0, 0, 0);
+ objdata.Material = 4;
+ objdata.TextureAnim = new byte[0];
+ objdata.Sound = LLUUID.Zero;
+ LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
+ objdata.TextureEntry = ntex.ToBytes();
+ objdata.State = 0;
+ objdata.Data = new byte[0];
+
+ objdata.ObjectData = new byte[76];
+ objdata.ObjectData[15] = 128;
+ objdata.ObjectData[16] = 63;
+ objdata.ObjectData[56] = 128;
+ objdata.ObjectData[61] = 102;
+ objdata.ObjectData[62] = 40;
+ objdata.ObjectData[63] = 61;
+ objdata.ObjectData[64] = 189;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected PrimData CreatePrimFromObjectAdd(ObjectAddPacket addPacket)
+ {
+ PrimData PData = new PrimData();
+ PData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+ PData.PCode = addPacket.ObjectData.PCode;
+ PData.PathBegin = addPacket.ObjectData.PathBegin;
+ PData.PathEnd = addPacket.ObjectData.PathEnd;
+ PData.PathScaleX = addPacket.ObjectData.PathScaleX;
+ PData.PathScaleY = addPacket.ObjectData.PathScaleY;
+ PData.PathShearX = addPacket.ObjectData.PathShearX;
+ PData.PathShearY = addPacket.ObjectData.PathShearY;
+ PData.PathSkew = addPacket.ObjectData.PathSkew;
+ PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
+ PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
+ PData.Scale = addPacket.ObjectData.Scale;
+ PData.PathCurve = addPacket.ObjectData.PathCurve;
+ PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
+ PData.ParentID = 0;
+ PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
+ PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
+ PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
+ PData.PathTaperX = addPacket.ObjectData.PathTaperX;
+ PData.PathTaperY = addPacket.ObjectData.PathTaperY;
+ PData.PathTwist = addPacket.ObjectData.PathTwist;
+ PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
+
+ return PData;
+ }
+ #endregion
+
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs
new file mode 100644
index 0000000..914c38a
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs
@@ -0,0 +1,358 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using OpenSim.Assets;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Utilities;
+using OpenSim.Caches;
+using libsecondlife;
+using libsecondlife.Packets;
+
+namespace OpenSim
+{
+ partial class ClientView
+ {
+ public class AgentAssetUpload
+ {
+ private Dictionary transactions = new Dictionary();
+ private ClientView ourClient;
+ private AssetCache m_assetCache;
+ private InventoryCache m_inventoryCache;
+
+ public AgentAssetUpload(ClientView client, AssetCache assetCache, InventoryCache inventoryCache)
+ {
+ this.ourClient = client;
+ m_assetCache = assetCache;
+ m_inventoryCache = inventoryCache;
+ }
+
+ public void AddUpload(LLUUID transactionID, AssetBase asset)
+ {
+ AssetTransaction upload = new AssetTransaction();
+ lock (this.transactions)
+ {
+ upload.Asset = asset;
+ upload.TransactionID = transactionID;
+ this.transactions.Add(transactionID, upload);
+ }
+ if (upload.Asset.Data.Length > 2)
+ {
+ //is complete
+ upload.UploadComplete = true;
+ AssetUploadCompletePacket response = new AssetUploadCompletePacket();
+ response.AssetBlock.Type = asset.Type;
+ response.AssetBlock.Success = true;
+ response.AssetBlock.UUID = transactionID.Combine(this.ourClient.SecureSessionID);
+ this.ourClient.OutPacket(response);
+ m_assetCache.AddAsset(asset);
+ }
+ else
+ {
+ upload.UploadComplete = false;
+ upload.XferID = Util.GetNextXferID();
+ RequestXferPacket xfer = new RequestXferPacket();
+ xfer.XferID.ID = upload.XferID;
+ xfer.XferID.VFileType = upload.Asset.Type;
+ xfer.XferID.VFileID = transactionID.Combine(this.ourClient.SecureSessionID);
+ xfer.XferID.FilePath = 0;
+ xfer.XferID.Filename = new byte[0];
+ this.ourClient.OutPacket(xfer);
+ }
+
+ }
+
+ public AssetBase GetUpload(LLUUID transactionID)
+ {
+ if (this.transactions.ContainsKey(transactionID))
+ {
+ return this.transactions[transactionID].Asset;
+ }
+
+ return null;
+ }
+
+ public void HandleUploadPacket(AssetUploadRequestPacket pack, LLUUID assetID)
+ {
+ // Console.Write("asset upload request , type = " + pack.AssetBlock.Type.ToString());
+ AssetBase asset = null;
+ if (pack.AssetBlock.Type == 0)
+ {
+
+ //first packet for transaction
+ asset = new AssetBase();
+ asset.FullID = assetID;
+ asset.Type = pack.AssetBlock.Type;
+ asset.InvType = asset.Type;
+ asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
+ asset.Data = pack.AssetBlock.AssetData;
+
+
+ }
+ else if (pack.AssetBlock.Type == 13 | pack.AssetBlock.Type == 5 | pack.AssetBlock.Type == 7)
+ {
+
+ asset = new AssetBase();
+ asset.FullID = assetID;
+ // Console.WriteLine("skin asset id is " + assetID.ToStringHyphenated());
+ asset.Type = pack.AssetBlock.Type;
+ asset.InvType = asset.Type;
+ asset.Name = "NewClothing" + Util.RandomClass.Next(1, 1000).ToString("000");
+ asset.Data = pack.AssetBlock.AssetData;
+
+
+ }
+
+ if (asset != null)
+ {
+ this.AddUpload(pack.AssetBlock.TransactionID, asset);
+ }
+ else
+ {
+
+ //currently we don't support this asset type
+ //so lets just tell the client that the upload is complete
+ AssetUploadCompletePacket response = new AssetUploadCompletePacket();
+ response.AssetBlock.Type = pack.AssetBlock.Type;
+ response.AssetBlock.Success = true;
+ response.AssetBlock.UUID = pack.AssetBlock.TransactionID.Combine(this.ourClient.SecureSessionID);
+ this.ourClient.OutPacket(response);
+ }
+
+ }
+
+ #region Xfer packet system for larger uploads
+
+ public void HandleXferPacket(SendXferPacketPacket xferPacket)
+ {
+ lock (this.transactions)
+ {
+ foreach (AssetTransaction trans in this.transactions.Values)
+ {
+ if (trans.XferID == xferPacket.XferID.ID)
+ {
+ if (trans.Asset.Data.Length > 1)
+ {
+ byte[] newArray = new byte[trans.Asset.Data.Length + xferPacket.DataPacket.Data.Length];
+ Array.Copy(trans.Asset.Data, 0, newArray, 0, trans.Asset.Data.Length);
+ Array.Copy(xferPacket.DataPacket.Data, 0, newArray, trans.Asset.Data.Length, xferPacket.DataPacket.Data.Length);
+ trans.Asset.Data = newArray;
+ }
+ else
+ {
+ byte[] newArray = new byte[xferPacket.DataPacket.Data.Length - 4];
+ Array.Copy(xferPacket.DataPacket.Data, 4, newArray, 0, xferPacket.DataPacket.Data.Length - 4);
+ trans.Asset.Data = newArray;
+ }
+
+ if ((xferPacket.XferID.Packet & 2147483648) != 0)
+ {
+ //end of transfer
+ trans.UploadComplete = true;
+ AssetUploadCompletePacket response = new AssetUploadCompletePacket();
+ response.AssetBlock.Type = trans.Asset.Type;
+ response.AssetBlock.Success = true;
+ response.AssetBlock.UUID = trans.TransactionID.Combine(this.ourClient.SecureSessionID);
+ this.ourClient.OutPacket(response);
+
+ m_assetCache.AddAsset(trans.Asset);
+ //check if we should add it to inventory
+ if (trans.AddToInventory)
+ {
+ // m_assetCache.AddAsset(trans.Asset);
+ m_inventoryCache.AddNewInventoryItem(this.ourClient, trans.InventFolder, trans.Asset);
+ }
+
+
+ }
+ break;
+ }
+
+ }
+ }
+
+ ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket();
+ confirmXfer.XferID.ID = xferPacket.XferID.ID;
+ confirmXfer.XferID.Packet = xferPacket.XferID.Packet;
+ this.ourClient.OutPacket(confirmXfer);
+ }
+
+ #endregion
+
+ public AssetBase AddUploadToAssetCache(LLUUID transactionID)
+ {
+ AssetBase asset = null;
+ if (this.transactions.ContainsKey(transactionID))
+ {
+ AssetTransaction trans = this.transactions[transactionID];
+ if (trans.UploadComplete)
+ {
+ m_assetCache.AddAsset(trans.Asset);
+ asset = trans.Asset;
+ }
+ }
+
+ return asset;
+ }
+
+ public void CreateInventoryItem(CreateInventoryItemPacket packet)
+ {
+ if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID))
+ {
+ AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID];
+ trans.Asset.Description = Util.FieldToString(packet.InventoryBlock.Description);
+ trans.Asset.Name = Util.FieldToString(packet.InventoryBlock.Name);
+ trans.Asset.Type = packet.InventoryBlock.Type;
+ trans.Asset.InvType = packet.InventoryBlock.InvType;
+ if (trans.UploadComplete)
+ {
+ //already complete so we can add it to the inventory
+ //m_assetCache.AddAsset(trans.Asset);
+ m_inventoryCache.AddNewInventoryItem(this.ourClient, packet.InventoryBlock.FolderID, trans.Asset);
+ }
+ else
+ {
+ trans.AddToInventory = true;
+ trans.InventFolder = packet.InventoryBlock.FolderID;
+ }
+ }
+ }
+
+ private class AssetTransaction
+ {
+ public uint XferID;
+ public AssetBase Asset;
+ public bool AddToInventory;
+ public LLUUID InventFolder = LLUUID.Zero;
+ public bool UploadComplete = false;
+ public LLUUID TransactionID = LLUUID.Zero;
+
+ public AssetTransaction()
+ {
+
+ }
+ }
+
+ //new class , not currently used.
+ public class AssetXferUploader
+ {
+ private IClientAPI ourClient;
+
+ public bool UploadComplete = false;
+
+ public bool AddToInventory;
+ public LLUUID InventFolder = LLUUID.Zero;
+
+ public uint XferID;
+ public AssetBase Asset;
+ public LLUUID TransactionID = LLUUID.Zero;
+
+
+ public AssetXferUploader(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data)
+ {
+ ourClient = remoteClient;
+ Asset = new AssetBase();
+ Asset.FullID = assetID;
+ Asset.InvType = type;
+ Asset.Type = type;
+ Asset.Data = data;
+ Asset.Name = "blank";
+ Asset.Description = "empty";
+ TransactionID = transaction;
+
+ if (Asset.Data.Length > 2)
+ {
+ //data block should only have data in it, if there is no more data to be uploaded
+ this.SendCompleteMessage();
+ }
+ else
+ {
+ this.ReqestStartXfer();
+ }
+ }
+
+ protected void SendCompleteMessage()
+ {
+ UploadComplete = true;
+ AssetUploadCompletePacket response = new AssetUploadCompletePacket();
+ response.AssetBlock.Type = Asset.Type;
+ response.AssetBlock.Success = true;
+ response.AssetBlock.UUID = Asset.FullID;
+ this.ourClient.OutPacket(response);
+
+ //TODO trigger event
+ }
+
+ protected void ReqestStartXfer()
+ {
+ UploadComplete = false;
+ XferID = Util.GetNextXferID();
+ RequestXferPacket xfer = new RequestXferPacket();
+ xfer.XferID.ID = XferID;
+ xfer.XferID.VFileType = Asset.Type;
+ xfer.XferID.VFileID = Asset.FullID;
+ xfer.XferID.FilePath = 0;
+ xfer.XferID.Filename = new byte[0];
+ this.ourClient.OutPacket(xfer);
+ }
+
+ public void HandleXferPacket(uint xferID, uint packetID, byte[] data)
+ {
+ if (XferID == xferID)
+ {
+ if (Asset.Data.Length > 1)
+ {
+ byte[] newArray = new byte[Asset.Data.Length + data.Length];
+ Array.Copy(Asset.Data, 0, newArray, 0, Asset.Data.Length);
+ Array.Copy(data, 0, newArray, Asset.Data.Length, data.Length);
+ Asset.Data = newArray;
+ }
+ else
+ {
+ byte[] newArray = new byte[data.Length - 4];
+ Array.Copy(data, 4, newArray, 0, data.Length - 4);
+ Asset.Data = newArray;
+ }
+
+ ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket();
+ confirmXfer.XferID.ID = xferID;
+ confirmXfer.XferID.Packet = packetID;
+ this.ourClient.OutPacket(confirmXfer);
+
+ if ((packetID & 2147483648) != 0)
+ {
+ this.SendCompleteMessage();
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs
new file mode 100644
index 0000000..32aed02
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs
@@ -0,0 +1,198 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using Nwc.XmlRpc;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using System.Threading;
+using System.Timers;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
+using OpenSim.Assets;
+
+namespace OpenSim
+{
+ public partial class ClientView
+ {
+ protected virtual void RegisterLocalPacketHandlers()
+ {
+ this.AddLocalPacketHandler(PacketType.LogoutRequest, this.Logout);
+ this.AddLocalPacketHandler(PacketType.AgentCachedTexture, this.AgentTextureCached);
+ this.AddLocalPacketHandler(PacketType.MultipleObjectUpdate, this.MultipleObjUpdate);
+ }
+
+ protected virtual bool Logout(ClientView simClient, Packet packet)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "OpenSimClient.cs:ProcessInPacket() - Got a logout request");
+ //send reply to let the client logout
+ LogoutReplyPacket logReply = new LogoutReplyPacket();
+ logReply.AgentData.AgentID = this.AgentID;
+ logReply.AgentData.SessionID = this.SessionID;
+ logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
+ logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
+ logReply.InventoryData[0].ItemID = LLUUID.Zero;
+ OutPacket(logReply);
+ //tell all clients to kill our object
+ KillObjectPacket kill = new KillObjectPacket();
+ kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
+ kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
+ // kill.ObjectData[0].ID = this.ClientAvatar.localid;
+ foreach (ClientView client in m_clientThreads.Values)
+ {
+ client.OutPacket(kill);
+ }
+
+ this.m_inventoryCache.ClientLeaving(this.AgentID, null);
+
+
+ // m_gridServer.LogoutSession(this.SessionID, this.AgentID, this.CircuitCode);
+ /*lock (m_world.Entities)
+ {
+ m_world.Entities.Remove(this.AgentID);
+ }*/
+ // m_world.RemoveViewerAgent(this);
+ //need to do other cleaning up here too
+ m_clientThreads.Remove(this.CircuitCode);
+ m_networkServer.RemoveClientCircuit(this.CircuitCode);
+ this.ClientThread.Abort();
+ return true;
+ }
+
+ protected bool AgentTextureCached(ClientView simclient, Packet packet)
+ {
+ // Console.WriteLine(packet.ToString());
+ AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet;
+ AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket();
+ cachedresp.AgentData.AgentID = this.AgentID;
+ cachedresp.AgentData.SessionID = this.SessionID;
+ cachedresp.AgentData.SerialNum = this.cachedtextureserial;
+ this.cachedtextureserial++;
+ cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[chechedtex.WearableData.Length];
+ for (int i = 0; i < chechedtex.WearableData.Length; i++)
+ {
+ cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
+ cachedresp.WearableData[i].TextureIndex = chechedtex.WearableData[i].TextureIndex;
+ cachedresp.WearableData[i].TextureID = LLUUID.Zero;
+ cachedresp.WearableData[i].HostName = new byte[0];
+ }
+ this.OutPacket(cachedresp);
+ return true;
+ }
+
+ protected bool MultipleObjUpdate(ClientView simClient, Packet packet)
+ {
+ MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
+ for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
+ {
+ if (multipleupdate.ObjectData[i].Type == 9) //change position
+ {
+ if (OnUpdatePrimPosition != null)
+ {
+ libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
+ OnUpdatePrimPosition(multipleupdate.ObjectData[i].ObjectLocalID, pos, this);
+ }
+ //should update stored position of the prim
+ }
+ else if (multipleupdate.ObjectData[i].Type == 10)//rotation
+ {
+ if (OnUpdatePrimRotation != null)
+ {
+ libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
+ OnUpdatePrimRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this);
+ }
+ }
+ else if (multipleupdate.ObjectData[i].Type == 13)//scale
+ {
+ if (OnUpdatePrimScale != null)
+ {
+ libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12);
+ OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this);
+ }
+ }
+ }
+ return true;
+ }
+
+ public void RequestMapLayer()
+ {
+ //should be getting the map layer from the grid server
+ //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
+ MapLayerReplyPacket mapReply = new MapLayerReplyPacket();
+ mapReply.AgentData.AgentID = this.AgentID;
+ mapReply.AgentData.Flags = 0;
+ mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
+ mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
+ mapReply.LayerData[0].Bottom = 0;
+ mapReply.LayerData[0].Left = 0;
+ mapReply.LayerData[0].Top = 30000;
+ mapReply.LayerData[0].Right = 30000;
+ mapReply.LayerData[0].ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
+ this.OutPacket(mapReply);
+ }
+
+ public void RequestMapBlocks(int minX, int minY, int maxX, int maxY)
+ {
+ /*
+ IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
+ MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
+ mbReply.AgentData.AgentID = this.AgentID;
+ int len;
+ if (simMapProfiles == null)
+ len = 0;
+ else
+ len = simMapProfiles.Count;
+
+ mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
+ int iii;
+ for (iii = 0; iii < len; iii++)
+ {
+ Hashtable mp = (Hashtable)simMapProfiles[iii];
+ mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
+ mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]);
+ mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
+ mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
+ mbReply.Data[iii].MapImageID = new LLUUID((string)mp["map-image-id"]);
+ mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
+ mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
+ mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
+ mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
+ }
+ this.OutPacket(mbReply);
+ */
+ }
+
+
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
new file mode 100644
index 0000000..191ef21
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -0,0 +1,550 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using Nwc.XmlRpc;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using System.Threading;
+using System.Timers;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
+using OpenSim.Assets;
+
+namespace OpenSim
+{
+ public partial class ClientView
+ {
+ protected override void ProcessInPacket(Packet Pack)
+ {
+ ack_pack(Pack);
+ if (debug)
+ {
+ if (Pack.Type != PacketType.AgentUpdate)
+ {
+ Console.WriteLine(Pack.Type.ToString());
+ }
+ }
+
+ if (this.ProcessPacketMethod(Pack))
+ {
+ //there is a handler registered that handled this packet type
+ return;
+ }
+ else
+ {
+ System.Text.Encoding _enc = System.Text.Encoding.ASCII;
+
+ switch (Pack.Type)
+ {
+ case PacketType.ViewerEffect:
+ ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
+ foreach (ClientView client in m_clientThreads.Values)
+ {
+ if (client.AgentID != this.AgentID)
+ {
+ viewer.AgentData.AgentID = client.AgentID;
+ viewer.AgentData.SessionID = client.SessionID;
+ client.OutPacket(viewer);
+ }
+ }
+ break;
+
+ #region World/Avatar
+ case PacketType.ChatFromViewer:
+ ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
+ if (Util.FieldToString(inchatpack.ChatData.Message) == "")
+ {
+ //empty message so don't bother with it
+ break;
+ }
+ string fromName = ""; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
+ byte[] message = inchatpack.ChatData.Message;
+ byte type = inchatpack.ChatData.Type;
+ LLVector3 fromPos = new LLVector3(); // ClientAvatar.Pos;
+ LLUUID fromAgentID = AgentID;
+ if (OnChatFromViewer != null)
+ {
+ this.OnChatFromViewer(message, type, fromPos, fromName, fromAgentID);
+ }
+ break;
+ case PacketType.RezObject:
+ RezObjectPacket rezPacket = (RezObjectPacket)Pack;
+ AgentInventory inven = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
+ if (inven != null)
+ {
+ if (inven.InventoryItems.ContainsKey(rezPacket.InventoryData.ItemID))
+ {
+ AssetBase asset = this.m_assetCache.GetAsset(inven.InventoryItems[rezPacket.InventoryData.ItemID].AssetID);
+ if (asset != null)
+ {
+ if (OnRezObject != null)
+ {
+ this.OnRezObject(asset, rezPacket.RezData.RayEnd);
+ this.m_inventoryCache.DeleteInventoryItem(this, rezPacket.InventoryData.ItemID);
+ }
+ }
+ }
+ }
+ break;
+ case PacketType.DeRezObject:
+ if (OnDeRezObject != null)
+ {
+ OnDeRezObject(Pack, this);
+ }
+ break;
+ case PacketType.ModifyLand:
+ ModifyLandPacket modify = (ModifyLandPacket)Pack;
+ if (modify.ParcelData.Length > 0)
+ {
+ if (OnModifyTerrain != null)
+ {
+ OnModifyTerrain(modify.ModifyBlock.Height, modify.ModifyBlock.Seconds, modify.ModifyBlock.BrushSize,
+ modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West);
+ }
+ }
+ break;
+ case PacketType.RegionHandshakeReply:
+ if (OnRegionHandShakeReply != null)
+ {
+ OnRegionHandShakeReply(this);
+ }
+ break;
+ case PacketType.AgentWearablesRequest:
+ if (OnRequestWearables != null)
+ {
+ OnRequestWearables(this);
+ }
+ if (OnRequestAvatarsData != null)
+ {
+ OnRequestAvatarsData(this);
+ }
+ break;
+ case PacketType.AgentSetAppearance:
+ AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
+ if (OnSetAppearance != null)
+ {
+ OnSetAppearance(appear.ObjectData.TextureEntry, appear.VisualParam);
+ }
+ break;
+ case PacketType.CompleteAgentMovement:
+ if (OnCompleteMovementToRegion != null)
+ {
+ OnCompleteMovementToRegion();
+ }
+ break;
+ case PacketType.AgentUpdate:
+ if (OnAgentUpdate != null)
+ {
+ AgentUpdatePacket agenUpdate = (AgentUpdatePacket) Pack;
+ OnAgentUpdate(this, agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotation );
+ }
+ break;
+ case PacketType.AgentAnimation:
+ if (!m_child)
+ {
+ AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
+ for (int i = 0; i < AgentAni.AnimationList.Length; i++)
+ {
+ if (AgentAni.AnimationList[i].StartAnim)
+ {
+ if (OnStartAnim != null)
+ {
+ OnStartAnim(AgentAni.AnimationList[i].AnimID, 1);
+ }
+ }
+ }
+ }
+ break;
+
+ #endregion
+
+ #region Objects/Prims
+ case PacketType.ObjectLink:
+ // OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString());
+ ObjectLinkPacket link = (ObjectLinkPacket)Pack;
+ uint parentprimid = 0;
+ List childrenprims = new List();
+ if (link.ObjectData.Length > 1)
+ {
+ parentprimid = link.ObjectData[0].ObjectLocalID;
+
+ for (int i = 1; i < link.ObjectData.Length; i++)
+ {
+ childrenprims.Add(link.ObjectData[i].ObjectLocalID);
+ }
+ }
+ if (OnLinkObjects != null)
+ {
+ OnLinkObjects(parentprimid, childrenprims);
+ }
+ break;
+ case PacketType.ObjectAdd:
+ // m_world.AddNewPrim((ObjectAddPacket)Pack, this);
+ if (OnAddPrim != null)
+ {
+ OnAddPrim(Pack, this);
+ }
+ break;
+ case PacketType.ObjectShape:
+ ObjectShapePacket shape = (ObjectShapePacket)Pack;
+ for (int i = 0; i < shape.ObjectData.Length; i++)
+ {
+ if (OnUpdatePrimShape != null)
+ {
+ OnUpdatePrimShape(shape.ObjectData[i].ObjectLocalID, shape.ObjectData[i]);
+ }
+ }
+ break;
+ case PacketType.ObjectSelect:
+ ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
+ for (int i = 0; i < incomingselect.ObjectData.Length; i++)
+ {
+ if (OnObjectSelect != null)
+ {
+ OnObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
+ }
+ }
+ break;
+ case PacketType.ObjectFlagUpdate:
+ ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
+ if (OnUpdatePrimFlags != null)
+ {
+ OnUpdatePrimFlags(flags.AgentData.ObjectLocalID, Pack, this);
+ }
+ break;
+ case PacketType.ObjectImage:
+ ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
+ for (int i = 0; i < imagePack.ObjectData.Length; i++)
+ {
+ if (OnUpdatePrimTexture != null)
+ {
+ OnUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID, imagePack.ObjectData[i].TextureEntry, this);
+ }
+ }
+ break;
+ case PacketType.ObjectGrab:
+ ObjectGrabPacket grap = (ObjectGrabPacket)Pack;
+ if (OnGrapObject != null)
+ {
+ OnGrapObject(grap.ObjectData.LocalID, grap.ObjectData.GrabOffset, this);
+ }
+ break;
+ case PacketType.ObjectGrabUpdate:
+ ObjectGrabUpdatePacket grapUpdate = (ObjectGrabUpdatePacket)Pack;
+ if (OnGrapUpdate != null)
+ {
+ OnGrapUpdate(grapUpdate.ObjectData.ObjectID, grapUpdate.ObjectData.GrabOffsetInitial, grapUpdate.ObjectData.GrabPosition, this);
+ }
+ break;
+ case PacketType.ObjectDeGrab:
+ ObjectDeGrabPacket deGrap = (ObjectDeGrabPacket)Pack;
+ if (OnDeGrapObject != null)
+ {
+ OnDeGrapObject(deGrap.ObjectData.LocalID, this);
+ }
+ break;
+ #endregion
+
+ #region Inventory/Asset/Other related packets
+ case PacketType.RequestImage:
+ RequestImagePacket imageRequest = (RequestImagePacket)Pack;
+ for (int i = 0; i < imageRequest.RequestImage.Length; i++)
+ {
+ m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
+ }
+ break;
+ case PacketType.TransferRequest:
+ //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
+ TransferRequestPacket transfer = (TransferRequestPacket)Pack;
+ m_assetCache.AddAssetRequest(this, transfer);
+ break;
+ case PacketType.AssetUploadRequest:
+ AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
+ this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID));
+ break;
+ case PacketType.RequestXfer:
+ //Console.WriteLine(Pack.ToString());
+ break;
+ case PacketType.SendXferPacket:
+ this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack);
+ break;
+ case PacketType.CreateInventoryFolder:
+ CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
+ m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
+ //Console.WriteLine(Pack.ToString());
+ break;
+ case PacketType.CreateInventoryItem:
+ //Console.WriteLine(Pack.ToString());
+ CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
+ if (createItem.InventoryBlock.TransactionID != LLUUID.Zero)
+ {
+ this.UploadAssets.CreateInventoryItem(createItem);
+ }
+ else
+ {
+ // Console.Write(Pack.ToString());
+ this.CreateInventoryItem(createItem);
+ }
+ break;
+ case PacketType.FetchInventory:
+ //Console.WriteLine("fetch item packet");
+ FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
+ m_inventoryCache.FetchInventory(this, FetchInventory);
+ break;
+ case PacketType.FetchInventoryDescendents:
+ FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
+ m_inventoryCache.FetchInventoryDescendents(this, Fetch);
+ break;
+ case PacketType.UpdateInventoryItem:
+ UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
+ //Console.WriteLine(Pack.ToString());
+ for (int i = 0; i < update.InventoryData.Length; i++)
+ {
+ if (update.InventoryData[i].TransactionID != LLUUID.Zero)
+ {
+ AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID));
+ if (asset != null)
+ {
+ // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache");
+ m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
+ }
+ else
+ {
+ asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID);
+ if (asset != null)
+ {
+ //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache");
+ m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
+ }
+ else
+ {
+ //Console.WriteLine("trying to update inventory item, but asset is null");
+ }
+ }
+ }
+ else
+ {
+ m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ;
+ }
+ }
+ break;
+ case PacketType.RequestTaskInventory:
+ // Console.WriteLine(Pack.ToString());
+ RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
+ ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
+ bool foundent = false;
+ /* foreach (Entity ent in m_world.Entities.Values)
+ {
+ if (ent.localid == requesttask.InventoryData.LocalID)
+ {
+ replytask.InventoryData.TaskID = ent.uuid;
+ replytask.InventoryData.Serial = 0;
+ replytask.InventoryData.Filename = new byte[0];
+ foundent = true;
+ }
+ }
+ if (foundent)
+ {
+ this.OutPacket(replytask);
+ }*/
+ break;
+ case PacketType.UpdateTaskInventory:
+ // Console.WriteLine(Pack.ToString());
+ UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
+ AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
+ /*if (myinventory != null)
+ {
+ if (updatetask.UpdateData.Key == 0)
+ {
+ if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null)
+ {
+ if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7)
+ {
+ LLUUID noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID;
+ AssetBase assBase = this.m_assetCache.GetAsset(noteaid);
+ if (assBase != null)
+ {
+ foreach (Entity ent in m_world.Entities.Values)
+ {
+ if (ent.localid == updatetask.UpdateData.LocalID)
+ {
+ if (ent is OpenSim.world.Primitive)
+ {
+ this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }*/
+ break;
+ case PacketType.MapLayerRequest:
+ this.RequestMapLayer();
+ break;
+ case PacketType.MapBlockRequest:
+ MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
+ if (OnRequestMapBlocks != null)
+ {
+ OnRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
+ }
+ break;
+ case PacketType.TeleportLandmarkRequest:
+ TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
+
+ TeleportStartPacket tpStart = new TeleportStartPacket();
+ tpStart.Info.TeleportFlags = 8; // tp via lm
+ this.OutPacket(tpStart);
+
+ TeleportProgressPacket tpProgress = new TeleportProgressPacket();
+ tpProgress.Info.Message = (new System.Text.ASCIIEncoding()).GetBytes("sending_landmark");
+ tpProgress.Info.TeleportFlags = 8;
+ tpProgress.AgentData.AgentID = tpReq.Info.AgentID;
+ this.OutPacket(tpProgress);
+
+ // Fetch landmark
+ LLUUID lmid = tpReq.Info.LandmarkID;
+ AssetBase lma = this.m_assetCache.GetAsset(lmid);
+ if (lma != null)
+ {
+ AssetLandmark lm = new AssetLandmark(lma);
+
+ if (lm.RegionID == m_regionData.SimUUID)
+ {
+ TeleportLocalPacket tpLocal = new TeleportLocalPacket();
+
+ tpLocal.Info.AgentID = tpReq.Info.AgentID;
+ tpLocal.Info.TeleportFlags = 8; // Teleport via landmark
+ tpLocal.Info.LocationID = 2;
+ tpLocal.Info.Position = lm.Position;
+ OutPacket(tpLocal);
+ }
+ else
+ {
+ TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ tpCancel.Info.AgentID = tpReq.Info.AgentID;
+ tpCancel.Info.SessionID = tpReq.Info.SessionID;
+ OutPacket(tpCancel);
+ }
+ }
+ else
+ {
+ Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented");
+
+ TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ tpCancel.Info.AgentID = tpReq.Info.AgentID;
+ tpCancel.Info.SessionID = tpReq.Info.SessionID;
+ OutPacket(tpCancel);
+ }
+ break;
+ case PacketType.TeleportLocationRequest:
+ TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
+ // Console.WriteLine(tpLocReq.ToString());
+
+ if (OnTeleportLocationRequest != null)
+ {
+ OnTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position, tpLocReq.Info.LookAt, 16);
+ }
+ else
+ {
+ //no event handler so cancel request
+ TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
+ tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
+ OutPacket(tpCancel);
+ }
+ break;
+ #endregion
+
+ case PacketType.MoneyBalanceRequest:
+ this.SendMoneyBalance(LLUUID.Zero, true, new byte[0], 1000);
+ break;
+
+ #region Parcel related packets
+ case PacketType.ParcelPropertiesRequest:
+ ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
+ if (OnParcelPropertiesRequest != null)
+ {
+ OnParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West), (int)Math.Round(propertiesRequest.ParcelData.South), (int)Math.Round(propertiesRequest.ParcelData.East), (int)Math.Round(propertiesRequest.ParcelData.North), propertiesRequest.ParcelData.SequenceID, propertiesRequest.ParcelData.SnapSelection, this);
+ }
+ break;
+ case PacketType.ParcelDivide:
+ ParcelDividePacket parcelDivide = (ParcelDividePacket)Pack;
+ if (OnParcelDivideRequest != null)
+ {
+ OnParcelDivideRequest((int)Math.Round(parcelDivide.ParcelData.West), (int)Math.Round(parcelDivide.ParcelData.South), (int)Math.Round(parcelDivide.ParcelData.East), (int)Math.Round(parcelDivide.ParcelData.North), this);
+ }
+ break;
+ case PacketType.ParcelJoin:
+ ParcelJoinPacket parcelJoin = (ParcelJoinPacket)Pack;
+ if (OnParcelJoinRequest != null)
+ {
+ OnParcelJoinRequest((int)Math.Round(parcelJoin.ParcelData.West), (int)Math.Round(parcelJoin.ParcelData.South), (int)Math.Round(parcelJoin.ParcelData.East), (int)Math.Round(parcelJoin.ParcelData.North), this);
+ }
+ break;
+ case PacketType.ParcelPropertiesUpdate:
+ ParcelPropertiesUpdatePacket updatePacket = (ParcelPropertiesUpdatePacket)Pack;
+ if (OnParcelPropertiesUpdateRequest != null)
+ {
+ OnParcelPropertiesUpdateRequest(updatePacket, this);
+ }
+ break;
+ #endregion
+
+ #region Estate Packets
+ case PacketType.EstateOwnerMessage:
+ EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
+ if (OnEstateOwnerMessage != null)
+ {
+ OnEstateOwnerMessage(messagePacket, this);
+ }
+ break;
+ #endregion
+
+ #region unimplemented handlers
+ case PacketType.AgentIsNowWearing:
+ // AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
+ //Console.WriteLine(Pack.ToString());
+ break;
+ case PacketType.ObjectScale:
+ //OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString());
+ break;
+ #endregion
+ }
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
new file mode 100644
index 0000000..312da9d
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -0,0 +1,273 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using Nwc.XmlRpc;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using System.Threading;
+using System.Timers;
+using OpenSim.Framework;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
+using OpenSim.Assets;
+using OpenSim.Caches;
+
+namespace OpenSim
+{
+ public delegate bool PacketMethod(ClientView simClient, Packet packet);
+
+ ///
+ /// Handles new client connections
+ /// Constructor takes a single Packet and authenticates everything
+ ///
+ public partial class ClientView : ClientViewBase, IClientAPI
+ {
+ public static TerrainManager TerrainManager;
+
+ protected static Dictionary PacketHandlers = new Dictionary(); //Global/static handlers for all clients
+ protected Dictionary m_packetHandlers = new Dictionary(); //local handlers for this instance
+
+ public LLUUID AgentID;
+ public LLUUID SessionID;
+ public LLUUID SecureSessionID = LLUUID.Zero;
+ public string firstName;
+ public string lastName;
+ public bool m_child = false;
+ private UseCircuitCodePacket cirpack;
+ public Thread ClientThread;
+ public LLVector3 startpos;
+
+ private AgentAssetUpload UploadAssets;
+ private LLUUID newAssetFolder = LLUUID.Zero;
+ private bool debug = false;
+ protected IWorld m_world;
+ private Dictionary m_clientThreads;
+ private AssetCache m_assetCache;
+ private InventoryCache m_inventoryCache;
+ private int cachedtextureserial = 0;
+ private RegionInfo m_regionData;
+ protected AuthenticateSessionsBase m_authenticateSessionsHandler;
+
+ public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions )
+ {
+ m_world = world;
+ m_clientThreads = clientThreads;
+ m_assetCache = assetCache;
+
+ m_networkServer = packServer;
+ m_inventoryCache = inventoryCache;
+ m_authenticateSessionsHandler = authenSessions;
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "OpenSimClient.cs - Started up new client thread to handle incoming request");
+ cirpack = initialcirpack;
+ userEP = remoteEP;
+
+ this.startpos = m_authenticateSessionsHandler.GetPosition(initialcirpack.CircuitCode.Code);
+
+ PacketQueue = new BlockingQueue();
+
+ this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache);
+ AckTimer = new System.Timers.Timer(500);
+ AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed);
+ AckTimer.Start();
+
+ this.RegisterLocalPacketHandlers();
+
+ ClientThread = new Thread(new ThreadStart(AuthUser));
+ ClientThread.IsBackground = true;
+ ClientThread.Start();
+ }
+
+ # region Client Methods
+
+ public void KillClient()
+ {
+ KillObjectPacket kill = new KillObjectPacket();
+ kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
+ kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
+ //kill.ObjectData[0].ID = this.ClientAvatar.localid;
+ foreach (ClientView client in m_clientThreads.Values)
+ {
+ client.OutPacket(kill);
+ }
+
+ this.m_inventoryCache.ClientLeaving(this.AgentID, null);
+ m_world.RemoveClient(this.AgentId);
+
+ m_clientThreads.Remove(this.CircuitCode);
+ m_networkServer.RemoveClientCircuit(this.CircuitCode);
+ this.ClientThread.Abort();
+ }
+ #endregion
+
+ # region Packet Handling
+ public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
+ {
+ bool result = false;
+ lock (PacketHandlers)
+ {
+ if (!PacketHandlers.ContainsKey(packetType))
+ {
+ PacketHandlers.Add(packetType, handler);
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
+ {
+ bool result = false;
+ lock (m_packetHandlers)
+ {
+ if (!m_packetHandlers.ContainsKey(packetType))
+ {
+ m_packetHandlers.Add(packetType, handler);
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ protected virtual bool ProcessPacketMethod(Packet packet)
+ {
+ bool result = false;
+ bool found = false;
+ PacketMethod method;
+ if (m_packetHandlers.TryGetValue(packet.Type, out method))
+ {
+ //there is a local handler for this packet type
+ result = method(this, packet);
+ }
+ else
+ {
+ //there is not a local handler so see if there is a Global handler
+ lock (PacketHandlers)
+ {
+ found = PacketHandlers.TryGetValue(packet.Type, out method);
+ }
+ if (found)
+ {
+ result = method(this, packet);
+ }
+ }
+ return result;
+ }
+
+ protected virtual void ClientLoop()
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "OpenSimClient.cs:ClientLoop() - Entered loop");
+ while (true)
+ {
+ QueItem nextPacket = PacketQueue.Dequeue();
+ if (nextPacket.Incoming)
+ {
+ //is a incoming packet
+ ProcessInPacket(nextPacket.Packet);
+ }
+ else
+ {
+ //is a out going packet
+ ProcessOutPacket(nextPacket.Packet);
+ }
+ }
+ }
+ # endregion
+
+ # region Setup
+
+ protected virtual void InitNewClient()
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
+ this.m_world.AddNewClient(this, this.AgentID, false);
+ }
+
+ protected virtual void AuthUser()
+ {
+ // AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
+ AuthenticateResponse sessionInfo = this.m_authenticateSessionsHandler.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
+ if (!sessionInfo.Authorised)
+ {
+ //session/circuit not authorised
+ OpenSim.Framework.Console.MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - New user request denied to " + userEP.ToString());
+ ClientThread.Abort();
+ }
+ else
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - Got authenticated connection from " + userEP.ToString());
+ //session is authorised
+ this.AgentID = cirpack.CircuitCode.ID;
+ this.SessionID = cirpack.CircuitCode.SessionID;
+ this.CircuitCode = cirpack.CircuitCode.Code;
+ this.firstName = sessionInfo.LoginInfo.First;
+ this.lastName = sessionInfo.LoginInfo.Last;
+
+ if (sessionInfo.LoginInfo.SecureSession != LLUUID.Zero)
+ {
+ this.SecureSessionID = sessionInfo.LoginInfo.SecureSession;
+ }
+ InitNewClient();
+
+ ClientLoop();
+ }
+ }
+ # endregion
+
+
+ protected override void KillThread()
+ {
+ this.ClientThread.Abort();
+ }
+
+ #region Inventory Creation
+ private void SetupInventory(AuthenticateResponse sessionInfo)
+ {
+
+ }
+ private AgentInventory CreateInventory(LLUUID baseFolder)
+ {
+ AgentInventory inventory = null;
+
+ return inventory;
+ }
+
+ private void CreateInventoryItem(CreateInventoryItemPacket packet)
+ {
+
+ }
+ #endregion
+
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientViewBase.cs b/OpenSim/Region/ClientStack/ClientViewBase.cs
new file mode 100644
index 0000000..8b503f0
--- /dev/null
+++ b/OpenSim/Region/ClientStack/ClientViewBase.cs
@@ -0,0 +1,327 @@
+
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using System.Threading;
+using System.Timers;
+using OpenSim.Framework.Utilities;
+using OpenSim.Framework.Interfaces;
+
+namespace OpenSim
+{
+ public class ClientViewBase
+ {
+ protected BlockingQueue PacketQueue;
+ protected Dictionary PendingAcks = new Dictionary();
+ protected Dictionary NeedAck = new Dictionary();
+
+ protected System.Timers.Timer AckTimer;
+ protected uint Sequence = 0;
+ protected object SequenceLock = new object();
+ protected const int MAX_APPENDED_ACKS = 10;
+ protected const int RESEND_TIMEOUT = 4000;
+ protected const int MAX_SEQUENCE = 0xFFFFFF;
+
+ public uint CircuitCode;
+ public EndPoint userEP;
+
+ protected PacketServer m_networkServer;
+
+ public ClientViewBase()
+ {
+
+ }
+
+ protected virtual void ProcessInPacket(Packet Pack)
+ {
+
+ }
+
+ protected virtual void ProcessOutPacket(Packet Pack)
+ {
+ // Keep track of when this packet was sent out
+ Pack.TickCount = Environment.TickCount;
+
+ if (!Pack.Header.Resent)
+ {
+ // Set the sequence number
+ lock (SequenceLock)
+ {
+ if (Sequence >= MAX_SEQUENCE)
+ Sequence = 1;
+ else
+ Sequence++;
+ Pack.Header.Sequence = Sequence;
+ }
+
+ if (Pack.Header.Reliable) //DIRTY HACK
+ {
+ lock (NeedAck)
+ {
+ if (!NeedAck.ContainsKey(Pack.Header.Sequence))
+ {
+ try
+ {
+ NeedAck.Add(Pack.Header.Sequence, Pack);
+ }
+ catch (Exception e) // HACKY
+ {
+ e.ToString();
+ // Ignore
+ // Seems to throw a exception here occasionally
+ // of 'duplicate key' despite being locked.
+ // !?!?!?
+ }
+ }
+ 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 (!Pack.Header.Resent)
+ {
+ // Append any ACKs that need to be sent out to this packet
+ lock (PendingAcks)
+ {
+ if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS &&
+ Pack.Type != PacketType.PacketAck &&
+ Pack.Type != PacketType.LogoutRequest)
+ {
+ Pack.Header.AckList = new uint[PendingAcks.Count];
+ int i = 0;
+
+ foreach (uint ack in PendingAcks.Values)
+ {
+ Pack.Header.AckList[i] = ack;
+ i++;
+ }
+
+ PendingAcks.Clear();
+ Pack.Header.AppendedAcks = true;
+ }
+ }
+ }
+ }
+ }
+
+ byte[] ZeroOutBuffer = new byte[4096];
+ byte[] sendbuffer;
+ sendbuffer = Pack.ToBytes();
+
+ try
+ {
+ if (Pack.Header.Zerocoded)
+ {
+ int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
+ m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP);
+ }
+ else
+ {
+ m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP);
+ }
+ }
+ catch (Exception)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread");
+ this.KillThread();
+ }
+
+ }
+
+ public virtual void InPacket(Packet NewPack)
+ {
+ // Handle appended ACKs
+ if (NewPack.Header.AppendedAcks)
+ {
+ lock (NeedAck)
+ {
+ foreach (uint ack in NewPack.Header.AckList)
+ {
+ NeedAck.Remove(ack);
+ }
+ }
+ }
+
+ // Handle PacketAck packets
+ if (NewPack.Type == PacketType.PacketAck)
+ {
+ PacketAckPacket ackPacket = (PacketAckPacket)NewPack;
+
+ lock (NeedAck)
+ {
+ foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
+ {
+ NeedAck.Remove(block.ID);
+ }
+ }
+ }
+ else if ((NewPack.Type == PacketType.StartPingCheck))
+ {
+ //reply to pingcheck
+ libsecondlife.Packets.StartPingCheckPacket startPing = (libsecondlife.Packets.StartPingCheckPacket)NewPack;
+ libsecondlife.Packets.CompletePingCheckPacket endPing = new CompletePingCheckPacket();
+ endPing.PingID.PingID = startPing.PingID.PingID;
+ OutPacket(endPing);
+ }
+ else
+ {
+ QueItem item = new QueItem();
+ item.Packet = NewPack;
+ item.Incoming = true;
+ this.PacketQueue.Enqueue(item);
+ }
+
+ }
+
+ public virtual void OutPacket(Packet NewPack)
+ {
+ QueItem item = new QueItem();
+ item.Packet = NewPack;
+ item.Incoming = false;
+ this.PacketQueue.Enqueue(item);
+ }
+
+ # region Low Level Packet Methods
+
+ protected void ack_pack(Packet Pack)
+ {
+ if (Pack.Header.Reliable)
+ {
+ libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket();
+ ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
+ ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
+ ack_it.Packets[0].ID = Pack.Header.Sequence;
+ ack_it.Header.Reliable = false;
+
+ OutPacket(ack_it);
+
+ }
+ /*
+ if (Pack.Header.Reliable)
+ {
+ lock (PendingAcks)
+ {
+ uint sequence = (uint)Pack.Header.Sequence;
+ if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; }
+ }
+ }*/
+ }
+
+ protected void ResendUnacked()
+ {
+ int now = Environment.TickCount;
+
+ lock (NeedAck)
+ {
+ foreach (Packet packet in NeedAck.Values)
+ {
+ if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent))
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Resending " + packet.Type.ToString() + " packet, " +
+ (now - packet.TickCount) + "ms have passed");
+
+ packet.Header.Resent = true;
+ OutPacket(packet);
+ }
+ }
+ }
+ }
+
+ protected void SendAcks()
+ {
+ lock (PendingAcks)
+ {
+ if (PendingAcks.Count > 0)
+ {
+ if (PendingAcks.Count > 250)
+ {
+ // FIXME: Handle the odd case where we have too many pending ACKs queued up
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Too many ACKs queued up!");
+ return;
+ }
+
+ //OpenSim.Framework.Console.MainLog.Instance.WriteLine("Sending PacketAck");
+
+
+ int i = 0;
+ PacketAckPacket acks = new PacketAckPacket();
+ acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
+
+ foreach (uint ack in PendingAcks.Values)
+ {
+ acks.Packets[i] = new PacketAckPacket.PacketsBlock();
+ acks.Packets[i].ID = ack;
+ i++;
+ }
+
+ acks.Header.Reliable = false;
+ OutPacket(acks);
+
+ PendingAcks.Clear();
+ }
+ }
+ }
+
+ protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea)
+ {
+ SendAcks();
+ ResendUnacked();
+ }
+ #endregion
+
+ protected virtual void KillThread()
+ {
+
+ }
+
+ #region Nested Classes
+
+ public class QueItem
+ {
+ public QueItem()
+ {
+ }
+
+ public Packet Packet;
+ public bool Incoming;
+ }
+ #endregion
+ }
+}
diff --git a/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj
new file mode 100644
index 0000000..0b19359
--- /dev/null
+++ b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj
@@ -0,0 +1,173 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {DC3698B2-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.ClientStack
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.ClientStack
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ ..\..\..\bin\Db4objects.Db4o.dll
+ False
+
+
+ ..\..\..\bin\libsecondlife.dll
+ False
+
+
+ OpenSim.FrameworkGenericConfig.Xml.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ ..\..\..\bin\XMLRPC.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Servers
+ {2CC71860-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Caches
+ {61FCCDB3-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Terrain.BasicTerrain
+ {C9E0F891-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/ClientStack/PacketServer.cs b/OpenSim/Region/ClientStack/PacketServer.cs
new file mode 100644
index 0000000..229570c
--- /dev/null
+++ b/OpenSim/Region/ClientStack/PacketServer.cs
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework;
+using System.Net;
+using System.Net.Sockets;
+using OpenSim.Assets;
+using OpenSim.Caches;
+
+namespace OpenSim
+{
+ public class PacketServer
+ {
+ private ClientStackNetworkHandler _networkHandler;
+ private IWorld _localWorld;
+ public Dictionary ClientThreads = new Dictionary();
+ public Dictionary ClientAPIs = new Dictionary();
+ protected uint serverPort;
+
+ public PacketServer(ClientStackNetworkHandler networkHandler, uint port)
+ {
+ _networkHandler = networkHandler;
+ this.serverPort = port;
+ _networkHandler.RegisterPacketServer(this);
+ }
+
+ public IWorld LocalWorld
+ {
+ set
+ {
+ this._localWorld = value;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual void ClientInPacket(uint circuitCode, Packet packet)
+ {
+ if (this.ClientThreads.ContainsKey(circuitCode))
+ {
+ ClientThreads[circuitCode].InPacket(packet);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual bool AddNewCircuitCodeClient(uint circuitCode)
+ {
+ return false;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public virtual void SendPacketToAllClients(Packet packet)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual void SendPacketToAllExcept(Packet packet, ClientView simClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual void AddClientPacketHandler(PacketType packetType, PacketMethod handler)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public virtual void RegisterClientPacketHandlers()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected virtual ClientView CreateNewClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions)
+ {
+ return new ClientView(remoteEP, initialcirpack, clientThreads, world, assetCache, packServer, inventoryCache, authenSessions );
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual bool AddNewClient(EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, InventoryCache inventoryCache, AuthenticateSessionsBase authenticateSessionsClass)
+ {
+ ClientView newuser =
+ CreateNewClient(epSender, useCircuit, ClientThreads, _localWorld, assetCache, this, inventoryCache,
+ authenticateSessionsClass);
+
+ this.ClientThreads.Add(useCircuit.CircuitCode.Code, newuser);
+ this.ClientAPIs.Add(useCircuit.CircuitCode.Code, (IClientAPI)newuser);
+
+ return true;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)
+ {
+ this._networkHandler.SendPacketTo(buffer, size, flags, circuitcode);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public virtual void RemoveClientCircuit(uint circuitcode)
+ {
+ this._networkHandler.RemoveClientCircuit(circuitcode);
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
new file mode 100644
index 0000000..b421fbd
--- /dev/null
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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.Text;
+using System.IO;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using System.Timers;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Terrain;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework;
+using OpenSim.Assets;
+using OpenSim.Caches;
+using OpenSim.Framework.Console;
+using OpenSim.Physics.Manager;
+using Nwc.XmlRpc;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.GenericConfig;
+
+namespace OpenSim
+{
+ public class RegionApplicationBase
+ {
+ protected IGenericConfig localConfig;
+ protected PhysicsManager physManager;
+ protected AssetCache AssetCache;
+ protected InventoryCache InventoryCache;
+ protected Dictionary clientCircuits = new Dictionary();
+ protected DateTime startuptime;
+ protected NetworkServersInfo serversData;
+
+ public string m_physicsEngine;
+ public bool m_sandbox = false;
+ public bool m_loginserver;
+ public bool user_accounts = false;
+ public bool gridLocalAsset = false;
+ protected bool configFileSetup = false;
+ public string m_config;
+
+ protected List m_udpServer = new List();
+ protected List regionData = new List();
+ protected List m_localWorld = new List();
+ protected BaseHttpServer httpServer;
+ protected List AuthenticateSessionsHandler = new List();
+
+ protected LogBase m_log;
+
+ public RegionApplicationBase()
+ {
+
+ }
+
+ public RegionApplicationBase(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile)
+ {
+ this.configFileSetup = useConfigFile;
+ m_sandbox = sandBoxMode;
+ m_loginserver = startLoginServer;
+ m_physicsEngine = physicsEngine;
+ m_config = configFile;
+ }
+
+ /*protected World m_localWorld;
+ public World LocalWorld
+ {
+ get { return m_localWorld; }
+ }*/
+
+ ///
+ /// Performs initialisation of the world, such as loading configuration from disk.
+ ///
+ public virtual void StartUp()
+ {
+ }
+
+ protected virtual void SetupLocalGridServers()
+ {
+ }
+
+ protected virtual void SetupRemoteGridServers()
+ {
+
+ }
+
+ protected virtual void SetupWorld()
+ {
+ }
+
+ protected virtual void SetupHttpListener()
+ {
+ }
+
+ protected virtual void ConnectToRemoteGridServer()
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs
new file mode 100644
index 0000000..f2a02d9
--- /dev/null
+++ b/OpenSim/Region/ClientStack/UDPServer.cs
@@ -0,0 +1,208 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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.Text;
+using System.IO;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using System.Timers;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Terrain;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Assets;
+using OpenSim.Caches;
+using OpenSim.Framework.Console;
+using OpenSim.Framework;
+using Nwc.XmlRpc;
+using OpenSim.Servers;
+using OpenSim.GenericConfig;
+
+namespace OpenSim
+{
+
+ public class UDPServer : ClientStackNetworkHandler
+ {
+ protected Dictionary clientCircuits = new Dictionary();
+ public Socket Server;
+ protected IPEndPoint ServerIncoming;
+ protected byte[] RecvBuffer = new byte[4096];
+ protected byte[] ZeroBuffer = new byte[8192];
+ protected IPEndPoint ipeSender;
+ protected EndPoint epSender;
+ protected AsyncCallback ReceivedData;
+ protected PacketServer _packetServer;
+
+ protected int listenPort;
+ protected IWorld m_localWorld;
+ protected AssetCache m_assetCache;
+ protected InventoryCache m_inventoryCache;
+ protected LogBase m_log;
+ protected AuthenticateSessionsBase m_authenticateSessionsClass;
+
+ public PacketServer PacketServer
+ {
+ get
+ {
+ return _packetServer;
+ }
+ set
+ {
+ _packetServer = value;
+ }
+ }
+
+ public IWorld LocalWorld
+ {
+ set
+ {
+ this.m_localWorld = value;
+ this._packetServer.LocalWorld = this.m_localWorld;
+ }
+ }
+
+ public UDPServer()
+ {
+ }
+
+ public UDPServer(int port, AssetCache assetCache, InventoryCache inventoryCache, LogBase console, AuthenticateSessionsBase authenticateClass)
+ {
+ listenPort = port;
+ this.m_assetCache = assetCache;
+ this.m_inventoryCache = inventoryCache;
+ this.m_log = console;
+ this.m_authenticateSessionsClass = authenticateClass;
+ this.CreatePacketServer();
+
+ }
+
+ protected virtual void CreatePacketServer()
+ {
+ PacketServer packetServer = new PacketServer(this, (uint) listenPort);
+ }
+
+ protected virtual void OnReceivedData(IAsyncResult result)
+ {
+ ipeSender = new IPEndPoint(IPAddress.Any, 0);
+ epSender = (EndPoint)ipeSender;
+ Packet packet = null;
+ int numBytes = Server.EndReceiveFrom(result, ref epSender);
+ int packetEnd = numBytes - 1;
+
+ packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
+
+ // do we already have a circuit for this endpoint
+ if (this.clientCircuits.ContainsKey(epSender))
+ {
+ //if so then send packet to the packetserver
+ this._packetServer.ClientInPacket(this.clientCircuits[epSender], packet);
+ }
+ else if (packet.Type == PacketType.UseCircuitCode)
+ {
+ // new client
+ this.AddNewClient(packet);
+ }
+ else
+ { // invalid client
+ m_log.Warn("UDPServer.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
+ }
+
+ Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
+ }
+
+ protected virtual void AddNewClient(Packet packet)
+ {
+ UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet;
+ this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
+
+ this.PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_inventoryCache, m_authenticateSessionsClass);
+ }
+
+ public void ServerListener()
+ {
+ m_log.Status("UDPServer.cs:ServerListener() - Opening UDP socket on " + listenPort);
+
+ ServerIncoming = new IPEndPoint(IPAddress.Any, listenPort);
+ Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ Server.Bind(ServerIncoming);
+
+ m_log.Verbose("UDPServer.cs:ServerListener() - UDP socket bound, getting ready to listen");
+
+ ipeSender = new IPEndPoint(IPAddress.Any, 0);
+ epSender = (EndPoint)ipeSender;
+ ReceivedData = new AsyncCallback(this.OnReceivedData);
+ Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
+
+ m_log.Verbose("UDPServer.cs:ServerListener() - Listening...");
+
+ }
+
+ public virtual void RegisterPacketServer(PacketServer server)
+ {
+ this._packetServer = server;
+ }
+
+ public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)//EndPoint packetSender)
+ {
+ // find the endpoint for this circuit
+ EndPoint sendto = null;
+ foreach (KeyValuePair p in this.clientCircuits)
+ {
+ if (p.Value == circuitcode)
+ {
+ sendto = p.Key;
+ break;
+ }
+ }
+ if (sendto != null)
+ {
+ //we found the endpoint so send the packet to it
+ this.Server.SendTo(buffer, size, flags, sendto);
+ }
+ }
+
+ public virtual void RemoveClientCircuit(uint circuitcode)
+ {
+ foreach (KeyValuePair p in this.clientCircuits)
+ {
+ if (p.Value == circuitcode)
+ {
+ this.clientCircuits.Remove(p.Key);
+ break;
+ }
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ClientStack/VersionInfo.cs b/OpenSim/Region/ClientStack/VersionInfo.cs
new file mode 100644
index 0000000..5d1354e
--- /dev/null
+++ b/OpenSim/Region/ClientStack/VersionInfo.cs
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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
+{
+ ///
+ ///
+ public class VersionInfo
+ {
+ public static string Version = "0.3, SVN build ";
+ }
+}
diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
new file mode 100644
index 0000000..01e0c59
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
@@ -0,0 +1,113 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Console;
+using libsecondlife;
+using OpenSim.Region;
+using Avatar=OpenSim.Region.Scenes.ScenePresence;
+using OpenSim.Region.Scenes;
+using OpenSim.Framework;
+using OpenSim.Caches;
+using OpenGrid.Framework.Communications;
+using OpenSim.Servers;
+
+namespace SimpleApp
+{
+ public class MyWorld : Scene
+ {
+ private RegionInfo m_regionInfo;
+ private List m_avatars;
+
+ public MyWorld(Dictionary clientThreads, RegionInfo regionInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
+ : base(clientThreads, regionInfo, authen, commsMan, assetCach, httpServer)
+ {
+ m_regionInfo = regionInfo;
+ m_avatars = new List();
+ }
+
+ public override void SendLayerData(IClientAPI remoteClient)
+ {
+ float[] map = new float[65536];
+
+ for (int i = 0; i < 65536; i++)
+ {
+ int x = i % 256;
+ int y = i / 256;
+
+ map[i] = (float)(x + y / 2);
+ }
+
+ remoteClient.SendLayerData(map);
+ }
+
+ #region IWorld Members
+
+ override public void AddNewClient(IClientAPI client, LLUUID agentID, bool child)
+
+ {
+ LLVector3 pos = new LLVector3(128, 128, 128);
+
+ client.OnRegionHandShakeReply += SendLayerData;
+ client.OnChatFromViewer +=
+ delegate(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
+ {
+ // Echo it (so you know what you typed)
+ client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
+ client.SendChatMessage("Ready.", 1, pos, "System", LLUUID.Zero );
+ };
+
+ client.OnRequestWearables += SendWearables;
+
+ client.OnCompleteMovementToRegion += delegate()
+ {
+ client.MoveAgentIntoRegion(m_regionInfo, pos, LLVector3.Zero );
+ };
+
+ client.OnCompleteMovementToRegion += delegate()
+ {
+ client.SendAvatarData(m_regionInfo.RegionHandle, client.FirstName,
+ client.LastName, client.AgentId, 0,
+ pos, null);
+
+ client.SendChatMessage("Welcome to My World.", 1, pos, "System", LLUUID.Zero );
+ };
+
+ client.SendRegionHandshake(m_regionInfo);
+
+ OpenSim.Region.Scenes.ScenePresence avatar = new Avatar( client, this, m_regionInfo );
+
+ }
+
+ private void SendWearables( IClientAPI client )
+ {
+ client.SendWearables( AvatarWearable.DefaultWearables );
+ }
+
+
+ override public void RemoveClient(LLUUID agentID)
+ {
+
+ }
+
+ public RegionInfo RegionInfo
+ {
+ get { return m_regionInfo; }
+ }
+
+ public object SyncRoot
+ {
+ get { return this; }
+ }
+
+ private uint m_nextLocalId = 1;
+
+ public uint NextLocalId
+ {
+ get { return m_nextLocalId++; }
+ }
+
+ #endregion
+ }
+}
diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs
new file mode 100644
index 0000000..e1465d1
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/Program.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OpenSim;
+using OpenSim.GridInterfaces.Local;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Console;
+using OpenSim.Assets;
+using libsecondlife;
+using OpenSim.Servers;
+using OpenSim.Framework;
+using OpenSim.Caches;
+using OpenGrid.Framework.Communications;
+using OpenSim.LocalCommunications;
+
+namespace SimpleApp
+{
+ class Program : IAssetReceiver, conscmd_callback
+ {
+ private LogBase m_log;
+ AuthenticateSessionsBase m_circuitManager;
+
+ private void Run()
+ {
+ m_log = new LogBase(null, "SimpleApp", this, false);
+ MainLog.Instance = m_log;
+
+ // CheckSumServer checksumServer = new CheckSumServer(12036);
+ // checksumServer.ServerListener();
+
+ string simAddr = "127.0.0.1";
+ int simPort = 9000;
+ /*
+ LoginServer loginServer = new LoginServer( simAddr, simPort, 0, 0, false );
+ loginServer.Startup();
+ loginServer.SetSessionHandler( AddNewSessionHandler );*/
+
+ m_circuitManager = new AuthenticateSessionsBase();
+
+ InventoryCache inventoryCache = new InventoryCache();
+
+ LocalAssetServer assetServer = new LocalAssetServer();
+ assetServer.SetServerInfo("http://127.0.0.1:8003/", "");
+ assetServer.SetReceiver(this);
+
+ AssetCache assetCache = new AssetCache(assetServer);
+
+ UDPServer udpServer = new UDPServer(simPort, assetCache, inventoryCache, m_log, m_circuitManager );
+ PacketServer packetServer = new PacketServer( udpServer, (uint) simPort );
+ udpServer.ServerListener();
+
+ ClientView.TerrainManager = new TerrainManager(new SecondLife());
+
+ CommunicationsManager communicationsManager = new CommunicationsLocal(null);
+
+ RegionInfo regionInfo = new RegionInfo( );
+ BaseHttpServer httpServer = new BaseHttpServer(simPort);
+ udpServer.LocalWorld = new MyWorld( packetServer.ClientAPIs, regionInfo, m_circuitManager, communicationsManager, assetCache, httpServer );
+
+ // World world = new World(udpServer.PacketServer.ClientAPIs, regionInfo);
+ // PhysicsScene physicsScene = new NullPhysicsScene();
+ // world.PhysicsScene = physicsScene;
+ // udpServer.LocalWorld = world;
+
+ // httpServer.AddXmlRPCHandler( "login_to_simulator", loginServer.XmlRpcLoginMethod );
+ httpServer.Start();
+
+ m_log.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
+ m_log.ReadLine();
+ }
+
+ private bool AddNewSessionHandler(ulong regionHandle, Login loginData)
+ {
+ m_log.WriteLine(LogPriority.NORMAL, "Region [{0}] recieved Login from [{1}] [{2}]", regionHandle, loginData.First, loginData.Last);
+
+ AgentCircuitData agent = new AgentCircuitData();
+ agent.AgentID = loginData.Agent;
+ agent.firstname = loginData.First;
+ agent.lastname = loginData.Last;
+ agent.SessionID = loginData.Session;
+ agent.SecureSessionID = loginData.SecureSession;
+ agent.circuitcode = loginData.CircuitCode;
+ agent.BaseFolder = loginData.BaseFolder;
+ agent.InventoryFolder = loginData.InventoryFolder;
+ agent.startpos = new LLVector3(128, 128, 70);
+
+ m_circuitManager.AddNewCircuit(agent.circuitcode, agent);
+
+ return true;
+ }
+
+ #region IAssetReceiver Members
+
+ public void AssetReceived( AssetBase asset, bool IsTexture)
+ {
+ throw new Exception("The method or operation is not implemented.");
+ }
+
+ public void AssetNotFound( AssetBase asset)
+ {
+ throw new Exception("The method or operation is not implemented.");
+ }
+
+ #endregion
+
+ #region conscmd_callback Members
+
+ public void RunCmd(string cmd, string[] cmdparams)
+ {
+ throw new Exception("The method or operation is not implemented.");
+ }
+
+ public void Show(string ShowWhat)
+ {
+ throw new Exception("The method or operation is not implemented.");
+ }
+
+ #endregion
+
+ static void Main(string[] args)
+ {
+ Program app = new Program();
+
+ app.Run();
+ }
+ }
+}
diff --git a/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0f9bf0f
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SimpleApp")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Playahead AB")]
+[assembly: AssemblyProduct("SimpleApp")]
+[assembly: AssemblyCopyright("Copyright © Playahead AB 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("a5cfa45f-5acf-4b2e-9c50-1dd1fd7608ee")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj
new file mode 100644
index 0000000..5129be2
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj
@@ -0,0 +1,154 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {24B12448-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ SimpleApp
+ JScript
+ Grid
+ IE50
+ false
+ Exe
+
+ SimpleApp
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ OpenSim.Servers.dll
+ False
+
+
+ System.dll
+ False
+
+
+ ..\..\..\..\bin\System.Data.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ ..\..\..\..\bin\XMLRPC.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Communications
+ {CB52B7E7-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Caches
+ {61FCCDB3-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.ClientStack
+ {DC3698B2-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.GridInterfaces.Local
+ {241A8CDD-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.LocalCommunications
+ {EB3A1BA8-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Simulation
+ {C0DAB338-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs b/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs
new file mode 100644
index 0000000..52ecd6b
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("LocalGridServers")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LocalGridServers")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs b/OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs
new file mode 100644
index 0000000..87eff49
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs
@@ -0,0 +1,312 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using System.Threading;
+using System.IO;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Utilities;
+using OpenSim.Framework.Console;
+using libsecondlife;
+using Db4objects.Db4o;
+using Db4objects.Db4o.Query;
+
+namespace OpenSim.GridInterfaces.Local
+{
+ public class LocalAssetPlugin : IAssetPlugin
+ {
+ public LocalAssetPlugin()
+ {
+
+ }
+
+ public IAssetServer GetAssetServer()
+ {
+ return (new LocalAssetServer());
+ }
+ }
+
+ public class LocalAssetServer : IAssetServer
+ {
+ private IAssetReceiver _receiver;
+ private BlockingQueue _assetRequests;
+ private IObjectContainer db;
+ private Thread _localAssetServerThread;
+
+ public LocalAssetServer()
+ {
+ bool yapfile;
+ this._assetRequests = new BlockingQueue();
+ yapfile = System.IO.File.Exists("assets.yap");
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Local Asset Server class created");
+ try
+ {
+ db = Db4oFactory.OpenFile("assets.yap");
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Db4 Asset database creation");
+ }
+ catch (Exception e)
+ {
+ db.Close();
+ OpenSim.Framework.Console.MainLog.Instance.WriteLine(LogPriority.MEDIUM, "Db4 Asset server :Constructor - Exception occured");
+ OpenSim.Framework.Console.MainLog.Instance.Warn(e.ToString());
+ }
+ if (!yapfile)
+ {
+ this.SetUpAssetDatabase();
+ }
+ this._localAssetServerThread = new Thread(new ThreadStart(RunRequests));
+ this._localAssetServerThread.IsBackground = true;
+ this._localAssetServerThread.Start();
+
+ }
+
+ public void SetReceiver(IAssetReceiver receiver)
+ {
+ this._receiver = receiver;
+ }
+
+ public void RequestAsset(LLUUID assetID, bool isTexture)
+ {
+ ARequest req = new ARequest();
+ req.AssetID = assetID;
+ req.IsTexture = isTexture;
+ this._assetRequests.Enqueue(req);
+ }
+
+ public void UpdateAsset(AssetBase asset)
+ {
+
+ }
+
+ public void UploadNewAsset(AssetBase asset)
+ {
+ AssetStorage store = new AssetStorage();
+ store.Data = asset.Data;
+ store.Name = asset.Name;
+ store.UUID = asset.FullID;
+ db.Set(store);
+ db.Commit();
+ }
+
+ public void SetServerInfo(string ServerUrl, string ServerKey)
+ {
+
+ }
+ public void Close()
+ {
+ if (db != null)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Closing local asset server database");
+ db.Close();
+ }
+ }
+
+ private void RunRequests()
+ {
+ while (true)
+ {
+ byte[] idata = null;
+ bool found = false;
+ AssetStorage foundAsset = null;
+ ARequest req = this._assetRequests.Dequeue();
+ IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID));
+ if (result.Count > 0)
+ {
+ foundAsset = (AssetStorage)result.Next();
+ found = true;
+ }
+
+ AssetBase asset = new AssetBase();
+ if (found)
+ {
+ asset.FullID = foundAsset.UUID;
+ asset.Type = foundAsset.Type;
+ asset.InvType = foundAsset.Type;
+ asset.Name = foundAsset.Name;
+ idata = foundAsset.Data;
+ }
+ else
+ {
+ asset.FullID = LLUUID.Zero;
+ }
+ asset.Data = idata;
+ _receiver.AssetReceived(asset, req.IsTexture);
+ }
+
+ }
+
+ private void SetUpAssetDatabase()
+ {
+ try
+ {
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "Setting up asset database");
+
+ AssetBase Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001");
+ Image.Name = "Bricks";
+ this.LoadAsset(Image, true, "bricks.jp2");
+ AssetStorage store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002");
+ Image.Name = "Plywood";
+ this.LoadAsset(Image, true, "plywood.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003");
+ Image.Name = "Rocks";
+ this.LoadAsset(Image, true, "rocks.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004");
+ Image.Name = "Granite";
+ this.LoadAsset(Image, true, "granite.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005");
+ Image.Name = "Hardwood";
+ this.LoadAsset(Image, true, "hardwood.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005");
+ Image.Name = "Prim Base Texture";
+ this.LoadAsset(Image, true, "plywood.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006");
+ Image.Name = "Map Base Texture";
+ this.LoadAsset(Image, true, "map_base.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007");
+ Image.Name = "Map Texture";
+ this.LoadAsset(Image, true, "map1.jp2");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+
+ Image = new AssetBase();
+ Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
+ Image.Name = "Shape";
+ this.LoadAsset(Image, false, "base_shape.dat");
+ store = new AssetStorage();
+ store.Data = Image.Data;
+ store.Name = Image.Name;
+ store.UUID = Image.FullID;
+ db.Set(store);
+ db.Commit();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ }
+
+ private void LoadAsset(AssetBase info, bool image, string filename)
+ {
+ //should request Asset from storage manager
+ //but for now read from file
+
+ string dataPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder;
+ string fileName = Path.Combine(dataPath, 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 AssetUUIDQuery : Predicate
+ {
+ private LLUUID _findID;
+
+ public AssetUUIDQuery(LLUUID find)
+ {
+ _findID = find;
+ }
+ public bool Match(AssetStorage asset)
+ {
+ return (asset.UUID == _findID);
+ }
+ }
+
+}
diff --git a/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj
new file mode 100644
index 0000000..484a205
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj
@@ -0,0 +1,107 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {241A8CDD-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.GridInterfaces.Local
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.GridInterfaces.Local
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Db4objects.Db4o.dll
+ False
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs
new file mode 100644
index 0000000..51596d0
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("RemoteGridServers")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("RemoteGridServers")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj
new file mode 100644
index 0000000..793fde2
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj
@@ -0,0 +1,107 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {98C7B681-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.GridInterfaces.Remote
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.GridInterfaces.Remote
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ ..\..\..\..\bin\XMLRPC.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs
new file mode 100644
index 0000000..ca01c68
--- /dev/null
+++ b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Utilities;
+
+namespace OpenSim.GridInterfaces.Remote
+{
+ public class RemoteAssetServer : IAssetServer
+ {
+ private IAssetReceiver _receiver;
+ private BlockingQueue _assetRequests;
+ private Thread _remoteAssetServerThread;
+ private string AssetServerUrl;
+ private string AssetSendKey;
+
+ public RemoteAssetServer()
+ {
+ this._assetRequests = new BlockingQueue();
+ this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
+ this._remoteAssetServerThread.IsBackground = true;
+ this._remoteAssetServerThread.Start();
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("Remote Asset Server class created");
+ }
+
+ public void SetReceiver(IAssetReceiver receiver)
+ {
+ this._receiver = receiver;
+ }
+
+ public void RequestAsset(LLUUID assetID, bool isTexture)
+ {
+ ARequest req = new ARequest();
+ req.AssetID = assetID;
+ req.IsTexture = isTexture;
+ this._assetRequests.Enqueue(req);
+ }
+
+ public void UpdateAsset(AssetBase asset)
+ {
+
+ }
+
+ public void UploadNewAsset(AssetBase asset)
+ {
+ Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
+ string ret = Windows1252Encoding.GetString(asset.Data);
+ byte[] buffer = Windows1252Encoding.GetBytes(ret);
+ WebClient client = new WebClient();
+ client.UploadData(this.AssetServerUrl + "assets/" + asset.FullID, buffer);
+
+ }
+
+ public void SetServerInfo(string ServerUrl, string ServerKey)
+ {
+ this.AssetServerUrl = ServerUrl;
+ this.AssetSendKey = ServerKey;
+ }
+
+ private void RunRequests()
+ {
+ while (true)
+ {
+ //we need to add support for the asset server not knowing about a requested asset
+ // 404... THE MAGIC FILE NOT FOUND ERROR, very useful for telling you things such as a file (or asset ;) ) not being found!!!!!!!!!!! it's 2:22AM
+ ARequest req = this._assetRequests.Dequeue();
+ LLUUID assetID = req.AssetID;
+ // OpenSim.Framework.Console.MainLog.Instance.Verbose(" RemoteAssetServer- Got a AssetServer request, processing it - " + this.AssetServerUrl + "assets/" + assetID);
+ WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "assets/" + assetID);
+ WebResponse AssetResponse = AssetLoad.GetResponse();
+ byte[] idata = new byte[(int)AssetResponse.ContentLength];
+ BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream());
+ idata = br.ReadBytes((int)AssetResponse.ContentLength);
+ br.Close();
+
+ AssetBase asset = new AssetBase();
+ asset.FullID = assetID;
+ asset.Data = idata;
+ _receiver.AssetReceived(asset, req.IsTexture);
+ }
+ }
+
+ public void Close()
+ {
+
+ }
+ }
+
+ public class RemoteAssetPlugin : IAssetPlugin
+ {
+ public RemoteAssetPlugin()
+ {
+
+ }
+
+ public IAssetServer GetAssetServer()
+ {
+ return (new RemoteAssetServer());
+ }
+ }
+
+}
diff --git a/OpenSim/Region/LocalCommunications/CommunicationsLocal.cs b/OpenSim/Region/LocalCommunications/CommunicationsLocal.cs
new file mode 100644
index 0000000..743b9b4
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/CommunicationsLocal.cs
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections.Generic;
+using System.Text;
+using libsecondlife;
+using OpenSim.Framework;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenGrid.Framework.Communications;
+
+
+namespace OpenSim.LocalCommunications
+{
+ public class CommunicationsLocal : CommunicationsManager
+ {
+ public LocalBackEndServices SandBoxServices = new LocalBackEndServices();
+ public LocalUserServices UserServices;
+
+ public CommunicationsLocal(NetworkServersInfo serversInfo)
+ : base(serversInfo)
+ {
+ UserServices = new LocalUserServices(this , serversInfo.DefaultHomeLocX, serversInfo.DefaultHomeLocY);
+ UserServices.AddPlugin("OpenGrid.Framework.Data.DB4o.dll");
+ UserServer = UserServices;
+ GridServer = SandBoxServices;
+ InterRegion = SandBoxServices;
+ }
+
+ internal void InformRegionOfLogin(ulong regionHandle, Login login)
+ {
+ this.SandBoxServices.AddNewSession(regionHandle, login);
+ }
+ }
+}
diff --git a/OpenSim/Region/LocalCommunications/LocalBackEndServices.cs b/OpenSim/Region/LocalCommunications/LocalBackEndServices.cs
new file mode 100644
index 0000000..ce48c6e
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/LocalBackEndServices.cs
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using OpenGrid.Framework.Communications;
+using libsecondlife;
+using OpenSim.Framework.Types;
+using OpenSim.Framework;
+
+namespace OpenSim.LocalCommunications
+{
+
+ public class LocalBackEndServices : IGridServices, IInterRegionCommunications
+ {
+ protected Dictionary regions = new Dictionary();
+ protected Dictionary regionHosts = new Dictionary();
+
+ public LocalBackEndServices()
+ {
+
+ }
+
+ ///
+ /// Register a region method with the BackEnd Services.
+ ///
+ ///
+ ///
+ public RegionCommsListener RegisterRegion(RegionInfo regionInfo, GridInfo gridInfo)
+ {
+ //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering");
+ if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle))
+ {
+ //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle );
+ this.regions.Add(regionInfo.RegionHandle, regionInfo);
+ RegionCommsListener regionHost = new RegionCommsListener();
+ this.regionHosts.Add(regionInfo.RegionHandle, regionHost);
+
+ return regionHost;
+ }
+
+ //already in our list of regions so for now lets return null
+ return null;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public List RequestNeighbours(RegionInfo regionInfo)
+ {
+ // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle);
+ List neighbours = new List();
+
+ foreach (RegionInfo reg in this.regions.Values)
+ {
+ // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY);
+ if (reg.RegionHandle != regionInfo.RegionHandle)
+ {
+ //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location");
+ if ((reg.RegionLocX > (regionInfo.RegionLocX - 2)) && (reg.RegionLocX < (regionInfo.RegionLocX + 2)))
+ {
+ if ((reg.RegionLocY > (regionInfo.RegionLocY - 2)) && (reg.RegionLocY < (regionInfo.RegionLocY + 2)))
+ {
+ neighbours.Add(reg);
+ }
+ }
+ }
+ }
+ return neighbours;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public RegionInfo RequestNeighbourInfo(ulong regionHandle)
+ {
+ if (this.regions.ContainsKey(regionHandle))
+ {
+ return this.regions[regionHandle];
+ }
+ return null;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
+ {
+ List mapBlocks = new List();
+ foreach(RegionInfo regInfo in this.regions.Values)
+ {
+ if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY)))
+ {
+ MapBlockData map = new MapBlockData();
+ map.Name = regInfo.RegionName;
+ map.X = (ushort)regInfo.RegionLocX;
+ map.Y = (ushort)regInfo.RegionLocY;
+ map.WaterHeight =(byte) regInfo.estateSettings.waterHeight;
+ map.MapImageId = regInfo.estateSettings.terrainImageID; //new LLUUID("00000000-0000-0000-9999-000000000007");
+ map.Agents = 1;
+ map.RegionFlags = 72458694;
+ map.Access = 13;
+ mapBlocks.Add(map);
+ }
+ }
+ return mapBlocks;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) //should change from agentCircuitData
+ {
+ //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent");
+ if (this.regionHosts.ContainsKey(regionHandle))
+ {
+ // Console.WriteLine("CommsManager- Informing a region to expect child agent");
+ this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agentData);
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool ExpectAvatarCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position)
+ {
+ if (this.regionHosts.ContainsKey(regionHandle))
+ {
+ // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing");
+ this.regionHosts[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session
+ ///
+ ///
+ ///
+ ///
+ public bool AddNewSession(ulong regionHandle, Login loginData)
+ {
+ //Console.WriteLine(" comms manager been told to expect new user");
+ AgentCircuitData agent = new AgentCircuitData();
+ agent.AgentID = loginData.Agent;
+ agent.firstname = loginData.First;
+ agent.lastname = loginData.Last;
+ agent.SessionID = loginData.Session;
+ agent.SecureSessionID = loginData.SecureSession;
+ agent.circuitcode = loginData.CircuitCode;
+ agent.BaseFolder = loginData.BaseFolder;
+ agent.InventoryFolder = loginData.InventoryFolder;
+ agent.startpos = new LLVector3(128, 128, 70);
+ agent.CapsPath = loginData.CapsPath;
+
+ if (this.regionHosts.ContainsKey(regionHandle))
+ {
+ this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agent);
+ return true;
+ }
+
+ // region not found
+ return false;
+ }
+ }
+}
+
diff --git a/OpenSim/Region/LocalCommunications/LocalUserServices.cs b/OpenSim/Region/LocalCommunications/LocalUserServices.cs
new file mode 100644
index 0000000..a7f7aa4
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/LocalUserServices.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+
+using OpenGrid.Framework.Communications;
+//using OpenSim.Framework.User;
+using OpenGrid.Framework.UserManagement;
+using OpenGrid.Framework.Data;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Utilities;
+
+using libsecondlife;
+
+namespace OpenSim.LocalCommunications
+{
+ public class LocalUserServices : UserManagerBase, IUserServices
+ {
+ private CommunicationsLocal m_Parent;
+
+ private uint defaultHomeX ;
+ private uint defaultHomeY;
+ public LocalUserServices(CommunicationsLocal parent, uint defHomeX, uint defHomeY)
+ {
+ m_Parent = parent;
+ defaultHomeX = defHomeX;
+ defaultHomeY = defHomeY;
+ }
+
+ public UserProfileData GetUserProfile(string firstName, string lastName)
+ {
+ return GetUserProfile(firstName + " " + lastName);
+ }
+
+ public UserProfileData GetUserProfile(string name)
+ {
+ return this.getUserProfile(name);
+ }
+ public UserProfileData GetUserProfile(LLUUID avatarID)
+ {
+ return this.getUserProfile(avatarID);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public override string GetMessage()
+ {
+ return "Welcome to OpenSim";
+ }
+
+ public override UserProfileData GetTheUser(string firstname, string lastname)
+ {
+ UserProfileData profile = getUserProfile(firstname, lastname);
+ if (profile != null)
+ {
+
+ return profile;
+ }
+
+ //no current user account so make one
+ Console.WriteLine("No User account found so creating a new one ");
+ this.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY);
+
+ profile = getUserProfile(firstname, lastname);
+
+ return profile;
+ }
+
+ public override bool AuthenticateUser(ref UserProfileData profile, string password)
+ {
+ //for now we will accept any password in sandbox mode
+ Console.WriteLine("authorising user");
+ return true;
+ }
+
+ public override void CustomiseResponse(ref LoginResponse response, ref UserProfileData theUser)
+ {
+ ulong currentRegion = theUser.currentAgent.currentHandle;
+ RegionInfo reg = m_Parent.GridServer.RequestNeighbourInfo(currentRegion);
+
+
+ if (reg != null)
+ {
+ response.Home = "{'region_handle':[r" + (reg.RegionLocX * 256).ToString() + ",r" + (reg.RegionLocY * 256).ToString() + "], " +
+ "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " +
+ "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
+ string capsPath = Util.GetRandomCapsPath();
+ response.SimAddress = reg.CommsIPListenAddr;
+ response.SimPort = (Int32)reg.CommsIPListenPort;
+ response.RegionX = reg.RegionLocX ;
+ response.RegionY = reg.RegionLocY ;
+ response.SeedCapability = "http://" + reg.CommsIPListenAddr + ":" + "9000" + "/CAPS/" + capsPath + "0000/";
+ theUser.currentAgent.currentRegion = reg.SimUUID;
+ theUser.currentAgent.currentHandle = reg.RegionHandle;
+
+ Login _login = new Login();
+ //copy data to login object
+ _login.First = response.Firstname;
+ _login.Last = response.Lastname;
+ _login.Agent = response.AgentID;
+ _login.Session = response.SessionID;
+ _login.SecureSession = response.SecureSessionID;
+ _login.CircuitCode = (uint)response.CircuitCode;
+ _login.CapsPath = capsPath;
+
+ m_Parent.InformRegionOfLogin(currentRegion, _login);
+ }
+ else
+ {
+ Console.WriteLine("not found region " + currentRegion);
+ }
+
+ }
+
+ }
+}
diff --git a/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj b/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj
new file mode 100644
index 0000000..6b2b78c
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj
@@ -0,0 +1,121 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {EB3A1BA8-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.LocalCommunications
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.LocalCommunications
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Communications
+ {CB52B7E7-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Data
+ {36B72A9B-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.UserManagement
+ {586E2916-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj.user b/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/OpenSim.Region.LocalCommunications.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/LocalCommunications/Properties/AssemblyInfo.cs b/OpenSim/Region/LocalCommunications/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8e6e711
--- /dev/null
+++ b/OpenSim/Region/LocalCommunications/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenSim.LocalCommunications")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenSim.LocalCommunications")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs
new file mode 100644
index 0000000..177c49d
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("PhysXplugin")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PhysXplugin")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
new file mode 100644
index 0000000..dcb8f3b
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 OpenSim.Physics.Manager;
+
+namespace OpenSim.Region.Physics.BasicPhysicsPlugin
+{
+ ///
+ /// Will be the PhysX plugin but for now will be a very basic physics engine
+ ///
+ public class BasicPhysicsPlugin : IPhysicsPlugin
+ {
+ private BasicScene _mScene;
+
+ public BasicPhysicsPlugin()
+ {
+
+ }
+
+ public bool Init()
+ {
+ return true;
+ }
+
+ public PhysicsScene GetScene()
+ {
+ return new BasicScene();
+ }
+
+ public string GetName()
+ {
+ return("basicphysics");
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+
+ public class BasicScene :PhysicsScene
+ {
+ private List _actors = new List();
+ private float[] _heightMap;
+
+ public BasicScene()
+ {
+
+ }
+
+ public override PhysicsActor AddAvatar(PhysicsVector position)
+ {
+ BasicActor act = new BasicActor();
+ act.Position = position;
+ _actors.Add(act);
+ return act;
+ }
+
+ public override void RemoveAvatar(PhysicsActor actor)
+ {
+ BasicActor act = (BasicActor)actor;
+ if(_actors.Contains(act))
+ {
+ _actors.Remove(act);
+ }
+
+ }
+
+ public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
+ {
+ return null;
+ }
+
+ public override void Simulate(float timeStep)
+ {
+ foreach (BasicActor actor in _actors)
+ {
+ actor.Position.X = actor.Position.X + (actor.Velocity.X * timeStep);
+ actor.Position.Y = actor.Position.Y + (actor.Velocity.Y * timeStep);
+ actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
+ /*if(actor.Flying)
+ {
+ actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
+ }
+ else
+ {
+ actor.Position.Z = actor.Position.Z + ((-9.8f + actor.Velocity.Z) * timeStep);
+ }
+ if(actor.Position.Z < (_heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1))
+ {*/
+ if ((actor.Position.Y > 0 && actor.Position.Y < 256) && (actor.Position.X > 0 && actor.Position.X < 256))
+ {
+ actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X] + 1;
+ }
+ else
+ {
+ if (actor.Position.Y < 0)
+ {
+ actor.Position.Y = 0;
+ }
+ else if (actor.Position.Y > 256)
+ {
+ actor.Position.Y = 256;
+ }
+
+ if (actor.Position.X < 0)
+ {
+ actor.Position.X = 0;
+ }
+ if (actor.Position.X > 256)
+ {
+ actor.Position.X = 256;
+ }
+ }
+ //}
+
+
+
+ // This code needs sorting out - border crossings etc
+/* if(actor.Position.X<0)
+ {
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ actor.Position.X = 0;
+ actor.Velocity.X = 0;
+ }
+ if(actor.Position.Y < 0)
+ {
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ actor.Position.Y = 0;
+ actor.Velocity.Y = 0;
+ }
+ if(actor.Position.X > 255)
+ {
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ actor.Position.X = 255;
+ actor.Velocity.X = 0;
+ }
+ if(actor.Position.Y > 255)
+ {
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ actor.Position.Y = 255;
+ actor.Velocity.X = 0;
+ }*/
+ }
+ }
+
+ public override void GetResults()
+ {
+
+ }
+
+ public override bool IsThreaded
+ {
+ get
+ {
+ return(false); // for now we won't be multithreaded
+ }
+ }
+
+ public override void SetTerrain(float[] heightMap)
+ {
+ this._heightMap = heightMap;
+ }
+
+ public override void DeleteTerrain()
+ {
+
+ }
+ }
+
+ public class BasicActor : PhysicsActor
+ {
+ private PhysicsVector _position;
+ private PhysicsVector _velocity;
+ private PhysicsVector _acceleration;
+ private bool flying;
+ public BasicActor()
+ {
+ _velocity = new PhysicsVector();
+ _position = new PhysicsVector();
+ _acceleration = new PhysicsVector();
+ }
+
+ public override bool Flying
+ {
+ get
+ {
+ return false;
+ }
+ set
+ {
+ flying= value;
+ }
+ }
+
+ public override PhysicsVector Position
+ {
+ get
+ {
+ return _position;
+ }
+ set
+ {
+ _position = value;
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return _velocity;
+ }
+ set
+ {
+ _velocity = value;
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ return Axiom.MathLib.Quaternion.Identity;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get
+ {
+ return _acceleration;
+ }
+
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return true;
+ }
+ set
+ {
+
+ }
+ }
+ public void SetAcceleration (PhysicsVector accel)
+ {
+ this._acceleration = accel;
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+
+ }
+ }
+
+}
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj
new file mode 100644
index 0000000..7dad533
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj
@@ -0,0 +1,93 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {15B4FEF3-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Physics.BasicPhysicsPlugin
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Physics.BasicPhysicsPlugin
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ System.dll
+ False
+
+
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Physics/Manager/AssemblyInfo.cs b/OpenSim/Region/Physics/Manager/AssemblyInfo.cs
new file mode 100644
index 0000000..132f64a
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("PhysicsManager")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PhysicsManager")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj
new file mode 100644
index 0000000..f340400
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj
@@ -0,0 +1,112 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {F4FF31EB-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Physics.Manager
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Physics.Manager
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
new file mode 100644
index 0000000..6366fb8
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+
+namespace OpenSim.Physics.Manager
+{
+ public abstract class PhysicsActor
+ {
+ public static PhysicsActor Null
+ {
+ get
+ {
+ return new NullPhysicsActor();
+ }
+ }
+
+ public abstract PhysicsVector Position
+ {
+ get;
+ set;
+ }
+
+ public abstract PhysicsVector Velocity
+ {
+ get;
+ set;
+ }
+
+ public abstract PhysicsVector Acceleration
+ {
+ get;
+ }
+
+ public abstract Axiom.MathLib.Quaternion Orientation
+ {
+ get;
+ set;
+ }
+
+ public abstract bool Flying
+ {
+ get;
+ set;
+ }
+
+ public abstract bool Kinematic
+ {
+ get;
+ set;
+ }
+
+ public abstract void AddForce(PhysicsVector force);
+
+ public abstract void SetMomentum(PhysicsVector momentum);
+ }
+
+ public class NullPhysicsActor : PhysicsActor
+ {
+ public override PhysicsVector Position
+ {
+ get
+ {
+ return PhysicsVector.Zero;
+ }
+ set
+ {
+ return;
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return PhysicsVector.Zero;
+ }
+ set
+ {
+ return;
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ return Axiom.MathLib.Quaternion.Identity;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get { return PhysicsVector.Zero; }
+ }
+
+ public override bool Flying
+ {
+ get
+ {
+ return false;
+ }
+ set
+ {
+ return;
+ }
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return true;
+ }
+ set
+ {
+ return;
+ }
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+ return;
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+ return;
+ }
+ }
+}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsManager.cs b/OpenSim/Region/Physics/Manager/PhysicsManager.cs
new file mode 100644
index 0000000..efccb36
--- /dev/null
+++ b/OpenSim/Region/Physics/Manager/PhysicsManager.cs
@@ -0,0 +1,117 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Collections;
+using System.IO;
+using System.Reflection;
+using Axiom.MathLib;
+using OpenSim.Framework.Console;
+
+namespace OpenSim.Physics.Manager
+{
+ ///
+ /// Description of MyClass.
+ ///
+ public class PhysicsManager
+ {
+ private Dictionary _plugins=new Dictionary();
+
+ public PhysicsManager()
+ {
+
+ }
+
+ public PhysicsScene GetPhysicsScene(string engineName)
+ {
+ if (String.IsNullOrEmpty(engineName))
+ {
+ return new NullPhysicsScene();
+ }
+
+ if(_plugins.ContainsKey(engineName))
+ {
+ OpenSim.Framework.Console.MainLog.Instance.WriteLine(LogPriority.LOW,"creating "+engineName);
+ return _plugins[engineName].GetScene();
+ }
+ else
+ {
+ OpenSim.Framework.Console.MainLog.Instance.WriteLine(LogPriority.MEDIUM,"couldn't find physicsEngine: {0}",engineName);
+ throw new ArgumentException(String.Format("couldn't find physicsEngine: {0}",engineName));
+ }
+ }
+
+ public void LoadPlugins()
+ {
+ string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory ,"Physics");
+ string[] pluginFiles = Directory.GetFiles(path, "*.dll");
+
+
+ for(int i= 0; i
+ /// ODE plugin
+ ///
+ public class OdePlugin : IPhysicsPlugin
+ {
+ private OdeScene _mScene;
+
+ public OdePlugin()
+ {
+
+ }
+
+ public bool Init()
+ {
+ return true;
+ }
+
+ public PhysicsScene GetScene()
+ {
+ if (_mScene == null)
+ {
+ _mScene = new OdeScene();
+ }
+ return (_mScene);
+ }
+
+ public string GetName()
+ {
+ return ("OpenDynamicsEngine");
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+
+ public class OdeScene : PhysicsScene
+ {
+ static public IntPtr world;
+ static public IntPtr space;
+ static private IntPtr contactgroup;
+ static private IntPtr LandGeom;
+ //static private IntPtr Land;
+ private double[] _heightmap;
+ static private d.NearCallback nearCallback = near;
+ private List _characters = new List();
+ private static d.ContactGeom[] contacts = new d.ContactGeom[30];
+ private static d.Contact contact;
+
+ public OdeScene()
+ {
+ contact.surface.mode = d.ContactFlags.Bounce | d.ContactFlags.SoftCFM;
+ contact.surface.mu = d.Infinity;
+ contact.surface.mu2 = 0.0f;
+ contact.surface.bounce = 0.1f;
+ contact.surface.bounce_vel = 0.1f;
+ contact.surface.soft_cfm = 0.01f;
+
+ world = d.WorldCreate();
+ space = d.HashSpaceCreate(IntPtr.Zero);
+ contactgroup = d.JointGroupCreate(0);
+ d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f);
+ //d.WorldSetCFM(world, 1e-5f);
+ d.WorldSetAutoDisableFlag(world, false);
+ d.WorldSetContactSurfaceLayer(world, 0.001f);
+ // d.CreatePlane(space, 0, 0, 1, 0);
+ this._heightmap = new double[65536];
+ }
+
+ // This function blatantly ripped off from BoxStack.cs
+ static private void near(IntPtr space, IntPtr g1, IntPtr g2)
+ {
+ IntPtr b1 = d.GeomGetBody(g1);
+ IntPtr b2 = d.GeomGetBody(g2);
+ if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
+ return;
+
+ int count = d.Collide(g1, g2, 500, contacts, d.ContactGeom.SizeOf);
+ for (int i = 0; i < count; ++i)
+ {
+ contact.geom = contacts[i];
+ IntPtr joint = d.JointCreateContact(world, contactgroup, ref contact);
+ d.JointAttach(joint, b1, b2);
+ }
+
+ }
+
+ public override PhysicsActor AddAvatar(PhysicsVector position)
+ {
+ PhysicsVector pos = new PhysicsVector();
+ pos.X = position.X;
+ pos.Y = position.Y;
+ pos.Z = position.Z + 20;
+ OdeCharacter newAv = new OdeCharacter(this, pos);
+ this._characters.Add(newAv);
+ return newAv;
+ }
+
+ public override void RemoveAvatar(PhysicsActor actor)
+ {
+
+ }
+
+ public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
+ {
+ PhysicsVector pos = new PhysicsVector();
+ pos.X = position.X;
+ pos.Y = position.Y;
+ pos.Z = position.Z;
+ PhysicsVector siz = new PhysicsVector();
+ siz.X = size.X;
+ siz.Y = size.Y;
+ siz.Z = size.Z;
+ return new OdePrim();
+ }
+
+ public override void Simulate(float timeStep)
+ {
+ foreach (OdeCharacter actor in _characters)
+ {
+ actor.Move(timeStep * 5f);
+ }
+ d.SpaceCollide(space, IntPtr.Zero, nearCallback);
+ d.WorldQuickStep(world, timeStep * 5f);
+ d.JointGroupEmpty(contactgroup);
+ foreach (OdeCharacter actor in _characters)
+ {
+ actor.UpdatePosition();
+ }
+
+ }
+
+ public override void GetResults()
+ {
+
+ }
+
+ public override bool IsThreaded
+ {
+ get
+ {
+ return (false); // for now we won't be multithreaded
+ }
+ }
+
+ public override void SetTerrain(float[] heightMap)
+ {
+ for (int i = 0; i < 65536; i++)
+ {
+ // this._heightmap[i] = (double)heightMap[i];
+ // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...)
+ int x = i & 0xff;
+ int y = i >> 8;
+ this._heightmap[i] = (double)heightMap[x * 256 + y];
+ }
+ IntPtr HeightmapData = d.GeomHeightfieldDataCreate();
+ d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 256, 256, 256, 256, 1.0f, 0.0f, 2.0f, 0);
+ d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256);
+ LandGeom = d.CreateHeightfield(space, HeightmapData, 1);
+ d.Matrix3 R = new d.Matrix3();
+
+ Axiom.MathLib.Quaternion q1 =Axiom.MathLib.Quaternion.FromAngleAxis(1.5707f, new Axiom.MathLib.Vector3(1,0,0));
+ Axiom.MathLib.Quaternion q2 =Axiom.MathLib.Quaternion.FromAngleAxis(1.5707f, new Axiom.MathLib.Vector3(0,1,0));
+ //Axiom.MathLib.Quaternion q3 = Axiom.MathLib.Quaternion.FromAngleAxis(3.14f, new Axiom.MathLib.Vector3(0, 0, 1));
+
+ q1 = q1 * q2;
+ //q1 = q1 * q3;
+ Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3();
+ float angle = 0;
+ q1.ToAngleAxis(ref angle, ref v3);
+
+ d.RFromAxisAndAngle(out R, v3.x, v3.y, v3.z, angle);
+ d.GeomSetRotation(LandGeom, ref R);
+ d.GeomSetPosition(LandGeom, 128, 128, 0);
+ }
+
+ public override void DeleteTerrain()
+ {
+
+ }
+ }
+
+ public class OdeCharacter : PhysicsActor
+ {
+ private PhysicsVector _position;
+ private PhysicsVector _velocity;
+ private PhysicsVector _acceleration;
+ private bool flying;
+ //private float gravityAccel;
+ private IntPtr BoundingCapsule;
+ IntPtr capsule_geom;
+ d.Mass capsule_mass;
+
+ public OdeCharacter(OdeScene parent_scene, PhysicsVector pos)
+ {
+ _velocity = new PhysicsVector();
+ _position = pos;
+ _acceleration = new PhysicsVector();
+ d.MassSetCapsule(out capsule_mass, 5.0f, 3, 0.5f, 2f);
+ capsule_geom = d.CreateCapsule(OdeScene.space, 0.5f, 2f);
+ this.BoundingCapsule = d.BodyCreate(OdeScene.world);
+ d.BodySetMass(BoundingCapsule, ref capsule_mass);
+ d.BodySetPosition(BoundingCapsule, pos.X, pos.Y, pos.Z);
+ d.GeomSetBody(capsule_geom, BoundingCapsule);
+ }
+
+ public override bool Flying
+ {
+ get
+ {
+ return flying;
+ }
+ set
+ {
+ flying = value;
+ }
+ }
+
+ public override PhysicsVector Position
+ {
+ get
+ {
+ return _position;
+ }
+ set
+ {
+ _position = value;
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return _velocity;
+ }
+ set
+ {
+ _velocity = value;
+ }
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return false;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ return Axiom.MathLib.Quaternion.Identity;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get
+ {
+ return _acceleration;
+ }
+
+ }
+ public void SetAcceleration(PhysicsVector accel)
+ {
+ this._acceleration = accel;
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+
+ }
+
+ public void Move(float timeStep)
+ {
+ PhysicsVector vec = new PhysicsVector();
+ vec.X = this._velocity.X * timeStep;
+ vec.Y = this._velocity.Y * timeStep;
+ if (flying)
+ {
+ vec.Z = (this._velocity.Z + 0.5f) * timeStep;
+ }
+ d.BodySetLinearVel(this.BoundingCapsule, vec.X, vec.Y, vec.Z);
+ }
+
+ public void UpdatePosition()
+ {
+ d.Vector3 vec = d.BodyGetPosition(BoundingCapsule);
+ this._position.X = vec.X;
+ this._position.Y = vec.Y;
+ this._position.Z = vec.Z+1.0f;
+ }
+ }
+
+ public class OdePrim : PhysicsActor
+ {
+ private PhysicsVector _position;
+ private PhysicsVector _velocity;
+ private PhysicsVector _acceleration;
+
+ public OdePrim()
+ {
+ _velocity = new PhysicsVector();
+ _position = new PhysicsVector();
+ _acceleration = new PhysicsVector();
+ }
+ public override bool Flying
+ {
+ get
+ {
+ return false; //no flying prims for you
+ }
+ set
+ {
+
+ }
+ }
+ public override PhysicsVector Position
+ {
+ get
+ {
+ PhysicsVector pos = new PhysicsVector();
+ // PhysicsVector vec = this._prim.Position;
+ //pos.X = vec.X;
+ //pos.Y = vec.Y;
+ //pos.Z = vec.Z;
+ return pos;
+
+ }
+ set
+ {
+ /*PhysicsVector vec = value;
+ PhysicsVector pos = new PhysicsVector();
+ pos.X = vec.X;
+ pos.Y = vec.Y;
+ pos.Z = vec.Z;
+ this._prim.Position = pos;*/
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return _velocity;
+ }
+ set
+ {
+ _velocity = value;
+ }
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return false;
+ //return this._prim.Kinematic;
+ }
+ set
+ {
+ //this._prim.Kinematic = value;
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ Axiom.MathLib.Quaternion res = new Axiom.MathLib.Quaternion();
+ return res;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get
+ {
+ return _acceleration;
+ }
+
+ }
+ public void SetAcceleration(PhysicsVector accel)
+ {
+ this._acceleration = accel;
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+
+ }
+
+
+ }
+
+}
diff --git a/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj
new file mode 100644
index 0000000..490c681
--- /dev/null
+++ b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj
@@ -0,0 +1,97 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {90620634-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Physics.OdePlugin
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Physics.OdePlugin
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ ..\..\..\..\bin\Ode.NET.dll
+ False
+
+
+ System.dll
+ False
+
+
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs
new file mode 100644
index 0000000..b49c8da
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("RealPhysXplugin")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("RealPhysXplugin")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj
new file mode 100644
index 0000000..77da908
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj
@@ -0,0 +1,97 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {A6D191D8-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Physics.PhysXPlugin
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Physics.PhysXPlugin
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\Physics\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ ..\..\..\..\bin\PhysX_Wrapper_Dotnet.dll
+ False
+
+
+ System.dll
+ False
+
+
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
new file mode 100644
index 0000000..8bf794b
--- /dev/null
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -0,0 +1,424 @@
+/*/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 OpenSim.Physics.Manager;
+using PhysXWrapper;
+
+namespace OpenSim.Region.Physics.PhysXPlugin
+{
+ ///
+ /// Will be the PhysX plugin but for now will be a very basic physics engine
+ ///
+ public class PhysXPlugin : IPhysicsPlugin
+ {
+ private PhysXScene _mScene;
+
+ public PhysXPlugin()
+ {
+
+ }
+
+ public bool Init()
+ {
+ return true;
+ }
+
+ public PhysicsScene GetScene()
+ {
+ if(_mScene == null)
+ {
+ _mScene = new PhysXScene();
+ }
+ return(_mScene);
+ }
+
+ public string GetName()
+ {
+ return("RealPhysX");
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+
+ public class PhysXScene :PhysicsScene
+ {
+ private List _characters = new List();
+ private List _prims = new List();
+ private float[] _heightMap = null;
+ private NxPhysicsSDK mySdk;
+ private NxScene scene;
+
+ public PhysXScene()
+ {
+ mySdk = NxPhysicsSDK.CreateSDK();
+ Console.WriteLine("Sdk created - now creating scene");
+ scene = mySdk.CreateScene();
+
+ }
+
+ public override PhysicsActor AddAvatar(PhysicsVector position)
+ {
+ Vec3 pos = new Vec3();
+ pos.X = position.X;
+ pos.Y = position.Y;
+ pos.Z = position.Z;
+ PhysXCharacter act = new PhysXCharacter( scene.AddCharacter(pos));
+ act.Position = position;
+ _characters.Add(act);
+ return act;
+ }
+
+ public override void RemoveAvatar(PhysicsActor actor)
+ {
+
+ }
+
+ public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
+ {
+ Vec3 pos = new Vec3();
+ pos.X = position.X;
+ pos.Y = position.Y;
+ pos.Z = position.Z;
+ Vec3 siz = new Vec3();
+ siz.X = size.X;
+ siz.Y = size.Y;
+ siz.Z = size.Z;
+ PhysXPrim act = new PhysXPrim( scene.AddNewBox(pos, siz));
+ _prims.Add(act);
+ return act;
+ }
+ public override void Simulate(float timeStep)
+ {
+ try
+ {
+ foreach (PhysXCharacter actor in _characters)
+ {
+ actor.Move(timeStep);
+ }
+ scene.Simulate(timeStep);
+ scene.FetchResults();
+ scene.UpdateControllers();
+
+ foreach (PhysXCharacter actor in _characters)
+ {
+ actor.UpdatePosition();
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ }
+
+ public override void GetResults()
+ {
+
+ }
+
+ public override bool IsThreaded
+ {
+ get
+ {
+ return(false); // for now we won't be multithreaded
+ }
+ }
+
+ public override void SetTerrain(float[] heightMap)
+ {
+ if (this._heightMap != null)
+ {
+ Console.WriteLine("PhysX - deleting old terrain");
+ this.scene.DeleteTerrain();
+ }
+ this._heightMap = heightMap;
+ this.scene.AddTerrain(heightMap);
+ }
+
+ public override void DeleteTerrain()
+ {
+ this.scene.DeleteTerrain();
+ }
+ }
+
+ public class PhysXCharacter : PhysicsActor
+ {
+ private PhysicsVector _position;
+ private PhysicsVector _velocity;
+ private PhysicsVector _acceleration;
+ private NxCharacter _character;
+ private bool flying;
+ private float gravityAccel;
+
+ public PhysXCharacter(NxCharacter character)
+ {
+ _velocity = new PhysicsVector();
+ _position = new PhysicsVector();
+ _acceleration = new PhysicsVector();
+ _character = character;
+ }
+
+ public override bool Flying
+ {
+ get
+ {
+ return flying;
+ }
+ set
+ {
+ flying = value;
+ }
+ }
+
+ public override PhysicsVector Position
+ {
+ get
+ {
+ return _position;
+ }
+ set
+ {
+ _position = value;
+ Vec3 ps = new Vec3();
+ ps.X = value.X;
+ ps.Y = value.Y;
+ ps.Z = value.Z;
+ this._character.Position = ps;
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return _velocity;
+ }
+ set
+ {
+ _velocity = value;
+ }
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return false;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ return Axiom.MathLib.Quaternion.Identity;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get
+ {
+ return _acceleration;
+ }
+
+ }
+ public void SetAcceleration (PhysicsVector accel)
+ {
+ this._acceleration = accel;
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+
+ }
+
+ public void Move(float timeStep)
+ {
+ Vec3 vec = new Vec3();
+ vec.X = this._velocity.X * timeStep;
+ vec.Y = this._velocity.Y * timeStep;
+ if(flying)
+ {
+ vec.Z = ( this._velocity.Z) * timeStep;
+ }
+ else
+ {
+ gravityAccel+= -9.8f;
+ vec.Z = (gravityAccel + this._velocity.Z) * timeStep;
+ }
+ int res = this._character.Move(vec);
+ if(res == 1)
+ {
+ gravityAccel = 0;
+ }
+ }
+
+ public void UpdatePosition()
+ {
+ Vec3 vec = this._character.Position;
+ this._position.X = vec.X;
+ this._position.Y = vec.Y;
+ this._position.Z = vec.Z;
+ }
+ }
+
+ public class PhysXPrim : PhysicsActor
+ {
+ private PhysicsVector _position;
+ private PhysicsVector _velocity;
+ private PhysicsVector _acceleration;
+ private NxActor _prim;
+
+ public PhysXPrim(NxActor prim)
+ {
+ _velocity = new PhysicsVector();
+ _position = new PhysicsVector();
+ _acceleration = new PhysicsVector();
+ _prim = prim;
+ }
+ public override bool Flying
+ {
+ get
+ {
+ return false; //no flying prims for you
+ }
+ set
+ {
+
+ }
+ }
+ public override PhysicsVector Position
+ {
+ get
+ {
+ PhysicsVector pos = new PhysicsVector();
+ Vec3 vec = this._prim.Position;
+ pos.X = vec.X;
+ pos.Y = vec.Y;
+ pos.Z = vec.Z;
+ return pos;
+
+ }
+ set
+ {
+ PhysicsVector vec = value;
+ Vec3 pos = new Vec3();
+ pos.X = vec.X;
+ pos.Y = vec.Y;
+ pos.Z = vec.Z;
+ this._prim.Position = pos;
+ }
+ }
+
+ public override PhysicsVector Velocity
+ {
+ get
+ {
+ return _velocity;
+ }
+ set
+ {
+ _velocity = value;
+ }
+ }
+
+ public override bool Kinematic
+ {
+ get
+ {
+ return this._prim.Kinematic;
+ }
+ set
+ {
+ this._prim.Kinematic = value;
+ }
+ }
+
+ public override Axiom.MathLib.Quaternion Orientation
+ {
+ get
+ {
+ Axiom.MathLib.Quaternion res = new Axiom.MathLib.Quaternion();
+ PhysXWrapper.Quaternion quat = this._prim.GetOrientation();
+ res.w = quat.W;
+ res.x = quat.X;
+ res.y = quat.Y;
+ res.z = quat.Z;
+ return res;
+ }
+ set
+ {
+
+ }
+ }
+
+ public override PhysicsVector Acceleration
+ {
+ get
+ {
+ return _acceleration;
+ }
+
+ }
+ public void SetAcceleration (PhysicsVector accel)
+ {
+ this._acceleration = accel;
+ }
+
+ public override void AddForce(PhysicsVector force)
+ {
+
+ }
+
+ public override void SetMomentum(PhysicsVector momentum)
+ {
+
+ }
+
+
+ }
+
+}
diff --git a/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs b/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f5da4c0
--- /dev/null
+++ b/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenSim.Scripting")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenSim.Scripting")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("61eae1ad-82aa-4c77-8bc5-b5a8c9522b18")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Scripting/Script.cs b/OpenSim/Region/Scripting/Script.cs
new file mode 100644
index 0000000..0f4af00
--- /dev/null
+++ b/OpenSim/Region/Scripting/Script.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using OpenSim.Framework.Console;
+using OpenSim.Framework;
+using OpenSim.Region;
+using OpenSim.Region.Scenes;
+
+namespace OpenSim.Scripting
+{
+ public interface IScript
+ {
+ void Initialise(ScriptInfo scriptInfo);
+ }
+
+ public class TestScript : IScript
+ {
+ ScriptInfo script;
+
+ public void Initialise(ScriptInfo scriptInfo)
+ {
+ script = scriptInfo;
+ script.events.OnFrame += new OpenSim.Region.Scenes.EventManager.OnFrameDelegate(events_OnFrame);
+ }
+
+ void events_OnFrame()
+ {
+ script.logger.Verbose("Hello World!");
+ }
+ }
+}
diff --git a/OpenSim/Region/Scripting/ScriptAccess.cs b/OpenSim/Region/Scripting/ScriptAccess.cs
new file mode 100644
index 0000000..a9fede5
--- /dev/null
+++ b/OpenSim/Region/Scripting/ScriptAccess.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using OpenSim.Region.Scenes;
+using OpenSim.Framework.Console;
+
+namespace OpenSim.Scripting
+{
+ ///
+ /// Class which provides access to the world
+ ///
+ public class ScriptInfo
+ {
+ // Reference to world.eventsManager provided for convenience
+ public EventManager events;
+
+ // The main world
+ public Scene world;
+
+ // The console
+ public LogBase logger;
+
+ public ScriptInfo(Scene scene)
+ {
+ world = scene;
+ events = world.eventManager;
+ logger = OpenSim.Framework.Console.MainLog.Instance;
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Caps.cs b/OpenSim/Region/Simulation/Caps.cs
new file mode 100644
index 0000000..13a351d
--- /dev/null
+++ b/OpenSim/Region/Simulation/Caps.cs
@@ -0,0 +1,258 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Xml;
+using OpenSim.Servers;
+using OpenSim.Framework;
+using OpenSim.Framework.Utilities;
+using OpenSim.Framework.Types;
+using OpenSim.Caches;
+using libsecondlife;
+
+namespace OpenSim.Region
+{
+ public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data);
+
+ public class Caps
+ {
+ private string httpListenerAddress;
+ private uint httpListenPort;
+ private string capsObjectPath = "00001-";
+ private string requestPath = "0000/";
+ private string mapLayerPath = "0001/";
+ private string newInventory = "0002/";
+ private string requestTexture = "0003/";
+ private string eventQueue = "0100/";
+ private BaseHttpServer httpListener;
+ private LLUUID agentID;
+ private AssetCache assetCache;
+ private int eventQueueCount = 1;
+ private Queue CapsEventQueue = new Queue();
+
+ public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, LLUUID agent)
+ {
+ assetCache = assetCach;
+ capsObjectPath = capsPath;
+ httpListener = httpServer;
+ httpListenerAddress = httpListen;
+ httpListenPort = httpPort;
+ agentID = agent;
+ }
+
+ ///
+ ///
+ ///
+ public void RegisterHandlers()
+ {
+ Console.WriteLine("registering CAPS handlers");
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + requestPath, CapsRequest);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + mapLayerPath, MapLayer);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + newInventory, NewAgentInventory);
+ httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + eventQueue, ProcessEventQueue);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string CapsRequest(string request, string path, string param)
+ {
+ // Console.WriteLine("Caps Request " + request);
+ string result = "";
+ result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
+ return result;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected LLSDCapsDetails GetCapabilities()
+ {
+ /* string capURLS = "";
+ capURLS += "MapLayerhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath + "";
+ capURLS += "NewFileAgentInventoryhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory + "";
+ //capURLS += "RequestTextureDownloadhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + requestTexture + "";
+ //capURLS += "EventQueueGethttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + eventQueue + "";
+ return capURLS;*/
+
+ LLSDCapsDetails caps = new LLSDCapsDetails();
+ caps.MapLayer = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath;
+ caps.NewFileAgentInventory = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory;
+ return caps;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string MapLayer(string request, string path, string param)
+ {
+ Encoding _enc = System.Text.Encoding.UTF8;
+ Hashtable hash =(Hashtable) LLSD.LLSDDeserialize(_enc.GetBytes(request));
+ LLSDMapRequest mapReq = new LLSDMapRequest();
+ LLSDHelpers.DeserialiseLLSDMap(hash, mapReq );
+
+ LLSDMapLayerResponse mapResponse= new LLSDMapLayerResponse();
+ mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
+ string res = LLSDHelpers.SerialiseLLSDReply(mapResponse);
+
+ //Console.WriteLine(" Maplayer response is " + res);
+
+ return res;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ protected LLSDMapLayer BuildLLSDMapLayerResponse()
+ {
+ LLSDMapLayer mapLayer = new LLSDMapLayer();
+ mapLayer.Right = 5000;
+ mapLayer.Top = 5000;
+ mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
+
+ return mapLayer;
+ }
+
+ public string ProcessEventQueue(string request, string path, string param)
+ {
+ // Console.WriteLine("event queue request " + request);
+ string res = "";
+ int timer = 0;
+
+ /*while ((timer < 200) || (this.CapsEventQueue.Count < 1))
+ {
+ timer++;
+ }*/
+ if (this.CapsEventQueue.Count > 0)
+ {
+ lock (this.CapsEventQueue)
+ {
+ string item = CapsEventQueue.Dequeue();
+ res = item;
+ }
+ }
+ else
+ {
+ res = this.CreateEmptyEventResponse();
+ }
+ return res;
+ }
+
+ public string CreateEstablishAgentComms(string caps, string ipAddressPort)
+ {
+ string res = "id" + eventQueueCount + "";
+ res += "events";
+ res += "messageEstablishAgentCommunication";
+ res += "body";
+ res += "sim-ip-and-port" + ipAddressPort + "";
+ res += "seed-capability" + caps + "";
+ res += "agent-id" + this.agentID.ToStringHyphenated() + "";
+ res += "";
+ res += "";
+ res += "";
+ eventQueueCount++;
+ this.CapsEventQueue.Enqueue(res);
+ return res;
+ }
+
+ public string CreateEmptyEventResponse()
+ {
+ string res = "id" + eventQueueCount + "";
+ res += "events";
+ res += "";
+ res += "";
+ eventQueueCount++;
+ return res;
+ }
+
+ public string NewAgentInventory(string request, string path, string param)
+ {
+ //Console.WriteLine("received upload request:"+ request);
+ string res = "";
+ LLUUID newAsset = LLUUID.Random();
+ LLUUID newInvItem = LLUUID.Random();
+ string uploaderPath = capsObjectPath + Util.RandomClass.Next(5000, 8000).ToString("0000");
+ AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener);
+ httpListener.AddRestHandler("POST", "/CAPS/" + uploaderPath, uploader.uploaderCaps);
+ string uploaderURL = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + uploaderPath;
+ //Console.WriteLine("uploader url is " + uploaderURL);
+ res += "";
+ res += "uploader" + uploaderURL + "";
+ //res += "successtrue";
+ res += "stateupload";
+ res += "";
+ uploader.OnUpLoad += this.UploadHandler;
+ return res;
+ }
+
+ public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data)
+ {
+ // Console.WriteLine("upload handler called");
+ AssetBase asset;
+ asset = new AssetBase();
+ asset.FullID = assetID;
+ asset.Type = 0;
+ asset.InvType = 0;
+ asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000");
+ asset.Data = data;
+ this.assetCache.AddAsset(asset);
+ }
+
+ public class AssetUploader
+ {
+ public event UpLoadedTexture OnUpLoad;
+
+ private string uploaderPath = "";
+ private LLUUID newAssetID;
+ private LLUUID inventoryItemID;
+ private BaseHttpServer httpListener;
+ public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
+ {
+ newAssetID = assetID;
+ inventoryItemID = inventoryItem;
+ uploaderPath = path;
+ httpListener = httpServer;
+
+ }
+
+ public string uploaderCaps(string request, string path, string param)
+ {
+ Encoding _enc = System.Text.Encoding.UTF8;
+ byte[] data = _enc.GetBytes(request);
+ //Console.WriteLine("recieved upload " + Util.FieldToString(data));
+ LLUUID inv = this.inventoryItemID;
+ string res = "";
+ res += "";
+ res += "new_asset" + newAssetID.ToStringHyphenated() + "";
+ res += "new_inventory_item" + inv.ToStringHyphenated() + "";
+ res += "statecomplete";
+ res += "";
+
+ // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated());
+ httpListener.RemoveRestHandler("POST", "/CAPS/" + uploaderPath);
+ if (OnUpLoad != null)
+ {
+ OnUpLoad(newAssetID, inv, data);
+ }
+
+ /*FileStream fs = File.Create("upload.jp2");
+ BinaryWriter bw = new BinaryWriter(fs);
+ bw.Write(data);
+ bw.Close();
+ fs.Close();*/
+ return res;
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/EstateManager.cs b/OpenSim/Region/Simulation/EstateManager.cs
new file mode 100644
index 0000000..dcb5564
--- /dev/null
+++ b/OpenSim/Region/Simulation/EstateManager.cs
@@ -0,0 +1,301 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Region;
+using OpenSim.Region.Scenes;
+using OpenSim;
+using libsecondlife;
+using libsecondlife.Packets;
+using Avatar = OpenSim.Region.Scenes.ScenePresence;
+
+
+namespace OpenSim.Region
+{
+
+ ///
+ /// Processes requests regarding estates. Refer to EstateSettings.cs in OpenSim.Framework. Types for all of the core settings
+ ///
+ public class EstateManager
+ {
+ private Scene m_world;
+ private RegionInfo m_regInfo;
+
+ public EstateManager(Scene world,RegionInfo reginfo)
+ {
+ m_world = world; //Estate settings found at world.m_regInfo.estateSettings
+ m_regInfo = reginfo;
+ }
+
+ private bool convertParamStringToBool(byte[] field)
+ {
+ string s = Helpers.FieldToUTF8String(field);
+ if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public void handleEstateOwnerMessage(EstateOwnerMessagePacket packet, IClientAPI remote_client)
+ {
+ if (remote_client.AgentId == m_regInfo.MasterAvatarAssignedUUID)
+ {
+ switch (Helpers.FieldToUTF8String(packet.MethodData.Method))
+ {
+ case "getinfo":
+ Console.WriteLine("GETINFO Requested");
+ this.sendRegionInfoPacketToAll();
+
+ break;
+ case "setregioninfo":
+ if (packet.ParamList.Length != 9)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: SetRegionInfo method has a ParamList of invalid length");
+ }
+ else
+ {
+ m_regInfo.estateSettings.regionFlags = libsecondlife.Simulator.RegionFlags.None;
+
+ if (convertParamStringToBool(packet.ParamList[0].Parameter))
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.BlockTerraform;
+ }
+
+ if (convertParamStringToBool(packet.ParamList[1].Parameter))
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.NoFly;
+ }
+
+ if (convertParamStringToBool(packet.ParamList[2].Parameter))
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.AllowDamage;
+ }
+
+ if (convertParamStringToBool(packet.ParamList[3].Parameter) == false)
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.BlockLandResell;
+ }
+
+
+ int tempMaxAgents = Convert.ToInt16(Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[4].Parameter)));
+ m_regInfo.estateSettings.maxAgents = (byte)tempMaxAgents;
+
+ float tempObjectBonusFactor = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
+ m_regInfo.estateSettings.objectBonusFactor = tempObjectBonusFactor;
+
+ int tempMatureLevel = Convert.ToInt16(Helpers.FieldToUTF8String(packet.ParamList[6].Parameter));
+ m_regInfo.estateSettings.simAccess = (libsecondlife.Simulator.SimAccess)tempMatureLevel;
+
+
+ if (convertParamStringToBool(packet.ParamList[7].Parameter))
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.RestrictPushObject;
+ }
+
+ if (convertParamStringToBool(packet.ParamList[8].Parameter))
+ {
+ m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | libsecondlife.Simulator.RegionFlags.AllowParcelChanges;
+ }
+
+ sendRegionInfoPacketToAll();
+
+ }
+ break;
+ case "texturebase":
+ foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
+ {
+ string s = Helpers.FieldToUTF8String(block.Parameter);
+ string[] splitField = s.Split(' ');
+ if (splitField.Length == 2)
+ {
+ LLUUID tempUUID = new LLUUID(splitField[1]);
+ switch (Convert.ToInt16(splitField[0]))
+ {
+ case 0:
+ m_regInfo.estateSettings.terrainBase0 = tempUUID;
+ break;
+ case 1:
+ m_regInfo.estateSettings.terrainBase1 = tempUUID;
+ break;
+ case 2:
+ m_regInfo.estateSettings.terrainBase2 = tempUUID;
+ break;
+ case 3:
+ m_regInfo.estateSettings.terrainBase3 = tempUUID;
+ break;
+ }
+ }
+ }
+ break;
+ case "texturedetail":
+ foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
+ {
+
+ string s = Helpers.FieldToUTF8String(block.Parameter);
+ string[] splitField = s.Split(' ');
+ if (splitField.Length == 2)
+ {
+ LLUUID tempUUID = new LLUUID(splitField[1]);
+ switch (Convert.ToInt16(splitField[0]))
+ {
+ case 0:
+ m_regInfo.estateSettings.terrainDetail0 = tempUUID;
+ break;
+ case 1:
+ m_regInfo.estateSettings.terrainDetail1 = tempUUID;
+ break;
+ case 2:
+ m_regInfo.estateSettings.terrainDetail2 = tempUUID;
+ break;
+ case 3:
+ m_regInfo.estateSettings.terrainDetail3 = tempUUID;
+ break;
+ }
+ }
+ }
+ break;
+ case "textureheights":
+ foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList)
+ {
+
+ string s = Helpers.FieldToUTF8String(block.Parameter);
+ string[] splitField = s.Split(' ');
+ if (splitField.Length == 3)
+ {
+
+ float tempHeightLow = (float)Convert.ToDecimal(splitField[1]);
+ float tempHeightHigh = (float)Convert.ToDecimal(splitField[2]);
+
+ switch (Convert.ToInt16(splitField[0]))
+ {
+ case 0:
+ m_regInfo.estateSettings.terrainStartHeight0 = tempHeightLow;
+ m_regInfo.estateSettings.terrainHeightRange0 = tempHeightHigh;
+ break;
+ case 1:
+ m_regInfo.estateSettings.terrainStartHeight1 = tempHeightLow;
+ m_regInfo.estateSettings.terrainHeightRange1 = tempHeightHigh;
+ break;
+ case 2:
+ m_regInfo.estateSettings.terrainStartHeight2 = tempHeightLow;
+ m_regInfo.estateSettings.terrainHeightRange2 = tempHeightHigh;
+ break;
+ case 3:
+ m_regInfo.estateSettings.terrainStartHeight3 = tempHeightLow;
+ m_regInfo.estateSettings.terrainHeightRange3 = tempHeightHigh;
+ break;
+ }
+ }
+ }
+ break;
+ case "texturecommit":
+ sendRegionHandshakeToAll();
+ break;
+ case "setregionterrain":
+ if (packet.ParamList.Length != 9)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
+ }
+ else
+ {
+ m_regInfo.estateSettings.waterHeight = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[0].Parameter));
+ m_regInfo.estateSettings.terrainRaiseLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[1].Parameter));
+ m_regInfo.estateSettings.terrainLowerLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter));
+ m_regInfo.estateSettings.useFixedSun = this.convertParamStringToBool(packet.ParamList[4].Parameter);
+ m_regInfo.estateSettings.sunHour = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter));
+
+ sendRegionInfoPacketToAll();
+ }
+ break;
+ default:
+ OpenSim.Framework.Console.MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString());
+ break;
+ }
+ }
+ }
+
+ public void sendRegionInfoPacketToAll()
+ {
+ List avatars = m_world.RequestAvatarList();
+
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ this.sendRegionInfoPacket(avatars[i].ControllingClient);
+ }
+ }
+
+ public void sendRegionHandshakeToAll()
+ {
+ List avatars = m_world.RequestAvatarList();
+
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ this.sendRegionHandshake(avatars[i].ControllingClient);
+ }
+ }
+
+ public void sendRegionInfoPacket(IClientAPI remote_client)
+ {
+ Encoding _enc = System.Text.Encoding.ASCII;
+
+ AgentCircuitData circuitData = remote_client.RequestClientInfo();
+
+ RegionInfoPacket regionInfoPacket = new RegionInfoPacket();
+ regionInfoPacket.AgentData.AgentID = circuitData.AgentID;
+ regionInfoPacket.AgentData.SessionID = circuitData.SessionID;
+ regionInfoPacket.RegionInfo.BillableFactor = m_regInfo.estateSettings.billableFactor;
+ regionInfoPacket.RegionInfo.EstateID = m_regInfo.estateSettings.estateID;
+ regionInfoPacket.RegionInfo.MaxAgents = m_regInfo.estateSettings.maxAgents;
+ regionInfoPacket.RegionInfo.ObjectBonusFactor = m_regInfo.estateSettings.objectBonusFactor;
+ regionInfoPacket.RegionInfo.ParentEstateID = m_regInfo.estateSettings.parentEstateID;
+ regionInfoPacket.RegionInfo.PricePerMeter = m_regInfo.estateSettings.pricePerMeter;
+ regionInfoPacket.RegionInfo.RedirectGridX = m_regInfo.estateSettings.redirectGridX;
+ regionInfoPacket.RegionInfo.RedirectGridY = m_regInfo.estateSettings.redirectGridY;
+ regionInfoPacket.RegionInfo.RegionFlags = (uint)m_regInfo.estateSettings.regionFlags;
+ regionInfoPacket.RegionInfo.SimAccess = (byte)m_regInfo.estateSettings.simAccess;
+ regionInfoPacket.RegionInfo.SimName = _enc.GetBytes( m_regInfo.RegionName);
+ regionInfoPacket.RegionInfo.SunHour = m_regInfo.estateSettings.sunHour;
+ regionInfoPacket.RegionInfo.TerrainLowerLimit = m_regInfo.estateSettings.terrainLowerLimit;
+ regionInfoPacket.RegionInfo.TerrainRaiseLimit = m_regInfo.estateSettings.terrainRaiseLimit;
+ regionInfoPacket.RegionInfo.UseEstateSun = !m_regInfo.estateSettings.useFixedSun;
+ regionInfoPacket.RegionInfo.WaterHeight = m_regInfo.estateSettings.waterHeight;
+
+ remote_client.OutPacket(regionInfoPacket);
+ }
+
+ public void sendRegionHandshake(IClientAPI remoteClient)
+ {
+ remoteClient.SendRegionHandshake(m_regInfo);
+ }
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj
new file mode 100644
index 0000000..7811a55
--- /dev/null
+++ b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj
@@ -0,0 +1,211 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {C0DAB338-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Simulation
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Simulation
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\Axiom.MathLib.dll
+ False
+
+
+ ..\..\..\bin\Db4objects.Db4o.dll
+ False
+
+
+ ..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+ ..\..\..\bin\XMLRPC.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Communications
+ {CB52B7E7-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.GenericConfig.Xml
+ {C74E4A30-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Servers
+ {2CC71860-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Caches
+ {61FCCDB3-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Physics.Manager
+ {F4FF31EB-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Region.Terrain.BasicTerrain
+ {C9E0F891-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Simulation/OpenSim.Region.Simulation.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Simulation/ParcelManager.cs b/OpenSim/Region/Simulation/ParcelManager.cs
new file mode 100644
index 0000000..d15d77d
--- /dev/null
+++ b/OpenSim/Region/Simulation/ParcelManager.cs
@@ -0,0 +1,892 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Region.Scenes;
+using Avatar = OpenSim.Region.Scenes.ScenePresence;
+
+namespace OpenSim.Region
+{
+
+
+ #region ParcelManager Class
+ ///
+ /// Handles Parcel objects and operations requiring information from other Parcel objects (divide, join, etc)
+ ///
+ public class ParcelManager : OpenSim.Framework.Interfaces.ILocalStorageParcelReceiver
+ {
+
+ #region Constants
+ //Parcel types set with flags in ParcelOverlay.
+ //Only one of these can be used.
+ public const byte PARCEL_TYPE_PUBLIC = (byte)0; //Equals 00000000
+ public const byte PARCEL_TYPE_OWNED_BY_OTHER = (byte)1; //Equals 00000001
+ public const byte PARCEL_TYPE_OWNED_BY_GROUP = (byte)2; //Equals 00000010
+ public const byte PARCEL_TYPE_OWNED_BY_REQUESTER = (byte)3; //Equals 00000011
+ public const byte PARCEL_TYPE_IS_FOR_SALE = (byte)4; //Equals 00000100
+ public const byte PARCEL_TYPE_IS_BEING_AUCTIONED = (byte)5; //Equals 00000101
+
+
+ //Flags that when set, a border on the given side will be placed
+ //NOTE: North and East is assumable by the west and south sides (if parcel to east has a west border, then I have an east border; etc)
+ //This took forever to figure out -- jeesh. /blame LL for even having to send these
+ public const byte PARCEL_FLAG_PROPERTY_BORDER_WEST = (byte)64; //Equals 01000000
+ public const byte PARCEL_FLAG_PROPERTY_BORDER_SOUTH = (byte)128; //Equals 10000000
+
+ //RequestResults (I think these are right, they seem to work):
+ public const int PARCEL_RESULT_ONE_PARCEL = 0; // The request they made contained only one parcel
+ public const int PARCEL_RESULT_MULTIPLE_PARCELS = 1; // The request they made contained more than one parcel
+
+ //These are other constants. Yay!
+ public const int START_PARCEL_LOCAL_ID = 1;
+ #endregion
+
+ #region Member Variables
+ public Dictionary parcelList = new Dictionary();
+ private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
+ private int[,] parcelIDList = new int[64, 64];
+
+ private Scene m_world;
+ private RegionInfo m_regInfo;
+
+ #endregion
+
+ #region Constructors
+ public ParcelManager(Scene world, RegionInfo reginfo)
+ {
+
+ m_world = world;
+ m_regInfo = reginfo;
+ parcelIDList.Initialize();
+
+ }
+ #endregion
+
+ #region Member Functions
+
+ #region Parcel From Storage Functions
+ public void ParcelFromStorage(ParcelData data)
+ {
+ Parcel new_parcel = new Parcel(data.ownerID, data.isGroupOwned, m_world);
+ new_parcel.parcelData = data.Copy();
+ new_parcel.setParcelBitmapFromByteArray();
+ addParcel(new_parcel);
+
+ }
+
+ public void NoParcelDataFromStorage()
+ {
+ resetSimParcels();
+ }
+ #endregion
+
+ #region Parcel Add/Remove/Get/Create
+ ///
+ /// Creates a basic Parcel object without an owner (a zeroed key)
+ ///
+ ///
+ public Parcel createBaseParcel()
+ {
+ return new Parcel(new LLUUID(), false, m_world);
+ }
+
+ ///
+ /// Adds a parcel to the stored list and adds them to the parcelIDList to what they own
+ ///
+ /// The parcel being added
+ public void addParcel(Parcel new_parcel)
+ {
+ lastParcelLocalID++;
+ new_parcel.parcelData.localID = lastParcelLocalID;
+ parcelList.Add(lastParcelLocalID, new_parcel.Copy());
+
+
+ bool[,] parcelBitmap = new_parcel.getParcelBitmap();
+ int x, y;
+ for (x = 0; x < 64; x++)
+ {
+ for (y = 0; y < 64; y++)
+ {
+ if (parcelBitmap[x, y])
+ {
+ parcelIDList[x, y] = lastParcelLocalID;
+ }
+ }
+ }
+ parcelList[lastParcelLocalID].forceUpdateParcelInfo();
+
+
+ }
+ ///
+ /// Removes a parcel from the list. Will not remove if local_id is still owning an area in parcelIDList
+ ///
+ /// Parcel.localID of the parcel to remove.
+ public void removeParcel(int local_id)
+ {
+ int x, y;
+ for (x = 0; x < 64; x++)
+ {
+ for (y = 0; y < 64; y++)
+ {
+ if (parcelIDList[x, y] == local_id)
+ {
+ throw new Exception("Could not remove parcel. Still being used at " + x + ", " + y);
+ }
+ }
+ }
+ m_world.localStorage.RemoveParcel(parcelList[local_id].parcelData);
+ parcelList.Remove(local_id);
+ }
+
+ private void performFinalParcelJoin(Parcel master, Parcel slave)
+ {
+ int x, y;
+ bool[,] parcelBitmapSlave = slave.getParcelBitmap();
+ for (x = 0; x < 64; x++)
+ {
+ for (y = 0; y < 64; y++)
+ {
+ if (parcelBitmapSlave[x, y])
+ {
+ parcelIDList[x, y] = master.parcelData.localID;
+ }
+ }
+ }
+ removeParcel(slave.parcelData.localID);
+ }
+ ///
+ /// Get the parcel at the specified point
+ ///
+ /// Value between 0 - 256 on the x axis of the point
+ /// Value between 0 - 256 on the y axis of the point
+ /// Parcel at the point supplied
+ public Parcel getParcel(int x, int y)
+ {
+ if (x > 256 || y > 256 || x < 0 || y < 0)
+ {
+ throw new Exception("Error: Parcel not found at point " + x + ", " + y);
+ }
+ else
+ {
+ return parcelList[parcelIDList[x / 4, y / 4]];
+ }
+
+ }
+ #endregion
+
+ #region Parcel Modification
+ ///
+ /// Subdivides a parcel
+ ///
+ /// West Point
+ /// South Point
+ /// East Point
+ /// North Point
+ /// LLUUID of user who is trying to subdivide
+ /// Returns true if successful
+ private bool subdivide(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
+ {
+ //First, lets loop through the points and make sure they are all in the same parcel
+ //Get the parcel at start
+ Parcel startParcel = getParcel(start_x, start_y);
+ if (startParcel == null) return false; //No such parcel at the beginning
+
+ //Loop through the points
+ try
+ {
+ int totalX = end_x - start_x;
+ int totalY = end_y - start_y;
+ int x, y;
+ for (y = 0; y < totalY; y++)
+ {
+ for (x = 0; x < totalX; x++)
+ {
+ Parcel tempParcel = getParcel(start_x + x, start_y + y);
+ if (tempParcel == null) return false; //No such parcel at that point
+ if (tempParcel != startParcel) return false; //Subdividing over 2 parcels; no-no
+ }
+ }
+ }
+ catch (Exception)
+ {
+ return false; //Exception. For now, lets skip subdivision
+ }
+
+ //If we are still here, then they are subdividing within one parcel
+ //Check owner
+ if (startParcel.parcelData.ownerID != attempting_user_id)
+ {
+ return false; //They cant do this!
+ }
+
+ //Lets create a new parcel with bitmap activated at that point (keeping the old parcels info)
+ Parcel newParcel = startParcel.Copy();
+ newParcel.parcelData.parcelName = "Subdivision of " + newParcel.parcelData.parcelName;
+ newParcel.parcelData.globalID = LLUUID.Random();
+
+ newParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(start_x, start_y, end_x, end_y));
+
+ //Now, lets set the subdivision area of the original to false
+ int startParcelIndex = startParcel.parcelData.localID;
+ parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false));
+ parcelList[startParcelIndex].forceUpdateParcelInfo();
+
+
+ //Now add the new parcel
+ addParcel(newParcel);
+
+
+
+
+
+ return true;
+ }
+ ///
+ /// Join 2 parcels together
+ ///
+ /// x value in first parcel
+ /// y value in first parcel
+ /// x value in second parcel
+ /// y value in second parcel
+ /// LLUUID of the avatar trying to join the parcels
+ /// Returns true if successful
+ private bool join(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id)
+ {
+ end_x -= 4;
+ end_y -= 4;
+
+ //NOTE: The following only connects the parcels in each corner and not all the parcels that are within the selection box!
+ //This should be fixed later -- somewhat "incomplete code" --Ming
+ Parcel startParcel, endParcel;
+
+ try
+ {
+ startParcel = getParcel(start_x, start_y);
+ endParcel = getParcel(end_x, end_y);
+ }
+ catch (Exception)
+ {
+ return false; //Error occured when trying to get the start and end parcels
+ }
+ if (startParcel == endParcel)
+ {
+ return false; //Subdivision of the same parcel is not allowed
+ }
+
+ //Check the parcel owners:
+ if (startParcel.parcelData.ownerID != endParcel.parcelData.ownerID)
+ {
+ return false;
+ }
+ if (startParcel.parcelData.ownerID != attempting_user_id)
+ {
+ //TODO: Group editing stuff. Avatar owner support for now
+ return false;
+ }
+
+ //Same owners! Lets join them
+ //Merge them to startParcel
+ parcelList[startParcel.parcelData.localID].setParcelBitmap(Parcel.mergeParcelBitmaps(startParcel.getParcelBitmap(), endParcel.getParcelBitmap()));
+ performFinalParcelJoin(startParcel, endParcel);
+
+ return true;
+
+
+
+ }
+ #endregion
+
+ #region Parcel Updating
+ ///
+ /// Where we send the ParcelOverlay packet to the client
+ ///
+ /// The object representing the client
+ public void sendParcelOverlay(IClientAPI remote_client)
+ {
+ const int PARCEL_BLOCKS_PER_PACKET = 1024;
+ int x, y = 0;
+ byte[] byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
+ int byteArrayCount = 0;
+ int sequenceID = 0;
+ ParcelOverlayPacket packet;
+
+ for (y = 0; y < 64; y++)
+ {
+ for (x = 0; x < 64; x++)
+ {
+ byte tempByte = (byte)0; //This represents the byte for the current 4x4
+ Parcel currentParcelBlock = getParcel(x * 4, y * 4);
+
+ if (currentParcelBlock.parcelData.ownerID == remote_client.AgentId)
+ {
+ //Owner Flag
+ tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_REQUESTER);
+ }
+ else if (currentParcelBlock.parcelData.salePrice > 0 && (currentParcelBlock.parcelData.authBuyerID == LLUUID.Zero || currentParcelBlock.parcelData.authBuyerID == remote_client.AgentId))
+ {
+ //Sale Flag
+ tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_IS_FOR_SALE);
+ }
+ else if (currentParcelBlock.parcelData.ownerID == LLUUID.Zero)
+ {
+ //Public Flag
+ tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_PUBLIC);
+ }
+ else
+ {
+ //Other Flag
+ tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_OTHER);
+ }
+
+
+ //Now for border control
+ if (x == 0)
+ {
+ tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
+ }
+ else if (getParcel((x - 1) * 4, y * 4) != currentParcelBlock)
+ {
+ tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST);
+ }
+
+ if (y == 0)
+ {
+ tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
+ }
+ else if (getParcel(x * 4, (y - 1) * 4) != currentParcelBlock)
+ {
+ tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH);
+ }
+
+ byteArray[byteArrayCount] = tempByte;
+ byteArrayCount++;
+ if (byteArrayCount >= PARCEL_BLOCKS_PER_PACKET)
+ {
+ byteArrayCount = 0;
+ packet = new ParcelOverlayPacket();
+ packet.ParcelData.Data = byteArray;
+ packet.ParcelData.SequenceID = sequenceID;
+ remote_client.OutPacket((Packet)packet);
+ sequenceID++;
+ byteArray = new byte[PARCEL_BLOCKS_PER_PACKET];
+ }
+ }
+ }
+
+ packet = new ParcelOverlayPacket();
+ packet.ParcelData.Data = byteArray;
+ packet.ParcelData.SequenceID = sequenceID; //Eh?
+ remote_client.OutPacket((Packet)packet);
+ }
+
+ public void handleParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client)
+ {
+ //Get the parcels within the bounds
+ List temp = new List();
+ int x, y, i;
+ int inc_x = end_x - start_x;
+ int inc_y = end_y - start_y;
+ for (x = 0; x < inc_x; x++)
+ {
+ for (y = 0; y < inc_y; y++)
+ {
+ OpenSim.Region.Parcel currentParcel = getParcel(start_x + x, start_y + y);
+ if (!temp.Contains(currentParcel))
+ {
+ currentParcel.forceUpdateParcelInfo();
+ temp.Add(currentParcel);
+ }
+ }
+ }
+
+ int requestResult = ParcelManager.PARCEL_RESULT_ONE_PARCEL;
+ if (temp.Count > 1)
+ {
+ requestResult = ParcelManager.PARCEL_RESULT_MULTIPLE_PARCELS;
+ }
+
+ for (i = 0; i < temp.Count; i++)
+ {
+ temp[i].sendParcelProperties(sequence_id, snap_selection, requestResult, remote_client);
+ }
+
+
+ sendParcelOverlay(remote_client);
+ }
+
+ public void handleParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
+ {
+ if (parcelList.ContainsKey(packet.ParcelData.LocalID))
+ {
+ parcelList[packet.ParcelData.LocalID].updateParcelProperties(packet, remote_client);
+ }
+ }
+ public void handleParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client)
+ {
+ subdivide(west, south, east, north, remote_client.AgentId);
+ }
+ public void handleParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client)
+ {
+ join(west, south, east, north, remote_client.AgentId);
+
+ }
+ #endregion
+
+ ///
+ /// Resets the sim to the default parcel (full sim parcel owned by the default user)
+ ///
+ public void resetSimParcels()
+ {
+ //Remove all the parcels in the sim and add a blank, full sim parcel set to public
+ parcelList.Clear();
+ lastParcelLocalID = START_PARCEL_LOCAL_ID - 1;
+ parcelIDList.Initialize();
+
+ Parcel fullSimParcel = new Parcel(LLUUID.Zero, false, m_world);
+
+ fullSimParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(0, 0, 256, 256));
+ fullSimParcel.parcelData.parcelName = "Your Sim Parcel";
+ fullSimParcel.parcelData.parcelDesc = "";
+
+ fullSimParcel.parcelData.ownerID = m_regInfo.MasterAvatarAssignedUUID;
+ fullSimParcel.parcelData.salePrice = 1;
+ fullSimParcel.parcelData.parcelFlags = libsecondlife.Parcel.ParcelFlags.ForSale;
+ fullSimParcel.parcelData.parcelStatus = libsecondlife.Parcel.ParcelStatus.Leased;
+
+ addParcel(fullSimParcel);
+
+ }
+ #endregion
+ }
+ #endregion
+
+
+ #region Parcel Class
+ ///
+ /// Keeps track of a specific parcel's information
+ ///
+ public class Parcel
+ {
+ #region Member Variables
+ public ParcelData parcelData = new ParcelData();
+ public Scene m_world;
+
+ private bool[,] parcelBitmap = new bool[64, 64];
+
+ #endregion
+
+
+ #region Constructors
+ public Parcel(LLUUID owner_id, bool is_group_owned, Scene world)
+ {
+ m_world = world;
+ parcelData.ownerID = owner_id;
+ parcelData.isGroupOwned = is_group_owned;
+
+ }
+ #endregion
+
+
+ #region Member Functions
+
+ #region General Functions
+ ///
+ /// Checks to see if this parcel contains a point
+ ///
+ ///
+ ///
+ /// Returns true if the parcel contains the specified point
+ public bool containsPoint(int x, int y)
+ {
+ if (x >= 0 && y >= 0 && x <= 256 && x <= 256)
+ {
+ return (parcelBitmap[x / 4, y / 4] == true);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public Parcel Copy()
+ {
+ Parcel newParcel = new Parcel(this.parcelData.ownerID, this.parcelData.isGroupOwned, m_world);
+
+ //Place all new variables here!
+ newParcel.parcelBitmap = (bool[,])(this.parcelBitmap.Clone());
+ newParcel.parcelData = parcelData.Copy();
+
+ return newParcel;
+ }
+
+ #endregion
+
+
+ #region Packet Request Handling
+ ///
+ /// Sends parcel properties as requested
+ ///
+ /// ID sent by client for them to keep track of
+ /// Bool sent by client for them to use
+ /// Object representing the client
+ public void sendParcelProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client)
+ {
+
+ ParcelPropertiesPacket updatePacket = new ParcelPropertiesPacket();
+ updatePacket.ParcelData.AABBMax = parcelData.AABBMax;
+ updatePacket.ParcelData.AABBMin = parcelData.AABBMin;
+ updatePacket.ParcelData.Area = parcelData.area;
+ updatePacket.ParcelData.AuctionID = parcelData.auctionID;
+ updatePacket.ParcelData.AuthBuyerID = parcelData.authBuyerID; //unemplemented
+
+ updatePacket.ParcelData.Bitmap = parcelData.parcelBitmapByteArray;
+
+ updatePacket.ParcelData.Desc = libsecondlife.Helpers.StringToField(parcelData.parcelDesc);
+ updatePacket.ParcelData.Category = (byte)parcelData.category;
+ updatePacket.ParcelData.ClaimDate = parcelData.claimDate;
+ updatePacket.ParcelData.ClaimPrice = parcelData.claimPrice;
+ updatePacket.ParcelData.GroupID = parcelData.groupID;
+ updatePacket.ParcelData.GroupPrims = parcelData.groupPrims;
+ updatePacket.ParcelData.IsGroupOwned = parcelData.isGroupOwned;
+ updatePacket.ParcelData.LandingType = (byte)parcelData.landingType;
+ updatePacket.ParcelData.LocalID = parcelData.localID;
+ updatePacket.ParcelData.MaxPrims = 1000; //unemplemented
+ updatePacket.ParcelData.MediaAutoScale = parcelData.mediaAutoScale;
+ updatePacket.ParcelData.MediaID = parcelData.mediaID;
+ updatePacket.ParcelData.MediaURL = Helpers.StringToField(parcelData.mediaURL);
+ updatePacket.ParcelData.MusicURL = Helpers.StringToField(parcelData.musicURL);
+ updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName);
+ updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented
+ updatePacket.ParcelData.OtherCount = 0; //unemplemented
+ updatePacket.ParcelData.OtherPrims = 0; //unemplented
+ updatePacket.ParcelData.OwnerID = parcelData.ownerID;
+ updatePacket.ParcelData.OwnerPrims = 0; //unemplemented
+ updatePacket.ParcelData.ParcelFlags = (uint)parcelData.parcelFlags; //unemplemented
+ updatePacket.ParcelData.ParcelPrimBonus = (float)1.0; //unemplemented
+ updatePacket.ParcelData.PassHours = parcelData.passHours;
+ updatePacket.ParcelData.PassPrice = parcelData.passPrice;
+ updatePacket.ParcelData.PublicCount = 0; //unemplemented
+ updatePacket.ParcelData.RegionDenyAnonymous = false; //unemplemented
+ updatePacket.ParcelData.RegionDenyIdentified = false; //unemplemented
+ updatePacket.ParcelData.RegionDenyTransacted = false; //unemplemented
+ updatePacket.ParcelData.RegionPushOverride = true; //unemplemented
+ updatePacket.ParcelData.RentPrice = 0; //??
+ updatePacket.ParcelData.RequestResult = request_result;
+ updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented
+ updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented
+ updatePacket.ParcelData.SelfCount = 0;//unemplemented
+ updatePacket.ParcelData.SequenceID = sequence_id;
+ updatePacket.ParcelData.SimWideMaxPrims = 15000; //unemplemented
+ updatePacket.ParcelData.SimWideTotalPrims = 0; //unemplemented
+ updatePacket.ParcelData.SnapSelection = snap_selection;
+ updatePacket.ParcelData.SnapshotID = parcelData.snapshotID;
+ updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus;
+ updatePacket.ParcelData.TotalPrims = 0; //unemplemented
+ updatePacket.ParcelData.UserLocation = parcelData.userLocation;
+ updatePacket.ParcelData.UserLookAt = parcelData.userLookAt;
+ remote_client.OutPacket((Packet)updatePacket);
+ }
+
+ public void updateParcelProperties(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client)
+ {
+ if (remote_client.AgentId == parcelData.ownerID)
+ {
+ //Needs later group support
+ parcelData.authBuyerID = packet.ParcelData.AuthBuyerID;
+ parcelData.category = (libsecondlife.Parcel.ParcelCategory)packet.ParcelData.Category;
+ parcelData.parcelDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc);
+ parcelData.groupID = packet.ParcelData.GroupID;
+ parcelData.landingType = packet.ParcelData.LandingType;
+ parcelData.mediaAutoScale = packet.ParcelData.MediaAutoScale;
+ parcelData.mediaID = packet.ParcelData.MediaID;
+ parcelData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL);
+ parcelData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL);
+ parcelData.parcelName = libsecondlife.Helpers.FieldToUTF8String(packet.ParcelData.Name);
+ parcelData.parcelFlags = (libsecondlife.Parcel.ParcelFlags)packet.ParcelData.ParcelFlags;
+ parcelData.passHours = packet.ParcelData.PassHours;
+ parcelData.passPrice = packet.ParcelData.PassPrice;
+ parcelData.salePrice = packet.ParcelData.SalePrice;
+ parcelData.snapshotID = packet.ParcelData.SnapshotID;
+ parcelData.userLocation = packet.ParcelData.UserLocation;
+ parcelData.userLookAt = packet.ParcelData.UserLookAt;
+
+ List avatars = m_world.RequestAvatarList();
+
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ Parcel over = m_world.parcelManager.getParcel((int)Math.Round(avatars[i].Pos.X), (int)Math.Round(avatars[i].Pos.Y));
+ if (over == this)
+ {
+ sendParcelProperties(0, false, 0, avatars[i].ControllingClient);
+ }
+ }
+
+ }
+ }
+ #endregion
+
+
+ #region Update Functions
+ ///
+ /// Updates the AABBMin and AABBMax values after area/shape modification of parcel
+ ///
+ private void updateAABBAndAreaValues()
+ {
+ int min_x = 64;
+ int min_y = 64;
+ int max_x = 0;
+ int max_y = 0;
+ int tempArea = 0;
+ int x, y;
+ for (x = 0; x < 64; x++)
+ {
+ for (y = 0; y < 64; y++)
+ {
+ if (parcelBitmap[x, y] == true)
+ {
+ if (min_x > x) min_x = x;
+ if (min_y > y) min_y = y;
+ if (max_x < x) max_x = x;
+ if (max_y < y) max_y = y;
+ tempArea += 16; //16sqm parcel
+ }
+ }
+ }
+ parcelData.AABBMin = new LLVector3((float)(min_x * 4), (float)(min_y * 4), m_world.Terrain[(min_x * 4), (min_y * 4)]);
+ parcelData.AABBMax = new LLVector3((float)(max_x * 4), (float)(max_y * 4), m_world.Terrain[(max_x * 4), (max_y * 4)]);
+ parcelData.area = tempArea;
+ }
+
+ public void updateParcelBitmapByteArray()
+ {
+ parcelData.parcelBitmapByteArray = convertParcelBitmapToBytes();
+ }
+
+ ///
+ /// Update all settings in parcel such as area, bitmap byte array, etc
+ ///
+ public void forceUpdateParcelInfo()
+ {
+ this.updateAABBAndAreaValues();
+ this.updateParcelBitmapByteArray();
+ }
+
+ public void setParcelBitmapFromByteArray()
+ {
+ parcelBitmap = convertBytesToParcelBitmap();
+ }
+ #endregion
+
+
+ #region Parcel Bitmap Functions
+ ///
+ /// Sets the parcel's bitmap manually
+ ///
+ /// 64x64 block representing where this parcel is on a map
+ public void setParcelBitmap(bool[,] bitmap)
+ {
+ if (bitmap.GetLength(0) != 64 || bitmap.GetLength(1) != 64 || bitmap.Rank != 2)
+ {
+ //Throw an exception - The bitmap is not 64x64
+ throw new Exception("Error: Invalid Parcel Bitmap");
+ }
+ else
+ {
+ //Valid: Lets set it
+ parcelBitmap = bitmap;
+ forceUpdateParcelInfo();
+
+ }
+ }
+ ///
+ /// Gets the parcels bitmap manually
+ ///
+ ///
+ public bool[,] getParcelBitmap()
+ {
+ return parcelBitmap;
+ }
+ ///
+ /// Converts the parcel bitmap to a packet friendly byte array
+ ///
+ ///
+ private byte[] convertParcelBitmapToBytes()
+ {
+ byte[] tempConvertArr = new byte[512];
+ byte tempByte = 0;
+ int x, y, i, byteNum = 0;
+ i = 0;
+ for (y = 0; y < 64; y++)
+ {
+ for (x = 0; x < 64; x++)
+ {
+ tempByte = Convert.ToByte(tempByte | Convert.ToByte(parcelBitmap[x, y]) << (i++ % 8));
+ if (i % 8 == 0)
+ {
+ tempConvertArr[byteNum] = tempByte;
+ tempByte = (byte)0;
+ i = 0;
+ byteNum++;
+ }
+ }
+ }
+ return tempConvertArr;
+ }
+
+ private bool[,] convertBytesToParcelBitmap()
+ {
+ bool[,] tempConvertMap = new bool[64, 64];
+ tempConvertMap.Initialize();
+ byte tempByte = 0;
+ int x = 0, y = 0, i = 0, bitNum = 0;
+ for (i = 0; i < 512; i++)
+ {
+ tempByte = parcelData.parcelBitmapByteArray[i];
+ for (bitNum = 0; bitNum < 8; bitNum++)
+ {
+ bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte)1);
+ tempConvertMap[x, y] = bit;
+ x++;
+ if (x > 63)
+ {
+ x = 0;
+ y++;
+ }
+
+ }
+
+ }
+ return tempConvertMap;
+ }
+ ///
+ /// Full sim parcel creation
+ ///
+ ///
+ public static bool[,] basicFullRegionParcelBitmap()
+ {
+ return getSquareParcelBitmap(0, 0, 256, 256);
+ }
+
+ ///
+ /// Used to modify the bitmap between the x and y points. Points use 64 scale
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool[,] getSquareParcelBitmap(int start_x, int start_y, int end_x, int end_y)
+ {
+
+ bool[,] tempBitmap = new bool[64, 64];
+ tempBitmap.Initialize();
+
+ tempBitmap = modifyParcelBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true);
+ return tempBitmap;
+ }
+
+ ///
+ /// Change a parcel's bitmap at within a square and set those points to a specific value
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool[,] modifyParcelBitmapSquare(bool[,] parcel_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value)
+ {
+ if (parcel_bitmap.GetLength(0) != 64 || parcel_bitmap.GetLength(1) != 64 || parcel_bitmap.Rank != 2)
+ {
+ //Throw an exception - The bitmap is not 64x64
+ throw new Exception("Error: Invalid Parcel Bitmap in modifyParcelBitmapSquare()");
+ }
+
+ int x, y;
+ for (y = 0; y < 64; y++)
+ {
+ for (x = 0; x < 64; x++)
+ {
+ if (x >= start_x / 4 && x < end_x / 4
+ && y >= start_y / 4 && y < end_y / 4)
+ {
+ parcel_bitmap[x, y] = set_value;
+ }
+ }
+ }
+ return parcel_bitmap;
+ }
+ ///
+ /// Join the true values of 2 bitmaps together
+ ///
+ ///
+ ///
+ ///
+ public static bool[,] mergeParcelBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
+ {
+ if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2)
+ {
+ //Throw an exception - The bitmap is not 64x64
+ throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_base in mergeParcelBitmaps");
+ }
+ if (bitmap_add.GetLength(0) != 64 || bitmap_add.GetLength(1) != 64 || bitmap_add.Rank != 2)
+ {
+ //Throw an exception - The bitmap is not 64x64
+ throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_add in mergeParcelBitmaps");
+
+ }
+
+ int x, y;
+ for (y = 0; y < 64; y++)
+ {
+ for (x = 0; x < 64; x++)
+ {
+ if (bitmap_add[x, y])
+ {
+ bitmap_base[x, y] = true;
+ }
+ }
+ }
+ return bitmap_base;
+ }
+ #endregion
+
+ #endregion
+
+
+ }
+ #endregion
+
+
+}
diff --git a/OpenSim/Region/Simulation/RegionManager.cs b/OpenSim/Region/Simulation/RegionManager.cs
new file mode 100644
index 0000000..a317f0f
--- /dev/null
+++ b/OpenSim/Region/Simulation/RegionManager.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OpenGrid.Framework.Communications;
+using OpenSim.Framework;
+using OpenSim.Framework.Types;
+using OpenSim.Servers;
+
+namespace OpenSim.Region
+{
+ public class RegionManager //needs renaming , but first we need to rename the namespace
+ {
+ protected AuthenticateSessionsBase authenticateHandler;
+ protected RegionCommsListener regionCommsHost;
+ protected CommunicationsManager commsManager;
+ protected List capsHandlers = new List();
+ protected BaseHttpServer httpListener;
+
+ protected Scenes.Scene m_Scene;
+
+ public ParcelManager parcelManager;
+ public EstateManager estateManager;
+
+ public RegionManager()
+ {
+
+ }
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/Entity.cs b/OpenSim/Region/Simulation/Scenes/Entity.cs
new file mode 100644
index 0000000..f8754f5
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Entity.cs
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using Axiom.MathLib;
+using OpenSim.Physics.Manager;
+using libsecondlife;
+using OpenSim.Region.Scripting;
+
+namespace OpenSim.Region.Scenes
+{
+ public abstract class Entity : IScriptReadonlyEntity
+ {
+ public libsecondlife.LLUUID uuid;
+ public Quaternion rotation;
+ protected List children;
+
+ protected PhysicsActor _physActor;
+ protected Scene m_world;
+ protected string m_name;
+
+ ///
+ ///
+ ///
+ public virtual string Name
+ {
+ get { return m_name; }
+ }
+
+ protected LLVector3 m_pos;
+ ///
+ ///
+ ///
+ public virtual LLVector3 Pos
+ {
+ get
+ {
+ if (this._physActor != null)
+ {
+ m_pos.X = _physActor.Position.X;
+ m_pos.Y = _physActor.Position.Y;
+ m_pos.Z = _physActor.Position.Z;
+ }
+
+ return m_pos;
+ }
+ set
+ {
+ if (this._physActor != null)
+ {
+ try
+ {
+ lock (this.m_world.SyncRoot)
+ {
+
+ this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+ }
+
+ m_pos = value;
+ }
+ }
+
+ public LLVector3 velocity;
+
+ ///
+ ///
+ ///
+ public virtual LLVector3 Velocity
+ {
+ get
+ {
+ if (this._physActor != null)
+ {
+ velocity.X = _physActor.Velocity.X;
+ velocity.Y = _physActor.Velocity.Y;
+ velocity.Z = _physActor.Velocity.Z;
+ }
+
+ return velocity;
+ }
+ set
+ {
+ if (this._physActor != null)
+ {
+ try
+ {
+ lock (this.m_world.SyncRoot)
+ {
+
+ this._physActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z);
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+ }
+
+ velocity = value;
+ }
+ }
+
+ protected uint m_localId;
+
+ public uint LocalId
+ {
+ get { return m_localId; }
+ }
+
+ ///
+ /// Creates a new Entity (should not occur on it's own)
+ ///
+ public Entity()
+ {
+ uuid = new libsecondlife.LLUUID();
+
+ m_pos = new LLVector3();
+ velocity = new LLVector3();
+ rotation = new Quaternion();
+ m_name = "(basic entity)";
+ children = new List();
+ }
+
+ ///
+ ///
+ ///
+ public virtual void updateMovement()
+ {
+ foreach (Entity child in children)
+ {
+ child.updateMovement();
+ }
+ }
+
+ ///
+ /// Performs any updates that need to be done at each frame. This function is overridable from it's children.
+ ///
+ public virtual void update() {
+ // Do any per-frame updates needed that are applicable to every type of entity
+ foreach (Entity child in children)
+ {
+ child.update();
+ }
+ }
+
+ ///
+ /// Called at a set interval to inform entities that they should back themsleves up to the DB
+ ///
+ public virtual void BackUp()
+ {
+
+ }
+
+ ///
+ /// Infoms the entity that the land (heightmap) has changed
+ ///
+ public virtual void LandRenegerated()
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs
new file mode 100644
index 0000000..65077e6
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/IScenePresenceBody.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Region.Scenes
+{
+ public interface IScenePresenceBody
+ {
+ void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation);
+ void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
+ void SendOurAppearance(IClientAPI OurClient);
+ void SendAppearanceToOtherAgent(ScenePresence avatarInfo);
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/Primitive.cs b/OpenSim/Region/Simulation/Scenes/Primitive.cs
new file mode 100644
index 0000000..e04c711
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Primitive.cs
@@ -0,0 +1,582 @@
+
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+
+namespace OpenSim.Region.Scenes
+{
+ public class Primitive : Entity
+ {
+ internal PrimData primData;
+ private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
+ // private Dictionary m_clientThreads;
+ private ulong m_regionHandle;
+ private const uint FULL_MASK_PERMISSIONS = 2147483647;
+ private bool physicsEnabled = false;
+ private byte updateFlag = 0;
+ private uint flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
+
+ private Dictionary inventoryItems;
+
+ #region Properties
+
+ public LLVector3 Scale
+ {
+ set
+ {
+ this.primData.Scale = value;
+ //this.dirtyFlag = true;
+ }
+ get
+ {
+ return this.primData.Scale;
+ }
+ }
+
+ public PhysicsActor PhysActor
+ {
+ set
+ {
+ this._physActor = value;
+ }
+ }
+
+ public override LLVector3 Pos
+ {
+ get
+ {
+ return base.Pos;
+ }
+ set
+ {
+ base.Pos = value;
+ }
+ }
+ #endregion
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public Primitive( ulong regionHandle, Scene world)
+ {
+ // m_clientThreads = clientThreads;
+ m_regionHandle = regionHandle;
+ m_world = world;
+ inventoryItems = new Dictionary();
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
+ {
+ // m_clientThreads = clientThreads;
+ m_regionHandle = regionHandle;
+ m_world = world;
+ inventoryItems = new Dictionary();
+ this.CreateFromPacket(addPacket, ownerID, localID);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public Primitive( ulong regionHandle, Scene world, LLUUID owner, LLUUID fullID, uint localID)
+ {
+ // m_clientThreads = clientThreads;
+ m_regionHandle = regionHandle;
+ m_world = world;
+ inventoryItems = new Dictionary();
+ this.primData = new PrimData();
+ this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+ this.primData.OwnerID = owner;
+ this.primData.FullID = this.uuid = fullID;
+ this.primData.LocalID = m_localId = localID;
+ }
+
+ ///
+ /// Constructor to create a default cube
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public Primitive( ulong regionHandle, Scene world, LLUUID owner, uint localID, LLVector3 position)
+ {
+ //m_clientThreads = clientThreads;
+ m_regionHandle = regionHandle;
+ m_world = world;
+ inventoryItems = new Dictionary();
+ this.primData = PrimData.DefaultCube();
+ this.primData.OwnerID = owner;
+ this.primData.LocalID = m_localId = localID;
+ this.Pos = this.primData.Position = position;
+
+ this.updateFlag = 1;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public byte[] GetByteArray()
+ {
+ byte[] result = null;
+ List dataArrays = new List();
+ dataArrays.Add(primData.ToBytes());
+ foreach (Entity child in children)
+ {
+ if (child is OpenSim.Region.Scenes.Primitive)
+ {
+ dataArrays.Add(((OpenSim.Region.Scenes.Primitive)child).GetByteArray());
+ }
+ }
+ byte[] primstart = Helpers.StringToField("");
+ byte[] primend = Helpers.StringToField("");
+ int totalLength = primstart.Length + primend.Length;
+ for (int i = 0; i < dataArrays.Count; i++)
+ {
+ totalLength += dataArrays[i].Length;
+ }
+
+ result = new byte[totalLength];
+ int arraypos = 0;
+ Array.Copy(primstart, 0, result, 0, primstart.Length);
+ arraypos += primstart.Length;
+ for (int i = 0; i < dataArrays.Count; i++)
+ {
+ Array.Copy(dataArrays[i], 0, result, arraypos, dataArrays[i].Length);
+ arraypos += dataArrays[i].Length;
+ }
+ Array.Copy(primend, 0, result, arraypos, primend.Length);
+
+ return result;
+ }
+
+ #region Overridden Methods
+
+ ///
+ ///
+ ///
+ public override void update()
+ {
+ if (this.updateFlag == 1) // is a new prim just been created/reloaded
+ {
+ this.SendFullUpdateToAllClients();
+ this.updateFlag = 0;
+ }
+ if (this.updateFlag == 2) //some change has been made so update the clients
+ {
+ this.SendTerseUpdateToALLClients();
+ this.updateFlag = 0;
+ }
+ }
+
+ ///
+ ///
+ ///
+ public override void BackUp()
+ {
+
+ }
+
+ #endregion
+
+ #region Packet handlers
+
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePosition(LLVector3 pos)
+ {
+ this.Pos = new LLVector3(pos.X, pos.Y, pos.Z);
+ this.updateFlag = 2;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void UpdateShape(ObjectShapePacket.ObjectDataBlock updatePacket)
+ {
+ this.primData.PathBegin = updatePacket.PathBegin;
+ this.primData.PathEnd = updatePacket.PathEnd;
+ this.primData.PathScaleX = updatePacket.PathScaleX;
+ this.primData.PathScaleY = updatePacket.PathScaleY;
+ this.primData.PathShearX = updatePacket.PathShearX;
+ this.primData.PathShearY = updatePacket.PathShearY;
+ this.primData.PathSkew = updatePacket.PathSkew;
+ this.primData.ProfileBegin = updatePacket.ProfileBegin;
+ this.primData.ProfileEnd = updatePacket.ProfileEnd;
+ this.primData.PathCurve = updatePacket.PathCurve;
+ this.primData.ProfileCurve = updatePacket.ProfileCurve;
+ this.primData.ProfileHollow = updatePacket.ProfileHollow;
+ this.primData.PathRadiusOffset = updatePacket.PathRadiusOffset;
+ this.primData.PathRevolutions = updatePacket.PathRevolutions;
+ this.primData.PathTaperX = updatePacket.PathTaperX;
+ this.primData.PathTaperY = updatePacket.PathTaperY;
+ this.primData.PathTwist = updatePacket.PathTwist;
+ this.primData.PathTwistBegin = updatePacket.PathTwistBegin;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void UpdateTexture(byte[] tex)
+ {
+ this.primData.TextureEntry = tex;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void AssignToParent(Primitive prim)
+ {
+
+ }
+
+ #endregion
+
+ # region Inventory Methods
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool AddToInventory(InventoryItem item)
+ {
+ return false;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public InventoryItem RemoveFromInventory(LLUUID itemID)
+ {
+ return null;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RequestXferInventory(IClientAPI simClient, ulong xferID)
+ {
+ //will only currently work if the total size of the inventory data array is under about 1000 bytes
+ SendXferPacketPacket send = new SendXferPacketPacket();
+
+ send.XferID.ID = xferID;
+ send.XferID.Packet = 1 + 2147483648;
+ send.DataPacket.Data = this.ConvertInventoryToBytes();
+
+ simClient.OutPacket(send);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public byte[] ConvertInventoryToBytes()
+ {
+ System.Text.Encoding enc = System.Text.Encoding.ASCII;
+ byte[] result = new byte[0];
+ List inventoryData = new List();
+ int totallength = 0;
+ foreach (InventoryItem invItem in inventoryItems.Values)
+ {
+ byte[] data = enc.GetBytes(invItem.ExportString());
+ inventoryData.Add(data);
+ totallength += data.Length;
+ }
+ //TODO: copy arrays into the single result array
+
+ return result;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void CreateInventoryFromBytes(byte[] data)
+ {
+
+ }
+
+ #endregion
+
+ #region Update viewers Methods
+
+ ///
+ ///
+ ///
+ ///
+ public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
+ {
+ this.SendFullUpdateToClient(remoteClient);
+ for (int i = 0; i < this.children.Count; i++)
+ {
+ if (this.children[i] is Primitive)
+ {
+ ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendFullUpdateToClient(IClientAPI remoteClient)
+ {
+ LLVector3 lPos;
+ if (this._physActor != null && this.physicsEnabled)
+ {
+ PhysicsVector pPos = this._physActor.Position;
+ lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
+ }
+ else
+ {
+ lPos = this.Pos;
+ }
+
+ remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.primData, lPos, new LLUUID("00000000-0000-0000-9999-000000000005"), this.flags);
+ }
+
+ ///
+ ///
+ ///
+ public void SendFullUpdateToAllClients()
+ {
+ List avatars = this.m_world.RequestAvatarList();
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ this.SendFullUpdateToClient(avatars[i].ControllingClient);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendTerseUpdateToClient(IClientAPI RemoteClient)
+ {
+ LLVector3 lPos;
+ Axiom.MathLib.Quaternion lRot;
+ if (this._physActor != null && this.physicsEnabled) //is this needed ? doesn't the property fields do this for us?
+ {
+ PhysicsVector pPos = this._physActor.Position;
+ lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
+ lRot = this._physActor.Orientation;
+ }
+ else
+ {
+ lPos = this.Pos;
+ lRot = this.rotation;
+ }
+ LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w);
+ RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot);
+ }
+
+ ///
+ ///
+ ///
+ public void SendTerseUpdateToALLClients()
+ {
+ List avatars = this.m_world.RequestAvatarList();
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ this.SendTerseUpdateToClient(avatars[i].ControllingClient);
+ }
+ }
+
+ #endregion
+
+ #region Create Methods
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
+ {
+ PrimData PData = new PrimData();
+ this.primData = PData;
+ this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+
+ PData.OwnerID = ownerID;
+ PData.PCode = addPacket.ObjectData.PCode;
+ PData.PathBegin = addPacket.ObjectData.PathBegin;
+ PData.PathEnd = addPacket.ObjectData.PathEnd;
+ PData.PathScaleX = addPacket.ObjectData.PathScaleX;
+ PData.PathScaleY = addPacket.ObjectData.PathScaleY;
+ PData.PathShearX = addPacket.ObjectData.PathShearX;
+ PData.PathShearY = addPacket.ObjectData.PathShearY;
+ PData.PathSkew = addPacket.ObjectData.PathSkew;
+ PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
+ PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
+ PData.Scale = addPacket.ObjectData.Scale;
+ PData.PathCurve = addPacket.ObjectData.PathCurve;
+ PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
+ PData.ParentID = 0;
+ PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
+ PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
+ PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
+ PData.PathTaperX = addPacket.ObjectData.PathTaperX;
+ PData.PathTaperY = addPacket.ObjectData.PathTaperY;
+ PData.PathTwist = addPacket.ObjectData.PathTwist;
+ PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
+ LLVector3 pos1 = addPacket.ObjectData.RayEnd;
+ this.primData.FullID = this.uuid = LLUUID.Random();
+ this.primData.LocalID = m_localId = (uint)(localID);
+ this.primData.Position = this.Pos = pos1;
+
+ this.updateFlag = 1;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromBytes(byte[] data)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromPrimData(PrimData primData)
+ {
+ this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromPrimData(PrimData primData, LLVector3 posi, uint localID, bool newprim)
+ {
+
+ }
+
+ public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
+ {
+ // Console.WriteLine("moving prim to new location " + pos.X + " , " + pos.Y + " , " + pos.Z);
+ this.Pos = pos;
+ this.SendTerseUpdateToALLClients();
+ }
+
+ public void GetProperites(IClientAPI client)
+ {
+ //needs changing
+ ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
+ proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
+ proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
+ proper.ObjectData[0].ItemID = LLUUID.Zero;
+ proper.ObjectData[0].CreationDate = (ulong)primData.CreationDate;
+ proper.ObjectData[0].CreatorID = primData.OwnerID;
+ proper.ObjectData[0].FolderID = LLUUID.Zero;
+ proper.ObjectData[0].FromTaskID = LLUUID.Zero;
+ proper.ObjectData[0].GroupID = LLUUID.Zero;
+ proper.ObjectData[0].InventorySerial = 0;
+ proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
+ proper.ObjectData[0].ObjectID = this.uuid;
+ proper.ObjectData[0].OwnerID = primData.OwnerID;
+ proper.ObjectData[0].TouchName = new byte[0];
+ proper.ObjectData[0].TextureID = new byte[0];
+ proper.ObjectData[0].SitName = new byte[0];
+ proper.ObjectData[0].Name = new byte[0];
+ proper.ObjectData[0].Description = new byte[0];
+ proper.ObjectData[0].OwnerMask = primData.OwnerMask;
+ proper.ObjectData[0].NextOwnerMask = primData.NextOwnerMask;
+ proper.ObjectData[0].GroupMask = primData.GroupMask;
+ proper.ObjectData[0].EveryoneMask = primData.EveryoneMask;
+ proper.ObjectData[0].BaseMask = primData.BaseMask;
+
+ client.OutPacket(proper);
+
+ }
+
+ #endregion
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs
new file mode 100644
index 0000000..d1a2717
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.PacketHandlers.cs
@@ -0,0 +1,305 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
+
+namespace OpenSim.Region.Scenes
+{
+ public partial class Scene
+ {
+ ///
+ /// Modifies terrain using the specified information
+ ///
+ /// The height at which the user started modifying the terrain
+ /// The number of seconds the modify button was pressed
+ /// The size of the brush used
+ /// The action to be performed
+ /// Distance from the north border where the cursor is located
+ /// Distance from the west border where the cursor is located
+ public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west)
+ {
+ // Shiny.
+ double size = (double)(1 << brushsize);
+
+ switch (action)
+ {
+ case 0:
+ // flatten terrain
+ Terrain.flatten(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+ case 1:
+ // raise terrain
+ Terrain.raise(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+ case 2:
+ //lower terrain
+ Terrain.lower(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+ case 3:
+ // smooth terrain
+ Terrain.smooth(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+ case 4:
+ // noise
+ Terrain.noise(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+ case 5:
+ // revert
+ Terrain.revert(north, west, size, (double)seconds / 100.0);
+ RegenerateTerrain(true, (int)north, (int)west);
+ break;
+
+ // CLIENT EXTENSIONS GO HERE
+ case 128:
+ // erode-thermal
+ break;
+ case 129:
+ // erode-aerobic
+ break;
+ case 130:
+ // erode-hydraulic
+ break;
+ }
+ return;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
+ {
+ Console.WriteLine("Chat message");
+ ScenePresence avatar = null;
+ foreach (IClientAPI client in m_clientThreads.Values)
+ {
+ int dis = -1000;
+ if (this.Avatars.ContainsKey(client.AgentId))
+ {
+
+ avatar = this.Avatars[client.AgentId];
+ // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
+ dis= (int)avatar.Pos.GetDistanceTo(fromPos);
+ Console.WriteLine("found avatar at " +dis);
+
+ }
+
+ switch (type)
+ {
+ case 0: // Whisper
+ if ((dis < 10) && (dis > -10))
+ {
+ //should change so the message is sent through the avatar rather than direct to the ClientView
+ client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
+ }
+ break;
+ case 1: // Say
+ if ((dis < 30) && (dis > -30))
+ {
+ Console.WriteLine("sending chat");
+ client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
+ }
+ break;
+ case 2: // Shout
+ if ((dis < 100) && (dis > -100))
+ {
+ client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
+ }
+ break;
+
+ case 0xff: // Broadcast
+ client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
+ break;
+ }
+
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RezObject(AssetBase primAsset, LLVector3 pos)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void DeRezObject(Packet packet, IClientAPI simClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendAvatarsToClient(IClientAPI remoteClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void LinkObjects(uint parentPrim, List childPrims)
+ {
+
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
+ {
+ foreach (Entity ent in Entities.Values)
+ {
+ if (ent.LocalId == primLocalID)
+ {
+ ((OpenSim.Region.Scenes.Primitive)ent).GetProperites(remoteClient);
+ break;
+ }
+ }
+ }
+
+ public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
+ {
+ if (this.Entities.ContainsKey(objectID))
+ {
+ ((Primitive)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
+ {
+ foreach (Entity ent in Entities.Values)
+ {
+ if (ent.LocalId == localID)
+ {
+ ((OpenSim.Region.Scenes.Primitive)ent).UpdatePosition(pos);
+ break;
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
+ {
+ }
+
+ ///
+ /// Sends prims to a client
+ ///
+ /// Client to send to
+ public void GetInitialPrims(IClientAPI RemoteClient)
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs b/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs
new file mode 100644
index 0000000..7b53388
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.Scripting.cs
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using System.IO;
+using System.Reflection;
+using OpenSim.Framework;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using libsecondlife;
+
+namespace OpenSim.Region.Scenes
+{
+ public partial class Scene
+ {
+ private Dictionary scriptEngines = new Dictionary();
+
+ ///
+ ///
+ ///
+ private void LoadScriptEngines()
+ {
+ this.LoadScriptPlugins();
+ }
+
+ ///
+ ///
+ ///
+ public void LoadScriptPlugins()
+ {
+ string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ScriptEngines");
+ string[] pluginFiles = Directory.GetFiles(path, "*.dll");
+
+
+ for (int i = 0; i < pluginFiles.Length; i++)
+ {
+ this.AddPlugin(pluginFiles[i]);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ private void AddPlugin(string FileName)
+ {
+ Assembly pluginAssembly = Assembly.LoadFrom(FileName);
+
+ foreach (Type pluginType in pluginAssembly.GetTypes())
+ {
+ if (pluginType.IsPublic)
+ {
+ if (!pluginType.IsAbstract)
+ {
+ Type typeInterface = pluginType.GetInterface("IScriptEngine", true);
+
+ if (typeInterface != null)
+ {
+ IScriptEngine plug = (IScriptEngine)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
+ plug.Init(this);
+ this.scriptEngines.Add(plug.GetName(), plug);
+
+ }
+
+ typeInterface = null;
+ }
+ }
+ }
+
+ pluginAssembly = null;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void LoadScript(string scriptType, string scriptName, string script, Entity ent)
+ {
+ if(this.scriptEngines.ContainsKey(scriptType))
+ {
+ this.scriptEngines[scriptType].LoadScript(script, scriptName, ent.LocalId);
+ }
+ }
+
+ #region IScriptAPI Methods
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public LLVector3 GetEntityPosition(uint localID)
+ {
+ LLVector3 res = new LLVector3();
+ // Console.WriteLine("script- getting entity " + localID + " position");
+ foreach (Entity entity in this.Entities.Values)
+ {
+ if (entity.LocalId == localID)
+ {
+ res.X = entity.Pos.X;
+ res.Y = entity.Pos.Y;
+ res.Z = entity.Pos.Z;
+ }
+ }
+ return res;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SetEntityPosition(uint localID, float x , float y, float z)
+ {
+ foreach (Entity entity in this.Entities.Values)
+ {
+ if (entity.LocalId == localID && entity is Primitive)
+ {
+ LLVector3 pos = entity.Pos;
+ pos.X = x;
+ pos.Y = y;
+ Primitive prim = entity as Primitive;
+ // Of course, we really should have asked the physEngine if this is possible, and if not, returned false.
+ //prim.UpdatePosition(pos);
+ // Console.WriteLine("script- setting entity " + localID + " positon");
+ }
+ }
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public uint GetRandomAvatarID()
+ {
+ //Console.WriteLine("script- getting random avatar id");
+ uint res = 0;
+ foreach (Entity entity in this.Entities.Values)
+ {
+ if (entity is ScenePresence)
+ {
+ res = entity.LocalId;
+ }
+ }
+ return res;
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/Scene.cs b/OpenSim/Region/Simulation/Scenes/Scene.cs
new file mode 100644
index 0000000..bf2244e
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/Scene.cs
@@ -0,0 +1,795 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 libsecondlife.Packets;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+using System.IO;
+using System.Threading;
+using System.Timers;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework;
+using OpenSim.Region.Scripting;
+using OpenSim.Terrain;
+using OpenGrid.Framework.Communications;
+using OpenSim.Caches;
+using OpenSim.Region;
+using OpenSim.Servers;
+
+namespace OpenSim.Region.Scenes
+{
+ public delegate bool FilterAvatarList(ScenePresence avatar);
+
+ public partial class Scene : SceneBase, ILocalStorageReceiver, IScriptAPI
+ {
+ protected System.Timers.Timer m_heartbeatTimer = new System.Timers.Timer();
+ protected Dictionary Avatars;
+ protected Dictionary Prims;
+ private PhysicsScene phyScene;
+ private float timeStep = 0.1f;
+ private Random Rand = new Random();
+ private uint _primCount = 702000;
+ private int storageCount;
+ private Dictionary m_scriptHandlers;
+ private Dictionary m_scripts;
+ private Mutex updateLock;
+
+ protected AuthenticateSessionsBase authenticateHandler;
+ protected RegionCommsListener regionCommsHost;
+ protected CommunicationsManager commsManager;
+
+ protected Dictionary capsHandlers = new Dictionary();
+ protected BaseHttpServer httpListener;
+
+ public ParcelManager parcelManager;
+ public EstateManager estateManager;
+ public EventManager eventManager;
+
+ #region Properties
+ ///
+ ///
+ ///
+ public PhysicsScene PhysScene
+ {
+ set
+ {
+ this.phyScene = value;
+ }
+ get
+ {
+ return (this.phyScene);
+ }
+ }
+
+ #endregion
+
+ #region Constructors
+ ///
+ /// Creates a new World class, and a region to go with it.
+ ///
+ /// Dictionary to contain client threads
+ /// Region Handle for this region
+ /// Region Name for this region
+ public Scene(Dictionary clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
+ {
+ try
+ {
+ updateLock = new Mutex(false);
+ this.authenticateHandler = authen;
+ this.commsManager = commsMan;
+ this.assetCache = assetCach;
+ m_clientThreads = clientThreads;
+ m_regInfo = regInfo;
+ m_regionHandle = m_regInfo.RegionHandle;
+ m_regionName = m_regInfo.RegionName;
+ this.m_datastore = m_regInfo.DataStore;
+ this.RegisterRegionWithComms();
+
+ parcelManager = new ParcelManager(this, this.m_regInfo);
+ estateManager = new EstateManager(this, this.m_regInfo);
+
+ eventManager = new EventManager();
+
+ m_scriptHandlers = new Dictionary();
+ m_scripts = new Dictionary();
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating new entitities instance");
+ Entities = new Dictionary();
+ Avatars = new Dictionary();
+ Prims = new Dictionary();
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating LandMap");
+ Terrain = new TerrainEngine();
+
+ ScenePresence.LoadAnims();
+ this.httpListener = httpServer;
+
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Error( "World.cs: Constructor failed with exception " + e.ToString());
+ }
+ }
+ #endregion
+
+ ///
+ ///
+ ///
+ public void StartTimer()
+ {
+ m_heartbeatTimer.Enabled = true;
+ m_heartbeatTimer.Interval = 100;
+ m_heartbeatTimer.Elapsed += new ElapsedEventHandler(this.Heartbeat);
+ }
+
+
+ #region Update Methods
+
+
+ ///
+ /// Performs per-frame updates regularly
+ ///
+ ///
+ ///
+ void Heartbeat(object sender, System.EventArgs e)
+ {
+ this.Update();
+ }
+
+ ///
+ /// Performs per-frame updates on the world, this should be the central world loop
+ ///
+ public override void Update()
+ {
+ updateLock.WaitOne();
+ try
+ {
+ if (this.phyScene.IsThreaded)
+ {
+ this.phyScene.GetResults();
+
+ }
+
+ foreach (libsecondlife.LLUUID UUID in Entities.Keys)
+ {
+ Entities[UUID].updateMovement();
+ }
+
+ lock (this.m_syncRoot)
+ {
+ this.phyScene.Simulate(timeStep);
+ }
+
+ foreach (libsecondlife.LLUUID UUID in Entities.Keys)
+ {
+ Entities[UUID].update();
+ }
+
+ // New
+ eventManager.TriggerOnFrame();
+
+ // TODO: Obsolete - Phase out
+ foreach (ScriptHandler scriptHandler in m_scriptHandlers.Values)
+ {
+ scriptHandler.OnFrame();
+ }
+ foreach (IScriptEngine scripteng in this.scriptEngines.Values)
+ {
+ scripteng.OnFrame();
+ }
+
+ //backup world data
+ this.storageCount++;
+ if (storageCount > 1200) //set to how often you want to backup
+ {
+ this.Backup();
+ storageCount = 0;
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: Update() - Failed with exception " + e.ToString());
+ }
+ updateLock.ReleaseMutex();
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public bool Backup()
+ {
+ /*
+ try
+ {
+ // Terrain backup routines
+ if (Terrain.tainted > 0)
+ {
+ Terrain.tainted = 0;
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain tainted, saving.");
+ localStorage.SaveMap(Terrain.getHeights1D());
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain saved, informing Physics.");
+ lock (this.m_syncRoot)
+ {
+ phyScene.SetTerrain(Terrain.getHeights1D());
+ }
+ }
+
+ // Primitive backup routines
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Backing up Primitives");
+ foreach (libsecondlife.LLUUID UUID in Entities.Keys)
+ {
+ Entities[UUID].BackUp();
+ }
+
+ //Parcel backup routines
+ ParcelData[] parcels = new ParcelData[parcelManager.parcelList.Count];
+ int i = 0;
+ foreach (OpenSim.Region.Parcel parcel in parcelManager.parcelList.Values)
+ {
+ parcels[i] = parcel.parcelData;
+ i++;
+ }
+ localStorage.SaveParcels(parcels);
+
+ // Backup successful
+ return true;
+ }
+ catch (Exception e)
+ {
+ // Backup failed
+ OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Backup() - Backup Failed with exception " + e.ToString());
+ return false;
+ }
+ */
+ return true;
+ }
+ #endregion
+
+ #region Regenerate Terrain
+
+ ///
+ /// Rebuilds the terrain using a procedural algorithm
+ ///
+ public void RegenerateTerrain()
+ {
+ try
+ {
+ Terrain.hills();
+
+ lock (this.m_syncRoot)
+ {
+ this.phyScene.SetTerrain(Terrain.getHeights1D());
+ }
+ this.localStorage.SaveMap(this.Terrain.getHeights1D());
+
+ foreach (IClientAPI client in m_clientThreads.Values)
+ {
+ this.SendLayerData(client);
+ }
+
+ foreach (libsecondlife.LLUUID UUID in Entities.Keys)
+ {
+ Entities[UUID].LandRenegerated();
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ /// Rebuilds the terrain using a 2D float array
+ ///
+ /// 256,256 float array containing heights
+ public void RegenerateTerrain(float[,] newMap)
+ {
+ try
+ {
+ this.Terrain.setHeights2D(newMap);
+ lock (this.m_syncRoot)
+ {
+ this.phyScene.SetTerrain(this.Terrain.getHeights1D());
+ }
+ this.localStorage.SaveMap(this.Terrain.getHeights1D());
+
+ foreach (IClientAPI client in m_clientThreads.Values)
+ {
+ this.SendLayerData(client);
+ }
+
+ foreach (libsecondlife.LLUUID UUID in Entities.Keys)
+ {
+ Entities[UUID].LandRenegerated();
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ /// Rebuilds the terrain assuming changes occured at a specified point[?]
+ ///
+ /// ???
+ /// ???
+ /// ???
+ public void RegenerateTerrain(bool changes, int pointx, int pointy)
+ {
+ try
+ {
+ if (changes)
+ {
+ /* Dont save here, rely on tainting system instead */
+
+ foreach (IClientAPI client in m_clientThreads.Values)
+ {
+ this.SendLayerData(pointx, pointy, client);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
+ }
+ }
+
+ #endregion
+
+ #region Load Terrain
+ ///
+ /// Loads the World heightmap
+ ///
+ ///
+ public override void LoadWorldMap()
+ {
+ try
+ {
+ float[] map = this.localStorage.LoadWorld();
+ if (map == null)
+ {
+ if (string.IsNullOrEmpty(this.m_regInfo.estateSettings.terrainFile))
+ {
+ Console.WriteLine("No default terrain, procedurally generating...");
+ this.Terrain.hills();
+
+ this.localStorage.SaveMap(this.Terrain.getHeights1D());
+ }
+ else
+ {
+ try
+ {
+ this.Terrain.loadFromFileF32(this.m_regInfo.estateSettings.terrainFile);
+ this.Terrain *= this.m_regInfo.estateSettings.terrainMultiplier;
+ }
+ catch
+ {
+ Console.WriteLine("Unable to load default terrain, procedurally generating instead...");
+ Terrain.hills();
+ }
+ this.localStorage.SaveMap(this.Terrain.getHeights1D());
+ }
+ }
+ else
+ {
+ this.Terrain.setHeights1D(map);
+ }
+
+ CreateTerrainTexture();
+
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadWorldMap() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ ///
+ ///
+ private void CreateTerrainTexture()
+ {
+ //create a texture asset of the terrain
+ byte[] data = this.Terrain.exportJpegImage("defaultstripe.png");
+ this.m_regInfo.estateSettings.terrainImageID = LLUUID.Random();
+ AssetBase asset = new AssetBase();
+ asset.FullID = this.m_regInfo.estateSettings.terrainImageID;
+ asset.Data = data;
+ asset.Name = "terrainImage";
+ asset.Type = 0;
+ this.assetCache.AddAsset(asset);
+ }
+ #endregion
+
+ #region Primitives Methods
+
+
+ ///
+ /// Loads the World's objects
+ ///
+ public void LoadPrimsFromStorage()
+ {
+ try
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: LoadPrimsFromStorage() - Loading primitives");
+ this.localStorage.LoadPrimitives(this);
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadPrimsFromStorage() - Failed with exception " + e.ToString());
+ }
+ }
+
+ ///
+ /// Loads a specific object from storage
+ ///
+ /// The object to load
+ public void PrimFromStorage(PrimData prim)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void AddNewPrim(Packet addPacket, IClientAPI agentClient)
+ {
+ AddNewPrim((ObjectAddPacket)addPacket, agentClient.AgentId);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void AddNewPrim(ObjectAddPacket addPacket, LLUUID ownerID)
+ {
+ try
+ {
+ Primitive prim = new Primitive(m_regionHandle, this, addPacket, ownerID, this._primCount);
+
+ this.Entities.Add(prim.uuid, prim);
+ this._primCount++;
+
+ // Trigger event for listeners
+ eventManager.TriggerOnNewPrimitive(prim);
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddNewPrim() - Failed with exception " + e.ToString());
+ }
+ }
+
+ #endregion
+
+ #region Add/Remove Avatar Methods
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child)
+ {
+ remoteClient.OnRegionHandShakeReply += this.SendLayerData;
+ //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims);
+ remoteClient.OnChatFromViewer += this.SimChat;
+ remoteClient.OnRequestWearables += this.InformClientOfNeighbours;
+ remoteClient.OnAddPrim += this.AddNewPrim;
+ remoteClient.OnUpdatePrimPosition += this.UpdatePrimPosition;
+ remoteClient.OnRequestMapBlocks += this.RequestMapBlocks;
+ remoteClient.OnTeleportLocationRequest += this.RequestTeleportLocation;
+ //remoteClient.OnObjectSelect += this.SelectPrim;
+ remoteClient.OnGrapUpdate += this.MoveObject;
+
+ /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
+ remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
+ remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
+ remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
+ remoteClient.OnEstateOwnerMessage += new EstateOwnerMessageRequest(estateManager.handleEstateOwnerMessage);
+ */
+
+ ScenePresence newAvatar = null;
+ try
+ {
+
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
+ newAvatar = new ScenePresence(remoteClient, this, this.m_regInfo);
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Adding new avatar to world");
+ OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Starting RegionHandshake ");
+
+ //newAvatar.SendRegionHandshake();
+ this.estateManager.sendRegionHandshake(remoteClient);
+
+ PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z);
+ lock (this.m_syncRoot)
+ {
+ newAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
+ }
+
+ lock (Entities)
+ {
+ if (!Entities.ContainsKey(agentID))
+ {
+ this.Entities.Add(agentID, newAvatar);
+ }
+ else
+ {
+ Entities[agentID] = newAvatar;
+ }
+ }
+ lock (Avatars)
+ {
+ if (Avatars.ContainsKey(agentID))
+ {
+ Avatars[agentID] = newAvatar;
+ }
+ else
+ {
+ this.Avatars.Add(agentID, newAvatar);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddViewerAgent() - Failed with exception " + e.ToString());
+ }
+ return;
+ }
+
+
+
+ ///
+ ///
+ ///
+ ///
+ public override void RemoveClient(LLUUID agentID)
+ {
+ eventManager.TriggerOnRemovePresence(agentID);
+
+ return;
+ }
+ #endregion
+
+ #region Request Avatars List Methods
+ //The idea is to have a group of method that return a list of avatars meeting some requirement
+ // ie it could be all Avatars within a certain range of the calling prim/avatar.
+
+ ///
+ /// Request a List of all Avatars in this World
+ ///
+ ///
+ public List RequestAvatarList()
+ {
+ List result = new List();
+
+ foreach (ScenePresence avatar in Avatars.Values)
+ {
+ result.Add(avatar);
+ }
+
+ return result;
+ }
+
+ ///
+ /// Request a filtered list of Avatars in this World
+ ///
+ ///
+ public List RequestAvatarList(FilterAvatarList filter)
+ {
+ List result = new List();
+
+ foreach (ScenePresence avatar in Avatars.Values)
+ {
+ if (filter(avatar))
+ {
+ result.Add(avatar);
+ }
+ }
+
+ return result;
+ }
+
+ ///
+ /// Request a Avatar by UUID
+ ///
+ ///
+ ///
+ public ScenePresence RequestAvatar(LLUUID avatarID)
+ {
+ if (this.Avatars.ContainsKey(avatarID))
+ {
+ return Avatars[avatarID];
+ }
+ return null;
+ }
+ #endregion
+
+
+ #region RegionCommsHost
+
+ ///
+ ///
+ ///
+ public void RegisterRegionWithComms()
+ {
+ GridInfo gridSettings = new GridInfo();
+ this.regionCommsHost = this.commsManager.GridServer.RegisterRegion(this.m_regInfo,gridSettings);
+ if (this.regionCommsHost != null)
+ {
+ this.regionCommsHost.OnExpectUser += new ExpectUserDelegate(this.NewUserConnection);
+ this.regionCommsHost.OnAvatarCrossingIntoRegion += new AgentCrossing(this.AgentCrossing);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
+ {
+ // Console.WriteLine("World.cs - add new user connection");
+ //should just check that its meant for this region
+ if (regionHandle == this.m_regInfo.RegionHandle)
+ {
+ if (agent.CapsPath != "")
+ {
+ //Console.WriteLine("new user, so creating caps handler for it");
+ Caps cap = new Caps(this.assetCache, httpListener, this.m_regInfo.CommsIPListenAddr, 9000, agent.CapsPath, agent.AgentID);
+ cap.RegisterHandlers();
+ this.capsHandlers.Add(agent.AgentID, cap);
+ }
+ this.authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
+ }
+ }
+
+ public void AgentCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position)
+ {
+ if (regionHandle == this.m_regInfo.RegionHandle)
+ {
+ if (this.Avatars.ContainsKey(agentID))
+ {
+ this.Avatars[agentID].MakeAvatar(position);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ public void InformClientOfNeighbours(IClientAPI remoteClient)
+ {
+ // Console.WriteLine("informing client of neighbouring regions");
+ List neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
+
+ //Console.WriteLine("we have " + neighbours.Count + " neighbouring regions");
+ if (neighbours != null)
+ {
+ for (int i = 0; i < neighbours.Count; i++)
+ {
+ // Console.WriteLine("sending neighbours data");
+ AgentCircuitData agent = remoteClient.RequestClientInfo();
+ agent.BaseFolder = LLUUID.Zero;
+ agent.InventoryFolder = LLUUID.Zero;
+ agent.startpos = new LLVector3(128, 128, 70);
+ agent.child = true;
+ this.commsManager.InterRegion.InformRegionOfChildAgent(neighbours[i].RegionHandle, agent);
+ remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr), (ushort)neighbours[i].CommsIPListenPort);
+ //this.capsHandlers[remoteClient.AgentId].CreateEstablishAgentComms("", System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr) + ":" + neighbours[i].CommsIPListenPort);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
+ {
+ return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
+ {
+ List mapBlocks;
+ mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
+ remoteClient.SendMapBlock(mapBlocks);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
+ {
+ if (regionHandle == this.m_regionHandle)
+ {
+ if (this.Avatars.ContainsKey(remoteClient.AgentId))
+ {
+ remoteClient.SendTeleportLocationStart();
+ remoteClient.SendLocalTeleport(position, lookAt, flags);
+ this.Avatars[remoteClient.AgentId].Teleport(position);
+ }
+ }
+ else
+ {
+ RegionInfo reg = this.RequestNeighbouringRegionInfo(regionHandle);
+ if (reg != null)
+ {
+ remoteClient.SendTeleportLocationStart();
+ AgentCircuitData agent = remoteClient.RequestClientInfo();
+ agent.BaseFolder = LLUUID.Zero;
+ agent.InventoryFolder = LLUUID.Zero;
+ agent.startpos = new LLVector3(128, 128, 70);
+ agent.child = true;
+ this.commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
+ this.commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position);
+ remoteClient.SendRegionTeleport(regionHandle, 13, reg.CommsIPListenAddr, (ushort)reg.CommsIPListenPort, 4, (1 << 4));
+ }
+ //remoteClient.SendTeleportCancel();
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
+ {
+ return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
+ }
+
+ #endregion
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneBase.cs b/OpenSim/Region/Simulation/Scenes/SceneBase.cs
new file mode 100644
index 0000000..4dbd374
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneBase.cs
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 libsecondlife.Packets;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+using System.IO;
+using System.Threading;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+using OpenSim.Region.Scripting;
+using OpenSim.Terrain;
+using OpenSim.Caches;
+
+namespace OpenSim.Region.Scenes
+{
+ public abstract class SceneBase : IWorld
+ {
+ public Dictionary Entities;
+ protected Dictionary m_clientThreads;
+ protected ulong m_regionHandle;
+ protected string m_regionName;
+ protected RegionInfo m_regInfo;
+
+ public TerrainEngine Terrain;
+
+ public string m_datastore;
+ public ILocalStorage localStorage;
+
+ protected object m_syncRoot = new object();
+ private uint m_nextLocalId = 8880000;
+ protected AssetCache assetCache;
+
+ #region Update Methods
+ ///
+ /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation)
+ ///
+ public abstract void Update();
+
+ #endregion
+
+ #region Terrain Methods
+
+ ///
+ /// Loads the World heightmap
+ ///
+ public abstract void LoadWorldMap();
+
+ ///
+ /// Loads a new storage subsystem from a named library
+ ///
+ /// Storage Library
+ /// Successful or not
+ public bool LoadStorageDLL(string dllName)
+ {
+ try
+ {
+ Assembly pluginAssembly = Assembly.LoadFrom(dllName);
+ ILocalStorage store = null;
+
+ foreach (Type pluginType in pluginAssembly.GetTypes())
+ {
+ if (pluginType.IsPublic)
+ {
+ if (!pluginType.IsAbstract)
+ {
+ Type typeInterface = pluginType.GetInterface("ILocalStorage", true);
+
+ if (typeInterface != null)
+ {
+ ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
+ store = plug;
+
+ store.Initialise(this.m_datastore);
+ break;
+ }
+
+ typeInterface = null;
+ }
+ }
+ }
+ pluginAssembly = null;
+ this.localStorage = store;
+ return (store == null);
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadStorageDLL() - Failed with exception " + e.ToString());
+ return false;
+ }
+ }
+
+
+ ///
+ /// Send the region heightmap to the client
+ ///
+ /// Client to send to
+ public virtual void SendLayerData(IClientAPI RemoteClient)
+ {
+ RemoteClient.SendLayerData(Terrain.getHeights1D());
+ }
+
+ ///
+ /// Sends a specified patch to a client
+ ///
+ /// Patch coordinate (x) 0..16
+ /// Patch coordinate (y) 0..16
+ /// The client to send to
+ public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient)
+ {
+ RemoteClient.SendLayerData(px, py, Terrain.getHeights1D());
+ }
+
+ #endregion
+
+ #region Add/Remove Agent/Avatar
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public abstract void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child);
+
+ ///
+ ///
+ ///
+ ///
+ public abstract void RemoveClient(LLUUID agentID);
+
+ #endregion
+
+ ///
+ ///
+ ///
+ ///
+ public virtual RegionInfo RegionInfo
+ {
+ get { return this.m_regInfo; }
+ }
+
+ public object SyncRoot
+ {
+ get { return m_syncRoot; }
+ }
+
+ public uint NextLocalId
+ {
+ get { return m_nextLocalId++; }
+ }
+
+ #region Shutdown
+ ///
+ /// Tidy before shutdown
+ ///
+ public virtual void Close()
+ {
+ try
+ {
+ this.localStorage.ShutDown();
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString());
+ }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneEvents.cs b/OpenSim/Region/Simulation/Scenes/SceneEvents.cs
new file mode 100644
index 0000000..2898578
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneEvents.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OpenSim.Region.Scenes
+{
+ ///
+ /// A class for triggering remote scene events.
+ ///
+ public class EventManager
+ {
+ public delegate void OnFrameDelegate();
+ public event OnFrameDelegate OnFrame;
+
+ public delegate void OnNewPresenceDelegate(ScenePresence presence);
+ public event OnNewPresenceDelegate OnNewPresence;
+
+ public delegate void OnNewPrimitiveDelegate(Primitive prim);
+ public event OnNewPrimitiveDelegate OnNewPrimitive;
+
+ public delegate void OnRemovePresenceDelegate(libsecondlife.LLUUID uuid);
+ public event OnRemovePresenceDelegate OnRemovePresence;
+
+ public void TriggerOnFrame()
+ {
+ if (OnFrame != null)
+ {
+ OnFrame();
+ }
+ }
+
+ public void TriggerOnNewPrimitive(Primitive prim)
+ {
+ if (OnNewPrimitive != null)
+ OnNewPrimitive(prim);
+ }
+
+ public void TriggerOnNewPresence(ScenePresence presence)
+ {
+ if (OnNewPresence != null)
+ OnNewPresence(presence);
+ }
+
+ public void TriggerOnRemovePresence(libsecondlife.LLUUID uuid)
+ {
+ if (OnRemovePresence != null)
+ {
+ OnRemovePresence(uuid);
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/SceneObject.cs b/OpenSim/Region/Simulation/Scenes/SceneObject.cs
new file mode 100644
index 0000000..5df87bf
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/SceneObject.cs
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Inventory;
+
+namespace OpenSim.Region.Scenes
+{
+ public class SceneObject : Entity
+ {
+ private LLUUID rootUUID;
+ //private Dictionary ChildPrimitives = new Dictionary();
+ protected Primitive rootPrimitive;
+ private Scene m_world;
+ protected ulong regionHandle;
+
+ ///
+ ///
+ ///
+ public SceneObject()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
+ {
+ this.rootPrimitive = new Primitive( this.regionHandle, this.m_world, addPacket, agentID, localID);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void CreateFromBytes(byte[] data)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public override void update()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public override void BackUp()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void GetProperites(IClientAPI client)
+ {
+ //needs changing
+ ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
+ proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
+ proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
+ proper.ObjectData[0].ItemID = LLUUID.Zero;
+ proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.primData.CreationDate;
+ proper.ObjectData[0].CreatorID = this.rootPrimitive.primData.OwnerID;
+ proper.ObjectData[0].FolderID = LLUUID.Zero;
+ proper.ObjectData[0].FromTaskID = LLUUID.Zero;
+ proper.ObjectData[0].GroupID = LLUUID.Zero;
+ proper.ObjectData[0].InventorySerial = 0;
+ proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
+ proper.ObjectData[0].ObjectID = this.uuid;
+ proper.ObjectData[0].OwnerID = this.rootPrimitive.primData.OwnerID;
+ proper.ObjectData[0].TouchName = new byte[0];
+ proper.ObjectData[0].TextureID = new byte[0];
+ proper.ObjectData[0].SitName = new byte[0];
+ proper.ObjectData[0].Name = new byte[0];
+ proper.ObjectData[0].Description = new byte[0];
+ proper.ObjectData[0].OwnerMask = this.rootPrimitive.primData.OwnerMask;
+ proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.primData.NextOwnerMask;
+ proper.ObjectData[0].GroupMask = this.rootPrimitive.primData.GroupMask;
+ proper.ObjectData[0].EveryoneMask = this.rootPrimitive.primData.EveryoneMask;
+ proper.ObjectData[0].BaseMask = this.rootPrimitive.primData.BaseMask;
+
+ client.OutPacket(proper);
+
+ }
+
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs
new file mode 100644
index 0000000..f0a8721
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.Animations.cs
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using System.Xml;
+
+namespace OpenSim.Region.Scenes
+{
+ partial class ScenePresence
+ {
+ public class AvatarAnimations
+ {
+
+ public Dictionary AnimsLLUUID = new Dictionary();
+ public Dictionary AnimsNames = new Dictionary();
+
+ public AvatarAnimations()
+ {
+ }
+
+ public void LoadAnims()
+ {
+ //OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs:LoadAnims() - Loading avatar animations");
+ XmlTextReader reader = new XmlTextReader("data/avataranimations.xml");
+
+ XmlDocument doc = new XmlDocument();
+ doc.Load(reader);
+ foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
+ {
+
+ if (nod.Attributes["name"] != null)
+ {
+ AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText);
+ }
+
+ }
+
+ reader.Close();
+
+ // OpenSim.Framework.Console.MainLog.Instance.Verbose("Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)");
+
+ foreach (KeyValuePair kp in OpenSim.Region.Scenes.ScenePresence.Animations.AnimsLLUUID)
+ {
+ AnimsNames.Add(kp.Value, kp.Key);
+ }
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs
new file mode 100644
index 0000000..d21b11f
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.Body.cs
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Region.Scenes
+{
+ partial class ScenePresence
+ {
+ public class Avatar : IScenePresenceBody
+ {
+ public Avatar()
+ {
+
+ }
+
+ public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
+ {
+ }
+
+ public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
+ {
+ }
+
+ public void SendOurAppearance(IClientAPI OurClient)
+ {
+ }
+
+ public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
+ {
+ }
+ }
+
+ public class ChildAgent : IScenePresenceBody //is a ghost
+ {
+ public ChildAgent()
+ {
+
+ }
+
+ public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
+ {
+ }
+
+ public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
+ {
+ }
+
+ public void SendOurAppearance(IClientAPI OurClient)
+ {
+ }
+
+ public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
+ {
+ }
+ }
+ }
+
+}
diff --git a/OpenSim/Region/Simulation/Scenes/ScenePresence.cs b/OpenSim/Region/Simulation/Scenes/ScenePresence.cs
new file mode 100644
index 0000000..45d3fed
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/ScenePresence.cs
@@ -0,0 +1,525 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.IO;
+using System.Text;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Physics.Manager;
+using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using Axiom.MathLib;
+
+namespace OpenSim.Region.Scenes
+{
+ public partial class ScenePresence : Entity
+ {
+ public static bool PhysicsEngineFlying = false;
+ public static AvatarAnimations Animations;
+ public static byte[] DefaultTexture;
+ public string firstname;
+ public string lastname;
+ public IClientAPI ControllingClient;
+ public LLUUID current_anim;
+ public int anim_seq;
+ private bool updateflag = false;
+ private byte movementflag = 0;
+ private List forcesList = new List();
+ private short _updateCount = 0;
+ private Axiom.MathLib.Quaternion bodyRot;
+ private LLObject.TextureEntry avatarAppearanceTexture = null;
+ private byte[] visualParams;
+ private AvatarWearable[] Wearables;
+ private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
+ private ulong m_regionHandle;
+ private bool childAgent = false;
+ private bool newForce = false;
+ private bool newAvatar = false;
+ private IScenePresenceBody m_body;
+
+ protected RegionInfo m_regionInfo;
+
+ #region Properties
+ ///
+ ///
+ ///
+ public PhysicsActor PhysActor
+ {
+ set
+ {
+ this._physActor = value;
+ }
+ get
+ {
+ return _physActor;
+ }
+ }
+ #endregion
+
+ #region Constructor(s)
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public ScenePresence(IClientAPI theClient, Scene world, RegionInfo reginfo)
+ {
+
+ m_world = world;
+ this.uuid = theClient.AgentId;
+
+ m_regionInfo = reginfo;
+ m_regionHandle = reginfo.RegionHandle;
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs ");
+ ControllingClient = theClient;
+ this.firstname = ControllingClient.FirstName;
+ this.lastname = ControllingClient.LastName;
+ m_localId = m_world.NextLocalId;
+ Pos = ControllingClient.StartPos;
+ visualParams = new byte[218];
+ for (int i = 0; i < 218; i++)
+ {
+ visualParams[i] = 100;
+ }
+
+ Wearables = AvatarWearable.DefaultWearables;
+
+ this.avatarAppearanceTexture = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
+
+ //register for events
+ ControllingClient.OnRequestWearables += this.SendOurAppearance;
+ //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance);
+ ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement;
+ ControllingClient.OnCompleteMovementToRegion += this.SendInitialData;
+ ControllingClient.OnAgentUpdate += this.HandleAgentUpdate;
+ // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
+ // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
+ //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
+
+ }
+ #endregion
+
+ #region Status Methods
+ ///
+ /// Not Used, most likely can be deleted
+ ///
+ ///
+ public void ChildStatusChange(bool status)
+ {
+ this.childAgent = status;
+
+ if (this.childAgent == true)
+ {
+ this.Velocity = new LLVector3(0, 0, 0);
+ this.Pos = new LLVector3(128, 128, 70);
+
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void MakeAvatar(LLVector3 pos)
+ {
+ //this.childAvatar = false;
+ this.Pos = pos;
+ this.newAvatar = true;
+ this.childAgent = false;
+ }
+
+ protected void MakeChildAgent()
+ {
+ this.Velocity = new LLVector3(0, 0, 0);
+ this.Pos = new LLVector3(128, 128, 70);
+ this.childAgent = true;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void Teleport(LLVector3 pos)
+ {
+ this.Pos = pos;
+ this.SendTerseUpdateToALLClients();
+ }
+
+ ///
+ ///
+ ///
+ public void StopMovement()
+ {
+
+ }
+ #endregion
+
+ #region Event Handlers
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
+ {
+
+ }
+
+ ///
+ /// Complete Avatar's movement into the region
+ ///
+ public void CompleteMovement()
+ {
+ LLVector3 look = this.Velocity;
+ if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
+ {
+ look = new LLVector3(0.99f, 0.042f, 0);
+ }
+ this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look);
+ if (this.childAgent)
+ {
+ this.childAgent = false;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
+ {
+ if ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
+ {
+ Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
+ if (((movementflag & 1) == 0) || (q != this.bodyRot))
+ {
+ Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0);
+ this.AddNewMovement(v3, q);
+ movementflag = 1;
+ this.bodyRot = q;
+ }
+ }
+ else if ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
+ {
+ Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
+ if (((movementflag & 2) == 0) || (q != this.bodyRot))
+ {
+ Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(-1, 0, 0);
+ this.AddNewMovement(v3, q);
+ movementflag = 2;
+ this.bodyRot = q;
+ }
+ }
+ else
+ {
+ if ((movementflag) != 0)
+ {
+ NewForce newVelocity = new NewForce();
+ newVelocity.X = 0;
+ newVelocity.Y = 0;
+ newVelocity.Z = 0;
+ this.forcesList.Add(newVelocity);
+ movementflag = 0;
+ }
+ }
+
+ }
+
+ protected void AddNewMovement(Axiom.MathLib.Vector3 vec, Axiom.MathLib.Quaternion rotation)
+ {
+ NewForce newVelocity = new NewForce();
+ Axiom.MathLib.Vector3 direc = rotation * vec;
+ direc.Normalize();
+
+ direc = direc * ((0.03f) * 128f);
+ if (this._physActor.Flying)
+ direc *= 4;
+
+ newVelocity.X = direc.x;
+ newVelocity.Y = direc.y;
+ newVelocity.Z = direc.z;
+ this.forcesList.Add(newVelocity);
+ }
+
+ #endregion
+
+ #region Overridden Methods
+ ///
+ ///
+ ///
+ public override void LandRenegerated()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public override void update()
+ {
+ if (this.childAgent == false)
+ {
+ if (this.newForce)
+ {
+ this.SendTerseUpdateToALLClients();
+ _updateCount = 0;
+ }
+ else if (movementflag != 0)
+ {
+ _updateCount++;
+ if (_updateCount > 3)
+ {
+ this.SendTerseUpdateToALLClients();
+ _updateCount = 0;
+ }
+ }
+
+ this.CheckForBorderCrossing();
+ }
+ }
+ #endregion
+
+ #region Update Client(s)
+ ///
+ ///
+ ///
+ ///
+ public void SendTerseUpdateToClient(IClientAPI RemoteClient)
+ {
+ LLVector3 pos = this.Pos;
+ LLVector3 vel = this.Velocity;
+ RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z));
+ }
+
+ ///
+ ///
+ ///
+ public void SendTerseUpdateToALLClients()
+ {
+ List avatars = this.m_world.RequestAvatarList();
+ for (int i = 0; i < avatars.Count; i++)
+ {
+ this.SendTerseUpdateToClient(avatars[i].ControllingClient);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
+ {
+ remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
+ }
+
+ ///
+ ///
+ ///
+ public void SendInitialData()
+ {
+ this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
+ if (this.newAvatar)
+ {
+ this.m_world.InformClientOfNeighbours(this.ControllingClient);
+ this.newAvatar = false;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendOurAppearance(IClientAPI OurClient)
+ {
+ this.ControllingClient.SendWearables(this.Wearables);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendAnimPack(LLUUID animID, int seq)
+ {
+
+
+ }
+
+ ///
+ ///
+ ///
+ public void SendAnimPack()
+ {
+
+ }
+ #endregion
+
+ #region Border Crossing Methods
+ ///
+ ///
+ ///
+ protected void CheckForBorderCrossing()
+ {
+ LLVector3 pos2 = this.Pos;
+ LLVector3 vel = this.Velocity;
+
+ float timeStep = 0.2f;
+ pos2.X = pos2.X + (vel.X * timeStep);
+ pos2.Y = pos2.Y + (vel.Y * timeStep);
+ pos2.Z = pos2.Z + (vel.Z * timeStep);
+
+ if ((pos2.X < 0) || (pos2.X > 256))
+ {
+ this.CrossToNewRegion();
+ }
+
+ if ((pos2.Y < 0) || (pos2.Y > 256))
+ {
+ this.CrossToNewRegion();
+ }
+ }
+
+ ///
+ ///
+ ///
+ protected void CrossToNewRegion()
+ {
+ LLVector3 pos = this.Pos;
+ LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z);
+ uint neighbourx = this.m_regionInfo.RegionLocX;
+ uint neighboury = this.m_regionInfo.RegionLocY;
+
+ if (pos.X < 2)
+ {
+ neighbourx -= 1;
+ newpos.X = 254;
+ }
+ if (pos.X > 253)
+ {
+ neighbourx += 1;
+ newpos.X = 1;
+ }
+ if (pos.Y < 2)
+ {
+ neighboury -= 1;
+ newpos.Y = 254;
+ }
+ if (pos.Y > 253)
+ {
+ neighboury += 1;
+ newpos.Y = 1;
+ }
+
+ LLVector3 vel = this.velocity;
+ ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256));
+ RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle);
+ if (neighbourRegion != null)
+ {
+ bool res = this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos);
+ if (res)
+ {
+ this.MakeChildAgent();
+ this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, System.Net.IPAddress.Parse(neighbourRegion.CommsIPListenAddr), (ushort)neighbourRegion.CommsIPListenPort);
+ }
+ }
+ }
+ #endregion
+
+ ///
+ ///
+ ///
+ public static void LoadAnims()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public override void updateMovement()
+ {
+ newForce = false;
+ lock (this.forcesList)
+ {
+ if (this.forcesList.Count > 0)
+ {
+ for (int i = 0; i < this.forcesList.Count; i++)
+ {
+ NewForce force = this.forcesList[i];
+
+ this.updateflag = true;
+ this.Velocity = new LLVector3(force.X, force.Y, force.Z);
+ this.newForce = true;
+ }
+ for (int i = 0; i < this.forcesList.Count; i++)
+ {
+ this.forcesList.RemoveAt(0);
+ }
+ }
+ }
+ }
+
+ public static void LoadTextureFile(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();
+ DefaultTexture = data1;
+ }
+
+ public class NewForce
+ {
+ public float X;
+ public float Y;
+ public float Z;
+
+ public NewForce()
+ {
+
+ }
+ }
+ }
+
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs
new file mode 100644
index 0000000..daa1b92
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptContext.cs
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+
+namespace OpenSim.Region.Scripting
+{
+ public interface IScriptContext
+ {
+ IScriptEntity Entity { get; }
+ bool TryGetRandomAvatar(out IScriptReadonlyEntity avatar);
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs
new file mode 100644
index 0000000..44b886f
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptEntity.cs
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+
+namespace OpenSim.Region.Scripting
+{
+ public interface IScriptReadonlyEntity
+ {
+ LLVector3 Pos { get; }
+ string Name { get; }
+ }
+
+ public interface IScriptEntity
+ {
+ LLVector3 Pos { get; set; }
+ string Name { get; }
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs b/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs
new file mode 100644
index 0000000..797998d
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/IScriptHandler.cs
@@ -0,0 +1,126 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+using OpenSim.Physics.Manager;
+using OpenSim.Region;
+using OpenSim.Region.Scenes;
+using Avatar=OpenSim.Region.Scenes.ScenePresence;
+using Primitive = OpenSim.Region.Scenes.Primitive;
+
+namespace OpenSim.Region.Scripting
+{
+ public delegate void ScriptEventHandler(IScriptContext context);
+
+ public class ScriptHandler : IScriptContext, IScriptEntity, IScriptReadonlyEntity
+ {
+ private Scene m_world;
+ private Script m_script;
+ private Entity m_entity;
+
+ public LLUUID ScriptId
+ {
+ get
+ {
+ return m_script.ScriptId;
+ }
+ }
+
+ public void OnFrame()
+ {
+ m_script.OnFrame(this);
+ }
+
+ public ScriptHandler(Script script, Entity entity, Scene world)
+ {
+ m_script = script;
+ m_entity = entity;
+ m_world = world;
+ }
+
+ #region IScriptContext Members
+
+ IScriptEntity IScriptContext.Entity
+ {
+ get
+ {
+ return this;
+ }
+ }
+
+ bool IScriptContext.TryGetRandomAvatar(out IScriptReadonlyEntity avatar)
+ {
+ foreach (Entity entity in m_world.Entities.Values )
+ {
+ if( entity is Avatar )
+ {
+ avatar = entity;
+ return true;
+ }
+ }
+
+ avatar = null;
+ return false;
+ }
+
+ #endregion
+
+ #region IScriptEntity and IScriptReadonlyEntity Members
+
+ public string Name
+ {
+ get
+ {
+ return m_entity.Name;
+ }
+ }
+
+ public LLVector3 Pos
+ {
+ get
+ {
+ return m_entity.Pos;
+ }
+
+ set
+ {
+ if (m_entity is Primitive)
+ {
+ Primitive prim = m_entity as Primitive;
+ // Of course, we really should have asked the physEngine if this is possible, and if not, returned false.
+ // prim.UpdatePosition( value );
+ }
+ }
+ }
+
+ #endregion
+ }
+
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/Script.cs b/OpenSim/Region/Simulation/Scenes/scripting/Script.cs
new file mode 100644
index 0000000..1d01f3c
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/Script.cs
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+
+namespace OpenSim.Region.Scripting
+{
+ public class Script
+ {
+ private LLUUID m_scriptId;
+ public virtual LLUUID ScriptId
+ {
+ get
+ {
+ return m_scriptId;
+ }
+ }
+
+ public Script( LLUUID scriptId )
+ {
+ m_scriptId = scriptId;
+ }
+
+ public ScriptEventHandler OnFrame;
+ }
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs b/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs
new file mode 100644
index 0000000..32ef046
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/ScriptFactory.cs
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+
+namespace OpenSim.Region.Scripting
+{
+ public delegate Script ScriptFactory();
+}
diff --git a/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs b/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs
new file mode 100644
index 0000000..21f07a8
--- /dev/null
+++ b/OpenSim/Region/Simulation/Scenes/scripting/Scripts/FollowRandomAvatar.cs
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using libsecondlife;
+
+namespace OpenSim.Region.Scripting
+{
+ public class FollowRandomAvatar : Script
+ {
+ public FollowRandomAvatar()
+ : base(LLUUID.Random())
+ {
+ OnFrame += MyOnFrame;
+ }
+
+ private void MyOnFrame(IScriptContext context)
+ {
+ LLVector3 pos = context.Entity.Pos;
+
+ IScriptReadonlyEntity avatar;
+
+ if (context.TryGetRandomAvatar(out avatar))
+ {
+ LLVector3 avatarPos = avatar.Pos;
+
+ float x = pos.X + ((float)avatarPos.X.CompareTo(pos.X)) / 2;
+ float y = pos.Y + ((float)avatarPos.Y.CompareTo(pos.Y)) / 2;
+
+ LLVector3 newPos = new LLVector3(x, y, pos.Z);
+
+ context.Entity.Pos = newPos;
+ }
+ }
+ }
+
+
+}
diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs
new file mode 100644
index 0000000..ab3c34c
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs
@@ -0,0 +1,117 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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.
+*
+*/
+
+// BDB Support
+// Apparently broken on Mono
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using BerkeleyDb;
+using Kds.Serialization;
+using Kds.Serialization.Buffer;
+
+namespace OpenSim.Storage.LocalStorageBDB
+{
+ public class BDBLocalStorage : ILocalStorage
+ {
+ const string simDbName = "localsim.db";
+
+ DbHash sim;
+ Db DB;
+ //BEFormatter formatter;
+
+ public BDBLocalStorage()
+ {
+ DB = new Db(DbCreateFlags.None);
+ sim = (DbHash)DB.Open(null, simDbName, null, BerkeleyDb.DbType.Hash, Db.OpenFlags.Create, 0);
+ //vendorDb = (DbBTree)db.Open(null, VendorDbName, null, DbType.BTree, Db.OpenFlags.Create, 0);
+ }
+
+ public void Initialise(string file)
+ {
+ // Blank
+ }
+
+ public void StorePrim(PrimData prim)
+ {
+ DbEntry key = new DbEntry();
+ DbEntry data = new DbEntry();
+ lock (sim)
+ {
+ sim.PutUnique(null, ref key, ref data, DbFile.WriteFlags.AutoCommit);
+ }
+ }
+ public void RemovePrim(LLUUID primID)
+ {
+
+ }
+ public void LoadPrimitives(ILocalStorageReceiver receiver)
+ {
+
+ }
+ public float[] LoadWorld()
+ {
+ return new float[65536];
+ }
+ public void SaveMap(float[] heightmap)
+ {
+
+ }
+
+ public void SaveParcels(ParcelData[] parcel_data)
+ {
+ }
+
+ public void SaveParcel(ParcelData parcel)
+ {
+ }
+
+ public void RemoveParcel(ParcelData parcel)
+ {
+ }
+
+ public void RemoveAllParcels()
+ {
+ }
+
+ public void LoadParcels(ILocalStorageParcelReceiver recv)
+ {
+ recv.NoParcelDataFromStorage();
+ }
+
+ public void ShutDown()
+ {
+ sim.GetDb().Close();
+ DB.Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj
new file mode 100644
index 0000000..b956c9b
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj
@@ -0,0 +1,112 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {A4691E59-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Storage.LocalStorageBerkeleyDB
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Storage.LocalStorageBerkeleyDB
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Kds.Serialization.dll
+ False
+
+
+ ..\..\..\..\bin\libdb_dotNET43.dll
+ False
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Storage.LocalStorageBerkeleyDB.dll.build b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Storage.LocalStorageBerkeleyDB.dll.build
new file mode 100644
index 0000000..bc2d8ec
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Storage.LocalStorageBerkeleyDB.dll.build
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs b/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs
new file mode 100644
index 0000000..ea2b62e
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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("Db4LocalStorage")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Db4LocalStorage")]
+[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("1.0.*")]
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs b/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
new file mode 100644
index 0000000..8e6b04d
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 Db4objects.Db4o;
+using Db4objects.Db4o.Query;
+
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Framework.Console;
+
+
+namespace OpenSim.Storage.LocalStorageDb4o
+{
+ ///
+ ///
+ ///
+ public class Db4LocalStorage : ILocalStorage
+ {
+ private IObjectContainer db;
+ private string datastore;
+
+ public Db4LocalStorage()
+ {
+
+ }
+
+ public void Initialise(string dfile)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("Db4LocalStorage Opening " + dfile);
+ datastore = dfile;
+ try
+ {
+ db = Db4oFactory.OpenFile(datastore);
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("Db4LocalStorage creation");
+ }
+ catch (Exception e)
+ {
+ db.Close();
+ OpenSim.Framework.Console.MainLog.Instance.Warn("Db4LocalStorage :Constructor - Exception occured");
+ OpenSim.Framework.Console.MainLog.Instance.Warn(e.ToString());
+ }
+ }
+
+ public void StorePrim(PrimData prim)
+ {
+ IObjectSet result = db.Query(new UUIDPrimQuery(prim.FullID));
+ if (result.Count > 0)
+ {
+ //prim already in storage
+ //so update it
+ PrimData found = (PrimData)result.Next();
+ found.PathBegin = prim.PathBegin;
+ found.PathCurve = prim.PathCurve;
+ found.PathEnd = prim.PathEnd;
+ found.PathRadiusOffset = prim.PathRadiusOffset;
+ found.PathRevolutions = prim.PathRevolutions;
+ found.PathScaleX = prim.PathScaleX;
+ found.PathScaleY = prim.PathScaleY;
+ found.PathShearX = prim.PathShearX;
+ found.PathShearY = prim.PathShearY;
+ found.PathSkew = prim.PathSkew;
+ found.PathTaperX = prim.PathTaperX;
+ found.PathTaperY = prim.PathTaperY;
+ found.PathTwist = prim.PathTwist;
+ found.PathTwistBegin = prim.PathTwistBegin;
+ found.PCode = prim.PCode;
+ found.ProfileBegin = prim.ProfileBegin;
+ found.ProfileCurve = prim.ProfileCurve;
+ found.ProfileEnd = prim.ProfileEnd;
+ found.ProfileHollow = prim.ProfileHollow;
+ found.Position = prim.Position;
+ found.Rotation = prim.Rotation;
+ found.TextureEntry = prim.TextureEntry;
+ db.Set(found);
+ db.Commit();
+ }
+ else
+ {
+ //not in storage
+ db.Set(prim);
+ db.Commit();
+ }
+ }
+
+ public void RemovePrim(LLUUID primID)
+ {
+ IObjectSet result = db.Query(new UUIDPrimQuery(primID));
+ if (result.Count > 0)
+ {
+ PrimData found = (PrimData)result.Next();
+ db.Delete(found);
+ }
+ }
+
+
+ public void LoadPrimitives(ILocalStorageReceiver receiver)
+ {
+ IObjectSet result = db.Get(typeof(PrimData));
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is " + result.Count);
+ foreach (PrimData prim in result)
+ {
+ receiver.PrimFromStorage(prim);
+ }
+ }
+
+ public float[] LoadWorld()
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("LoadWorld() - Loading world....");
+ float[] heightmap = null;
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("LoadWorld() - Looking for a heightmap in local DB");
+ IObjectSet world_result = db.Get(typeof(MapStorage));
+ if (world_result.Count > 0)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("LoadWorld() - Found a heightmap in local database, loading");
+ MapStorage map = (MapStorage)world_result.Next();
+ //blank.LandMap = map.Map;
+ heightmap = map.Map;
+ }
+ return heightmap;
+ }
+
+ public void SaveMap(float[] heightmap)
+ {
+ IObjectSet world_result = db.Get(typeof(MapStorage));
+ if (world_result.Count > 0)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Verbose("SaveWorld() - updating saved copy of heightmap in local database");
+ MapStorage map = (MapStorage)world_result.Next();
+ db.Delete(map);
+ }
+ MapStorage map1 = new MapStorage();
+ map1.Map = heightmap; //OpenSim_Main.local_world.LandMap;
+ db.Set(map1);
+ db.Commit();
+ }
+
+ public void SaveParcel(ParcelData parcel)
+ {
+ IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
+ if (result.Count > 0)
+ {
+ //Old Parcel
+ ParcelData updateParcel = (ParcelData)result.Next();
+ updateParcel.AABBMax = parcel.AABBMax;
+ updateParcel.AABBMin = parcel.AABBMin;
+ updateParcel.area = parcel.area;
+ updateParcel.auctionID = parcel.auctionID;
+ updateParcel.authBuyerID = parcel.authBuyerID;
+ updateParcel.category = parcel.category;
+ updateParcel.claimDate = parcel.claimDate;
+ updateParcel.claimPrice = parcel.claimPrice;
+ updateParcel.groupID = parcel.groupID;
+ updateParcel.groupPrims = parcel.groupPrims;
+ updateParcel.isGroupOwned = parcel.isGroupOwned;
+ updateParcel.landingType = parcel.landingType;
+ updateParcel.mediaAutoScale = parcel.mediaAutoScale;
+ updateParcel.mediaID = parcel.mediaID;
+ updateParcel.mediaURL = parcel.mediaURL;
+ updateParcel.musicURL = parcel.musicURL;
+ updateParcel.localID = parcel.localID;
+ updateParcel.ownerID = parcel.ownerID;
+ updateParcel.passHours = parcel.passHours;
+ updateParcel.passPrice = parcel.passPrice;
+ updateParcel.parcelBitmapByteArray = (byte[])parcel.parcelBitmapByteArray.Clone();
+ updateParcel.parcelDesc = parcel.parcelDesc;
+ updateParcel.parcelFlags = parcel.parcelFlags;
+ updateParcel.parcelName = parcel.parcelName;
+ updateParcel.parcelStatus = parcel.parcelStatus;
+ updateParcel.salePrice = parcel.salePrice;
+ updateParcel.snapshotID = parcel.snapshotID;
+ updateParcel.userLocation = parcel.userLocation;
+ updateParcel.userLookAt = parcel.userLookAt;
+
+ db.Set(updateParcel);
+ }
+ else
+ {
+ db.Set(parcel);
+ }
+ db.Commit();
+ }
+
+ public void SaveParcels(ParcelData[] parcel_data)
+ {
+ MainLog.Instance.Notice("Parcel Backup: Saving Parcels...");
+ int i;
+ for (i = 0; i < parcel_data.GetLength(0); i++)
+ {
+
+ SaveParcel(parcel_data[i]);
+
+ }
+ MainLog.Instance.Notice("Parcel Backup: Parcel Save Complete");
+ }
+
+ public void RemoveParcel(ParcelData parcel)
+ {
+ IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
+ if (result.Count > 0)
+ {
+ db.Delete(result[0]);
+ }
+ db.Commit();
+ }
+ public void RemoveAllParcels()
+ {
+ MainLog.Instance.Notice("Parcel Backup: Removing all parcels...");
+ IObjectSet result = db.Get(typeof(ParcelData));
+ if (result.Count > 0)
+ {
+ foreach (ParcelData parcelData in result)
+ {
+ RemoveParcel(parcelData);
+ }
+ }
+ }
+
+ public void LoadParcels(ILocalStorageParcelReceiver recv)
+ {
+ MainLog.Instance.Notice("Parcel Backup: Loading Parcels...");
+ IObjectSet result = db.Get(typeof(ParcelData));
+ if (result.Count > 0)
+ {
+ MainLog.Instance.Notice("Parcel Backup: Parcels exist in database.");
+ foreach (ParcelData parcelData in result)
+ {
+
+ recv.ParcelFromStorage(parcelData);
+ }
+ }
+ else
+ {
+ MainLog.Instance.Notice("Parcel Backup: No parcels exist. Creating basic parcel.");
+ recv.NoParcelDataFromStorage();
+ }
+ MainLog.Instance.Notice("Parcel Backup: Parcels Restored");
+ }
+ public void ShutDown()
+ {
+ db.Commit();
+ db.Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs b/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs
new file mode 100644
index 0000000..56387ac
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+
+namespace OpenSim.Storage.LocalStorageDb4o
+{
+ public class MapStorage
+ {
+ public float[] Map;
+
+ public MapStorage()
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj
new file mode 100644
index 0000000..147158c
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj
@@ -0,0 +1,116 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {43DB702D-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Storage.LocalStorageDb4o
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Storage.LocalStorageDb4o
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\Db4objects.Db4o.dll
+ False
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs
new file mode 100644
index 0000000..d24fb5f
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using Db4objects.Db4o;
+using Db4objects.Db4o.Query;
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Storage.LocalStorageDb4o
+{
+ public class UUIDParcelQuery : Predicate
+ {
+ private LLUUID globalIDSearch;
+
+ public UUIDParcelQuery(LLUUID find)
+ {
+ globalIDSearch = find;
+ }
+ public bool Match(ParcelData parcel)
+ {
+ return (parcel.globalID == globalIDSearch);
+ }
+ }
+}
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs
new file mode 100644
index 0000000..b2e8a91
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using Db4objects.Db4o;
+using Db4objects.Db4o.Query;
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Storage.LocalStorageDb4o
+{
+ public class UUIDPrimQuery : Predicate
+ {
+ private LLUUID _findID;
+
+ public UUIDPrimQuery(LLUUID find)
+ {
+ _findID = find;
+ }
+ public bool Match(PrimData prim)
+ {
+ return (prim.FullID == _findID);
+ }
+ }
+}
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj
new file mode 100644
index 0000000..d1353a5
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj
@@ -0,0 +1,111 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {477B9270-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Storage.LocalStorageSQLite
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Storage.LocalStorageSQLite
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\..\bin\libsecondlife.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ ..\..\..\..\bin\System.Data.SQLite.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+ OpenSim.Framework
+ {8ACA2445-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+ OpenSim.Framework.Console
+ {A7CD0630-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build
new file mode 100644
index 0000000..bd4c731
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..b45debf
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenSim.Storage.LocalStorageSQLite")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenSim.Storage.LocalStorageSQLite")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ecd6e0c1-7909-413e-9e3f-659678ac3bc3")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.*")]
+[assembly: AssemblyFileVersion("1.0.0.*")]
diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs b/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs
new file mode 100644
index 0000000..8a7893e
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs
@@ -0,0 +1,198 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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.
+*
+*/
+
+// SQLite Support
+// A bad idea, but the IRC people told me to!
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SQLite;
+using libsecondlife;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Storage.LocalStorageSQLite
+{
+ public class SQLiteLocalStorage : ILocalStorage
+ {
+ IDbConnection db;
+
+ public SQLiteLocalStorage()
+ {
+ try
+ {
+ string connectionstring = "URI=file:localsim.sdb";
+ db = (IDbConnection)new SQLiteConnection(connectionstring);
+ db.Open();
+ }
+ catch (Exception e)
+ {
+ db.Close();
+ OpenSim.Framework.Console.MainLog.Instance.Warn("SQLiteLocalStorage :Constructor - Exception occured");
+ OpenSim.Framework.Console.MainLog.Instance.Warn(e.ToString());
+ }
+ }
+
+ public void Initialise(string file)
+ {
+ // Blank
+ }
+
+ public void StorePrim(PrimData prim)
+ {
+ IDbCommand cmd = db.CreateCommand();
+
+ //SECURITY WARNING:
+ // These parameters wont produce SQL injections since they are all integer based, however.
+ // if inserting strings such as name or description, you will need to use appropriate
+ // measures to prevent SQL injection (although the value of SQL injection in this is limited).
+
+ string sql = "REPLACE INTO prim (OwnerID,PCode,PathBegin,PathEnd,PathScaleX,PathScaleY,PathShearX,PathShearY,PathSkew,ProfileBegin,ProfileEnd,Scale,PathCurve,ProfileCurve,ParentID,ProfileHollow,PathRadiusOffset,PathRevolutions,PathTaperX,PathTaperY,PathTwist,PathTwistBegin,Texture,CreationDate,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,Position,Rotation,LocalID,FullID) ";
+ sql += "VALUES (";
+ sql += "\"" + prim.OwnerID.ToStringHyphenated() + "\","; // KILL ME NOW!
+ sql += "\"" + prim.PCode.ToString() + "\",";
+ sql += "\"" + prim.PathBegin.ToString() + "\",";
+ sql += "\"" + prim.PathEnd.ToString() + "\",";
+ sql += "\"" + prim.PathScaleX.ToString() + "\",";
+ sql += "\"" + prim.PathScaleY.ToString() + "\",";
+ sql += "\"" + prim.PathShearX.ToString() + "\",";
+ sql += "\"" + prim.PathShearY.ToString() + "\",";
+ sql += "\"" + prim.PathSkew.ToString() + "\",";
+ sql += "\"" + prim.ProfileBegin.ToString() + "\",";
+ sql += "\"" + prim.ProfileEnd.ToString() + "\",";
+ sql += "\"" + prim.Scale.ToString() + "\",";
+ sql += "\"" + prim.PathCurve.ToString() + "\",";
+ sql += "\"" + prim.ProfileCurve.ToString() + "\",";
+ sql += "\"" + prim.ParentID.ToString() + "\",";
+ sql += "\"" + prim.ProfileHollow.ToString() + "\",";
+ sql += "\"" + prim.PathRadiusOffset.ToString() + "\",";
+ sql += "\"" + prim.PathRevolutions.ToString() + "\",";
+ sql += "\"" + prim.PathTaperX.ToString() + "\",";
+ sql += "\"" + prim.PathTaperY.ToString() + "\",";
+ sql += "\"" + prim.PathTwist.ToString() + "\",";
+ sql += "\"" + prim.PathTwistBegin.ToString() + "\",";
+ sql += "\"" + prim.TextureEntry.ToString() + "\",";
+ sql += "\"" + prim.CreationDate.ToString() + "\",";
+ sql += "\"" + prim.OwnerMask.ToString() + "\",";
+ sql += "\"" + prim.NextOwnerMask.ToString() + "\",";
+ sql += "\"" + prim.GroupMask.ToString() + "\",";
+ sql += "\"" + prim.EveryoneMask.ToString() + "\",";
+ sql += "\"" + prim.BaseMask.ToString() + "\",";
+ sql += "\"" + prim.Position.ToString() + "\",";
+ sql += "\"" + prim.Rotation.ToString() + "\",";
+ sql += "\"" + prim.LocalID.ToString() + "\",";
+ sql += "\"" + prim.FullID.ToString() + "\")";
+
+ cmd.CommandText = sql;
+
+ try
+ {
+ cmd.ExecuteNonQuery();
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("SQLiteLocalStorage :StorePrim - Exception occured");
+ OpenSim.Framework.Console.MainLog.Instance.Warn(e.ToString());
+ }
+
+ cmd.Dispose();
+ cmd = null;
+ }
+
+ public void RemovePrim(LLUUID primID)
+ {
+ IDbCommand cmd = db.CreateCommand();
+
+ //SECURITY WARNING:
+ // These parameters wont produce SQL injections since they are all integer based, however.
+ // if inserting strings such as name or description, you will need to use appropriate
+ // measures to prevent SQL injection (although the value of SQL injection in this is limited).
+
+ string sql = "DELETE FROM prim WHERE FullID = \"" + primID.ToStringHyphenated() + "\"";
+
+ cmd.CommandText = sql;
+
+ try
+ {
+ cmd.ExecuteNonQuery();
+ }
+ catch (Exception e)
+ {
+ OpenSim.Framework.Console.MainLog.Instance.Warn("SQLiteLocalStorage :RemovePrim - Exception occured");
+ OpenSim.Framework.Console.MainLog.Instance.Warn(e.ToString());
+ }
+
+ cmd.Dispose();
+ cmd = null;
+ }
+
+ public void LoadPrimitives(ILocalStorageReceiver receiver)
+ {
+
+ }
+
+ public float[] LoadWorld()
+ {
+ return new float[65536];
+ }
+
+ public void SaveMap(float[] heightmap)
+ {
+
+ }
+
+ public void SaveParcels(ParcelData[] parcel_manager)
+ {
+
+ }
+
+ public void SaveParcel(ParcelData parcel)
+ {
+ }
+
+ public void RemoveParcel(ParcelData parcel)
+ {
+ }
+
+ public void RemoveAllParcels()
+ {
+ }
+
+ public void LoadParcels(ILocalStorageParcelReceiver recv)
+ {
+ recv.NoParcelDataFromStorage();
+ }
+
+ public void ShutDown()
+ {
+ db.Close();
+ db = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj
new file mode 100644
index 0000000..24667e5
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj
@@ -0,0 +1,110 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {C9E0F891-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ OpenSim.Region.Terrain.BasicTerrain
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ OpenSim.Region.Terrain.BasicTerrain
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\..\..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ ..\..\..\bin\libTerrain-BSD.dll
+ False
+
+
+ Microsoft.JScript.dll
+ False
+
+
+ ..\..\..\bin\openjpegnet.dll
+ False
+
+
+ System.dll
+ False
+
+
+ System.Data.dll
+ False
+
+
+ System.Drawing.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user
new file mode 100644
index 0000000..6841907
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user
@@ -0,0 +1,12 @@
+
+
+ Debug
+ AnyCPU
+ C:\New Folder\second-life-viewer\opensim-dailys2\opensim15-06\NameSpaceChanges\bin\
+ 8.0.50727
+ ProjectFiles
+ 0
+
+
+
+
diff --git a/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..827c68f
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenSim.Terrain.BasicTerrain")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OpenSim.Terrain.BasicTerrain")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3263f5b5-0a41-4ed5-91a2-9baaaeecc849")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
new file mode 100644
index 0000000..4f989fa
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
@@ -0,0 +1,786 @@
+/*
+* Copyright (c) Contributors, http://www.openmetaverse.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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 System.Text;
+using System.Drawing;
+using libTerrain;
+using OpenJPEGNet;
+
+namespace OpenSim.Terrain
+{
+ public class TerrainCommand
+ {
+ public virtual bool run(string[] cmdargs, ref string output)
+ {
+ return false;
+ }
+
+ public string args;
+ public string help;
+ }
+
+ public class TerrainEngine
+ {
+ ///
+ /// Plugin library for scripts
+ ///
+ public FilterHost customFilters = new FilterHost();
+
+ ///
+ /// A [normally] 256x256 heightmap
+ ///
+ public Channel heightmap;
+
+ ///
+ /// A copy of heightmap at the last save point (for reverting)
+ ///
+ public Channel revertmap;
+
+ ///
+ /// Water heightmap (needs clientside mods to work)
+ ///
+ public Channel watermap;
+
+ ///
+ /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine.
+ /// Counts the number of modifications since the last save. (0 = Untainted)
+ ///
+ public int tainted;
+
+ int w, h;
+
+ ///
+ /// Generate a new TerrainEngine instance and creates a new heightmap
+ ///
+ public TerrainEngine()
+ {
+ w = 256;
+ h = 256;
+ heightmap = new Channel(w, h);
+
+ tainted++;
+ }
+
+ ///
+ /// Converts the heightmap to a 65536 value 1D floating point array
+ ///
+ /// A float[65536] array containing the heightmap
+ public float[] getHeights1D()
+ {
+ float[] heights = new float[w * h];
+ int i;
+
+ for (i = 0; i < w * h; i++)
+ {
+ heights[i] = (float)heightmap.map[i / w, i % w];
+ }
+
+ return heights;
+ }
+
+ ///
+ /// Converts the heightmap to a 256x256 value 2D floating point array.
+ ///
+ /// An array of 256,256 values containing the heightmap
+ public float[,] getHeights2D()
+ {
+ float[,] heights = new float[w, h];
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ heights[x, y] = (float)heightmap.map[x, y];
+ }
+ }
+ return heights;
+ }
+
+ ///
+ /// Imports a 1D floating point array into the 2D heightmap array
+ ///
+ /// The array to import (must have 65536 members)
+ public void setHeights1D(float[] heights)
+ {
+ int i;
+ for (i = 0; i < w * h; i++)
+ {
+ heightmap.map[i / w, i % w] = heights[i];
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Loads a 2D array of values into the heightmap
+ ///
+ /// An array of 256,256 float values
+ public void setHeights2D(float[,] heights)
+ {
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ heightmap.set(x, y, (double)heights[x, y]);
+ }
+ }
+ tainted++;
+ }
+
+ ///
+ /// Swaps the two heightmap buffers (the 'revert map' and the heightmap)
+ ///
+ public void swapRevertMaps()
+ {
+ Channel backup = heightmap.copy();
+ heightmap = revertmap;
+ revertmap = backup;
+ }
+
+ ///
+ /// Saves the current heightmap into the revertmap
+ ///
+ public void saveRevertMap()
+ {
+ revertmap = heightmap.copy();
+ }
+
+ ///
+ /// Processes a terrain-specific command
+ ///
+ /// Commandline arguments (space seperated)
+ /// Reference that returns error or help text if returning false
+ /// If the operation was successful (if not, the error is placed into resultText)
+ public bool RunTerrainCmd(string[] args, ref string resultText)
+ {
+ string command = args[0];
+
+ try
+ {
+
+ switch (command)
+ {
+ case "help":
+ resultText += "terrain regenerate - rebuilds the sims terrain using a default algorithm\n";
+ resultText += "terrain voronoi - generates a worley fractal with X points per block";
+ resultText += "terrain seed - sets the random seed value to \n";
+ resultText += "terrain load - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n";
+ resultText += "terrain save - saves a terrain to disk, type can be 'F32', 'F64' or 'PNG'\n";
+ resultText += "terrain save grdmap - creates a PNG snapshot of the region using a named gradient map\n";
+ resultText += "terrain rescale - rescales a terrain to be between and meters high\n";
+ resultText += "terrain erode aerobic \n";
+ resultText += "terrain erode thermal \n";
+ resultText += "terrain multiply - multiplies a terrain by \n";
+ resultText += "terrain revert - reverts the terrain to the stored original\n";
+ resultText += "terrain bake - saves the current terrain into the revert map\n";
+ resultText += "terrain csfilter - loads a new filter from the specified .cs file\n";
+ resultText += "terrain jsfilter - loads a new filter from the specified .js file\n";
+ foreach (KeyValuePair filter in customFilters.filters)
+ {
+ resultText += filter.Value.Help();
+ }
+
+ return false;
+
+ case "revert":
+ swapRevertMaps();
+ saveRevertMap();
+ break;
+
+ case "bake":
+ saveRevertMap();
+ break;
+
+ case "seed":
+ setSeed(Convert.ToInt32(args[1]));
+ break;
+
+ case "erode":
+ return consoleErosion(args, ref resultText);
+
+ case "voronoi":
+ double[] c = new double[2];
+ c[0] = -1;
+ c[1] = 1;
+ heightmap.voronoiDiagram(Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), c);
+ break;
+
+ case "hills":
+ return consoleHills(args, ref resultText);
+
+ case "regenerate":
+ hills();
+ break;
+
+ case "rescale":
+ setRange(Convert.ToSingle(args[1]), Convert.ToSingle(args[2]));
+ break;
+
+ case "multiply":
+ heightmap *= Convert.ToDouble(args[1]);
+ break;
+
+ case "load":
+ switch (args[1].ToLower())
+ {
+ case "f32":
+ loadFromFileF32(args[2]);
+ break;
+
+ case "f64":
+ loadFromFileF64(args[2]);
+ break;
+
+ case "raw":
+ loadFromFileSLRAW(args[2]);
+ break;
+
+ case "img":
+ heightmap.loadImage(args[2]);
+ return false;
+
+ default:
+ resultText = "Unknown image or data format";
+ return false;
+ }
+ break;
+
+ case "save":
+ switch (args[1].ToLower())
+ {
+ case "f32":
+ writeToFileF32(args[2]);
+ break;
+
+ case "f64":
+ writeToFileF64(args[2]);
+ break;
+
+ case "grdmap":
+ exportImage(args[2], args[3]);
+ break;
+
+ case "png":
+ heightmap.saveImage(args[2]);
+ break;
+
+ default:
+ resultText = "Unknown image or data format";
+ return false;
+ }
+ break;
+
+ case "csfilter":
+ customFilters.LoadFilterCSharp(args[1]);
+ break;
+ case "jsfilter":
+ customFilters.LoadFilterJScript(args[1]);
+ break;
+
+ default:
+ // Run any custom registered filters
+ if (customFilters.filters.ContainsKey(command))
+ {
+ customFilters.filters[command].Filter(heightmap, args);
+ break;
+ }
+ else
+ {
+ resultText = "Unknown terrain command";
+ return false;
+ }
+ }
+ return true;
+ }
+ catch (Exception e)
+ {
+ resultText = "Error running terrain command: " + e.ToString();
+ return false;
+ }
+ }
+
+ private bool consoleErosion(string[] args, ref string resultText)
+ {
+ switch (args[1].ToLower())
+ {
+ case "aerobic":
+ // WindSpeed, PickupMinimum,DropMinimum,Carry,Rounds,Lowest
+ heightmap.AerobicErosion(Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToInt32(args[6]), Convert.ToBoolean(args[7]));
+ break;
+ case "thermal":
+ heightmap.thermalWeathering(Convert.ToDouble(args[2]), Convert.ToInt32(args[3]), Convert.ToDouble(args[4]));
+ break;
+ default:
+ resultText = "Unknown erosion type";
+ return false;
+ }
+ return true;
+ }
+
+ private bool consoleHills(string[] args, ref string resultText)
+ {
+ int count;
+ double sizeMin;
+ double sizeRange;
+ bool island;
+ bool additive;
+ bool noisy;
+
+ if (args.GetLength(0) > 2)
+ {
+ count = Convert.ToInt32(args[2]);
+ sizeMin = Convert.ToDouble(args[3]);
+ sizeRange = Convert.ToDouble(args[4]);
+ island = Convert.ToBoolean(args[5]);
+ additive = Convert.ToBoolean(args[6]);
+ noisy = Convert.ToBoolean(args[7]);
+ }
+ else
+ {
+ count = 200;
+ sizeMin = 20;
+ sizeRange = 40;
+ island = true;
+ additive = true;
+ noisy = false;
+ }
+
+ switch (args[1].ToLower())
+ {
+ case "blocks":
+ heightmap.hillsBlocks(count, sizeMin, sizeRange, island, additive, noisy);
+ break;
+ case "cones":
+ heightmap.hillsCones(count, sizeMin, sizeRange, island, additive, noisy);
+ break;
+ case "spheres":
+ heightmap.hillsSpheres(count, sizeMin, sizeRange, island, additive, noisy);
+ break;
+ case "squared":
+ heightmap.hillsSquared(count, sizeMin, sizeRange, island, additive, noisy);
+ break;
+ default:
+ resultText = "Unknown hills type";
+ return false;
+ }
+ return true;
+ }
+
+ ///
+ /// Renormalises the array between min and max
+ ///
+ /// Minimum value of the new array
+ /// Maximum value of the new array
+ public void setRange(float min, float max)
+ {
+ heightmap.normalise((double)min, (double)max);
+ tainted++;
+ }
+
+ ///
+ /// Loads a file consisting of 256x256 doubles and imports it as an array into the map.
+ ///
+ /// TODO: Move this to libTerrain itself
+ /// The filename of the double array to import
+ public void loadFromFileF64(string filename)
+ {
+ System.IO.FileInfo file = new System.IO.FileInfo(filename);
+ System.IO.FileStream s = file.Open(System.IO.FileMode.Open, System.IO.FileAccess.Read);
+ System.IO.BinaryReader bs = new System.IO.BinaryReader(s);
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ heightmap.map[x, y] = bs.ReadDouble();
+ }
+ }
+
+ bs.Close();
+ s.Close();
+
+ tainted++;
+ }
+
+ ///
+ /// Loads a file consisting of 256x256 floats and imports it as an array into the map.
+ ///
+ /// TODO: Move this to libTerrain itself
+ /// The filename of the float array to import
+ public void loadFromFileF32(string filename)
+ {
+ System.IO.FileInfo file = new System.IO.FileInfo(filename);
+ System.IO.FileStream s = file.Open(System.IO.FileMode.Open, System.IO.FileAccess.Read);
+ System.IO.BinaryReader bs = new System.IO.BinaryReader(s);
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ heightmap.map[x, y] = (double)bs.ReadSingle();
+ }
+ }
+
+ bs.Close();
+ s.Close();
+
+ tainted++;
+ }
+
+ ///
+ /// Loads a file formatted in the SL .RAW Format used on the main grid
+ ///
+ /// This file format stinks and is best avoided.
+ /// A path to the .RAW format
+ public void loadFromFileSLRAW(string filename)
+ {
+ System.IO.FileInfo file = new System.IO.FileInfo(filename);
+ System.IO.FileStream s = file.Open(System.IO.FileMode.Open, System.IO.FileAccess.Read);
+ System.IO.BinaryReader bs = new System.IO.BinaryReader(s);
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ heightmap.map[x, y] = (double)bs.ReadByte() * ((double)bs.ReadByte() / 127.0);
+ bs.ReadBytes(11); // Advance the stream to next bytes.
+ }
+ }
+
+ bs.Close();
+ s.Close();
+
+ tainted++;
+ }
+
+ ///
+ /// Writes the current terrain heightmap to disk, in the format of a 65536 entry double[] array.
+ ///
+ /// The desired output filename
+ public void writeToFileF64(string filename)
+ {
+ System.IO.FileInfo file = new System.IO.FileInfo(filename);
+ System.IO.FileStream s = file.Open(System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
+ System.IO.BinaryWriter bs = new System.IO.BinaryWriter(s);
+
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ bs.Write(heightmap.get(x, y));
+ }
+ }
+
+ bs.Close();
+ s.Close();
+ }
+
+ ///
+ /// Writes the current terrain heightmap to disk, in the format of a 65536 entry float[] array
+ ///
+ /// The desired output filename
+ public void writeToFileF32(string filename)
+ {
+ System.IO.FileInfo file = new System.IO.FileInfo(filename);
+ System.IO.FileStream s = file.Open(System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
+ System.IO.BinaryWriter bs = new System.IO.BinaryWriter(s);
+
+ int x, y;
+ for (x = 0; x < w; x++)
+ {
+ for (y = 0; y < h; y++)
+ {
+ bs.Write((float)heightmap.get(x, y));
+ }
+ }
+
+ bs.Close();
+ s.Close();
+ }
+
+ ///
+ /// Sets the random seed to be used by procedural functions which involve random numbers.
+ ///
+ /// The desired seed
+ public void setSeed(int val)
+ {
+ heightmap.seed = val;
+ }
+
+ ///
+ /// Raises land in a sphere around the specified coordinates
+ ///
+ /// Center of the sphere on the X axis
+ /// Center of the sphere on the Y axis
+ /// The radius of the sphere
+ /// Scale the height of the sphere by this amount (recommended 0..2)
+ public void raise(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ heightmap.raise(rx, ry, size, amount);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Lowers the land in a sphere around the specified coordinates
+ ///
+ /// The center of the sphere at the X axis
+ /// The center of the sphere at the Y axis
+ /// The radius of the sphere in meters
+ /// Scale the height of the sphere by this amount (recommended 0..2)
+ public void lower(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ heightmap.lower(rx, ry, size, amount);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Flattens the land under the brush of specified coordinates (spherical mask)
+ ///
+ /// Center of sphere
+ /// Center of sphere
+ /// Radius of the sphere
+ /// Thickness of the mask (0..2 recommended)
+ public void flatten(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ heightmap.flatten(rx, ry, size, amount);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Creates noise within the specified bounds
+ ///
+ /// Center of the bounding sphere
+ /// Center of the bounding sphere
+ /// The radius of the sphere
+ /// Strength of the mask (0..2) recommended
+ public void noise(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ Channel smoothed = new Channel();
+ smoothed.noise();
+
+ Channel mask = new Channel();
+ mask.raise(rx, ry, size, amount);
+
+ heightmap.blend(smoothed, mask);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Reverts land within the specified bounds
+ ///
+ /// Center of the bounding sphere
+ /// Center of the bounding sphere
+ /// The radius of the sphere
+ /// Strength of the mask (0..2) recommended
+ public void revert(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ Channel mask = new Channel();
+ mask.raise(rx, ry, size, amount);
+
+ heightmap.blend(revertmap, mask);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Smooths land under the brush of specified coordinates (spherical mask)
+ ///
+ /// Center of the sphere
+ /// Center of the sphere
+ /// Radius of the sphere
+ /// Thickness of the mask (0..2 recommended)
+ public void smooth(double rx, double ry, double size, double amount)
+ {
+ lock (heightmap)
+ {
+ Channel smoothed = heightmap.copy();
+ smoothed.smooth(amount);
+
+ Channel mask = new Channel();
+ mask.raise(rx,ry,size,amount);
+
+ heightmap.blend(smoothed, mask);
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Generates a simple set of hills in the shape of an island
+ ///
+ public void hills()
+ {
+ lock (heightmap)
+ {
+ heightmap.hillsSpheres(200, 20, 40, true, true, false);
+ heightmap.normalise();
+ heightmap *= 60.0; // Raise to 60m
+ }
+
+ tainted++;
+ }
+
+ ///
+ /// Multiplies the heightfield by val
+ ///
+ /// The heightfield
+ /// The multiplier
+ ///
+ public static TerrainEngine operator *(TerrainEngine meep, Double val)
+ {
+ meep.heightmap *= val;
+ meep.tainted++;
+ return meep;
+ }
+
+ ///
+ /// Returns the height at the coordinates x,y
+ ///
+ /// X Coordinate
+ /// Y Coordinate
+ ///
+ public float this[int x, int y]
+ {
+ get
+ {
+ return (float)heightmap.get(x, y);
+ }
+ set
+ {
+ tainted++;
+ heightmap.set(x, y, (double)value);
+ }
+ }
+
+ ///
+ /// Exports the current heightmap to a PNG file
+ ///
+ /// The destination filename for the image
+ /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal.
+ public void exportImage(string filename, string gradientmap)
+ {
+ try
+ {
+ Bitmap gradientmapLd = new Bitmap(gradientmap);
+
+ int pallete = gradientmapLd.Height;
+
+ Bitmap bmp = new Bitmap(heightmap.w, heightmap.h);
+ Color[] colours = new Color[pallete];
+
+ for (int i = 0; i < pallete; i++)
+ {
+ colours[i] = gradientmapLd.GetPixel(0, i);
+ }
+
+ Channel copy = heightmap.copy();
+ for (int x = 0; x < copy.w; x++)
+ {
+ for (int y = 0; y < copy.h; y++)
+ {
+ // 512 is the largest possible height before colours clamp
+ int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(x, y) / 512.0), 0.0) * pallete);
+ bmp.SetPixel(x, y, colours[colorindex]);
+ }
+ }
+
+ bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Failed generating terrain map: " + e.ToString());
+ }
+ }
+
+ ///
+ /// Exports the current heightmap in Jpeg2000 format to a byte[]
+ ///
+ /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal.
+ public byte[] exportJpegImage(string gradientmap)
+ {
+ byte[] imageData = null;
+ try
+ {
+ Bitmap gradientmapLd = new Bitmap(gradientmap);
+
+ int pallete = gradientmapLd.Height;
+
+ Bitmap bmp = new Bitmap(heightmap.w, heightmap.h);
+ Color[] colours = new Color[pallete];
+
+ for (int i = 0; i < pallete; i++)
+ {
+ colours[i] = gradientmapLd.GetPixel(0, i);
+ }
+
+ Channel copy = heightmap.copy();
+ for (int x = 0; x < copy.w; x++)
+ {
+ for (int y = 0; y < copy.h; y++)
+ {
+ // 512 is the largest possible height before colours clamp
+ int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(copy.h - y, x) / 512.0), 0.0) * pallete);
+ bmp.SetPixel(x, y, colours[colorindex]);
+ }
+ }
+
+ //bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
+ imageData = OpenJPEGNet.OpenJPEG.EncodeFromImage(bmp, "map");
+
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Failed generating terrain map: " + e.ToString());
+ }
+
+ return imageData;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs
new file mode 100644
index 0000000..689375d
--- /dev/null
+++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using System.CodeDom.Compiler;
+using System.CodeDom;
+using Microsoft.CSharp;
+using Microsoft.JScript;
+
+using libTerrain;
+
+namespace OpenSim.Terrain
+{
+ public interface ITerrainFilter
+ {
+ void Filter(Channel heightmap, string[] args);
+ string Register();
+ string Help();
+ }
+
+ public class TestFilter : ITerrainFilter
+ {
+ public void Filter(Channel heightmap, string[] args)
+ {
+ Console.WriteLine("Hello world");
+ }
+
+ public string Register()
+ {
+ return "demofilter";
+ }
+
+ public string Help()
+ {
+ return "demofilter - Does nothing";
+ }
+ }
+
+ public class FilterHost
+ {
+ public Dictionary filters = new Dictionary();
+
+ private void LoadFilter(ICodeCompiler compiler, string filename)
+ {
+ CompilerParameters compilerParams = new CompilerParameters();
+ CompilerResults compilerResults;
+ compilerParams.GenerateExecutable = false;
+ compilerParams.GenerateInMemory = true;
+ compilerParams.IncludeDebugInformation = false;
+ compilerParams.ReferencedAssemblies.Add("libTerrain-BSD.dll");
+ compilerParams.ReferencedAssemblies.Add("OpenSim.Terrain.BasicTerrain.dll");
+ compilerParams.ReferencedAssemblies.Add("System.dll");
+
+ compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
+
+ if (compilerResults.Errors.Count > 0)
+ {
+ Console.WriteLine("Compile errors:");
+ foreach (CompilerError error in compilerResults.Errors)
+ {
+ Console.WriteLine(error.Line.ToString() + ": " + error.ErrorText.ToString());
+ }
+ }
+ else
+ {
+ foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
+ {
+ Type testInterface = pluginType.GetInterface("ITerrainFilter",true);
+
+ if (testInterface != null)
+ {
+ ITerrainFilter filter = (ITerrainFilter)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
+
+ string filterName = filter.Register();
+ Console.WriteLine("Plugin: " + filterName + " loaded.");
+
+ if (!filters.ContainsKey(filterName))
+ {
+ filters.Add(filterName, filter);
+ }
+ else
+ {
+ filters[filterName] = filter;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void LoadFilterCSharp(string filename)
+ {
+ CSharpCodeProvider compiler = new CSharpCodeProvider();
+ LoadFilter(compiler.CreateCompiler(), filename);
+ }
+
+ public void LoadFilterJScript(string filename)
+ {
+ JScriptCodeProvider compiler = new JScriptCodeProvider();
+ LoadFilter(compiler.CreateCompiler(), filename);
+ }
+ }
+}
--
cgit v1.1